diff options
author | Juan Linietsky <reduzio@gmail.com> | 2017-09-14 15:01:11 -0300 |
---|---|---|
committer | Juan Linietsky <reduzio@gmail.com> | 2017-09-14 15:02:51 -0300 |
commit | 35ed1eef2a6a00087799ded7e10ce94ed4d8b373 (patch) | |
tree | 3c0fd40140814fd14ec27193678bb5b73f3559b8 /modules/gdnative/gd_native_library_editor.cpp | |
parent | 57516a447395223e56e93e05994a5bf69ee3bcac (diff) |
Added a menu to enable/disabled GDNative singletons in project settings
Diffstat (limited to 'modules/gdnative/gd_native_library_editor.cpp')
-rw-r--r-- | modules/gdnative/gd_native_library_editor.cpp | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/modules/gdnative/gd_native_library_editor.cpp b/modules/gdnative/gd_native_library_editor.cpp new file mode 100644 index 0000000000..8aa931d6c9 --- /dev/null +++ b/modules/gdnative/gd_native_library_editor.cpp @@ -0,0 +1,120 @@ +#include "gd_native_library_editor.h" +#include "gdnative.h" + +void GDNativeLibraryEditor::_find_gdnative_singletons(EditorFileSystemDirectory *p_dir, const Set<String> &enabled_list) { + + + // check children + + for (int i = 0; i < p_dir->get_file_count(); i++) { + String file_type = p_dir->get_file_type(i); + + if (file_type != "GDNativeLibrary") { + continue; + } + + Ref<GDNativeLibrary> lib = ResourceLoader::load(p_dir->get_file_path(i)); + if (lib.is_valid() && lib->is_singleton_gdnative()) { + String path = p_dir->get_file_path(i); + TreeItem *ti = libraries->create_item(libraries->get_root()); + ti->set_text(0,path.get_file()); + ti->set_tooltip(0,path); + ti->set_metadata(0,path); + ti->set_cell_mode(1,TreeItem::CELL_MODE_RANGE); + ti->set_text(1,"Disabled,Enabled"); + bool enabled = enabled_list.has(path)?true:false; + + ti->set_range(1,enabled?1:0); + ti->set_custom_color(1,enabled?Color(0,1,0):Color(1,0,0)); + } + } + + // check subdirectories + for (int i = 0; i < p_dir->get_subdir_count(); i++) { + _find_gdnative_singletons(p_dir->get_subdir(i),enabled_list); + } + + +} + +void GDNativeLibraryEditor::_update_libraries() { + + updating=true; + libraries->clear(); + libraries->create_item(); //rppt + + Vector<String> enabled_paths; + if (ProjectSettings::get_singleton()->has("gdnative/singletons")) { + enabled_paths=ProjectSettings::get_singleton()->get("gdnative/singletons"); + } + Set<String> enabled_list; + for(int i=0;i<enabled_paths.size();i++) { + enabled_list.insert(enabled_paths[i]); + } + + EditorFileSystemDirectory *fs = EditorFileSystem::get_singleton()->get_filesystem(); + if (fs) { + _find_gdnative_singletons(fs,enabled_list); + } + + updating=false; + +} + +void GDNativeLibraryEditor::_item_edited() { + if (updating) + return; + + TreeItem *item = libraries->get_edited(); + if (!item) + return; + + bool enabled = item->get_range(1); + String path = item->get_metadata(0); + + Vector<String> enabled_paths; + if (ProjectSettings::get_singleton()->has("gdnative/singletons")) { + enabled_paths=ProjectSettings::get_singleton()->get("gdnative/singletons"); + } + + if (enabled) { + if (enabled_paths.find(path)==-1) { + enabled_paths.push_back(path); + } + } else { + enabled_paths.erase(path); + } + + if (enabled_paths.size()) { + ProjectSettings::get_singleton()->set("gdnative/singletons",enabled_paths); + } else { + ProjectSettings::get_singleton()->set("gdnative/singletons",Variant()); + } +} + +void GDNativeLibraryEditor::_notification(int p_what) { + + if (p_what==NOTIFICATION_VISIBILITY_CHANGED) { + if (is_visible_in_tree()) { + _update_libraries(); + } + } +} + +void GDNativeLibraryEditor::_bind_methods() { + + ClassDB::bind_method(D_METHOD("_item_edited"),&GDNativeLibraryEditor::_item_edited); +} + +GDNativeLibraryEditor::GDNativeLibraryEditor() +{ + libraries = memnew( Tree ); + libraries->set_columns(2); + libraries->set_column_titles_visible(true); + libraries->set_column_title(0,TTR("Library")); + libraries->set_column_title(1,TTR("Status")); + libraries->set_hide_root(true); + add_margin_child(TTR("Libraries: "),libraries,true); + updating=false; + libraries->connect("item_edited",this,"_item_edited"); +} |