Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[3.x] Make several actions in the Inspector dock more obvious #50528

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
102 changes: 88 additions & 14 deletions editor/editor_path.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -59,29 +59,51 @@ void EditorPath::_add_children_to_popup(Object *p_obj, int p_depth) {

Ref<Texture> 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());

_add_children_to_popup(obj, p_depth + 1);
}
}

void EditorPath::_show_popup() {
sub_objects_menu->clear();

Size2 size = get_size();
Point2 gp = get_global_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->popup();
}

void EditorPath::_about_to_show() {
Object *obj = ObjectDB::get_instance(history->get_path_object(history->get_path_size() - 1));
if (!obj) {
return;
}

objects.clear();
get_popup()->clear();
get_popup()->set_size(Size2(get_size().width, 1));

_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);
}
}

Expand All @@ -94,7 +116,7 @@ void EditorPath::update_path() {

Ref<Texture> icon = EditorNode::get_singleton()->get_object_icon(obj);
if (icon.is_valid()) {
set_icon(icon);
current_object_icon->set_texture(icon);
}

if (i == history->get_path_size() - 1) {
Expand All @@ -120,12 +142,26 @@ void EditorPath::update_path() {
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());
}
}
}

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) {
ERR_FAIL_INDEX(p_idx, objects.size());

Expand All @@ -139,21 +175,59 @@ void EditorPath::_id_pressed(int p_idx) {

void EditorPath::_notification(int p_what) {
switch (p_what) {
case NOTIFICATION_ENTER_TREE:
case NOTIFICATION_THEME_CHANGED: {
update_path();

// Button overrides Control's method, so we have to improvise.
sub_objects_icon->set_texture(sub_objects_icon->get_icon("select_arrow", "Tree"));
current_object_label->add_font_override("font", get_font("main", "EditorFonts"));
} break;

case NOTIFICATION_READY: {
connect("pressed", this, "_show_popup");
} break;
}
}

void EditorPath::_bind_methods() {
ClassDB::bind_method("_show_popup", &EditorPath::_show_popup);
ClassDB::bind_method("_about_to_show", &EditorPath::_about_to_show);
ClassDB::bind_method("_id_pressed", &EditorPath::_id_pressed);
}

EditorPath::EditorPath(EditorHistory *p_history) {
history = p_history;
set_clip_text(true);
set_text_align(ALIGN_LEFT);
get_popup()->connect("about_to_show", this, "_about_to_show");
get_popup()->connect("id_pressed", this, "_id_pressed");

MarginContainer *main_mc = memnew(MarginContainer);
main_mc->set_anchors_and_margins_preset(PRESET_WIDE);
main_mc->add_constant_override("margin_left", 4 * EDSCALE);
main_mc->add_constant_override("margin_right", 6 * EDSCALE);
main_mc->set_mouse_filter(MOUSE_FILTER_PASS);
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_show", this, "_about_to_show");
sub_objects_menu->connect("id_pressed", this, "_id_pressed");

set_tooltip(TTR("Open a list of sub-resources."));
}
16 changes: 13 additions & 3 deletions editor/editor_path.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,16 +32,24 @@
#define EDITOR_PATH_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;

TextureRect *current_object_icon;
Label *current_object_label;
TextureRect *sub_objects_icon;
PopupMenu *sub_objects_menu;

Vector<ObjectID> objects;
EditorPath();

void _show_popup();
void _id_pressed(int p_idx);
void _about_to_show();
void _add_children_to_popup(Object *p_obj, int p_depth = 0);
Expand All @@ -52,6 +60,8 @@ class EditorPath : public MenuButton {

public:
void update_path();
void clear_path();
void enable_path();

EditorPath(EditorHistory *p_history);
};
Expand Down
101 changes: 60 additions & 41 deletions editor/inspector_dock.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,14 @@ void InspectorDock::_menu_option(int p_option) {
case COLLAPSE_ALL: {
_menu_collapseall();
} break;

case RESOURCE_SAVE: {
_save_resource(false);
} break;
case RESOURCE_SAVE_AS: {
_save_resource(true);
} break;

case RESOURCE_MAKE_BUILT_IN: {
_unref_resource();
} break;
Expand All @@ -52,13 +60,6 @@ void InspectorDock::_menu_option(int p_option) {
_paste_resource();
} break;

case RESOURCE_SAVE: {
_save_resource(false);
} break;
case RESOURCE_SAVE_AS: {
_save_resource(true);
} break;

case OBJECT_REQUEST_HELP: {
if (current) {
editor->set_visible_editor(EditorNode::EDITOR_SCRIPT);
Expand Down Expand Up @@ -332,11 +333,19 @@ void InspectorDock::_notification(int p_what) {
switch (p_what) {
case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
set_theme(editor->get_gui_base()->get_theme());

resource_new_button->set_icon(get_icon("New", "EditorIcons"));
resource_load_button->set_icon(get_icon("Load", "EditorIcons"));
resource_save_button->set_icon(get_icon("Save", "EditorIcons"));
resource_extra_button->set_icon(get_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_icon("ActionPaste", "EditorIcons"));
resource_extra_popup->set_item_icon(resource_extra_popup->get_item_index(RESOURCE_COPY), get_icon("ActionCopy", "EditorIcons"));

backward_button->set_icon(get_icon("Back", "EditorIcons"));
forward_button->set_icon(get_icon("Forward", "EditorIcons"));

history_menu->set_icon(get_icon("History", "EditorIcons"));
object_menu->set_icon(get_icon("Tools", "EditorIcons"));
warning->set_icon(get_icon("NodeWarning", "EditorIcons"));
Expand Down Expand Up @@ -408,12 +417,7 @@ void InspectorDock::update(Object *p_object) {
object_menu->set_disabled(true);
warning->hide();
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;
}

Expand All @@ -422,35 +426,28 @@ void InspectorDock::update(Object *p_object) {

object_menu->set_disabled(false);
search->set_editable(true);
editor_path->set_disabled(false);
editor_path->enable_path();

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();

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_icon("GuiTreeArrowDown", "EditorIcons"), ED_SHORTCUT("property_editor/expand_all", TTR("Expand All")), EXPAND_ALL);
p->add_icon_shortcut(get_icon("GuiTreeArrowRight", "EditorIcons"), ED_SHORTCUT("property_editor/collapse_all", TTR("Collapse All")), COLLAPSE_ALL);
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) {
p->add_separator();
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_icon("HelpSearch", "EditorIcons"), ED_SHORTCUT("property_editor/open_help", TTR("Open in Help")), OBJECT_REQUEST_HELP);
}

List<MethodInfo> methods;
Expand Down Expand Up @@ -528,6 +525,17 @@ InspectorDock::InspectorDock(EditorNode *p_editor, EditorData &p_editor_data) {
resource_save_button->set_focus_mode(Control::FOCUS_NONE);
resource_save_button->set_disabled(true);

resource_extra_button = memnew(MenuButton);
resource_extra_button->set_icon(get_icon("GuiTabMenu", "EditorIcons"));
general_options_hb->add_child(resource_extra_button);
resource_extra_button->get_popup()->add_icon_shortcut(get_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_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", this, "_menu_option");

general_options_hb->add_spacer();

backward_button = memnew(ToolButton);
Expand All @@ -553,30 +561,41 @@ InspectorDock::InspectorDock(EditorNode *p_editor, EditorData &p_editor_data) {
history_menu->connect("about_to_show", this, "_prepare_history");
history_menu->get_popup()->connect("id_pressed", this, "_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->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_icon(get_icon("Tools", "EditorIcons"));
node_info_hb->add_child(object_menu);
object_menu->set_tooltip(TTR("Object properties."));
object_menu->get_popup()->connect("id_pressed", this, "_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_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", this, "_menu_option", varray(OBJECT_REQUEST_HELP));

new_resource_dialog = memnew(CreateDialog);
editor->get_gui_base()->add_child(new_resource_dialog);
new_resource_dialog->set_base_type("Resource");
new_resource_dialog->connect("create", this, "_resource_created");

HBoxContainer *property_tools_hb = memnew(HBoxContainer);
add_child(property_tools_hb);

search = memnew(LineEdit);
search->set_h_size_flags(Control::SIZE_EXPAND_FILL);
search->set_placeholder(TTR("Filter properties"));
search->set_right_icon(get_icon("Search", "EditorIcons"));
search->set_clear_button_enabled(true);
add_child(search);
property_tools_hb->add_child(search);

object_menu = memnew(MenuButton);
object_menu->set_icon(get_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", this, "_menu_option");

warning = memnew(Button);
add_child(warning);
Expand Down
2 changes: 2 additions & 0 deletions editor/inspector_dock.h
Original file line number Diff line number Diff line change
Expand Up @@ -82,9 +82,11 @@ class InspectorDock : public VBoxContainer {
ToolButton *resource_new_button;
ToolButton *resource_load_button;
MenuButton *resource_save_button;
MenuButton *resource_extra_button;
MenuButton *history_menu;
LineEdit *search;

Button *open_docs_button;
MenuButton *object_menu;
EditorPath *editor_path;

Expand Down