diff --git a/src/internal_libs/utils/opRes.h b/src/internal_libs/utils/opRes.h index e4dbaa0..7b42a20 100644 --- a/src/internal_libs/utils/opRes.h +++ b/src/internal_libs/utils/opRes.h @@ -10,6 +10,10 @@ #ifndef _OPERATION_RESULT_H_ #define _OPERATION_RESULT_H_ +#ifdef BUFFER_SIZE + #undef BUFFER_SIZE +#endif + #include namespace lunarium diff --git a/src/run_modes/editor/panel_manager.cpp b/src/run_modes/editor/panel_manager.cpp index efc2162..1ed4f1d 100644 --- a/src/run_modes/editor/panel_manager.cpp +++ b/src/run_modes/editor/panel_manager.cpp @@ -50,6 +50,7 @@ namespace lunarium { namespace editor mpMainPanel = &MainPanel::GetInstance(); mpMainPanel->SetEditor(mpEditor); + mpMainPanel->ResetDockSpace(); CreatePanels(); @@ -111,6 +112,17 @@ namespace lunarium { namespace editor { 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) { diff --git a/src/run_modes/editor/panel_manager.h b/src/run_modes/editor/panel_manager.h index 9b6a7dd..0960849 100644 --- a/src/run_modes/editor/panel_manager.h +++ b/src/run_modes/editor/panel_manager.h @@ -34,6 +34,7 @@ namespace editor Panel* GetPanel(PanelType type); const MainPanel::DockSpaces& GetDockSpaces() const; + void ResetDocking(); void OnTick(double delta); void OnRender(lunarium::IGraphics* g); diff --git a/src/run_modes/editor/panels/iPanel.cpp b/src/run_modes/editor/panels/iPanel.cpp index f2a534b..0b11272 100644 --- a/src/run_modes/editor/panels/iPanel.cpp +++ b/src/run_modes/editor/panels/iPanel.cpp @@ -16,7 +16,7 @@ namespace lunarium namespace editor { Panel::Panel(PanelType type,bool isOpen) - : mType(type), mIsOpen(isOpen) + : mType(type), mIsOpen(isOpen), mForceDock(false) { } @@ -49,6 +49,10 @@ namespace editor h = mHeight; } + void Panel::ForceDock() + { + mForceDock = true; + } void Panel::Update(float dt) { diff --git a/src/run_modes/editor/panels/iPanel.h b/src/run_modes/editor/panels/iPanel.h index 9af0c6a..c39ac39 100644 --- a/src/run_modes/editor/panels/iPanel.h +++ b/src/run_modes/editor/panels/iPanel.h @@ -39,10 +39,12 @@ namespace editor bool IsOpen(); void GetPosition(int& x, int& y) const; void GetSize(int& w, int& h) const; + void ForceDock(); protected: PanelType mType; bool mIsOpen; + bool mForceDock; // Editor* mpEditor; int mX; diff --git a/src/run_modes/editor/panels/mainPanel.cpp b/src/run_modes/editor/panels/mainPanel.cpp index aaa8ca5..a6750c3 100644 --- a/src/run_modes/editor/panels/mainPanel.cpp +++ b/src/run_modes/editor/panels/mainPanel.cpp @@ -13,6 +13,7 @@ #include #include // To use the DockWindowXXX methods #include +#include "../panel_manager.h" namespace lunarium { @@ -20,7 +21,7 @@ namespace editor { MainPanel* MainPanel::mpInstance = nullptr; MainPanel::MainPanel() - : Panel(PT_MAIN, true), mpEditor(nullptr) + : Panel(PT_MAIN, true), mpEditor(nullptr), mResetDockSpace(false) { } @@ -52,64 +53,104 @@ namespace editor return mDockSpaces; } + void MainPanel::ResetDockSpace() + { + mResetDockSpace = true; + } + bool MainPanel::DoFrame() { if (!mIsOpen) return false; - DoMainMenu(); + + 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 ) ); - Core::MainWindow().GetFramebufferSize(&mWidth, &mHeight); - Core::MainWindow().GetPosition(&mX, &mY); + + + // Core::MainWindow().GetFramebufferSize(&mWidth, &mHeight); + // Core::MainWindow().GetPosition(&mX, &mY); float double_frame_height = ImGui::GetFrameHeight() * 2; - ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f); - ImGui::SetNextWindowSize(ImVec2(mWidth, mHeight - double_frame_height), ImGuiCond_Always); - ImGui::SetNextWindowPos(ImVec2(mX, mY + ImGui::GetFrameHeight()), ImGuiCond_Always); - if (!ImGui::Begin("Lunarium Editor", &mIsOpen, ImGuiWindowFlags_NoCollapse - | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize - | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoBringToFrontOnFocus)) + // ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f); + // ImGui::SetNextWindowSize(ImVec2(mWidth, mHeight - double_frame_height), ImGuiCond_Always); + // ImGui::SetNextWindowPos(ImVec2(mX, mY + ImGui::GetFrameHeight()), ImGuiCond_Always); + if (!ImGui::Begin("Lunarium Editor", &mIsOpen, WindowFlags)) { + MakeDockSpaces(); ImGui::End(); return false; } + ImGui::PopStyleVar( 3 ); + MakeDockSpaces(); - ImGui::PopStyleVar(); +// ImGui::PopStyleVar(); ImGui::End(); - // STATUS BAR - const ImGuiViewport* viewport = ImGui::GetMainViewport(); - ImGui::SetNextWindowViewport(viewport->ID); - ImGui::SetNextWindowSize(ImVec2(mWidth, ImGui::GetFrameHeight() - 15.0f), ImGuiCond_Always); - ImGui::SetNextWindowPos(ImVec2(mX, mY + (mHeight - ImGui::GetFrameHeight() - 8.0f)), ImGuiCond_Always); - ImGui::Begin("status bar", &mIsOpen, ImGuiWindowFlags_NoCollapse - | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize - | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoDocking ); - - if (ImGui::BeginTable("status", 3, ImGuiTableFlags_BordersInnerV)) - { - ImGui::AlignTextToFramePadding(); - ImGui::TableNextColumn(); - ImGui::Text("Lunarium"); - ImGui::TableNextColumn(); - ImGui::Text("Testing"); - ImGui::TableNextColumn(); - ImGui::Text("Status Bar"); - ImGui::EndTable(); - } - - ImGui::End(); + // // STATUS BAR + // const ImGuiViewport* viewport = ImGui::GetMainViewport(); + // ImGui::SetNextWindowViewport(viewport->ID); + // ImGui::SetNextWindowSize(ImVec2(mWidth, ImGui::GetFrameHeight() - 15.0f), ImGuiCond_Always); + // ImGui::SetNextWindowPos(ImVec2(mX, mY + (mHeight - ImGui::GetFrameHeight() - 8.0f)), ImGuiCond_Always); + // ImGui::Begin("status bar", &mIsOpen, ImGuiWindowFlags_NoCollapse + // | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize + // | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoDocking ); + + // if (ImGui::BeginTable("status", 3, ImGuiTableFlags_BordersInnerV)) + // { + // ImGui::AlignTextToFramePadding(); + // ImGui::TableNextColumn(); + // ImGui::Text("Lunarium"); + // ImGui::TableNextColumn(); + // ImGui::Text("Testing"); + // ImGui::TableNextColumn(); + // ImGui::Text("Status Bar"); + // ImGui::EndTable(); + // } + + // ImGui::End(); return true; } void MainPanel::MakeDockSpaces() { - mDockSpaces.Main = ImGui::DockSpace(ImGui::GetID("Lunarium Editor")); + ImGuiViewport* Viewport = ImGui::GetMainViewport(); + mDockSpaces.Main = ImGui::DockSpace(ImGui::GetID("Lunarium Editor Dockspace"), Viewport->Size); + if (!ImGui::DockBuilderGetNode(mDockSpaces.Main) || mResetDockSpace) + { + Logger::Log(mpEditor->GetLogCat(), LogLevel::INFO, "Resetting Dockspaces"); + + mResetDockSpace = false; + ImGui::DockBuilderRemoveNode(mDockSpaces.Main); + ImGui::DockBuilderAddNode(mDockSpaces.Main, ImGuiDockNodeFlags_DockSpace); + ImGui::DockBuilderSetNodeSize(mDockSpaces.Main, Viewport->Size); + ImGui::DockBuilderSetNodePos(mDockSpaces.Main, Viewport->WorkPos); + + ImGui::DockBuilderSplitNode(mDockSpaces.Main, ImGuiDir_Left, 0.25f, &mDockSpaces.Left, &mDockSpaces.Center); + ImGui::DockBuilderSplitNode(mDockSpaces.Center, ImGuiDir_Right, 0.25f, &mDockSpaces.Right, &mDockSpaces.Center); + ImGui::DockBuilderSplitNode(mDockSpaces.Center, ImGuiDir_Down, 0.25f, &mDockSpaces.Bottom, &mDockSpaces.Center); + ImGui::DockBuilderFinish(mDockSpaces.Main); + + // Dock Panels + ImGui::DockBuilderDockWindow("World View", mDockSpaces.Center); + + } + //ImGui::DockSpace(mDockSpaces.Main); } @@ -151,7 +192,11 @@ namespace editor if (ImGui::BeginMenu("Windows")) { - + if (ImGui::MenuItem("Reset Window Docking")) + { + ResetDockSpace(); + PanelManager::GetInstance().ResetDocking(); + } ImGui::EndMenu(); } diff --git a/src/run_modes/editor/panels/mainPanel.h b/src/run_modes/editor/panels/mainPanel.h index 7718fd6..15f2dda 100644 --- a/src/run_modes/editor/panels/mainPanel.h +++ b/src/run_modes/editor/panels/mainPanel.h @@ -25,7 +25,7 @@ namespace editor unsigned int Left; unsigned int Right; unsigned int Center; - unsigned int Top; + // unsigned int Top; unsigned int Bottom; }; @@ -36,6 +36,7 @@ namespace editor void SetEditor(Editor* e); const DockSpaces& GetDockSpaces() const; + void ResetDockSpace(); // Returns false if the window is closed bool DoFrame(); @@ -48,6 +49,7 @@ namespace editor private: Editor* mpEditor; DockSpaces mDockSpaces; + bool mResetDockSpace; private: // HELPERS void DoMainMenu(); diff --git a/src/run_modes/editor/panels/worldView.cpp b/src/run_modes/editor/panels/worldView.cpp index 5fce5f2..73264b6 100644 --- a/src/run_modes/editor/panels/worldView.cpp +++ b/src/run_modes/editor/panels/worldView.cpp @@ -7,6 +7,7 @@ ******************************************************************************/ #include "worldView.h" +#include #include #include #include @@ -28,7 +29,14 @@ namespace editor return false; //ImGui::SetNextWindowPosition() - ImGui::SetNextWindowDockID(PanelManager::GetInstance().GetDockSpaces().Center, ImGuiCond_Appearing); + + if (mForceDock) + { + mForceDock = false; + //ImGui::SetNextWindowDockID(PanelManager::GetInstance().GetDockSpaces().Center, ImGuiCond_Appearing); + Logger::Log(LogCategory::CORE, LogLevel::INFO, "Attempting force-dock world view panel"); + } + if (!ImGui::Begin("World View", &mIsOpen, ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoScrollbar)) { ImGui::End();