diff --git a/src/AIAC/LayerUI.cpp b/src/AIAC/LayerUI.cpp index c6b88646e..db90c9110 100644 --- a/src/AIAC/LayerUI.cpp +++ b/src/AIAC/LayerUI.cpp @@ -117,12 +117,12 @@ namespace AIAC m_LogoLightClr = AIAC::Image(AIAC_LOGO_COLOR); // Set panes UI for layers - // Label Collapse PaneContent - StackPane(PaneUI("Camera", false, AIAC_BIND_EVENT_FN(SetPaneUICamera) )); - StackPane(PaneUI("Mapping", false, AIAC_BIND_EVENT_FN(SetPaneUISlam) )); - StackPane(PaneUI("ACIM (Execution model)", false, AIAC_BIND_EVENT_FN(SetPaneUIACIM) )); - StackPane(PaneUI("Toolhead", false, AIAC_BIND_EVENT_FN(SetPaneUIToolhead), AIAC_BIND_EVENT_FN(OnCollapsingPaneUIToolhead))); - StackPane(PaneUI("Utils", false, AIAC_BIND_EVENT_FN(SetPaneUIUtils) )); + // Label Collapse PaneContent + StackPane(PaneUI("Camera", false, AIAC_BIND_EVENT_FN(SetPaneUICamera) )); + StackPane(PaneUI("Mapping", false, AIAC_BIND_EVENT_FN(SetPaneUISlam) )); + StackPane(PaneUI("ACIM (Execution model)", false, AIAC_BIND_EVENT_FN(SetPaneUIACIM) )); + StackPane(PaneUI("Toolhead", false, AIAC_BIND_EVENT_FN(SetPaneUIToolhead), AIAC_BIND_EVENT_FN(OnCollapsingPaneUIToolhead))); + StackPane(PaneUI("Utils", false, AIAC_BIND_EVENT_FN(SetPaneUIUtils) )); m_IsOpen = new bool(true); } @@ -174,6 +174,39 @@ namespace AIAC ImGui::DestroyContext(); } + template + void PaneUI::Show(Args &&... args) { + bool isOpened = ImGui::CollapsingHeader(m_Label, m_IsCollapsed ? ImGuiTreeNodeFlags_DefaultOpen : 0); + if (isOpened) { + // if this one is not opened yet, close the previously opened one + if (m_CollapseState != CollapseState::OPEN) { + auto lastOpenedPaneUI = AIAC_APP.GetLayer()->GetOpenedPaneUI(); + if (lastOpenedPaneUI != nullptr && lastOpenedPaneUI->m_Label != m_Label) { + ImGui::GetStateStorage()->SetInt(ImGui::GetID(lastOpenedPaneUI->m_Label), 0); + lastOpenedPaneUI->Show(); + } + AIAC_APP.GetLayer()->SetOpenedPaneUI(this); + } + m_CollapseState = CollapseState::OPEN; + m_func(std::forward(args)...); + } + + // check if it's just collapsed + if (!isOpened) { + if (m_CollapseState == CollapseState::OPEN) { + m_CollapseState = CollapseState::ON_COLLAPSING; + } + } + } + + template + void PaneUI::CheckOnCollapsing(Args &&... args) { + if (m_CollapseState == CollapseState::ON_COLLAPSING) { + m_onCollapseCallback(std::forward(args)...); + m_CollapseState = CollapseState::COLLAPSE; + } + } + void LayerUI::ShowMenuBar() { if (ImGui::BeginMainMenuBar()) @@ -204,8 +237,8 @@ namespace AIAC #endif for (auto& pane : m_PaneUIStack) { - pane->Show(); - pane->CheckOnCollapsing(); + pane.Show(); + pane.CheckOnCollapsing(); } ImGui::End(); diff --git a/src/AIAC/LayerUI.h b/src/AIAC/LayerUI.h index abb2fb4a4..f8b2d7bcd 100644 --- a/src/AIAC/LayerUI.h +++ b/src/AIAC/LayerUI.h @@ -33,28 +33,10 @@ namespace AIAC { } template - void Show(Args &&... args) { - bool isOpened = ImGui::CollapsingHeader(m_Label, m_IsCollapsed ? ImGuiTreeNodeFlags_DefaultOpen : 0); - if (isOpened) { - m_CollapseState = CollapseState::OPEN; - m_func(std::forward(args)...); - } - - // check if it's just collapsed - if (!isOpened) { - if (m_CollapseState == CollapseState::OPEN) { - m_CollapseState = CollapseState::ON_COLLAPSING; - } - } - } + void Show(Args &&... args); template - void CheckOnCollapsing(Args &&... args) { - if (m_CollapseState == CollapseState::ON_COLLAPSING) { - m_onCollapseCallback(); - m_CollapseState = CollapseState::COLLAPSE; - } - } + void CheckOnCollapsing(Args &&... args); private: CollapseState m_CollapseState; @@ -95,13 +77,15 @@ namespace AIAC { void ShowLogRecorderUI(); - inline void StackPane(PaneUI pane) { m_PaneUIStack.push_back(std::make_shared(pane)); } + inline void StackPane(PaneUI pane) { m_PaneUIStack.emplace_back(std::move(pane)); } void SetPaneUICamera(); void SetPaneUISlam(); void SetPaneUIToolhead(); void OnCollapsingPaneUIToolhead(); void SetPaneUIACIM(); void SetPaneUIUtils(); + PaneUI* GetOpenedPaneUI() { return m_OpenedPaneUI; } + void SetOpenedPaneUI(PaneUI* paneUI) { m_OpenedPaneUI = paneUI; } private: void SetGlobalViewUI(ImVec2 viewportSize); @@ -125,7 +109,8 @@ namespace AIAC { bool *m_IsOpen = nullptr; - std::vector> m_PaneUIStack; + std::vector m_PaneUIStack; + PaneUI* m_OpenedPaneUI = nullptr; // UI File Selection std::string m_FileSelectDefaultPath = ".";