Skip to content

Commit b28b578

Browse files
committed
Merge pull request godotengine#113692 from KoBeWi/cringe
Defer updating dock tabs
2 parents 53d4c66 + 6647533 commit b28b578

2 files changed

Lines changed: 27 additions & 8 deletions

File tree

editor/docks/editor_dock_manager.cpp

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -520,6 +520,26 @@ void EditorDockManager::_move_dock(EditorDock *p_dock, Control *p_target, int p_
520520
}
521521
}
522522

523+
void EditorDockManager::_queue_update_tab_style(EditorDock *p_dock) {
524+
if (dirty_docks.is_empty()) {
525+
callable_mp(this, &EditorDockManager::_update_dirty_dock_tabs).call_deferred();
526+
}
527+
dirty_docks.insert(p_dock);
528+
}
529+
530+
void EditorDockManager::_update_dirty_dock_tabs() {
531+
bool update_menu = false;
532+
for (EditorDock *dock : dirty_docks) {
533+
update_menu = update_menu || dock->global;
534+
_update_tab_style(dock);
535+
}
536+
dirty_docks.clear();
537+
538+
if (update_menu) {
539+
update_docks_menu();
540+
}
541+
}
542+
523543
void EditorDockManager::_update_tab_style(EditorDock *p_dock) {
524544
if (!p_dock->enabled || !p_dock->is_open) {
525545
return; // Disabled by feature profile or manually closed by user.
@@ -534,10 +554,6 @@ void EditorDockManager::_update_tab_style(EditorDock *p_dock) {
534554
int index = tab_container->get_tab_idx_from_control(p_dock);
535555
ERR_FAIL_COND(index == -1);
536556

537-
if (p_dock->global) {
538-
update_docks_menu();
539-
}
540-
541557
tab_container->get_tab_bar()->set_font_color_override_all(index, p_dock->title_color);
542558

543559
const TabStyle style = (tab_container == EditorNode::get_bottom_panel())
@@ -902,8 +918,8 @@ void EditorDockManager::add_dock(EditorDock *p_dock) {
902918

903919
p_dock->dock_slot_index = p_dock->default_slot;
904920
all_docks.push_back(p_dock);
905-
p_dock->connect("_tab_style_changed", callable_mp(this, &EditorDockManager::_update_tab_style).bind(p_dock));
906-
p_dock->connect("renamed", callable_mp(this, &EditorDockManager::_update_tab_style).bind(p_dock));
921+
p_dock->connect("_tab_style_changed", callable_mp(this, &EditorDockManager::_queue_update_tab_style).bind(p_dock));
922+
p_dock->connect("renamed", callable_mp(this, &EditorDockManager::_queue_update_tab_style).bind(p_dock));
907923

908924
if (p_dock->default_slot != DockConstants::DOCK_SLOT_NONE) {
909925
open_dock(p_dock, false);
@@ -921,8 +937,8 @@ void EditorDockManager::remove_dock(EditorDock *p_dock) {
921937
_move_dock(p_dock, nullptr);
922938

923939
all_docks.erase(p_dock);
924-
p_dock->disconnect("_tab_style_changed", callable_mp(this, &EditorDockManager::_update_tab_style));
925-
p_dock->disconnect("renamed", callable_mp(this, &EditorDockManager::_update_tab_style));
940+
p_dock->disconnect("_tab_style_changed", callable_mp(this, &EditorDockManager::_queue_update_tab_style));
941+
p_dock->disconnect("renamed", callable_mp(this, &EditorDockManager::_queue_update_tab_style));
926942
_update_layout();
927943
}
928944

editor/docks/editor_dock_manager.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ class EditorDockManager : public Object {
9797
DockSlot dock_slots[DockConstants::DOCK_SLOT_MAX];
9898
Vector<WindowWrapper *> dock_windows;
9999
LocalVector<EditorDock *> all_docks;
100+
HashSet<EditorDock *> dirty_docks;
100101

101102
EditorDock *dock_tab_dragged = nullptr;
102103
bool docks_visible = true;
@@ -123,6 +124,8 @@ class EditorDockManager : public Object {
123124
void _move_dock_tab_index(EditorDock *p_dock, int p_tab_index, bool p_set_current);
124125
void _move_dock(EditorDock *p_dock, Control *p_target, int p_tab_index = -1, bool p_set_current = true);
125126

127+
void _queue_update_tab_style(EditorDock *p_dock);
128+
void _update_dirty_dock_tabs();
126129
void _update_tab_style(EditorDock *p_dock);
127130

128131
public:

0 commit comments

Comments
 (0)