From 761193ecd9ac0240fc8bf945f0601acb82bf8e98 Mon Sep 17 00:00:00 2001 From: Ignacio Etcheverry Date: Sat, 23 Jul 2016 21:37:25 +0200 Subject: Project Manager: Added project list scrolling with keyboard --- tools/editor/project_manager.cpp | 134 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) (limited to 'tools/editor/project_manager.cpp') diff --git a/tools/editor/project_manager.cpp b/tools/editor/project_manager.cpp index b7d3abfd5..caf116523 100644 --- a/tools/editor/project_manager.cpp +++ b/tools/editor/project_manager.cpp @@ -31,6 +31,7 @@ #include "os/os.h" #include "os/dir_access.h" #include "os/file_access.h" +#include "os/keyboard.h" #include "editor_settings.h" #include "scene/gui/separator.h" #include "scene/gui/tool_button.h" @@ -491,6 +492,10 @@ void ProjectManager::_notification(int p_what) { if (p_what==NOTIFICATION_ENTER_TREE) { get_tree()->set_editor_hint(true); + + } else if (p_what==NOTIFICATION_VISIBILITY_CHANGED) { + + set_process_unhandled_input(is_visible()); } } @@ -576,6 +581,134 @@ void ProjectManager::_panel_input(const InputEvent& p_ev,Node *p_hb) { } } +void ProjectManager::_unhandled_input(const InputEvent& p_ev) { + + if (p_ev.type==InputEvent::KEY) { + + const InputEventKey &k = p_ev.key; + + if (!k.pressed) + return; + + bool scancode_handled = true; + + switch (k.scancode) { + + case KEY_HOME: { + + for (int i=0; iget_child_count(); i++) { + + HBoxContainer *hb = scroll_childs->get_child(i)->cast_to(); + if (hb) { + selected_list.clear(); + selected_list.insert(hb->get_meta("name"), hb->get_meta("main_scene")); + scroll->set_v_scroll(0); + break; + } + } + + } break; + case KEY_END: { + + for (int i=scroll_childs->get_child_count()-1; i>=0; i--) { + + HBoxContainer *hb = scroll_childs->get_child(i)->cast_to(); + if (hb) { + selected_list.clear(); + selected_list.insert(hb->get_meta("name"), hb->get_meta("main_scene")); + scroll->set_v_scroll(scroll_childs->get_size().y); + break; + } + } + + } break; + case KEY_UP: { + + if (k.mod.shift) + break; + + if (selected_list.size()) { + + bool found = false; + + for (int i=scroll_childs->get_child_count()-1; i>=0; i--) { + + HBoxContainer *hb = scroll_childs->get_child(i)->cast_to(); + if (!hb) continue; + + String current = hb->get_meta("name"); + + if (found) { + selected_list.clear(); + selected_list.insert(current, hb->get_meta("main_scene")); + + int offset_diff = scroll->get_v_scroll() - hb->get_pos().y; + + if (offset_diff > 0) + scroll->set_v_scroll(scroll->get_v_scroll() - offset_diff); + + break; + + } else if (current==selected_list.back()->key()) { + + found = true; + } + } + + break; + } + // else fallthrough to key_down + } + case KEY_DOWN: { + + if (k.mod.shift) + break; + + bool found = selected_list.empty(); + + for (int i=0; iget_child_count(); i++) { + + HBoxContainer *hb = scroll_childs->get_child(i)->cast_to(); + if (!hb) continue; + + String current = hb->get_meta("name"); + + if (found) { + selected_list.clear(); + selected_list.insert(current, hb->get_meta("main_scene")); + + int last_y_visible = scroll->get_v_scroll() + scroll->get_size().y; + int offset_diff = (hb->get_pos().y + hb->get_size().y) - last_y_visible; + + if (offset_diff > 0) + scroll->set_v_scroll(scroll->get_v_scroll() + offset_diff); + + break; + + } else if (current==selected_list.back()->key()) { + + found = true; + } + } + + } break; + default: { + scancode_handled = false; + } break; + } + + if (scancode_handled) { + accept_event(); + + for(int i=0;iget_child_count();i++) { + CanvasItem *item = scroll_childs->get_child(i)->cast_to(); + if (item) + item->update(); + } + } + } +} + void ProjectManager::_favorite_pressed(Node *p_hb) { String clicked = p_hb->get_meta("name"); @@ -964,6 +1097,7 @@ void ProjectManager::_bind_methods() { ObjectTypeDB::bind_method("_load_recent_projects",&ProjectManager::_load_recent_projects); ObjectTypeDB::bind_method("_panel_draw",&ProjectManager::_panel_draw); ObjectTypeDB::bind_method("_panel_input",&ProjectManager::_panel_input); + ObjectTypeDB::bind_method("_unhandled_input",&ProjectManager::_unhandled_input); ObjectTypeDB::bind_method("_favorite_pressed",&ProjectManager::_favorite_pressed); ObjectTypeDB::bind_method("_install_project",&ProjectManager::_install_project); -- cgit v1.3.1 From 759e20aac69eca8beeca95a0f321c6a3f41f435f Mon Sep 17 00:00:00 2001 From: Dima Granetchi Date: Tue, 26 Jul 2016 22:17:41 +0300 Subject: Command-F focus filter input field in project manager --- tools/editor/project_manager.cpp | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'tools/editor/project_manager.cpp') diff --git a/tools/editor/project_manager.cpp b/tools/editor/project_manager.cpp index caf116523..dd634e51e 100644 --- a/tools/editor/project_manager.cpp +++ b/tools/editor/project_manager.cpp @@ -692,6 +692,10 @@ void ProjectManager::_unhandled_input(const InputEvent& p_ev) { } } break; + case KEY_F: { + if (k.mod.command) this->project_filter->search_box->grab_focus(); + else scancode_handled = false; + } break; default: { scancode_handled = false; } break; -- cgit v1.3.1 From 283530a70ba4c1a325dbd143f0c55e89b22f68df Mon Sep 17 00:00:00 2001 From: Dima Granetchi Date: Fri, 29 Jul 2016 03:33:59 +0300 Subject: keep selected_list up to date --- tools/editor/project_manager.cpp | 56 ++++++++++++++++++++++++---------------- tools/editor/project_manager.h | 1 + 2 files changed, 35 insertions(+), 22 deletions(-) (limited to 'tools/editor/project_manager.cpp') diff --git a/tools/editor/project_manager.cpp b/tools/editor/project_manager.cpp index dd634e51e..9ca69935d 100644 --- a/tools/editor/project_manager.cpp +++ b/tools/editor/project_manager.cpp @@ -510,6 +510,27 @@ void ProjectManager::_panel_draw(Node *p_hb) { } } +void ProjectManager::_update_project_buttons() +{ + String single_selected = ""; + if (selected_list.size() == 1) { + single_selected = selected_list.front()->key(); + } + + single_selected_main = ""; + for(int i=0;iget_child_count();i++) { + CanvasItem *item = scroll_childs->get_child(i)->cast_to(); + item->update(); + + if (single_selected!="" && single_selected == item->get_meta("name")) + single_selected_main = item->get_meta("main_scene"); + } + + erase_btn->set_disabled(selected_list.size()<1); + open_btn->set_disabled(selected_list.size()<1); + run_btn->set_disabled(selected_list.size()<1 || (selected_list.size()==1 && single_selected_main=="")); +} + void ProjectManager::_panel_input(const InputEvent& p_ev,Node *p_hb) { if (p_ev.type==InputEvent::MOUSE_BUTTON && p_ev.mouse_button.pressed && p_ev.mouse_button.button_index==BUTTON_LEFT) { @@ -557,23 +578,7 @@ void ProjectManager::_panel_input(const InputEvent& p_ev,Node *p_hb) { } } - String single_selected = ""; - if (selected_list.size() == 1) { - single_selected = selected_list.front()->key(); - } - - single_selected_main = ""; - for(int i=0;iget_child_count();i++) { - CanvasItem *item = scroll_childs->get_child(i)->cast_to(); - item->update(); - - if (single_selected!="" && single_selected == item->get_meta("name")) - single_selected_main = item->get_meta("main_scene"); - } - - erase_btn->set_disabled(selected_list.size()<1); - open_btn->set_disabled(selected_list.size()<1); - run_btn->set_disabled(selected_list.size()<1 || (selected_list.size()==1 && single_selected_main=="")); + _update_project_buttons(); if (p_ev.mouse_button.doubleclick) _open_project(); //open if doubleclicked @@ -739,6 +744,8 @@ void ProjectManager::_load_recent_projects() { memdelete( scroll_childs->get_child(0)); } + Map selected_list_copy = selected_list; + List properties; EditorSettings::get_singleton()->get_property_list(&properties); @@ -845,6 +852,8 @@ void ProjectManager::_load_recent_projects() { main_scene = cf->get_value("application","main_scene"); } + selected_list_copy.erase(project); + HBoxContainer *hb = memnew( HBoxContainer ); hb->set_meta("name",project); hb->set_meta("main_scene",main_scene); @@ -882,12 +891,15 @@ void ProjectManager::_load_recent_projects() { scroll_childs->add_child(hb); } - + + for (Map::Element *E = selected_list_copy.front();E;E = E->next()) { + String key = E->key(); + selected_list.erase(key); + } + scroll->set_v_scroll(0); - - erase_btn->set_disabled(selected_list.size()<1); - open_btn->set_disabled(selected_list.size()<1); - run_btn->set_disabled(selected_list.size()<1 || (selected_list.size()==1 && single_selected_main=="")); + + _update_project_buttons(); EditorSettings::get_singleton()->save(); diff --git a/tools/editor/project_manager.h b/tools/editor/project_manager.h index 74d1d3693..fac1fc774 100644 --- a/tools/editor/project_manager.h +++ b/tools/editor/project_manager.h @@ -82,6 +82,7 @@ class ProjectManager : public Control { void _new_project(); void _erase_project(); void _erase_project_confirm(); + void _update_project_buttons(); void _exit_dialog(); void _scan_begin(const String& p_base); -- cgit v1.3.1 From 9720e73e0480e454b580afc9499240bb08a823f3 Mon Sep 17 00:00:00 2001 From: Andreas Haas Date: Fri, 29 Jul 2016 17:06:37 +0200 Subject: Project Manager: Import projects using filesystem drag'n'drop. Can drop an engine.cfg file over the window to import it ;) --- tools/editor/project_manager.cpp | 17 +++++++++++++++++ tools/editor/project_manager.h | 1 + 2 files changed, 18 insertions(+) (limited to 'tools/editor/project_manager.cpp') diff --git a/tools/editor/project_manager.cpp b/tools/editor/project_manager.cpp index 9ca69935d..28d9738fe 100644 --- a/tools/editor/project_manager.cpp +++ b/tools/editor/project_manager.cpp @@ -364,6 +364,12 @@ public: mode=p_mode; } + void import_from_file(const String& p_file) { + mode=MODE_IMPORT; + _file_selected(p_file); + ok_pressed(); + } + void show_dialog() { @@ -1097,6 +1103,14 @@ void ProjectManager::_install_project(const String& p_zip_path,const String& p_t npdialog->show_dialog(); } +void ProjectManager::_files_dropped(StringArray p_files, int p_screen) { + for (int i = 0; i < p_files.size(); i++) { + if (p_files[i].ends_with("engine.cfg")) { + npdialog->import_from_file(p_files[i]); + } + } +} + void ProjectManager::_bind_methods() { ObjectTypeDB::bind_method("_open_project",&ProjectManager::_open_project); @@ -1116,6 +1130,7 @@ void ProjectManager::_bind_methods() { ObjectTypeDB::bind_method("_unhandled_input",&ProjectManager::_unhandled_input); ObjectTypeDB::bind_method("_favorite_pressed",&ProjectManager::_favorite_pressed); ObjectTypeDB::bind_method("_install_project",&ProjectManager::_install_project); + ObjectTypeDB::bind_method("_files_dropped",&ProjectManager::_files_dropped); } @@ -1330,6 +1345,8 @@ ProjectManager::ProjectManager() { //get_ok()->set_text("Exit"); last_clicked = ""; + + SceneTree::get_singleton()->connect("files_dropped", this, "_files_dropped"); } diff --git a/tools/editor/project_manager.h b/tools/editor/project_manager.h index fac1fc774..50bd7d94c 100644 --- a/tools/editor/project_manager.h +++ b/tools/editor/project_manager.h @@ -95,6 +95,7 @@ class ProjectManager : public Control { void _panel_input(const InputEvent& p_ev,Node *p_hb); void _unhandled_input(const InputEvent& p_ev); void _favorite_pressed(Node *p_hb); + void _files_dropped(StringArray p_files, int p_screen); protected: -- cgit v1.3.1 From a1c0fdac9a4ec1e8c2097b457a52e568f983c7d0 Mon Sep 17 00:00:00 2001 From: Dima Granetchi Date: Sun, 31 Jul 2016 01:04:16 +0300 Subject: fix run button availability check --- tools/editor/project_manager.cpp | 21 ++++++++++----------- tools/editor/project_manager.h | 3 --- 2 files changed, 10 insertions(+), 14 deletions(-) (limited to 'tools/editor/project_manager.cpp') diff --git a/tools/editor/project_manager.cpp b/tools/editor/project_manager.cpp index 28d9738fe..f885fbba0 100644 --- a/tools/editor/project_manager.cpp +++ b/tools/editor/project_manager.cpp @@ -518,23 +518,23 @@ void ProjectManager::_panel_draw(Node *p_hb) { void ProjectManager::_update_project_buttons() { - String single_selected = ""; - if (selected_list.size() == 1) { - single_selected = selected_list.front()->key(); - } - - single_selected_main = ""; for(int i=0;iget_child_count();i++) { + CanvasItem *item = scroll_childs->get_child(i)->cast_to(); item->update(); - - if (single_selected!="" && single_selected == item->get_meta("name")) - single_selected_main = item->get_meta("main_scene"); + } + + bool has_runnable_scene = false; + for (Map::Element *E=selected_list.front(); E; E=E->next()) { + const String &selected_main = E->get(); + if (selected_main == "") continue; + has_runnable_scene = true; + break; } erase_btn->set_disabled(selected_list.size()<1); open_btn->set_disabled(selected_list.size()<1); - run_btn->set_disabled(selected_list.size()<1 || (selected_list.size()==1 && single_selected_main=="")); + run_btn->set_disabled(!has_runnable_scene); } void ProjectManager::_panel_input(const InputEvent& p_ev,Node *p_hb) { @@ -1072,7 +1072,6 @@ void ProjectManager::_erase_project_confirm() { EditorSettings::get_singleton()->save(); selected_list.clear(); last_clicked = ""; - single_selected_main=""; _load_recent_projects(); } diff --git a/tools/editor/project_manager.h b/tools/editor/project_manager.h index 50bd7d94c..da5703390 100644 --- a/tools/editor/project_manager.h +++ b/tools/editor/project_manager.h @@ -60,7 +60,6 @@ class ProjectManager : public Control { VBoxContainer *scroll_childs; Map selected_list; // name -> main_scene String last_clicked; - String single_selected_main; bool importing; HBoxContainer *projects_hb; @@ -69,8 +68,6 @@ class ProjectManager : public Control { Control *gui_base; - void _item_doubleclicked(); - void _scan_projects(); -- cgit v1.3.1 From 5e011dcd0e4958f6bc59f64e024402af1ad1dc0d Mon Sep 17 00:00:00 2001 From: Dima Granetchi Date: Sun, 31 Jul 2016 01:10:13 +0300 Subject: dnd folder open scan window if engine.cfg not found --- tools/editor/project_manager.cpp | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'tools/editor/project_manager.cpp') diff --git a/tools/editor/project_manager.cpp b/tools/editor/project_manager.cpp index 28d9738fe..20544d2f0 100644 --- a/tools/editor/project_manager.cpp +++ b/tools/editor/project_manager.cpp @@ -1104,11 +1104,17 @@ void ProjectManager::_install_project(const String& p_zip_path,const String& p_t } void ProjectManager::_files_dropped(StringArray p_files, int p_screen) { + bool import_project_file = false; for (int i = 0; i < p_files.size(); i++) { if (p_files[i].ends_with("engine.cfg")) { npdialog->import_from_file(p_files[i]); + import_project_file = true; } } + if (!import_project_file && p_files.size() > 0) { + scan_dir->set_current_dir(p_files[0]); + scan_dir->popup_centered_ratio(); + } } void ProjectManager::_bind_methods() { -- cgit v1.3.1 From 0b595f94c47a9144dbe9c200a8057558b0c4f839 Mon Sep 17 00:00:00 2001 From: Rémi Verschelde Date: Sun, 31 Jul 2016 20:46:00 +0200 Subject: Improve dialog title when scanning for projects --- tools/editor/project_manager.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'tools/editor/project_manager.cpp') diff --git a/tools/editor/project_manager.cpp b/tools/editor/project_manager.cpp index daba5c9eb..90e655f11 100644 --- a/tools/editor/project_manager.cpp +++ b/tools/editor/project_manager.cpp @@ -1270,6 +1270,7 @@ ProjectManager::ProjectManager() { scan_dir = memnew( FileDialog ); scan_dir->set_access(FileDialog::ACCESS_FILESYSTEM); scan_dir->set_mode(FileDialog::MODE_OPEN_DIR); + scan_dir->set_title(TTR("Select a Folder to Scan")); // must be after mode or it's overridden scan_dir->set_current_dir( EditorSettings::get_singleton()->get("global/default_project_path") ); gui_base->add_child(scan_dir); scan_dir->connect("dir_selected",this,"_scan_begin"); -- cgit v1.3.1 From bee20910569d89cf36b6601eca2c6322f2947943 Mon Sep 17 00:00:00 2001 From: Dima Granetchi Date: Mon, 1 Aug 2016 01:59:31 +0300 Subject: Auto import project folder, confirm scan multiple folders or non-project folder --- tools/editor/project_manager.cpp | 56 ++++++++++++++++++++++++++++++++++------ tools/editor/project_manager.h | 2 ++ 2 files changed, 50 insertions(+), 8 deletions(-) (limited to 'tools/editor/project_manager.cpp') diff --git a/tools/editor/project_manager.cpp b/tools/editor/project_manager.cpp index 90e655f11..62b15d344 100644 --- a/tools/editor/project_manager.cpp +++ b/tools/editor/project_manager.cpp @@ -1103,16 +1103,50 @@ void ProjectManager::_install_project(const String& p_zip_path,const String& p_t } void ProjectManager::_files_dropped(StringArray p_files, int p_screen) { - bool import_project_file = false; + Set folders_set; + DirAccess *da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM); for (int i = 0; i < p_files.size(); i++) { - if (p_files[i].ends_with("engine.cfg")) { - npdialog->import_from_file(p_files[i]); - import_project_file = true; + String file = p_files[i]; + folders_set.insert(da->dir_exists(file) ? file : file.get_base_dir()); + } + memdelete(da); + if (folders_set.size()>0) { + StringArray folders; + for (Set::Element *E=folders_set.front();E;E=E->next()) { + folders.append(E->get()); + } + + bool confirm = true; + if (folders.size()==1) { + DirAccess *dir = DirAccess::create(DirAccess::ACCESS_FILESYSTEM); + if (dir->change_dir(folders[0])==OK) { + dir->list_dir_begin(); + String file = dir->get_next(); + while(confirm && file!=String()) { + if (!da->current_is_dir() && file.ends_with("engine.cfg")) { + confirm = false; + } + file = dir->get_next(); + } + dir->list_dir_end(); + } + memdelete(dir); + } + if (confirm) { + multi_scan_ask->get_ok()->disconnect("pressed", this, "_scan_multiple_folders"); + multi_scan_ask->get_ok()->connect("pressed", this, "_scan_multiple_folders", varray(folders)); + multi_scan_ask->set_text(vformat(TTR("You are about the scan %s folders for existing Godot projects. Do you confirm?"), folders.size())); + multi_scan_ask->popup_centered_minsize(); + } else { + _scan_multiple_folders(folders); } } - if (!import_project_file && p_files.size() > 0) { - scan_dir->set_current_dir(p_files[0]); - scan_dir->popup_centered_ratio(); +} + +void ProjectManager::_scan_multiple_folders(StringArray p_files) +{ + for (int i = 0; i < p_files.size(); i++) { + _scan_begin(p_files.get(i)); } } @@ -1136,6 +1170,7 @@ void ProjectManager::_bind_methods() { ObjectTypeDB::bind_method("_favorite_pressed",&ProjectManager::_favorite_pressed); ObjectTypeDB::bind_method("_install_project",&ProjectManager::_install_project); ObjectTypeDB::bind_method("_files_dropped",&ProjectManager::_files_dropped); + ObjectTypeDB::bind_method(_MD("_scan_multiple_folders", "files"),&ProjectManager::_scan_multiple_folders); } @@ -1332,8 +1367,13 @@ ProjectManager::ProjectManager() { multi_run_ask = memnew( ConfirmationDialog ); multi_run_ask->get_ok()->set_text(TTR("Run")); multi_run_ask->get_ok()->connect("pressed", this, "_run_project_confirm"); - + gui_base->add_child(multi_run_ask); + + multi_scan_ask = memnew( ConfirmationDialog ); + multi_scan_ask->get_ok()->set_text(TTR("Scan")); + + gui_base->add_child(multi_scan_ask); OS::get_singleton()->set_low_processor_usage_mode(true); diff --git a/tools/editor/project_manager.h b/tools/editor/project_manager.h index da5703390..46f7aea3a 100644 --- a/tools/editor/project_manager.h +++ b/tools/editor/project_manager.h @@ -55,6 +55,7 @@ class ProjectManager : public Control { ConfirmationDialog *erase_ask; ConfirmationDialog *multi_open_ask; ConfirmationDialog *multi_run_ask; + ConfirmationDialog *multi_scan_ask; NewProjectDialog *npdialog; ScrollContainer *scroll; VBoxContainer *scroll_childs; @@ -93,6 +94,7 @@ class ProjectManager : public Control { void _unhandled_input(const InputEvent& p_ev); void _favorite_pressed(Node *p_hb); void _files_dropped(StringArray p_files, int p_screen); + void _scan_multiple_folders(StringArray p_files); protected: -- cgit v1.3.1