mirror of
https://github.com/Relintai/pandemonium_engine.git
synced 2025-02-13 03:10:09 +01:00
Now custom nodes can be added to the SceneTreeDock's create root node page.
This commit is contained in:
parent
b823759397
commit
a286c2ecd9
@ -1177,11 +1177,12 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
|
|||||||
case TOOL_CREATE_2D_SCENE:
|
case TOOL_CREATE_2D_SCENE:
|
||||||
case TOOL_CREATE_3D_SCENE:
|
case TOOL_CREATE_3D_SCENE:
|
||||||
case TOOL_CREATE_USER_INTERFACE:
|
case TOOL_CREATE_USER_INTERFACE:
|
||||||
|
case TOOL_CREATE_CUSTOM_ROOT_CLASS:
|
||||||
case TOOL_CREATE_FAVORITE: {
|
case TOOL_CREATE_FAVORITE: {
|
||||||
Node *new_node = nullptr;
|
Node *new_node = nullptr;
|
||||||
|
|
||||||
if (TOOL_CREATE_FAVORITE == p_tool) {
|
if (TOOL_CREATE_FAVORITE == p_tool) {
|
||||||
String name = selected_favorite_root.get_slicec(' ', 0);
|
String name = selected_root.get_slicec(' ', 0);
|
||||||
if (ScriptServer::is_global_class(name)) {
|
if (ScriptServer::is_global_class(name)) {
|
||||||
new_node = Object::cast_to<Node>(ClassDB::instance(ScriptServer::get_global_class_native_base(name)));
|
new_node = Object::cast_to<Node>(ClassDB::instance(ScriptServer::get_global_class_native_base(name)));
|
||||||
Ref<Script> script = ResourceLoader::load(ScriptServer::get_global_class_path(name), "Script");
|
Ref<Script> script = ResourceLoader::load(ScriptServer::get_global_class_path(name), "Script");
|
||||||
@ -1190,12 +1191,19 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
|
|||||||
new_node->set_name(name);
|
new_node->set_name(name);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
new_node = Object::cast_to<Node>(ClassDB::instance(selected_favorite_root));
|
new_node = Object::cast_to<Node>(ClassDB::instance(selected_root));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!new_node) {
|
if (!new_node) {
|
||||||
new_node = memnew(Node);
|
new_node = memnew(Node);
|
||||||
ERR_PRINT("Creating root from favorite '" + selected_favorite_root + "' failed. Creating 'Node' instead.");
|
ERR_PRINT("Creating root from favorite '" + selected_root + "' failed. Creating 'Node' instead.");
|
||||||
|
}
|
||||||
|
} else if (p_tool == TOOL_CREATE_CUSTOM_ROOT_CLASS) {
|
||||||
|
new_node = Object::cast_to<Node>(ClassDB::instance(selected_root));
|
||||||
|
|
||||||
|
if (!new_node) {
|
||||||
|
new_node = memnew(Node);
|
||||||
|
ERR_PRINT("Creating custom root '" + selected_root + "' failed. Creating 'Node' instead.");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
switch (p_tool) {
|
switch (p_tool) {
|
||||||
@ -3092,6 +3100,19 @@ void SceneTreeDock::_update_create_root_dialog() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (beginner_nodes) {
|
||||||
|
for (int i = 0; i < _custom_scene_root_classes.size(); ++i) {
|
||||||
|
CustomSceneRootClassEntry e = _custom_scene_root_classes[i];
|
||||||
|
|
||||||
|
Button *button = memnew(Button);
|
||||||
|
beginner_nodes->add_child(button);
|
||||||
|
button->set_text(TTR(e.name));
|
||||||
|
button->set_clip_text(true);
|
||||||
|
button->set_icon(EditorNode::get_singleton()->get_class_icon(e.class_name));
|
||||||
|
button->connect("pressed", this, "_custom_root_selected", make_binds(e.class_name));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
EditorSettings::get_singleton()->set_setting("_use_favorites_root_selection", toggle->is_pressed());
|
EditorSettings::get_singleton()->set_setting("_use_favorites_root_selection", toggle->is_pressed());
|
||||||
EditorSettings::get_singleton()->save();
|
EditorSettings::get_singleton()->save();
|
||||||
if (toggle->is_pressed()) {
|
if (toggle->is_pressed()) {
|
||||||
@ -3135,10 +3156,15 @@ void SceneTreeDock::_update_create_root_dialog() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void SceneTreeDock::_favorite_root_selected(const String &p_class) {
|
void SceneTreeDock::_favorite_root_selected(const String &p_class) {
|
||||||
selected_favorite_root = p_class;
|
selected_root = p_class;
|
||||||
_tool_selected(TOOL_CREATE_FAVORITE, false);
|
_tool_selected(TOOL_CREATE_FAVORITE, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SceneTreeDock::_custom_root_selected(const String &p_class) {
|
||||||
|
selected_root = p_class;
|
||||||
|
_tool_selected(TOOL_CREATE_CUSTOM_ROOT_CLASS, false);
|
||||||
|
}
|
||||||
|
|
||||||
void SceneTreeDock::_clear_clipboard() {
|
void SceneTreeDock::_clear_clipboard() {
|
||||||
for (List<Node *>::Element *E = node_clipboard.front(); E; E = E->next()) {
|
for (List<Node *>::Element *E = node_clipboard.front(); E; E = E->next()) {
|
||||||
memdelete(E->get());
|
memdelete(E->get());
|
||||||
@ -3243,6 +3269,7 @@ void SceneTreeDock::_bind_methods() {
|
|||||||
ClassDB::bind_method(D_METHOD("_local_tree_selected"), &SceneTreeDock::_local_tree_selected);
|
ClassDB::bind_method(D_METHOD("_local_tree_selected"), &SceneTreeDock::_local_tree_selected);
|
||||||
ClassDB::bind_method(D_METHOD("_update_script_button"), &SceneTreeDock::_update_script_button);
|
ClassDB::bind_method(D_METHOD("_update_script_button"), &SceneTreeDock::_update_script_button);
|
||||||
ClassDB::bind_method(D_METHOD("_favorite_root_selected"), &SceneTreeDock::_favorite_root_selected);
|
ClassDB::bind_method(D_METHOD("_favorite_root_selected"), &SceneTreeDock::_favorite_root_selected);
|
||||||
|
ClassDB::bind_method(D_METHOD("_custom_root_selected"), &SceneTreeDock::_custom_root_selected);
|
||||||
ClassDB::bind_method(D_METHOD("_update_create_root_dialog"), &SceneTreeDock::_update_create_root_dialog);
|
ClassDB::bind_method(D_METHOD("_update_create_root_dialog"), &SceneTreeDock::_update_create_root_dialog);
|
||||||
|
|
||||||
ClassDB::bind_method(D_METHOD("instance"), &SceneTreeDock::instance);
|
ClassDB::bind_method(D_METHOD("instance"), &SceneTreeDock::instance);
|
||||||
@ -3254,6 +3281,37 @@ void SceneTreeDock::_bind_methods() {
|
|||||||
ADD_SIGNAL(MethodInfo("node_created", PropertyInfo(Variant::OBJECT, "node", PROPERTY_HINT_RESOURCE_TYPE, "Node")));
|
ADD_SIGNAL(MethodInfo("node_created", PropertyInfo(Variant::OBJECT, "node", PROPERTY_HINT_RESOURCE_TYPE, "Node")));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int SceneTreeDock::add_custom_scene_root_class(const String &p_name, const String &p_class_name) {
|
||||||
|
int next_id = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < _custom_scene_root_classes.size(); ++i) {
|
||||||
|
int cid = _custom_scene_root_classes[i].id;
|
||||||
|
|
||||||
|
if (cid > next_id) {
|
||||||
|
next_id = cid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
++next_id;
|
||||||
|
|
||||||
|
CustomSceneRootClassEntry e;
|
||||||
|
e.id = next_id;
|
||||||
|
e.name = p_name;
|
||||||
|
e.class_name = p_class_name;
|
||||||
|
|
||||||
|
_custom_scene_root_classes.push_back(e);
|
||||||
|
|
||||||
|
return next_id;
|
||||||
|
}
|
||||||
|
void SceneTreeDock::remove_custom_scene_root_class(const int id) {
|
||||||
|
for (int i = 0; i < _custom_scene_root_classes.size(); ++i) {
|
||||||
|
if (_custom_scene_root_classes[i].id == id) {
|
||||||
|
_custom_scene_root_classes.remove(i);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
SceneTreeDock::SceneTreeDock(EditorNode *p_editor, Node *p_scene_root, EditorSelection *p_editor_selection, EditorData &p_editor_data) {
|
SceneTreeDock::SceneTreeDock(EditorNode *p_editor, Node *p_scene_root, EditorSelection *p_editor_selection, EditorData &p_editor_data) {
|
||||||
set_name("Scene");
|
set_name("Scene");
|
||||||
editor = p_editor;
|
editor = p_editor;
|
||||||
|
@ -35,13 +35,13 @@
|
|||||||
#include "core/containers/hash_map.h"
|
#include "core/containers/hash_map.h"
|
||||||
#include "core/containers/list.h"
|
#include "core/containers/list.h"
|
||||||
#include "core/containers/map.h"
|
#include "core/containers/map.h"
|
||||||
#include "core/string/node_path.h"
|
#include "core/containers/set.h"
|
||||||
|
#include "core/containers/vector.h"
|
||||||
#include "core/object/object_id.h"
|
#include "core/object/object_id.h"
|
||||||
#include "core/object/reference.h"
|
#include "core/object/reference.h"
|
||||||
#include "core/object/resource.h"
|
#include "core/object/resource.h"
|
||||||
#include "core/containers/set.h"
|
#include "core/string/node_path.h"
|
||||||
#include "core/string/ustring.h"
|
#include "core/string/ustring.h"
|
||||||
#include "core/containers/vector.h"
|
|
||||||
|
|
||||||
#include "modules/modules_enabled.gen.h" // For regex.
|
#include "modules/modules_enabled.gen.h" // For regex.
|
||||||
|
|
||||||
@ -117,6 +117,7 @@ class SceneTreeDock : public VBoxContainer {
|
|||||||
TOOL_CREATE_2D_SCENE,
|
TOOL_CREATE_2D_SCENE,
|
||||||
TOOL_CREATE_3D_SCENE,
|
TOOL_CREATE_3D_SCENE,
|
||||||
TOOL_CREATE_USER_INTERFACE,
|
TOOL_CREATE_USER_INTERFACE,
|
||||||
|
TOOL_CREATE_CUSTOM_ROOT_CLASS,
|
||||||
TOOL_CREATE_FAVORITE,
|
TOOL_CREATE_FAVORITE,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -195,7 +196,7 @@ class SceneTreeDock : public VBoxContainer {
|
|||||||
bool tree_clicked;
|
bool tree_clicked;
|
||||||
|
|
||||||
VBoxContainer *create_root_dialog;
|
VBoxContainer *create_root_dialog;
|
||||||
String selected_favorite_root;
|
String selected_root;
|
||||||
|
|
||||||
void _add_children_to_popup(Object *p_obj, int p_depth);
|
void _add_children_to_popup(Object *p_obj, int p_depth);
|
||||||
|
|
||||||
@ -271,6 +272,7 @@ class SceneTreeDock : public VBoxContainer {
|
|||||||
|
|
||||||
void _update_create_root_dialog();
|
void _update_create_root_dialog();
|
||||||
void _favorite_root_selected(const String &p_class);
|
void _favorite_root_selected(const String &p_class);
|
||||||
|
void _custom_root_selected(const String &p_class);
|
||||||
|
|
||||||
void _clear_clipboard();
|
void _clear_clipboard();
|
||||||
void _create_remap_for_node(Node *p_node, Map<RES, RES> &r_remap);
|
void _create_remap_for_node(Node *p_node, Map<RES, RES> &r_remap);
|
||||||
@ -279,6 +281,14 @@ class SceneTreeDock : public VBoxContainer {
|
|||||||
bool _update_node_path(Node *p_root_node, NodePath &r_node_path, Map<Node *, NodePath> *p_renames) const;
|
bool _update_node_path(Node *p_root_node, NodePath &r_node_path, Map<Node *, NodePath> *p_renames) const;
|
||||||
bool _check_node_path_recursive(Node *p_root_node, Variant &r_variant, Map<Node *, NodePath> *p_renames) const;
|
bool _check_node_path_recursive(Node *p_root_node, Variant &r_variant, Map<Node *, NodePath> *p_renames) const;
|
||||||
|
|
||||||
|
struct CustomSceneRootClassEntry {
|
||||||
|
int id;
|
||||||
|
String name;
|
||||||
|
String class_name;
|
||||||
|
};
|
||||||
|
|
||||||
|
Vector<CustomSceneRootClassEntry> _custom_scene_root_classes;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void _notification(int p_what);
|
void _notification(int p_what);
|
||||||
static void _bind_methods();
|
static void _bind_methods();
|
||||||
@ -297,6 +307,7 @@ public:
|
|||||||
void set_selected(Node *p_node, bool p_emit_selected = false);
|
void set_selected(Node *p_node, bool p_emit_selected = false);
|
||||||
void fill_path_renames(Node *p_node, Node *p_new_parent, Map<Node *, NodePath> *p_renames);
|
void fill_path_renames(Node *p_node, Node *p_new_parent, Map<Node *, NodePath> *p_renames);
|
||||||
void perform_node_renames(Node *p_base, Map<Node *, NodePath> *p_renames, Map<Ref<Animation>, Set<int>> *r_rem_anims = nullptr);
|
void perform_node_renames(Node *p_base, Map<Node *, NodePath> *p_renames, Map<Ref<Animation>, Set<int>> *r_rem_anims = nullptr);
|
||||||
|
|
||||||
SceneTreeEditor *get_tree_editor() {
|
SceneTreeEditor *get_tree_editor() {
|
||||||
return scene_tree;
|
return scene_tree;
|
||||||
}
|
}
|
||||||
@ -322,6 +333,9 @@ public:
|
|||||||
return script_create_dialog;
|
return script_create_dialog;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int add_custom_scene_root_class(const String &p_name, const String &p_class_name);
|
||||||
|
void remove_custom_scene_root_class(const int id);
|
||||||
|
|
||||||
SceneTreeDock(EditorNode *p_editor, Node *p_scene_root, EditorSelection *p_editor_selection, EditorData &p_editor_data);
|
SceneTreeDock(EditorNode *p_editor, Node *p_scene_root, EditorSelection *p_editor_selection, EditorData &p_editor_data);
|
||||||
~SceneTreeDock();
|
~SceneTreeDock();
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user