// Copyright 2025 Pound Emulator Project. All rights reserved. #pragma once #include #include #include #include "Window.h" #include "Panel.h" namespace Pound::GUI { struct TabBar; struct TabItem { std::string name; std::string shortcut; bool *p_selected = nullptr; std::function render_callback; std::function checked_callback; std::unique_ptr nested_tabs = nullptr; }; struct TabBar { std::string id; std::vector items; bool is_visible = true; }; class GUIManager { public: GUIManager(); ~GUIManager(); bool Initialize(const std::string &title, int width, int height); void Shutdown(); void RunFrame(); bool IsRunning() const { return running && window && !window->ShouldClose(); } Window *GetWindow() const { return window.get(); } void AddPanel(std::shared_ptr panel); void RemovePanel(const std::string &name); TabBar *AddTabs(const std::string &name); void AddSubTab(TabBar *parent_bar, const std::string &name, std::function callback = nullptr); void AddSubTab(TabBar *parent_bar, const std::string &name, const std::string &shortcut, std::function callback); void AddSubTab(TabBar *parent_bar, const std::string &name, bool *p_selected, std::function callback = nullptr); void AddSubTab(TabBar *parent_bar, const std::string &name, bool *p_selected, const std::string &shortcut, std::function callback = nullptr); private: void BeginFrame(); void EndFrame(); void ApplyTheme(); void RenderTabBars(); void RenderTabBarContents(TabBar &bar); std::unique_ptr window; std::vector> panels; bool running = false; bool show_demo_window = false; std::vector> m_tab_bars; }; } // namespace Pound::GUI