Programmatic docking proof-of-concept working

Gui_Panel_Refactor
Joeyrp 4 years ago
parent 6a6c6d42ab
commit 6b24ac4bc5

@ -10,6 +10,10 @@
#ifndef _OPERATION_RESULT_H_ #ifndef _OPERATION_RESULT_H_
#define _OPERATION_RESULT_H_ #define _OPERATION_RESULT_H_
#ifdef BUFFER_SIZE
#undef BUFFER_SIZE
#endif
#include <string> #include <string>
namespace lunarium namespace lunarium

@ -50,6 +50,7 @@ namespace lunarium { namespace editor
mpMainPanel = &MainPanel::GetInstance(); mpMainPanel = &MainPanel::GetInstance();
mpMainPanel->SetEditor(mpEditor); mpMainPanel->SetEditor(mpEditor);
mpMainPanel->ResetDockSpace();
CreatePanels(); CreatePanels();
@ -111,6 +112,17 @@ namespace lunarium { namespace editor
{ {
return mpMainPanel->GetDockSpaces(); 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) void PanelManager::OnTick(double delta)
{ {

@ -34,6 +34,7 @@ namespace editor
Panel* GetPanel(PanelType type); Panel* GetPanel(PanelType type);
const MainPanel::DockSpaces& GetDockSpaces() const; const MainPanel::DockSpaces& GetDockSpaces() const;
void ResetDocking();
void OnTick(double delta); void OnTick(double delta);
void OnRender(lunarium::IGraphics* g); void OnRender(lunarium::IGraphics* g);

@ -16,7 +16,7 @@ namespace lunarium
namespace editor namespace editor
{ {
Panel::Panel(PanelType type,bool isOpen) Panel::Panel(PanelType type,bool isOpen)
: mType(type), mIsOpen(isOpen) : mType(type), mIsOpen(isOpen), mForceDock(false)
{ {
} }
@ -49,6 +49,10 @@ namespace editor
h = mHeight; h = mHeight;
} }
void Panel::ForceDock()
{
mForceDock = true;
}
void Panel::Update(float dt) void Panel::Update(float dt)
{ {

@ -39,10 +39,12 @@ namespace editor
bool IsOpen(); bool IsOpen();
void GetPosition(int& x, int& y) const; void GetPosition(int& x, int& y) const;
void GetSize(int& w, int& h) const; void GetSize(int& w, int& h) const;
void ForceDock();
protected: protected:
PanelType mType; PanelType mType;
bool mIsOpen; bool mIsOpen;
bool mForceDock;
// Editor* mpEditor; // Editor* mpEditor;
int mX; int mX;

@ -13,6 +13,7 @@
#include <dearimgui/imgui.h> #include <dearimgui/imgui.h>
#include <dearimgui/imgui_internal.h> // To use the DockWindowXXX methods #include <dearimgui/imgui_internal.h> // To use the DockWindowXXX methods
#include <utils/logger.h> #include <utils/logger.h>
#include "../panel_manager.h"
namespace lunarium namespace lunarium
{ {
@ -20,7 +21,7 @@ namespace editor
{ {
MainPanel* MainPanel::mpInstance = nullptr; MainPanel* MainPanel::mpInstance = nullptr;
MainPanel::MainPanel() MainPanel::MainPanel()
: Panel(PT_MAIN, true), mpEditor(nullptr) : Panel(PT_MAIN, true), mpEditor(nullptr), mResetDockSpace(false)
{ {
} }
@ -52,64 +53,104 @@ namespace editor
return mDockSpaces; return mDockSpaces;
} }
void MainPanel::ResetDockSpace()
{
mResetDockSpace = true;
}
bool MainPanel::DoFrame() bool MainPanel::DoFrame()
{ {
if (!mIsOpen) if (!mIsOpen)
return false; return false;
DoMainMenu(); 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; float double_frame_height = ImGui::GetFrameHeight() * 2;
ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f); // ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f);
ImGui::SetNextWindowSize(ImVec2(mWidth, mHeight - double_frame_height), ImGuiCond_Always); // ImGui::SetNextWindowSize(ImVec2(mWidth, mHeight - double_frame_height), ImGuiCond_Always);
ImGui::SetNextWindowPos(ImVec2(mX, mY + ImGui::GetFrameHeight()), ImGuiCond_Always); // ImGui::SetNextWindowPos(ImVec2(mX, mY + ImGui::GetFrameHeight()), ImGuiCond_Always);
if (!ImGui::Begin("Lunarium Editor", &mIsOpen, ImGuiWindowFlags_NoCollapse if (!ImGui::Begin("Lunarium Editor", &mIsOpen, WindowFlags))
| ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize
| ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoBringToFrontOnFocus))
{ {
MakeDockSpaces();
ImGui::End(); ImGui::End();
return false; return false;
} }
ImGui::PopStyleVar( 3 );
MakeDockSpaces(); MakeDockSpaces();
ImGui::PopStyleVar(); // ImGui::PopStyleVar();
ImGui::End(); ImGui::End();
// STATUS BAR // // STATUS BAR
const ImGuiViewport* viewport = ImGui::GetMainViewport(); // const ImGuiViewport* viewport = ImGui::GetMainViewport();
ImGui::SetNextWindowViewport(viewport->ID); // ImGui::SetNextWindowViewport(viewport->ID);
ImGui::SetNextWindowSize(ImVec2(mWidth, ImGui::GetFrameHeight() - 15.0f), ImGuiCond_Always); // ImGui::SetNextWindowSize(ImVec2(mWidth, ImGui::GetFrameHeight() - 15.0f), ImGuiCond_Always);
ImGui::SetNextWindowPos(ImVec2(mX, mY + (mHeight - ImGui::GetFrameHeight() - 8.0f)), ImGuiCond_Always); // ImGui::SetNextWindowPos(ImVec2(mX, mY + (mHeight - ImGui::GetFrameHeight() - 8.0f)), ImGuiCond_Always);
ImGui::Begin("status bar", &mIsOpen, ImGuiWindowFlags_NoCollapse // ImGui::Begin("status bar", &mIsOpen, ImGuiWindowFlags_NoCollapse
| ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize // | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize
| ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoDocking ); // | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoDocking );
if (ImGui::BeginTable("status", 3, ImGuiTableFlags_BordersInnerV)) // if (ImGui::BeginTable("status", 3, ImGuiTableFlags_BordersInnerV))
{ // {
ImGui::AlignTextToFramePadding(); // ImGui::AlignTextToFramePadding();
ImGui::TableNextColumn(); // ImGui::TableNextColumn();
ImGui::Text("Lunarium"); // ImGui::Text("Lunarium");
ImGui::TableNextColumn(); // ImGui::TableNextColumn();
ImGui::Text("Testing"); // ImGui::Text("Testing");
ImGui::TableNextColumn(); // ImGui::TableNextColumn();
ImGui::Text("Status Bar"); // ImGui::Text("Status Bar");
ImGui::EndTable(); // ImGui::EndTable();
} // }
ImGui::End(); // ImGui::End();
return true; return true;
} }
void MainPanel::MakeDockSpaces() 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::BeginMenu("Windows"))
{ {
if (ImGui::MenuItem("Reset Window Docking"))
{
ResetDockSpace();
PanelManager::GetInstance().ResetDocking();
}
ImGui::EndMenu(); ImGui::EndMenu();
} }

@ -25,7 +25,7 @@ namespace editor
unsigned int Left; unsigned int Left;
unsigned int Right; unsigned int Right;
unsigned int Center; unsigned int Center;
unsigned int Top; // unsigned int Top;
unsigned int Bottom; unsigned int Bottom;
}; };
@ -36,6 +36,7 @@ namespace editor
void SetEditor(Editor* e); void SetEditor(Editor* e);
const DockSpaces& GetDockSpaces() const; const DockSpaces& GetDockSpaces() const;
void ResetDockSpace();
// Returns false if the window is closed // Returns false if the window is closed
bool DoFrame(); bool DoFrame();
@ -48,6 +49,7 @@ namespace editor
private: private:
Editor* mpEditor; Editor* mpEditor;
DockSpaces mDockSpaces; DockSpaces mDockSpaces;
bool mResetDockSpace;
private: // HELPERS private: // HELPERS
void DoMainMenu(); void DoMainMenu();

@ -7,6 +7,7 @@
******************************************************************************/ ******************************************************************************/
#include "worldView.h" #include "worldView.h"
#include <utils\logger.h>
#include <game/world/world.h> #include <game/world/world.h>
#include <dearimgui/imgui.h> #include <dearimgui/imgui.h>
#include <editor/editor.h> #include <editor/editor.h>
@ -28,7 +29,14 @@ namespace editor
return false; return false;
//ImGui::SetNextWindowPosition() //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)) if (!ImGui::Begin("World View", &mIsOpen, ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoScrollbar))
{ {
ImGui::End(); ImGui::End();

Loading…
Cancel
Save