Browse Source

Make several actions in the Inspector dock more obvious

Yuri Sizov 4 years ago
parent
commit
f6d827b0da
4 changed files with 162 additions and 59 deletions
  1. 86 14
      editor/editor_path.cpp
  2. 13 3
      editor/editor_path.h
  3. 61 42
      editor/inspector_dock.cpp
  4. 2 0
      editor/inspector_dock.h

+ 86 - 14
editor/editor_path.cpp

@@ -59,15 +59,40 @@ void EditorPath::_add_children_to_popup(Object *p_obj, int p_depth) {
 
 
 		Ref<Texture2D> icon = EditorNode::get_singleton()->get_object_icon(obj);
 		Ref<Texture2D> icon = EditorNode::get_singleton()->get_object_icon(obj);
 
 
-		int index = get_popup()->get_item_count();
-		get_popup()->add_icon_item(icon, E->get().name.capitalize(), objects.size());
-		get_popup()->set_item_h_offset(index, p_depth * 10 * EDSCALE);
+		String proper_name = "";
+		Vector<String> name_parts = E->get().name.split("/");
+
+		for (int i = 0; i < name_parts.size(); i++) {
+			if (i > 0) {
+				proper_name += " > ";
+			}
+			proper_name += name_parts[i].capitalize();
+		}
+
+		int index = sub_objects_menu->get_item_count();
+		sub_objects_menu->add_icon_item(icon, proper_name, objects.size());
+		sub_objects_menu->set_item_h_offset(index, p_depth * 10 * EDSCALE);
 		objects.push_back(obj->get_instance_id());
 		objects.push_back(obj->get_instance_id());
 
 
 		_add_children_to_popup(obj, p_depth + 1);
 		_add_children_to_popup(obj, p_depth + 1);
 	}
 	}
 }
 }
 
 
+void EditorPath::_show_popup() {
+	sub_objects_menu->clear();
+
+	Size2 size = get_size();
+	Point2 gp = get_screen_position();
+	gp.y += size.y;
+
+	sub_objects_menu->set_position(gp);
+	sub_objects_menu->set_size(Size2(size.width, 1));
+	sub_objects_menu->set_parent_rect(Rect2(Point2(gp - sub_objects_menu->get_position()), size));
+
+	sub_objects_menu->take_mouse_focus();
+	sub_objects_menu->popup();
+}
+
 void EditorPath::_about_to_show() {
 void EditorPath::_about_to_show() {
 	Object *obj = ObjectDB::get_instance(history->get_path_object(history->get_path_size() - 1));
 	Object *obj = ObjectDB::get_instance(history->get_path_object(history->get_path_size() - 1));
 	if (!obj) {
 	if (!obj) {
@@ -75,13 +100,11 @@ void EditorPath::_about_to_show() {
 	}
 	}
 
 
 	objects.clear();
 	objects.clear();
-	get_popup()->clear();
-	get_popup()->set_size(Size2(get_size().width, 1));
 
 
 	_add_children_to_popup(obj);
 	_add_children_to_popup(obj);
-	if (get_popup()->get_item_count() == 0) {
-		get_popup()->add_item(TTR("No sub-resources found."));
-		get_popup()->set_item_disabled(0, true);
+	if (sub_objects_menu->get_item_count() == 0) {
+		sub_objects_menu->add_item(TTR("No sub-resources found."));
+		sub_objects_menu->set_item_disabled(0, true);
 	}
 	}
 }
 }
 
 
@@ -94,7 +117,7 @@ void EditorPath::update_path() {
 
 
 		Ref<Texture2D> icon = EditorNode::get_singleton()->get_object_icon(obj);
 		Ref<Texture2D> icon = EditorNode::get_singleton()->get_object_icon(obj);
 		if (icon.is_valid()) {
 		if (icon.is_valid()) {
-			set_icon(icon);
+			current_object_icon->set_texture(icon);
 		}
 		}
 
 
 		if (i == history->get_path_size() - 1) {
 		if (i == history->get_path_size() - 1) {
@@ -120,12 +143,26 @@ void EditorPath::update_path() {
 				name = obj->get_class();
 				name = obj->get_class();
 			}
 			}
 
 
-			set_text(" " + name); // An extra space so the text is not too close of the icon.
+			current_object_label->set_text(" " + name); // An extra space so the text is not too close of the icon.
 			set_tooltip(obj->get_class());
 			set_tooltip(obj->get_class());
 		}
 		}
 	}
 	}
 }
 }
 
 
+void EditorPath::clear_path() {
+	set_disabled(true);
+	set_tooltip("");
+
+	current_object_label->set_text("");
+	current_object_icon->set_texture(nullptr);
+	sub_objects_icon->set_visible(false);
+}
+
+void EditorPath::enable_path() {
+	set_disabled(false);
+	sub_objects_icon->set_visible(true);
+}
+
 void EditorPath::_id_pressed(int p_idx) {
 void EditorPath::_id_pressed(int p_idx) {
 	ERR_FAIL_INDEX(p_idx, objects.size());
 	ERR_FAIL_INDEX(p_idx, objects.size());
 
 
@@ -139,8 +176,16 @@ void EditorPath::_id_pressed(int p_idx) {
 
 
 void EditorPath::_notification(int p_what) {
 void EditorPath::_notification(int p_what) {
 	switch (p_what) {
 	switch (p_what) {
+		case NOTIFICATION_ENTER_TREE:
 		case NOTIFICATION_THEME_CHANGED: {
 		case NOTIFICATION_THEME_CHANGED: {
 			update_path();
 			update_path();
+
+			sub_objects_icon->set_texture(get_theme_icon("select_arrow", "Tree"));
+			current_object_label->add_theme_font_override("font", get_theme_font("main", "EditorFonts"));
+		} break;
+
+		case NOTIFICATION_READY: {
+			connect("pressed", callable_mp(this, &EditorPath::_show_popup));
 		} break;
 		} break;
 	}
 	}
 }
 }
@@ -150,8 +195,35 @@ void EditorPath::_bind_methods() {
 
 
 EditorPath::EditorPath(EditorHistory *p_history) {
 EditorPath::EditorPath(EditorHistory *p_history) {
 	history = p_history;
 	history = p_history;
-	set_clip_text(true);
-	set_text_align(ALIGN_LEFT);
-	get_popup()->connect("about_to_popup", callable_mp(this, &EditorPath::_about_to_show));
-	get_popup()->connect("id_pressed", callable_mp(this, &EditorPath::_id_pressed));
+
+	MarginContainer *main_mc = memnew(MarginContainer);
+	main_mc->set_anchors_and_offsets_preset(PRESET_WIDE);
+	main_mc->add_theme_constant_override("margin_left", 4 * EDSCALE);
+	main_mc->add_theme_constant_override("margin_right", 6 * EDSCALE);
+	add_child(main_mc);
+
+	HBoxContainer *main_hb = memnew(HBoxContainer);
+	main_mc->add_child(main_hb);
+
+	current_object_icon = memnew(TextureRect);
+	current_object_icon->set_stretch_mode(TextureRect::STRETCH_KEEP_CENTERED);
+	main_hb->add_child(current_object_icon);
+
+	current_object_label = memnew(Label);
+	current_object_label->set_clip_text(true);
+	current_object_label->set_align(Label::ALIGN_LEFT);
+	current_object_label->set_h_size_flags(SIZE_EXPAND_FILL);
+	main_hb->add_child(current_object_label);
+
+	sub_objects_icon = memnew(TextureRect);
+	sub_objects_icon->set_visible(false);
+	sub_objects_icon->set_stretch_mode(TextureRect::STRETCH_KEEP_CENTERED);
+	main_hb->add_child(sub_objects_icon);
+
+	sub_objects_menu = memnew(PopupMenu);
+	add_child(sub_objects_menu);
+	sub_objects_menu->connect("about_to_popup", callable_mp(this, &EditorPath::_about_to_show));
+	sub_objects_menu->connect("id_pressed", callable_mp(this, &EditorPath::_id_pressed));
+
+	set_tooltip(TTR("Open a list of sub-resources."));
 }
 }

+ 13 - 3
editor/editor_path.h

@@ -32,16 +32,24 @@
 #define EDITOR_PATH_H
 #define EDITOR_PATH_H
 
 
 #include "editor_data.h"
 #include "editor_data.h"
-#include "scene/gui/menu_button.h"
+#include "scene/gui/box_container.h"
+#include "scene/gui/button.h"
+#include "scene/gui/popup_menu.h"
 
 
-class EditorPath : public MenuButton {
-	GDCLASS(EditorPath, MenuButton);
+class EditorPath : public Button {
+	GDCLASS(EditorPath, Button);
 
 
 	EditorHistory *history;
 	EditorHistory *history;
 
 
+	TextureRect *current_object_icon;
+	Label *current_object_label;
+	TextureRect *sub_objects_icon;
+	PopupMenu *sub_objects_menu;
+
 	Vector<ObjectID> objects;
 	Vector<ObjectID> objects;
 	EditorPath();
 	EditorPath();
 
 
+	void _show_popup();
 	void _id_pressed(int p_idx);
 	void _id_pressed(int p_idx);
 	void _about_to_show();
 	void _about_to_show();
 	void _add_children_to_popup(Object *p_obj, int p_depth = 0);
 	void _add_children_to_popup(Object *p_obj, int p_depth = 0);
@@ -52,6 +60,8 @@ protected:
 
 
 public:
 public:
 	void update_path();
 	void update_path();
+	void clear_path();
+	void enable_path();
 
 
 	EditorPath(EditorHistory *p_history);
 	EditorPath(EditorHistory *p_history);
 };
 };

+ 61 - 42
editor/inspector_dock.cpp

@@ -42,6 +42,14 @@ void InspectorDock::_menu_option(int p_option) {
 		case COLLAPSE_ALL: {
 		case COLLAPSE_ALL: {
 			_menu_collapseall();
 			_menu_collapseall();
 		} break;
 		} break;
+
+		case RESOURCE_SAVE: {
+			_save_resource(false);
+		} break;
+		case RESOURCE_SAVE_AS: {
+			_save_resource(true);
+		} break;
+
 		case RESOURCE_MAKE_BUILT_IN: {
 		case RESOURCE_MAKE_BUILT_IN: {
 			_unref_resource();
 			_unref_resource();
 		} break;
 		} break;
@@ -52,13 +60,6 @@ void InspectorDock::_menu_option(int p_option) {
 			_paste_resource();
 			_paste_resource();
 		} break;
 		} break;
 
 
-		case RESOURCE_SAVE: {
-			_save_resource(false);
-		} break;
-		case RESOURCE_SAVE_AS: {
-			_save_resource(true);
-		} break;
-
 		case OBJECT_REQUEST_HELP: {
 		case OBJECT_REQUEST_HELP: {
 			if (current) {
 			if (current) {
 				editor->set_visible_editor(EditorNode::EDITOR_SCRIPT);
 				editor->set_visible_editor(EditorNode::EDITOR_SCRIPT);
@@ -335,9 +336,16 @@ void InspectorDock::_notification(int p_what) {
 		case NOTIFICATION_LAYOUT_DIRECTION_CHANGED:
 		case NOTIFICATION_LAYOUT_DIRECTION_CHANGED:
 		case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
 		case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
 			set_theme(editor->get_gui_base()->get_theme());
 			set_theme(editor->get_gui_base()->get_theme());
+
 			resource_new_button->set_icon(get_theme_icon("New", "EditorIcons"));
 			resource_new_button->set_icon(get_theme_icon("New", "EditorIcons"));
 			resource_load_button->set_icon(get_theme_icon("Load", "EditorIcons"));
 			resource_load_button->set_icon(get_theme_icon("Load", "EditorIcons"));
 			resource_save_button->set_icon(get_theme_icon("Save", "EditorIcons"));
 			resource_save_button->set_icon(get_theme_icon("Save", "EditorIcons"));
+			resource_extra_button->set_icon(get_theme_icon("GuiTabMenu", "EditorIcons"));
+
+			PopupMenu *resource_extra_popup = resource_extra_button->get_popup();
+			resource_extra_popup->set_item_icon(resource_extra_popup->get_item_index(RESOURCE_EDIT_CLIPBOARD), get_theme_icon("ActionPaste", "EditorIcons"));
+			resource_extra_popup->set_item_icon(resource_extra_popup->get_item_index(RESOURCE_COPY), get_theme_icon("ActionCopy", "EditorIcons"));
+
 			if (is_layout_rtl()) {
 			if (is_layout_rtl()) {
 				backward_button->set_icon(get_theme_icon("Forward", "EditorIcons"));
 				backward_button->set_icon(get_theme_icon("Forward", "EditorIcons"));
 				forward_button->set_icon(get_theme_icon("Back", "EditorIcons"));
 				forward_button->set_icon(get_theme_icon("Back", "EditorIcons"));
@@ -345,6 +353,7 @@ void InspectorDock::_notification(int p_what) {
 				backward_button->set_icon(get_theme_icon("Back", "EditorIcons"));
 				backward_button->set_icon(get_theme_icon("Back", "EditorIcons"));
 				forward_button->set_icon(get_theme_icon("Forward", "EditorIcons"));
 				forward_button->set_icon(get_theme_icon("Forward", "EditorIcons"));
 			}
 			}
+
 			history_menu->set_icon(get_theme_icon("History", "EditorIcons"));
 			history_menu->set_icon(get_theme_icon("History", "EditorIcons"));
 			object_menu->set_icon(get_theme_icon("Tools", "EditorIcons"));
 			object_menu->set_icon(get_theme_icon("Tools", "EditorIcons"));
 			warning->set_icon(get_theme_icon("NodeWarning", "EditorIcons"));
 			warning->set_icon(get_theme_icon("NodeWarning", "EditorIcons"));
@@ -403,12 +412,7 @@ void InspectorDock::update(Object *p_object) {
 		object_menu->set_disabled(true);
 		object_menu->set_disabled(true);
 		warning->hide();
 		warning->hide();
 		search->set_editable(false);
 		search->set_editable(false);
-
-		editor_path->set_disabled(true);
-		editor_path->set_text("");
-		editor_path->set_tooltip("");
-		editor_path->set_icon(nullptr);
-
+		editor_path->clear_path();
 		return;
 		return;
 	}
 	}
 
 
@@ -417,35 +421,28 @@ void InspectorDock::update(Object *p_object) {
 
 
 	object_menu->set_disabled(false);
 	object_menu->set_disabled(false);
 	search->set_editable(true);
 	search->set_editable(true);
-	editor_path->set_disabled(false);
+	editor_path->enable_path();
+
 	resource_save_button->set_disabled(!is_resource);
 	resource_save_button->set_disabled(!is_resource);
+	open_docs_button->set_visible(is_resource || is_node);
+
+	PopupMenu *resource_extra_popup = resource_extra_button->get_popup();
+	resource_extra_popup->set_item_disabled(resource_extra_popup->get_item_index(RESOURCE_COPY), !is_resource);
+	resource_extra_popup->set_item_disabled(resource_extra_popup->get_item_index(RESOURCE_MAKE_BUILT_IN), !is_resource);
 
 
 	PopupMenu *p = object_menu->get_popup();
 	PopupMenu *p = object_menu->get_popup();
 
 
 	p->clear();
 	p->clear();
-	p->add_shortcut(ED_SHORTCUT("property_editor/expand_all", TTR("Expand All Properties")), EXPAND_ALL);
-	p->add_shortcut(ED_SHORTCUT("property_editor/collapse_all", TTR("Collapse All Properties")), COLLAPSE_ALL);
-	p->add_separator();
-	if (is_resource) {
-		p->add_item(TTR("Save"), RESOURCE_SAVE);
-		p->add_item(TTR("Save As..."), RESOURCE_SAVE_AS);
-		p->add_separator();
-	}
-	p->add_shortcut(ED_SHORTCUT("property_editor/copy_params", TTR("Copy Params")), OBJECT_COPY_PARAMS);
-	p->add_shortcut(ED_SHORTCUT("property_editor/paste_params", TTR("Paste Params")), OBJECT_PASTE_PARAMS);
+	p->add_icon_shortcut(get_theme_icon("GuiTreeArrowDown", "EditorIcons"), ED_SHORTCUT("property_editor/expand_all", TTR("Expand All")), EXPAND_ALL);
+	p->add_icon_shortcut(get_theme_icon("GuiTreeArrowRight", "EditorIcons"), ED_SHORTCUT("property_editor/collapse_all", TTR("Collapse All")), COLLAPSE_ALL);
 	p->add_separator();
 	p->add_separator();
 
 
-	p->add_shortcut(ED_SHORTCUT("property_editor/paste_resource", TTR("Edit Resource Clipboard")), RESOURCE_EDIT_CLIPBOARD);
-	if (is_resource) {
-		p->add_shortcut(ED_SHORTCUT("property_editor/copy_resource", TTR("Copy Resource")), RESOURCE_COPY);
-		p->add_shortcut(ED_SHORTCUT("property_editor/unref_resource", TTR("Make Built-In")), RESOURCE_MAKE_BUILT_IN);
-	}
+	p->add_shortcut(ED_SHORTCUT("property_editor/copy_params", TTR("Copy Properties")), OBJECT_COPY_PARAMS);
+	p->add_shortcut(ED_SHORTCUT("property_editor/paste_params", TTR("Paste Properties")), OBJECT_PASTE_PARAMS);
 
 
 	if (is_resource || is_node) {
 	if (is_resource || is_node) {
 		p->add_separator();
 		p->add_separator();
 		p->add_shortcut(ED_SHORTCUT("property_editor/make_subresources_unique", TTR("Make Sub-Resources Unique")), OBJECT_UNIQUE_RESOURCES);
 		p->add_shortcut(ED_SHORTCUT("property_editor/make_subresources_unique", TTR("Make Sub-Resources Unique")), OBJECT_UNIQUE_RESOURCES);
-		p->add_separator();
-		p->add_icon_shortcut(get_theme_icon("HelpSearch", "EditorIcons"), ED_SHORTCUT("property_editor/open_help", TTR("Open in Help")), OBJECT_REQUEST_HELP);
 	}
 	}
 
 
 	List<MethodInfo> methods;
 	List<MethodInfo> methods;
@@ -525,6 +522,17 @@ InspectorDock::InspectorDock(EditorNode *p_editor, EditorData &p_editor_data) {
 	resource_save_button->set_focus_mode(Control::FOCUS_NONE);
 	resource_save_button->set_focus_mode(Control::FOCUS_NONE);
 	resource_save_button->set_disabled(true);
 	resource_save_button->set_disabled(true);
 
 
+	resource_extra_button = memnew(MenuButton);
+	resource_extra_button->set_icon(get_theme_icon("GuiTabMenu", "EditorIcons"));
+	general_options_hb->add_child(resource_extra_button);
+	resource_extra_button->get_popup()->add_icon_shortcut(get_theme_icon("ActionPaste", "EditorIcons"), ED_SHORTCUT("property_editor/paste_resource", TTR("Edit Resource from Clipboard")), RESOURCE_EDIT_CLIPBOARD);
+	resource_extra_button->get_popup()->add_icon_shortcut(get_theme_icon("ActionCopy", "EditorIcons"), ED_SHORTCUT("property_editor/copy_resource", TTR("Copy Resource")), RESOURCE_COPY);
+	resource_extra_button->get_popup()->set_item_disabled(1, true);
+	resource_extra_button->get_popup()->add_separator();
+	resource_extra_button->get_popup()->add_shortcut(ED_SHORTCUT("property_editor/unref_resource", TTR("Make Resource Built-In")), RESOURCE_MAKE_BUILT_IN);
+	resource_extra_button->get_popup()->set_item_disabled(3, true);
+	resource_extra_button->get_popup()->connect("id_pressed", callable_mp(this, &InspectorDock::_menu_option));
+
 	general_options_hb->add_spacer();
 	general_options_hb->add_spacer();
 
 
 	backward_button = memnew(Button);
 	backward_button = memnew(Button);
@@ -558,31 +566,42 @@ InspectorDock::InspectorDock(EditorNode *p_editor, EditorData &p_editor_data) {
 	history_menu->connect("about_to_popup", callable_mp(this, &InspectorDock::_prepare_history));
 	history_menu->connect("about_to_popup", callable_mp(this, &InspectorDock::_prepare_history));
 	history_menu->get_popup()->connect("id_pressed", callable_mp(this, &InspectorDock::_select_history));
 	history_menu->get_popup()->connect("id_pressed", callable_mp(this, &InspectorDock::_select_history));
 
 
-	HBoxContainer *node_info_hb = memnew(HBoxContainer);
-	add_child(node_info_hb);
-
+	HBoxContainer *subresource_hb = memnew(HBoxContainer);
+	add_child(subresource_hb);
 	editor_path = memnew(EditorPath(editor->get_editor_history()));
 	editor_path = memnew(EditorPath(editor->get_editor_history()));
 	editor_path->set_h_size_flags(Control::SIZE_EXPAND_FILL);
 	editor_path->set_h_size_flags(Control::SIZE_EXPAND_FILL);
-	node_info_hb->add_child(editor_path);
+	subresource_hb->add_child(editor_path);
 
 
-	object_menu = memnew(MenuButton);
-	object_menu->set_shortcut_context(this);
-	object_menu->set_icon(get_theme_icon("Tools", "EditorIcons"));
-	node_info_hb->add_child(object_menu);
-	object_menu->set_tooltip(TTR("Object properties."));
-	object_menu->get_popup()->connect("id_pressed", callable_mp(this, &InspectorDock::_menu_option));
+	open_docs_button = memnew(Button);
+	open_docs_button->set_flat(true);
+	open_docs_button->set_visible(false);
+	open_docs_button->set_tooltip(TTR("Open documentation for this object."));
+	open_docs_button->set_icon(get_theme_icon("HelpSearch", "EditorIcons"));
+	open_docs_button->set_shortcut(ED_SHORTCUT("property_editor/open_help", TTR("Open Documentation")));
+	subresource_hb->add_child(open_docs_button);
+	open_docs_button->connect("pressed", callable_mp(this, &InspectorDock::_menu_option), varray(OBJECT_REQUEST_HELP));
 
 
 	new_resource_dialog = memnew(CreateDialog);
 	new_resource_dialog = memnew(CreateDialog);
 	editor->get_gui_base()->add_child(new_resource_dialog);
 	editor->get_gui_base()->add_child(new_resource_dialog);
 	new_resource_dialog->set_base_type("Resource");
 	new_resource_dialog->set_base_type("Resource");
 	new_resource_dialog->connect("create", callable_mp(this, &InspectorDock::_resource_created));
 	new_resource_dialog->connect("create", callable_mp(this, &InspectorDock::_resource_created));
 
 
+	HBoxContainer *property_tools_hb = memnew(HBoxContainer);
+	add_child(property_tools_hb);
+
 	search = memnew(LineEdit);
 	search = memnew(LineEdit);
 	search->set_h_size_flags(Control::SIZE_EXPAND_FILL);
 	search->set_h_size_flags(Control::SIZE_EXPAND_FILL);
 	search->set_placeholder(TTR("Filter properties"));
 	search->set_placeholder(TTR("Filter properties"));
 	search->set_right_icon(get_theme_icon("Search", "EditorIcons"));
 	search->set_right_icon(get_theme_icon("Search", "EditorIcons"));
 	search->set_clear_button_enabled(true);
 	search->set_clear_button_enabled(true);
-	add_child(search);
+	property_tools_hb->add_child(search);
+
+	object_menu = memnew(MenuButton);
+	object_menu->set_shortcut_context(this);
+	object_menu->set_icon(get_theme_icon("Tools", "EditorIcons"));
+	property_tools_hb->add_child(object_menu);
+	object_menu->set_tooltip(TTR("Manage object properties."));
+	object_menu->get_popup()->connect("id_pressed", callable_mp(this, &InspectorDock::_menu_option));
 
 
 	warning = memnew(Button);
 	warning = memnew(Button);
 	add_child(warning);
 	add_child(warning);

+ 2 - 0
editor/inspector_dock.h

@@ -81,9 +81,11 @@ class InspectorDock : public VBoxContainer {
 	Button *resource_new_button;
 	Button *resource_new_button;
 	Button *resource_load_button;
 	Button *resource_load_button;
 	MenuButton *resource_save_button;
 	MenuButton *resource_save_button;
+	MenuButton *resource_extra_button;
 	MenuButton *history_menu;
 	MenuButton *history_menu;
 	LineEdit *search;
 	LineEdit *search;
 
 
+	Button *open_docs_button;
 	MenuButton *object_menu;
 	MenuButton *object_menu;
 	EditorPath *editor_path;
 	EditorPath *editor_path;