Explorar el Código

Added a menu to enable/disabled GDNative singletons in project settings

Juan Linietsky hace 8 años
padre
commit
35ed1eef2a

+ 120 - 0
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");
+}

+ 26 - 0
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<String>& enabled_list);
+	void _item_edited();
+protected:
+
+	void _notification(int p_what);
+	static void _bind_methods();
+public:
+	GDNativeLibraryEditor();
+};
+
+#endif
+#endif // GD_NATIVE_LIBRARY_EDITOR_H

+ 10 - 3
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<String> get_gdnative_singletons(EditorFileSystemDirectory *p_dir) {
 void actual_discoverer_handler() {
 	EditorFileSystemDirectory *dir = EditorFileSystem::get_singleton()->get_filesystem();
 
+
 	Set<String> 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