1
0
Fork 0

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.
This commit is contained in:
Hugo Locurcio 2025-02-19 17:09:59 +01:00
parent e567f49cbb
commit a710e87b12
No known key found for this signature in database
GPG Key ID: 39E8F8BE30B0A49C
5 changed files with 34 additions and 129 deletions

View File

@ -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<Ref<EditorResourceConversionPlugin>> 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<Resource> 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);

View File

@ -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<InputEvent> &p_event) override;

View File

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

View File

@ -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 {

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path fill="#fff" d="m2.9999987 4v2c-3.99999826 0-3.99999826 6 0 6h2v-8zm0 4v2c-1.3333328 0-1.3333328-2 0-2zm3.153-1.9995h1.849c0 .6997448-.4477153 1.267-1 1.267v1c1.1546662 0 1.1546662 1.732 0 1.732h-1v2h1c2.5516323.17298 3.9889633-2.8755515 2.232-4.734.4889602-.2262388.7913553-.7269315.764-1.265v-2h-3.845zm7.8470003-2.0005v2c-3.999998 0-3.999998 6 0 6h2v-8zm0 4v2c-1.333333 0-1.333333-2 0-2z"/></svg>

After

Width:  |  Height:  |  Size: 467 B