diff --git a/modules/gdnative/gd_native_library_editor.cpp b/modules/gdnative/gd_native_library_editor.cpp new file mode 100644 index 00000000000..8aa931d6c97 --- /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 &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 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 enabled_paths; + if (ProjectSettings::get_singleton()->has("gdnative/singletons")) { + enabled_paths=ProjectSettings::get_singleton()->get("gdnative/singletons"); + } + Set enabled_list; + for(int i=0;iget_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 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"); +} diff --git a/modules/gdnative/gd_native_library_editor.h b/modules/gdnative/gd_native_library_editor.h new file mode 100644 index 00000000000..a6c8f317906 --- /dev/null +++ b/modules/gdnative/gd_native_library_editor.h @@ -0,0 +1,26 @@ +#ifndef GD_NATIVE_LIBRARY_EDITOR_H +#define GD_NATIVE_LIBRARY_EDITOR_H + +#ifdef TOOLS_ENABLED +#include "editor/project_settings_editor.h" +#include "editor/editor_file_system.h" + +class GDNativeLibraryEditor : public VBoxContainer +{ + Tree *libraries; + + bool updating; + void _update_libraries(); + + void _find_gdnative_singletons(EditorFileSystemDirectory *p_dir,const Set& enabled_list); + void _item_edited(); +protected: + + void _notification(int p_what); + static void _bind_methods(); +public: + GDNativeLibraryEditor(); +}; + +#endif +#endif // GD_NATIVE_LIBRARY_EDITOR_H diff --git a/modules/gdnative/register_types.cpp b/modules/gdnative/register_types.cpp index 559e9fa4551..dc0da5021dd 100644 --- a/modules/gdnative/register_types.cpp +++ b/modules/gdnative/register_types.cpp @@ -43,7 +43,7 @@ #ifdef TOOLS_ENABLED #include "editor/editor_node.h" - +#include "gd_native_library_editor.h" // Class used to discover singleton gdnative files void actual_discoverer_handler(); @@ -99,6 +99,7 @@ Set get_gdnative_singletons(EditorFileSystemDirectory *p_dir) { void actual_discoverer_handler() { EditorFileSystemDirectory *dir = EditorFileSystem::get_singleton()->get_filesystem(); + Set file_paths = get_gdnative_singletons(dir); Array files; @@ -115,7 +116,13 @@ void actual_discoverer_handler() { GDNativeSingletonDiscover *discoverer = NULL; -void discoverer_callback() { +static void editor_init_callback() { + + GDNativeLibraryEditor *library_editor = memnew( GDNativeLibraryEditor ); + library_editor->set_name(TTR("GDNative")); + ProjectSettingsEditor::get_singleton()->get_tabs()->add_child(library_editor); + + discoverer = memnew(GDNativeSingletonDiscover); EditorFileSystem::get_singleton()->connect("filesystem_changed", discoverer, "get_class"); } @@ -184,7 +191,7 @@ void register_gdnative_types() { #ifdef TOOLS_ENABLED if (Engine::get_singleton()->is_editor_hint()) { - EditorNode::add_init_callback(discoverer_callback); + EditorNode::add_init_callback(editor_init_callback); } #endif