|
|
|
@ -24,15 +24,16 @@ using namespace lunarium::gui;
|
|
|
|
namespace lunarium { namespace editor
|
|
|
|
namespace lunarium { namespace editor
|
|
|
|
{
|
|
|
|
{
|
|
|
|
PanelManager::PanelManager()
|
|
|
|
PanelManager::PanelManager()
|
|
|
|
: mpEditor(nullptr), mResetDockSpace(false), mDockSpaceID(0)
|
|
|
|
: mpEditor(nullptr), mResetDockSpace(false), mDockSpaceID(0), mSplitBottom(false)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
OpRes PanelManager::Initialize(Editor* editor, std::string name)
|
|
|
|
OpRes PanelManager::Initialize(Editor* editor, std::string name, bool split_bottom)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
mpEditor = editor;
|
|
|
|
mpEditor = editor;
|
|
|
|
mName = name;
|
|
|
|
mName = name;
|
|
|
|
|
|
|
|
mSplitBottom = split_bottom;
|
|
|
|
|
|
|
|
|
|
|
|
memset(&mWindowClass, 0, sizeof(ImGuiWindowClass));
|
|
|
|
memset(&mWindowClass, 0, sizeof(ImGuiWindowClass));
|
|
|
|
mWindowClass.ClassId = mpEditor->GetNextWindowID();
|
|
|
|
mWindowClass.ClassId = mpEditor->GetNextWindowID();
|
|
|
|
@ -53,7 +54,7 @@ namespace lunarium { namespace editor
|
|
|
|
|
|
|
|
|
|
|
|
OpRes PanelManager::AddPanel(gui::PanelType type, gui::Panel* panel)
|
|
|
|
OpRes PanelManager::AddPanel(gui::PanelType type, gui::Panel* panel)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (GetPanel(type))
|
|
|
|
if (mPanels.find(type) != mPanels.end())
|
|
|
|
{
|
|
|
|
{
|
|
|
|
return OpRes::Fail("Cannot add panel - panel already exists. Panel Name: %s", panel->GetName());
|
|
|
|
return OpRes::Fail("Cannot add panel - panel already exists. Panel Name: %s", panel->GetName());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -113,6 +114,17 @@ namespace lunarium { namespace editor
|
|
|
|
return &mWindowClass;
|
|
|
|
return &mWindowClass;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool PanelManager::IsBottomSplit() const
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
return mSplitBottom;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void PanelManager::SetSplitBottom(bool split_bottom)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
mSplitBottom = split_bottom;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void PanelManager::ResetDocking()
|
|
|
|
void PanelManager::ResetDocking()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
mResetDockSpace = true;
|
|
|
|
mResetDockSpace = true;
|
|
|
|
@ -195,6 +207,12 @@ namespace lunarium { namespace editor
|
|
|
|
//ImGui::DockBuilderSetNodePos(mDockSpaces.Main, Viewport->WorkPos);
|
|
|
|
//ImGui::DockBuilderSetNodePos(mDockSpaces.Main, Viewport->WorkPos);
|
|
|
|
|
|
|
|
|
|
|
|
ImGui::DockBuilderSplitNode(mDockSpaceID, ImGuiDir_Down, 0.25f, &mDockZoneIDs[PanelDockZone::DDZ_BOTTOM], &mDockZoneIDs[PanelDockZone::DDZ_CENTER]);
|
|
|
|
ImGui::DockBuilderSplitNode(mDockSpaceID, ImGuiDir_Down, 0.25f, &mDockZoneIDs[PanelDockZone::DDZ_BOTTOM], &mDockZoneIDs[PanelDockZone::DDZ_CENTER]);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (mSplitBottom)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
ImGui::DockBuilderSplitNode(mDockZoneIDs[PanelDockZone::DDZ_BOTTOM], ImGuiDir_Left, 0.2f, &mDockZoneIDs[PanelDockZone::DDZ_BOT_LEFT], &mDockZoneIDs[PanelDockZone::DDZ_BOT_RIGHT]);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
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_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::DockBuilderSplitNode(mDockZoneIDs[PanelDockZone::DDZ_CENTER], ImGuiDir_Left, 0.2f, &mDockZoneIDs[PanelDockZone::DDZ_LEFT], &mDockZoneIDs[PanelDockZone::DDZ_CENTER]);
|
|
|
|
ImGui::DockBuilderFinish(mDockSpaceID);
|
|
|
|
ImGui::DockBuilderFinish(mDockSpaceID);
|
|
|
|
@ -205,6 +223,22 @@ namespace lunarium { namespace editor
|
|
|
|
PanelDockZone dz = iter->second->GetDockZone();
|
|
|
|
PanelDockZone dz = iter->second->GetDockZone();
|
|
|
|
if (dz != PanelDockZone::DDZ_NONE)
|
|
|
|
if (dz != PanelDockZone::DDZ_NONE)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
// If the panel expects the bottom node to be split but it isn't
|
|
|
|
|
|
|
|
// we need to change it to just dock to the bottom
|
|
|
|
|
|
|
|
if ((dz == PanelDockZone::DDZ_BOT_LEFT ||
|
|
|
|
|
|
|
|
dz == PanelDockZone::DDZ_BOT_RIGHT) &&
|
|
|
|
|
|
|
|
!mSplitBottom)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
dz = PanelDockZone::DDZ_BOTTOM;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Also need to account for the opposite situation
|
|
|
|
|
|
|
|
// Default it to the bottom left
|
|
|
|
|
|
|
|
if (dz == PanelDockZone::DDZ_BOTTOM && mSplitBottom)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
dz = PanelDockZone::DDZ_BOT_LEFT;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ImGui::DockBuilderDockWindow(iter->second->GetName(), mDockZoneIDs[dz]);
|
|
|
|
ImGui::DockBuilderDockWindow(iter->second->GetName(), mDockZoneIDs[dz]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|