From a710e87b124c59908f95c539a86329acede2649a Mon Sep 17 00:00:00 2001 From: Hugo Locurcio Date: Wed, 19 Feb 2025 17:09:59 +0100 Subject: [PATCH] Replace editor renderer dropdown with icon next to version button The rendering driver is represented by the icon, while the rendering method is represented by its color (green for Forward+, purple for Mobile, blue for Compatibility). This allows saving space at the top of the editor while providing more information than before on editor screenshots and videos, which is useful for technical support purposes. EditorVersionButton is now based on Button instead of LinkButton so that it can display an icon. However, this means its text is no longer underlined on hover. --- editor/editor_node.cpp | 112 --------------------------- editor/editor_node.h | 11 --- editor/gui/editor_version_button.cpp | 33 +++++++- editor/gui/editor_version_button.h | 6 +- editor/icons/Direct3D12.svg | 1 + 5 files changed, 34 insertions(+), 129 deletions(-) create mode 100644 editor/icons/Direct3D12.svg diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index 6b725240f9e..178a56a9771 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -558,8 +558,6 @@ void EditorNode::_update_theme(bool p_skip_creation) { if (EditorDebuggerNode::get_singleton()->is_visible()) { bottom_panel->add_theme_style_override(SceneStringName(panel), theme->get_stylebox(SNAME("BottomPanelDebuggerOverride"), EditorStringName(EditorStyles))); } - - _update_renderer_color(); } editor_dock_manager->update_tab_styles(); @@ -6625,71 +6623,6 @@ Vector> EditorNode::find_resource_conversion return ret; } -void EditorNode::_update_renderer_color() { - String rendering_method = renderer->get_selected_metadata(); - - if (rendering_method == "forward_plus") { - renderer->add_theme_color_override(SceneStringName(font_color), theme->get_color(SNAME("forward_plus_color"), EditorStringName(Editor))); - } else if (rendering_method == "mobile") { - renderer->add_theme_color_override(SceneStringName(font_color), theme->get_color(SNAME("mobile_color"), EditorStringName(Editor))); - } else if (rendering_method == "gl_compatibility") { - renderer->add_theme_color_override(SceneStringName(font_color), theme->get_color(SNAME("gl_compatibility_color"), EditorStringName(Editor))); - } -} - -void EditorNode::_renderer_selected(int p_which) { - String rendering_method = renderer->get_item_metadata(p_which); - - String current_renderer = GLOBAL_GET("rendering/renderer/rendering_method"); - - if (rendering_method == current_renderer) { - return; - } - - renderer_request = rendering_method; - video_restart_dialog->set_text( - vformat(TTR("Changing the renderer requires restarting the editor.\n\nChoosing Save & Restart will change the rendering method to:\n- Desktop platforms: %s\n- Mobile platforms: %s\n- Web platform: gl_compatibility"), - renderer_request, renderer_request.replace("forward_plus", "mobile"))); - video_restart_dialog->popup_centered(); - renderer->select(renderer_current); - _update_renderer_color(); -} - -void EditorNode::_add_renderer_entry(const String &p_renderer_name, bool p_mark_overridden) { - String item_text; - if (p_renderer_name == "forward_plus") { - item_text = TTR("Forward+"); - } - if (p_renderer_name == "mobile") { - item_text = TTR("Mobile"); - } - if (p_renderer_name == "gl_compatibility") { - item_text = TTR("Compatibility"); - } - if (p_mark_overridden) { - item_text += " " + TTR("(Overridden)"); - } - renderer->add_item(item_text); -} - -void EditorNode::_set_renderer_name_save_and_restart() { - ProjectSettings::get_singleton()->set("rendering/renderer/rendering_method", renderer_request); - if (renderer_request == "mobile" || renderer_request == "gl_compatibility") { - // Also change the mobile override if changing to a compatible rendering method. - // This prevents visual discrepancies between desktop and mobile platforms. - ProjectSettings::get_singleton()->set("rendering/renderer/rendering_method.mobile", renderer_request); - } else if (renderer_request == "forward_plus") { - // Use the equivalent mobile rendering method. This prevents the rendering method from staying - // on its old choice if moving from `gl_compatibility` to `forward_plus`. - ProjectSettings::get_singleton()->set("rendering/renderer/rendering_method.mobile", "mobile"); - } - - ProjectSettings::get_singleton()->save(); - - save_all_scenes(); - restart_editor(); -} - void EditorNode::_resource_saved(Ref p_resource, const String &p_path) { if (singleton->saving_resources_in_path.has(p_resource)) { // This is going to be handled by save_resource_in_path when the time is right. @@ -7597,16 +7530,6 @@ EditorNode::EditorNode() { right_menu_hb->set_mouse_filter(Control::MOUSE_FILTER_STOP); title_bar->add_child(right_menu_hb); - renderer = memnew(OptionButton); - renderer->set_visible(true); - renderer->set_flat(true); - renderer->set_theme_type_variation("TopBarOptionButton"); - renderer->set_fit_to_longest_item(false); - renderer->set_focus_mode(Control::FOCUS_NONE); - renderer->set_tooltip_text(TTR("Choose a rendering method.\n\nNotes:\n- On mobile platforms, the Mobile rendering method is used if Forward+ is selected here.\n- On the web platform, the Compatibility rendering method is always used.")); - - right_menu_hb->add_child(renderer); - if (can_expand) { // Add spacer to avoid other controls under the window minimize/maximize/close buttons (right side). right_menu_spacer = memnew(Control); @@ -7614,41 +7537,6 @@ EditorNode::EditorNode() { title_bar->add_child(right_menu_spacer); } - String current_renderer_ps = GLOBAL_GET("rendering/renderer/rendering_method"); - current_renderer_ps = current_renderer_ps.to_lower(); - String current_renderer_os = OS::get_singleton()->get_current_rendering_method().to_lower(); - - // Add the renderers name to the UI. - if (current_renderer_ps == current_renderer_os) { - renderer->connect(SceneStringName(item_selected), callable_mp(this, &EditorNode::_renderer_selected)); - // As we are doing string comparisons, keep in standard case to prevent problems with capitals - // "vulkan" in particular uses lowercase "v" in the code, and uppercase in the UI. - PackedStringArray renderers = ProjectSettings::get_singleton()->get_custom_property_info().get(StringName("rendering/renderer/rendering_method")).hint_string.split(",", false); - for (int i = 0; i < renderers.size(); i++) { - String rendering_method = renderers[i]; - _add_renderer_entry(rendering_method, false); - renderer->set_item_metadata(i, rendering_method); - // Lowercase for standard comparison. - rendering_method = rendering_method.to_lower(); - if (current_renderer_ps == rendering_method) { - renderer->select(i); - renderer_current = i; - } - } - } else { - // It's an CLI-overridden rendering method. - _add_renderer_entry(current_renderer_os, true); - renderer->set_item_metadata(0, current_renderer_os); - renderer->select(0); - renderer_current = 0; - } - _update_renderer_color(); - - video_restart_dialog = memnew(ConfirmationDialog); - video_restart_dialog->set_ok_button_text(TTR("Save & Restart")); - video_restart_dialog->connect(SceneStringName(confirmed), callable_mp(this, &EditorNode::_set_renderer_name_save_and_restart)); - gui_base->add_child(video_restart_dialog); - progress_hb = memnew(BackgroundProgress); layout_dialog = memnew(EditorLayoutsDialog); diff --git a/editor/editor_node.h b/editor/editor_node.h index de3af997473..a2bc465a782 100644 --- a/editor/editor_node.h +++ b/editor/editor_node.h @@ -278,12 +278,6 @@ private: Control *gui_base = nullptr; VBoxContainer *main_vbox = nullptr; - OptionButton *renderer = nullptr; - - ConfirmationDialog *video_restart_dialog = nullptr; - - int renderer_current = 0; - String renderer_request; // Split containers. DockSplitContainer *left_l_hsplit = nullptr; @@ -597,11 +591,6 @@ private: void _update_from_settings(); void _gdextensions_reloaded(); - void _renderer_selected(int); - void _update_renderer_color(); - void _add_renderer_entry(const String &p_renderer_name, bool p_mark_overridden); - void _set_renderer_name_save_and_restart(); - void _exit_editor(int p_exit_code); virtual void input(const Ref &p_event) override; diff --git a/editor/gui/editor_version_button.cpp b/editor/gui/editor_version_button.cpp index 635d66f42a9..a307ab87985 100644 --- a/editor/gui/editor_version_button.cpp +++ b/editor/gui/editor_version_button.cpp @@ -32,6 +32,7 @@ #include "core/os/time.h" #include "core/version.h" +#include "scene/gui/control.h" String _get_version_string(EditorVersionButton::VersionFormat p_format) { String main; @@ -60,10 +61,30 @@ String _get_version_string(EditorVersionButton::VersionFormat p_format) { void EditorVersionButton::_notification(int p_what) { switch (p_what) { case NOTIFICATION_POSTINITIALIZE: { - // This can't be done in the constructor because theme cache is not ready yet. set_auto_translate_mode(AUTO_TRANSLATE_MODE_DISABLED); set_text(_get_version_string(format)); } break; + case NOTIFICATION_ENTER_TREE: { + // This can't be done in the constructor because theme cache is not ready yet. + add_theme_icon_override(SNAME("icon"), get_editor_theme_icon(SNAME("Direct3D12"))); + Color icon_color; + if (RS::get_singleton()->get_current_rendering_method() == "forward_plus") { + icon_color = get_theme_color(SNAME("forward_plus_color"), SNAME("Editor")); + } else if (RS::get_singleton()->get_current_rendering_method() == "mobile") { + icon_color = get_theme_color(SNAME("mobile_color"), SNAME("Editor")); + } else { + icon_color = get_theme_color(SNAME("gl_compatibility_color"), SNAME("Editor")); + } + // Cancel out the modulation applied to the node, which is used to reduce the text's opacity + // in the editor bottom panel and project manager. + // We don't want the modulation to affect the icon, as it becomes hard to see otherwise. + icon_color /= get_self_modulate(); + add_theme_color_override(SNAME("icon_normal_color"), icon_color); + add_theme_color_override(SNAME("icon_pressed_color"), icon_color); + add_theme_color_override(SNAME("icon_focus_color"), icon_color); + add_theme_color_override(SNAME("icon_hover_color"), icon_color); + add_theme_color_override(SNAME("icon_hover_pressed_color"), icon_color); + } break; } } @@ -73,7 +94,10 @@ void EditorVersionButton::pressed() { EditorVersionButton::EditorVersionButton(VersionFormat p_format) { format = p_format; - set_underline_mode(LinkButton::UNDERLINE_MODE_ON_HOVER); + + set_flat(true); + set_icon_alignment(HORIZONTAL_ALIGNMENT_RIGHT); + set_focus_mode(FOCUS_NONE); String build_date; if (VERSION_TIMESTAMP > 0) { @@ -81,5 +105,8 @@ EditorVersionButton::EditorVersionButton(VersionFormat p_format) { } else { build_date = TTR("(unknown)"); } - set_tooltip_text(vformat(TTR("Git commit date: %s\nClick to copy the version information."), build_date)); + const String rendering_driver = RS::get_singleton()->get_current_rendering_driver_name(); + const String rendering_method = RS::get_singleton()->get_current_rendering_method(); + + set_tooltip_text(vformat(TTR("Git commit date: %s\nRendering method: %s\nRendering driver: %s\nClick to copy the version information."), build_date, rendering_method, rendering_driver)); } diff --git a/editor/gui/editor_version_button.h b/editor/gui/editor_version_button.h index 591c3d483ee..efc48e9fa90 100644 --- a/editor/gui/editor_version_button.h +++ b/editor/gui/editor_version_button.h @@ -31,10 +31,10 @@ #ifndef EDITOR_VERSION_BUTTON_H #define EDITOR_VERSION_BUTTON_H -#include "scene/gui/link_button.h" +#include "scene/gui/button.h" -class EditorVersionButton : public LinkButton { - GDCLASS(EditorVersionButton, LinkButton); +class EditorVersionButton : public Button { + GDCLASS(EditorVersionButton, Button); public: enum VersionFormat { diff --git a/editor/icons/Direct3D12.svg b/editor/icons/Direct3D12.svg new file mode 100644 index 00000000000..b960c889688 --- /dev/null +++ b/editor/icons/Direct3D12.svg @@ -0,0 +1 @@ + \ No newline at end of file