From de002ef156808ec433f8c646baa7dec02293f2b6 Mon Sep 17 00:00:00 2001 From: GigabiteStudios Date: Thu, 18 Jun 2026 18:58:57 -0500 Subject: [PATCH] fix(tabs): allow stable tab selection --- src/ui/gitree_ui.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/ui/gitree_ui.cpp b/src/ui/gitree_ui.cpp index 9e83dcb..788ad36 100644 --- a/src/ui/gitree_ui.cpp +++ b/src/ui/gitree_ui.cpp @@ -29,6 +29,7 @@ namespace { std::vector> g_tabs; size_t g_active_tab = 0; +RepositoryView* g_tab_to_select = nullptr; UserData* g_user_data = nullptr; AvatarCache* g_avatar_cache = nullptr; std::array g_path{}; @@ -68,6 +69,7 @@ void persist_repository_session() { void create_new_tab(bool persist = true) { g_tabs.push_back(std::make_unique()); g_active_tab = g_tabs.size() - 1; + g_tab_to_select = g_tabs.back().get(); if (persist) persist_repository_session(); } @@ -953,9 +955,11 @@ void draw_app() { bool add_tab = false; if (ImGui::BeginTabBar("repositories", ImGuiTabBarFlags_AutoSelectNewTabs)) { for (size_t i = 0; i < g_tabs.size(); ++i) { + ImGui::PushID(g_tabs[i].get()); bool open = true; - const std::string label = g_tabs[i]->name + "###repo_tab_" + std::to_string(i); - const ImGuiTabItemFlags flags = (i == g_active_tab ? ImGuiTabItemFlags_SetSelected : ImGuiTabItemFlags_None) | + const std::string label = g_tabs[i]->name + "###repo_tab"; + const ImGuiTabItemFlags flags = (g_tabs[i].get() == g_tab_to_select + ? ImGuiTabItemFlags_SetSelected : ImGuiTabItemFlags_None) | ImGuiTabItemFlags_NoReorder; if (ImGui::BeginTabItem(label.c_str(), &open, flags)) { if (g_active_tab != i) { @@ -988,6 +992,7 @@ void draw_app() { ImGui::EndPopup(); } if (!open) tab_to_close = i; + ImGui::PopID(); } ImGui::SameLine(0, ui(6.0f)); ImGui::InvisibleButton("##new_tab", {ui(28.0f), ui(28.0f)}); @@ -1007,6 +1012,7 @@ void draw_app() { }, IM_COL32(214, 221, 231, 255), ICON_FA_PLUS); if (add_hovered) ImGui::SetTooltip("New tab"); ImGui::EndTabBar(); + g_tab_to_select = nullptr; } if (tab_move_from < g_tabs.size() && tab_move_to < g_tabs.size() && tab_move_from != tab_move_to) { RepositoryView* active = g_tabs[g_active_tab].get(); @@ -1129,6 +1135,7 @@ int runGitree(int argc, char** argv) { if (!path.empty()) git_manager.openRepository(*g_tabs.back(), path, g_notice); } g_active_tab = std::min(user_data.activeRepository(), g_tabs.size() - 1); + g_tab_to_select = g_tabs[g_active_tab].get(); } else { create_new_tab(false); }