Merge pull request #106164 from lodetrick/refactor-bottom-panel

Refactor editor `EditorBottomPanel` to be a `TabContainer`
This commit is contained in:
Thaddeus Crews 2025-11-07 10:32:35 -06:00
commit 522fa8d9bc
No known key found for this signature in database
GPG key ID: 8C6E5FEB5FC03CCC
18 changed files with 272 additions and 358 deletions

View file

@ -55,8 +55,7 @@ DebuggerEditorPlugin::DebuggerEditorPlugin(PopupMenu *p_debug_menu) {
file_server = memnew(EditorFileServer);
EditorDebuggerNode *debugger = memnew(EditorDebuggerNode);
Button *db = EditorNode::get_bottom_panel()->add_item(TTRC("Debugger"), debugger, ED_SHORTCUT_AND_COMMAND("bottom_panels/toggle_debugger_bottom_panel", TTRC("Toggle Debugger Bottom Panel"), KeyModifierMask::ALT | Key::D));
debugger->set_tool_button(db);
EditorNode::get_bottom_panel()->add_item(TTRC("Debugger"), debugger, ED_SHORTCUT_AND_COMMAND("bottom_panels/toggle_debugger_bottom_panel", TTRC("Toggle Debugger Bottom Panel"), KeyModifierMask::ALT | Key::D));
// Main editor debug menu.
debug_menu = p_debug_menu;

View file

@ -441,26 +441,35 @@ void EditorDebuggerNode::_update_errors() {
dbg->update_tabs();
});
if (error_count == 0 && warning_count == 0) {
debugger_button->set_text(TTR("Debugger"));
debugger_button->remove_theme_color_override(SceneStringName(font_color));
debugger_button->set_button_icon(Ref<Texture2D>());
} else {
debugger_button->set_text(TTR("Debugger") + " (" + itos(error_count + warning_count) + ")");
if (error_count >= 1 && warning_count >= 1) {
debugger_button->set_button_icon(get_editor_theme_icon(SNAME("ErrorWarning")));
// Use error color to represent the highest level of severity reported.
debugger_button->add_theme_color_override(SceneStringName(font_color), get_theme_color(SNAME("error_color"), EditorStringName(Editor)));
} else if (error_count >= 1) {
debugger_button->set_button_icon(get_editor_theme_icon(SNAME("Error")));
debugger_button->add_theme_color_override(SceneStringName(font_color), get_theme_color(SNAME("error_color"), EditorStringName(Editor)));
} else {
debugger_button->set_button_icon(get_editor_theme_icon(SNAME("Warning")));
debugger_button->add_theme_color_override(SceneStringName(font_color), get_theme_color(SNAME("warning_color"), EditorStringName(Editor)));
}
}
last_error_count = error_count;
last_warning_count = warning_count;
// TODO: Replace logic when EditorDock class is merged to be more flexible.
TabContainer *parent = Object::cast_to<TabContainer>(get_parent());
if (!parent) {
return;
}
int idx = parent->get_tab_idx_from_control(this);
if (error_count == 0 && warning_count == 0) {
set_name(TTR("Debugger"));
parent->set_tab_icon(idx, Ref<Texture2D>());
parent->get_tab_bar()->set_font_color_override_all(idx, Color(0, 0, 0, 0));
} else {
set_name(TTR("Debugger") + " (" + itos(error_count + warning_count) + ")");
if (error_count >= 1 && warning_count >= 1) {
parent->set_tab_icon(idx, get_editor_theme_icon(SNAME("ErrorWarning")));
// Use error color to represent the highest level of severity reported.
parent->get_tab_bar()->set_font_color_override_all(idx, get_theme_color(SNAME("error_color"), EditorStringName(Editor)));
} else if (error_count >= 1) {
parent->set_tab_icon(idx, get_editor_theme_icon(SNAME("Error")));
parent->get_tab_bar()->set_font_color_override_all(idx, get_theme_color(SNAME("error_color"), EditorStringName(Editor)));
} else {
parent->set_tab_icon(idx, get_editor_theme_icon(SNAME("Warning")));
parent->get_tab_bar()->set_font_color_override_all(idx, get_theme_color(SNAME("warning_color"), EditorStringName(Editor)));
}
}
}
}

View file

@ -93,7 +93,6 @@ private:
Ref<EditorDebuggerServer> server;
TabContainer *tabs = nullptr;
Button *debugger_button = nullptr;
MenuButton *script_menu = nullptr;
Ref<Script> stack_script; // Why?!?
@ -180,10 +179,6 @@ public:
void set_script_debug_button(MenuButton *p_button);
void set_tool_button(Button *p_button) {
debugger_button = p_button;
}
String get_var_value(const String &p_var) const;
Ref<Script> get_dump_stack_script() const { return stack_script; } // Why do we need this?