From 4e068d628cf778c73305218c48ef7451b6bf2a86 Mon Sep 17 00:00:00 2001 From: Gary Talent Date: Mon, 3 Feb 2025 00:19:14 -0600 Subject: [PATCH] [studio] Fix misrender flash on tab close --- src/olympic/studio/applib/src/studioapp.cpp | 29 ++++++++++++++++----- src/olympic/studio/applib/src/studioapp.hpp | 1 + 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/olympic/studio/applib/src/studioapp.cpp b/src/olympic/studio/applib/src/studioapp.cpp index 82df7b2d..944939de 100644 --- a/src/olympic/studio/applib/src/studioapp.cpp +++ b/src/olympic/studio/applib/src/studioapp.cpp @@ -231,7 +231,10 @@ void StudioUI::drawTabs() noexcept { if (m_activeEditorOnLastDraw != e.get()) [[unlikely]] { m_activeEditor->onActivated(); } - if (open) [[likely]] { + if (m_closeActiveTab) [[unlikely]] { + ImGui::SetTabItemClosed(e->itemDisplayName().c_str()); + + } else if (open) [[likely]] { e->draw(m_sctx); } m_activeEditorOnLastDraw = e.get(); @@ -258,6 +261,20 @@ void StudioUI::drawTabs() noexcept { ++it; } } + if (m_closeActiveTab) [[unlikely]] { + if (m_activeEditor) { + auto const idx = find_if( + m_editors.begin(), m_editors.end(), + [this](ox::UPtr const &e) { + return m_activeEditor == e.get(); + }); + if (idx != m_editors.end()) { + oxLogError(m_editors.erase(idx.offset()).error); + } + m_activeEditor = nullptr; + } + m_closeActiveTab = false; + } } void StudioUI::loadEditorMaker(EditorMaker const&editorMaker) noexcept { @@ -407,13 +424,12 @@ ox::Error StudioUI::handleMoveFile(ox::StringViewCR oldPath, ox::StringViewCR ne } ox::Error StudioUI::handleDeleteFile(ox::StringViewCR path) noexcept { - for (size_t i{}; auto &e : m_editors) { + for (auto &e : m_editors) { if (path == e->itemPath()) { - oxLogError(m_editors.erase(i).error); oxLogError(closeFile(path)); + m_closeActiveTab = true; break; } - ++i; } return m_projectExplorer.refreshProjectTreeModel(); } @@ -505,13 +521,12 @@ ox::Error StudioUI::handleCloseFileResponse(ig::PopupResponse const response) no } ox::Error StudioUI::closeCurrentFile() noexcept { - for (size_t i{}; auto &e : m_editors) { + for (auto &e : m_editors) { if (m_activeEditor == e.get()) { oxLogError(closeFile(e->itemPath())); - oxLogError(m_editors.erase(i).error); + m_closeActiveTab = true; break; } - ++i; } return {}; } diff --git a/src/olympic/studio/applib/src/studioapp.hpp b/src/olympic/studio/applib/src/studioapp.hpp index 3ac1b308..0ced3dca 100644 --- a/src/olympic/studio/applib/src/studioapp.hpp +++ b/src/olympic/studio/applib/src/studioapp.hpp @@ -41,6 +41,7 @@ class StudioUI: public ox::SignalHandler { BaseEditor *m_activeEditorOnLastDraw = nullptr; BaseEditor *m_activeEditor = nullptr; BaseEditor *m_activeEditorUpdatePending = nullptr; + bool m_closeActiveTab{}; ox::Vector> m_queuedMoves; ox::Vector> m_queuedDirMoves; NewMenu m_newMenu{keelCtx(m_tctx)};