fix(tabs): allow stable tab selection
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user