/****************************************************************************** * File - panel_manager.cpp * Author - Joey Pollack * Date - 2022/02/07 (y/m/d) * Mod Date - 2022/02/07 (y/m/d) * Description - Manage the editor panels ******************************************************************************/ #include "panel_manager.h" #include "editor.h" #include // Panels #include "panels/about.h" #include "panels/assetBrowser.h" #include "panels/worldTree.h" #include "panels/worldView.h" #include "panels/propertiesView.h" namespace lunarium { namespace editor { PanelManager* PanelManager::mpInstance = nullptr; PanelManager& PanelManager::GetInstance() { if (!mpInstance) { mpInstance = new PanelManager(); } return *mpInstance; } void PanelManager::FreeInstance() { delete mpInstance; mpInstance = nullptr; } PanelManager::PanelManager() : mpEditor(nullptr), mpMainPanel(nullptr) { } OpRes PanelManager::Initialize(Editor* editor) { mpEditor = editor; mpMainPanel = &MainPanel::GetInstance(); mpMainPanel->SetEditor(mpEditor); mpMainPanel->ResetDockSpace(); CreatePanels(); return OpRes::OK(); } void PanelManager::Shutdown() { DestoryPanels(); MainPanel::FreeInstance(); } void PanelManager::OpenPanel(PanelType type) { Panel* p = GetPanel(type); if (!p || p->IsOpen()) { return; } p->SetOpen(true); } void PanelManager::ClosePanel(PanelType type) { Panel* p = GetPanel(type); if (!p || !p->IsOpen()) { return; } p->SetOpen(false); } bool PanelManager::IsOpen(PanelType type) { Panel* p = GetPanel(type); if (!p) { return false; } return p->IsOpen(); } Panel* PanelManager::GetPanel(PanelType type) { auto iter = mPanels.find(type); if (iter != mPanels.end()) { return iter->second; } Logger::Log(mpEditor->GetLogCat(), LogLevel::WARNING, "Requested panel not found: %d", type); return nullptr; } const MainPanel::DockSpaces& PanelManager::GetDockSpaces() const { return mpMainPanel->GetDockSpaces(); } void PanelManager::ResetDocking() { for (auto iter = mPanels.begin(); iter != mPanels.end(); iter++) { if (iter->second->IsOpen()) { iter->second->ForceDock(); } } } void PanelManager::OnTick(double delta) { for (auto iter = mPanels.begin(); iter != mPanels.end(); iter++) { if (iter->second->IsOpen()) { iter->second->Update(delta); } } } void PanelManager::OnRender(lunarium::IGraphics* g) { mpMainPanel->DoFrame(); for (auto iter = mPanels.begin(); iter != mPanels.end(); iter++) { if (iter->second->IsOpen()) { iter->second->DoFrame(); } } } //////////////////////////////////////////////////////////// // HELPER METHODS //////////////////////////////////////////////////////////// void PanelManager::CreatePanels() { mPanels[PanelType::PT_ABOUT] = new AboutPanel; mPanels[PanelType::PT_ASSET_BROWSER] = new AssetBrowser(""); mPanels[PanelType::PT_WORLD_TREE] = new WorldTree(); mPanels[PanelType::PT_WORLD_VIEW] = new WorldView(); mPanels[PanelType::PT_PROPERTIES_VIEW] = new PropertiesView(); } void PanelManager::DestoryPanels() { delete mPanels[PanelType::PT_ABOUT]; delete mPanels[PanelType::PT_ASSET_BROWSER]; delete mPanels[PanelType::PT_WORLD_TREE]; delete mPanels[PanelType::PT_WORLD_VIEW]; delete mPanels[PanelType::PT_PROPERTIES_VIEW]; mPanels.clear(); } }}