/****************************************************************************** * 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 // 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" using namespace lunarium::gui; namespace lunarium { namespace editor { PanelManager::PanelManager() : mpEditor(nullptr), mResetDockSpace(false), mDockSpaceID(0) { } OpRes PanelManager::Initialize(Editor* editor, std::string name) { mpEditor = editor; mName = name; memset(&mWindowClass, 0, sizeof(ImGuiWindowClass)); mWindowClass.ClassId = mpEditor->GetNextWindowID(); if (!std::filesystem::exists("imgui.ini")) { mResetDockSpace = true; } return OpRes::OK(); } void PanelManager::Shutdown() { DestoryPanels(); } OpRes PanelManager::AddPanel(gui::PanelType type, gui::Panel* panel) { if (GetPanel(type)) { return OpRes::Fail("Cannot add panel - panel already exists. Panel Name: %s", panel->GetName()); } mPanels[type] = panel; return OpRes::OK(); } 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 ImGuiWindowClass* PanelManager::GetWindowClass() const { return &mWindowClass; } 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(); ImGuiViewport* Viewport = ImGui::GetWindowViewport(); 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(mName.c_str(), nullptr, WindowFlags); ImGui::PopStyleVar(3); MakeDockSpaces(); ImGui::End(); for (auto iter = mPanels.begin(); iter != mPanels.end(); iter++) { if (iter->second->IsOpen()) { ImGui::SetNextWindowClass(&mWindowClass); iter->second->DoFrame(); } } } //////////////////////////////////////////////////////////// // HELPER METHODS //////////////////////////////////////////////////////////// void PanelManager::DestoryPanels() { for (auto iter = mPanels.begin(); iter != mPanels.end(); iter++) { delete iter->second; } mPanels.clear(); } void PanelManager::MakeDockSpaces() { //ImGuiViewport* Viewport = ImGui::GetMainViewport(); ImGuiViewport* Viewport = ImGui::GetWindowViewport(); ImGuiID windowID = mpEditor->GetNextWindowID(); std::string dock_name = mName; dock_name += " DockSpace"; mDockSpaceID = ImGui::DockSpace(ImGui::GetID(dock_name.c_str()), ImVec2(0, 0), 0, &mWindowClass); if (!ImGui::DockBuilderGetNode(mDockSpaceID) || mResetDockSpace) { Logger::Log(mpEditor->GetLogCat(), LogLevel::INFO_VERBOSE, "Resetting Dockspace: %s", dock_name.c_str()); 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_Down, 0.25f, &mDockZoneIDs[PanelDockZone::DDZ_BOTTOM], &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_Left, 0.2f, &mDockZoneIDs[PanelDockZone::DDZ_LEFT], &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]); } } } } }}