/****************************************************************************** * 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 #include #include // To use the DockWindowXXX methods #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), mResetDockSpace(false) { } OpRes PanelManager::Initialize(Editor* editor) { mpEditor = editor; //mpMainPanel = &MainPanel::GetInstance(); // mpMainPanel->SetEditor(mpEditor); //mpMainPanel->ResetDockSpace(); if (!std::filesystem::exists("imgui.ini")) { mResetDockSpace = true; } 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; } void PanelManager::ResetDocking() { mResetDockSpace = true; } 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(); ImGuiViewport* Viewport = ImGui::GetMainViewport(); ImGui::SetNextWindowPos( Viewport->WorkPos ); ImGui::SetNextWindowSize( Viewport->WorkSize ); ImGui::SetNextWindowViewport( Viewport->ID ); ImGuiWindowFlags WindowFlags = 0; WindowFlags |= ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoDocking; WindowFlags |= ImGuiWindowFlags_NoBringToFrontOnFocus | ImGuiWindowFlags_NoNavFocus; ImGui::PushStyleVar( ImGuiStyleVar_WindowRounding, 0.0f ); ImGui::PushStyleVar( ImGuiStyleVar_WindowBorderSize, 0.0f ); ImGui::PushStyleVar( ImGuiStyleVar_WindowPadding, ImVec2( 0.0f, 0.0f ) ); ImGui::Begin("Lunarium Editor", nullptr, WindowFlags); ImGui::PopStyleVar(3); MakeDockSpaces(); ImGui::End(); 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(); } void PanelManager::MakeDockSpaces() { ImGuiViewport* Viewport = ImGui::GetMainViewport(); mDockSpaceID = ImGui::DockSpace(ImGui::GetID("Lunarium Editor Dockspace")); if (!ImGui::DockBuilderGetNode(mDockSpaceID) || mResetDockSpace) { Logger::Log(mpEditor->GetLogCat(), LogLevel::INFO, "Resetting Dockspaces"); mResetDockSpace = false; ImGui::DockBuilderRemoveNode(mDockSpaceID); ImGui::DockBuilderAddNode(mDockSpaceID, ImGuiDockNodeFlags_DockSpace); ImGui::DockBuilderSetNodeSize(mDockSpaceID, Viewport->Size); //ImGui::DockBuilderSetNodePos(mDockSpaces.Main, Viewport->WorkPos); ImGui::DockBuilderSplitNode(mDockSpaceID, ImGuiDir_Left, 0.25f, &mDockZoneIDs[PanelDockZone::DDZ_LEFT], &mDockZoneIDs[PanelDockZone::DDZ_CENTER]); ImGui::DockBuilderSplitNode(mDockZoneIDs[PanelDockZone::DDZ_CENTER], ImGuiDir_Right, 0.2f, &mDockZoneIDs[PanelDockZone::DDZ_RIGHT], &mDockZoneIDs[PanelDockZone::DDZ_CENTER]); ImGui::DockBuilderSplitNode(mDockZoneIDs[PanelDockZone::DDZ_CENTER], ImGuiDir_Down, 0.25f, &mDockZoneIDs[PanelDockZone::DDZ_BOTTOM], &mDockZoneIDs[PanelDockZone::DDZ_CENTER]); ImGui::DockBuilderFinish(mDockSpaceID); // Dock Panels for (auto iter = mPanels.begin(); iter != mPanels.end(); iter++) { PanelDockZone dz = iter->second->GetDockZone(); if (dz != PanelDockZone::DDZ_NONE) { ImGui::DockBuilderDockWindow(iter->second->GetName(), mDockZoneIDs[dz]); } } } } }}