Merge pull request #17576 from Mr-Slurpy/master
Allow users to add items to Tool menu
This commit is contained in:
commit
74382dbfbb
3 changed files with 73 additions and 29 deletions
|
@ -2123,10 +2123,6 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) {
|
||||||
log->add_message("REDO: " + action);
|
log->add_message("REDO: " + action);
|
||||||
|
|
||||||
} break;
|
} break;
|
||||||
case TOOLS_ORPHAN_RESOURCES: {
|
|
||||||
|
|
||||||
orphan_resources->show();
|
|
||||||
} break;
|
|
||||||
|
|
||||||
case EDIT_REVERT: {
|
case EDIT_REVERT: {
|
||||||
|
|
||||||
|
@ -2572,6 +2568,30 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void EditorNode::_tool_menu_option(int p_idx) {
|
||||||
|
switch (tool_menu->get_item_id(p_idx)) {
|
||||||
|
case TOOLS_ORPHAN_RESOURCES: {
|
||||||
|
orphan_resources->show();
|
||||||
|
} break;
|
||||||
|
case TOOLS_CUSTOM: {
|
||||||
|
if (tool_menu->get_item_submenu(p_idx) == "") {
|
||||||
|
Array params = tool_menu->get_item_metadata(p_idx);
|
||||||
|
|
||||||
|
Object *handler = ObjectDB::get_instance(params[0]);
|
||||||
|
String callback = params[1];
|
||||||
|
Variant *ud = ¶ms[2];
|
||||||
|
Variant::CallError ce;
|
||||||
|
|
||||||
|
handler->call(callback, (const Variant **)&ud, 1, ce);
|
||||||
|
if (ce.error != Variant::CallError::CALL_OK) {
|
||||||
|
String err = Variant::get_call_error_text(handler, callback, (const Variant **)&ud, 1, ce);
|
||||||
|
ERR_PRINTS("Error calling function from tool menu: " + err);
|
||||||
|
}
|
||||||
|
} // else it's a submenu so don't do anything.
|
||||||
|
} break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int EditorNode::_next_unsaved_scene(bool p_valid_filename, int p_start) {
|
int EditorNode::_next_unsaved_scene(bool p_valid_filename, int p_start) {
|
||||||
|
|
||||||
for (int i = p_start; i < editor_data.get_edited_scene_count(); i++) {
|
for (int i = p_start; i < editor_data.get_edited_scene_count(); i++) {
|
||||||
|
@ -4464,6 +4484,45 @@ Variant EditorNode::drag_files_and_dirs(const Vector<String> &p_paths, Control *
|
||||||
return drag_data;
|
return drag_data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void EditorNode::add_tool_menu_item(const String &p_name, Object *p_handler, const String &p_callback, const Variant &p_ud) {
|
||||||
|
ERR_FAIL_NULL(p_handler);
|
||||||
|
int idx = tool_menu->get_item_count();
|
||||||
|
tool_menu->add_item(p_name, TOOLS_CUSTOM);
|
||||||
|
|
||||||
|
Array parameters;
|
||||||
|
parameters.push_back(p_handler->get_instance_id());
|
||||||
|
parameters.push_back(p_callback);
|
||||||
|
parameters.push_back(p_ud);
|
||||||
|
|
||||||
|
tool_menu->set_item_metadata(idx, parameters);
|
||||||
|
}
|
||||||
|
|
||||||
|
void EditorNode::add_tool_submenu_item(const String &p_name, PopupMenu *p_submenu) {
|
||||||
|
ERR_FAIL_NULL(p_submenu);
|
||||||
|
ERR_FAIL_COND(p_submenu->get_parent() != NULL);
|
||||||
|
|
||||||
|
tool_menu->add_child(p_submenu);
|
||||||
|
tool_menu->add_submenu_item(p_name, p_submenu->get_name(), TOOLS_CUSTOM);
|
||||||
|
}
|
||||||
|
|
||||||
|
void EditorNode::remove_tool_menu_item(const String &p_name) {
|
||||||
|
for (int i = 0; i < tool_menu->get_item_count(); i++) {
|
||||||
|
if (tool_menu->get_item_id(i) != TOOLS_CUSTOM)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (tool_menu->get_item_text(i) == p_name) {
|
||||||
|
if (tool_menu->get_item_submenu(i) != "") {
|
||||||
|
Node *n = tool_menu->get_node(tool_menu->get_item_submenu(i));
|
||||||
|
tool_menu->remove_child(n);
|
||||||
|
memdelete(n);
|
||||||
|
}
|
||||||
|
tool_menu->remove_item(i);
|
||||||
|
tool_menu->set_as_minsize();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void EditorNode::_dropped_files(const Vector<String> &p_files, int p_screen) {
|
void EditorNode::_dropped_files(const Vector<String> &p_files, int p_screen) {
|
||||||
|
|
||||||
String to_path = ProjectSettings::get_singleton()->globalize_path(get_filesystem_dock()->get_current_path());
|
String to_path = ProjectSettings::get_singleton()->globalize_path(get_filesystem_dock()->get_current_path());
|
||||||
|
@ -4660,6 +4719,7 @@ Vector<Ref<EditorResourceConversionPlugin> > EditorNode::find_resource_conversio
|
||||||
void EditorNode::_bind_methods() {
|
void EditorNode::_bind_methods() {
|
||||||
|
|
||||||
ClassDB::bind_method("_menu_option", &EditorNode::_menu_option);
|
ClassDB::bind_method("_menu_option", &EditorNode::_menu_option);
|
||||||
|
ClassDB::bind_method("_tool_menu_option", &EditorNode::_tool_menu_option);
|
||||||
ClassDB::bind_method("_menu_confirm_current", &EditorNode::_menu_confirm_current);
|
ClassDB::bind_method("_menu_confirm_current", &EditorNode::_menu_confirm_current);
|
||||||
ClassDB::bind_method("_dialog_action", &EditorNode::_dialog_action);
|
ClassDB::bind_method("_dialog_action", &EditorNode::_dialog_action);
|
||||||
ClassDB::bind_method("_resource_selected", &EditorNode::_resource_selected, DEFVAL(""));
|
ClassDB::bind_method("_resource_selected", &EditorNode::_resource_selected, DEFVAL(""));
|
||||||
|
@ -5233,9 +5293,9 @@ EditorNode::EditorNode() {
|
||||||
p->connect("id_pressed", this, "_menu_option");
|
p->connect("id_pressed", this, "_menu_option");
|
||||||
p->add_item(TTR("Export"), FILE_EXPORT_PROJECT);
|
p->add_item(TTR("Export"), FILE_EXPORT_PROJECT);
|
||||||
|
|
||||||
PopupMenu *tool_menu = memnew(PopupMenu);
|
tool_menu = memnew(PopupMenu);
|
||||||
tool_menu->set_name("Tools");
|
tool_menu->set_name("Tools");
|
||||||
tool_menu->connect("id_pressed", this, "_menu_option");
|
tool_menu->connect("index_pressed", this, "_tool_menu_option");
|
||||||
p->add_child(tool_menu);
|
p->add_child(tool_menu);
|
||||||
p->add_submenu_item(TTR("Tools"), "Tools");
|
p->add_submenu_item(TTR("Tools"), "Tools");
|
||||||
tool_menu->add_item(TTR("Orphan Resource Explorer"), TOOLS_ORPHAN_RESOURCES);
|
tool_menu->add_item(TTR("Orphan Resource Explorer"), TOOLS_ORPHAN_RESOURCES);
|
||||||
|
|
|
@ -141,6 +141,7 @@ private:
|
||||||
EDIT_REDO,
|
EDIT_REDO,
|
||||||
EDIT_REVERT,
|
EDIT_REVERT,
|
||||||
TOOLS_ORPHAN_RESOURCES,
|
TOOLS_ORPHAN_RESOURCES,
|
||||||
|
TOOLS_CUSTOM,
|
||||||
RESOURCE_NEW,
|
RESOURCE_NEW,
|
||||||
RESOURCE_LOAD,
|
RESOURCE_LOAD,
|
||||||
RESOURCE_SAVE,
|
RESOURCE_SAVE,
|
||||||
|
@ -426,6 +427,7 @@ private:
|
||||||
void _menu_option(int p_option);
|
void _menu_option(int p_option);
|
||||||
void _menu_confirm_current();
|
void _menu_confirm_current();
|
||||||
void _menu_option_confirm(int p_option, bool p_confirmed);
|
void _menu_option_confirm(int p_option, bool p_confirmed);
|
||||||
|
void _tool_menu_option(int p_idx);
|
||||||
void _update_debug_options();
|
void _update_debug_options();
|
||||||
|
|
||||||
void _property_editor_forward();
|
void _property_editor_forward();
|
||||||
|
@ -600,21 +602,6 @@ private:
|
||||||
static int build_callback_count;
|
static int build_callback_count;
|
||||||
static EditorBuildCallback build_callbacks[MAX_BUILD_CALLBACKS];
|
static EditorBuildCallback build_callbacks[MAX_BUILD_CALLBACKS];
|
||||||
|
|
||||||
bool _initializing_tool_menu;
|
|
||||||
|
|
||||||
struct ToolMenuItem {
|
|
||||||
String name;
|
|
||||||
String submenu;
|
|
||||||
Variant ud;
|
|
||||||
ObjectID handler;
|
|
||||||
String callback;
|
|
||||||
};
|
|
||||||
|
|
||||||
Vector<ToolMenuItem> tool_menu_items;
|
|
||||||
|
|
||||||
void _tool_menu_insert_item(const ToolMenuItem &p_item);
|
|
||||||
void _rebuild_tool_menu() const;
|
|
||||||
|
|
||||||
bool _dimming;
|
bool _dimming;
|
||||||
float _dim_time;
|
float _dim_time;
|
||||||
Timer *_dim_timer;
|
Timer *_dim_timer;
|
||||||
|
|
|
@ -429,21 +429,18 @@ void EditorPlugin::remove_control_from_container(CustomControlContainer p_locati
|
||||||
}
|
}
|
||||||
|
|
||||||
void EditorPlugin::add_tool_menu_item(const String &p_name, Object *p_handler, const String &p_callback, const Variant &p_ud) {
|
void EditorPlugin::add_tool_menu_item(const String &p_name, Object *p_handler, const String &p_callback, const Variant &p_ud) {
|
||||||
|
EditorNode::get_singleton()->add_tool_menu_item(p_name, p_handler, p_callback, p_ud);
|
||||||
//EditorNode::get_singleton()->add_tool_menu_item(p_name, p_handler, p_callback, p_ud);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void EditorPlugin::add_tool_submenu_item(const String &p_name, Object *p_submenu) {
|
void EditorPlugin::add_tool_submenu_item(const String &p_name, Object *p_submenu) {
|
||||||
|
|
||||||
ERR_FAIL_NULL(p_submenu);
|
ERR_FAIL_NULL(p_submenu);
|
||||||
PopupMenu *submenu = Object::cast_to<PopupMenu>(p_submenu);
|
PopupMenu *submenu = Object::cast_to<PopupMenu>(p_submenu);
|
||||||
ERR_FAIL_NULL(submenu);
|
ERR_FAIL_NULL(submenu);
|
||||||
//EditorNode::get_singleton()->add_tool_submenu_item(p_name, submenu);
|
EditorNode::get_singleton()->add_tool_submenu_item(p_name, submenu);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EditorPlugin::remove_tool_menu_item(const String &p_name) {
|
void EditorPlugin::remove_tool_menu_item(const String &p_name) {
|
||||||
|
EditorNode::get_singleton()->remove_tool_menu_item(p_name);
|
||||||
//EditorNode::get_singleton()->remove_tool_menu_item(p_name);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void EditorPlugin::set_input_event_forwarding_always_enabled() {
|
void EditorPlugin::set_input_event_forwarding_always_enabled() {
|
||||||
|
@ -707,9 +704,9 @@ void EditorPlugin::_bind_methods() {
|
||||||
ClassDB::bind_method(D_METHOD("remove_control_from_docks", "control"), &EditorPlugin::remove_control_from_docks);
|
ClassDB::bind_method(D_METHOD("remove_control_from_docks", "control"), &EditorPlugin::remove_control_from_docks);
|
||||||
ClassDB::bind_method(D_METHOD("remove_control_from_bottom_panel", "control"), &EditorPlugin::remove_control_from_bottom_panel);
|
ClassDB::bind_method(D_METHOD("remove_control_from_bottom_panel", "control"), &EditorPlugin::remove_control_from_bottom_panel);
|
||||||
ClassDB::bind_method(D_METHOD("remove_control_from_container", "container", "control"), &EditorPlugin::remove_control_from_container);
|
ClassDB::bind_method(D_METHOD("remove_control_from_container", "container", "control"), &EditorPlugin::remove_control_from_container);
|
||||||
//ClassDB::bind_method(D_METHOD("add_tool_menu_item", "name", "handler", "callback", "ud"),&EditorPlugin::add_tool_menu_item,DEFVAL(Variant()));
|
ClassDB::bind_method(D_METHOD("add_tool_menu_item", "name", "handler", "callback", "ud"), &EditorPlugin::add_tool_menu_item, DEFVAL(Variant()));
|
||||||
ClassDB::bind_method(D_METHOD("add_tool_submenu_item", "name", "submenu"), &EditorPlugin::add_tool_submenu_item);
|
ClassDB::bind_method(D_METHOD("add_tool_submenu_item", "name", "submenu"), &EditorPlugin::add_tool_submenu_item);
|
||||||
//ClassDB::bind_method(D_METHOD("remove_tool_menu_item", "name"),&EditorPlugin::remove_tool_menu_item);
|
ClassDB::bind_method(D_METHOD("remove_tool_menu_item", "name"), &EditorPlugin::remove_tool_menu_item);
|
||||||
ClassDB::bind_method(D_METHOD("add_custom_type", "type", "base", "script", "icon"), &EditorPlugin::add_custom_type);
|
ClassDB::bind_method(D_METHOD("add_custom_type", "type", "base", "script", "icon"), &EditorPlugin::add_custom_type);
|
||||||
ClassDB::bind_method(D_METHOD("remove_custom_type", "type"), &EditorPlugin::remove_custom_type);
|
ClassDB::bind_method(D_METHOD("remove_custom_type", "type"), &EditorPlugin::remove_custom_type);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue