fix(tabs): allow stable tab selection

This commit is contained in:
2026-06-18 18:58:57 -05:00
parent a5b0d8ba71
commit de002ef156

View File

@@ -29,6 +29,7 @@ namespace {
std::vector<std::unique_ptr<RepositoryView>> 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<char, 1024> g_path{};
@@ -68,6 +69,7 @@ void persist_repository_session() {
void create_new_tab(bool persist = true) {
g_tabs.push_back(std::make_unique<RepositoryView>());
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);
}