Refactored MainPanel into the PanelManager instead (they both were basically doing the same job)

Menu and status bar code refactored into Editor (This could become quite large may need another class to handle the menus)
Build script now accepts the g option to delete the imgui.ini file on build for testing.
Gui_Panel_Refactor
Joeyrp 4 years ago
parent 6b24ac4bc5
commit ed030afcea

@ -7,8 +7,16 @@ IF not exist build/ (
goto END goto END
) )
set "DELGUI="
set "RELEASE="
IF "%~1" == "r" ( If "%~1" == "r" set "RELEASE=1"
If "%~2" == "r" set "RELEASE=1"
If "%~1" == "g" set "DELGUI=1"
If "%~2" == "g" set "DELGUI=1"
IF defined RELEASE (
cmake --build build/ --target ALL_BUILD --config Release cmake --build build/ --target ALL_BUILD --config Release
xcopy /y test_data\engine_state.xml build\Release\ xcopy /y test_data\engine_state.xml build\Release\
) ELSE ( ) ELSE (
@ -16,4 +24,9 @@ cmake --build build/ --target ALL_BUILD --config Debug
xcopy /y test_data\engine_state.xml build\Debug\ xcopy /y test_data\engine_state.xml build\Debug\
) )
IF defined DELGUI (
del /s /q build\Debug\imgui.ini
del /s /q build\Release\imgui.ini
)
:END :END

@ -35,7 +35,7 @@ int main(int argc, char** argv)
return 1; return 1;
} }
std::cout << "\nEngine core successfully initialized!\n"; //std::cout << "\nEngine core successfully initialized!\n";
core.RunGameLoop(); core.RunGameLoop();

@ -5,7 +5,6 @@ set(EDITOR_SRC
"panel_manager.cpp" "panel_manager.cpp"
"project/project.cpp" "project/project.cpp"
"panels/iPanel.cpp" "panels/iPanel.cpp"
"panels/mainPanel.cpp"
"panels/about.cpp" "panels/about.cpp"
"panels/assetBrowser.cpp" "panels/assetBrowser.cpp"
"panels/worldTree.cpp" "panels/worldTree.cpp"

@ -13,6 +13,7 @@
#include <utils/logger.h> #include <utils/logger.h>
#include <gui/fileBrowser.h> #include <gui/fileBrowser.h>
#include <internal_data/dataManager.h> #include <internal_data/dataManager.h>
#include <dearimgui/imgui.h>
#include "panels/assetBrowser.h" #include "panels/assetBrowser.h"
@ -67,6 +68,8 @@ namespace editor
void Editor::OnRender(lunarium::IGraphics* g) void Editor::OnRender(lunarium::IGraphics* g)
{ {
DoMainMenu();
DoStatusBar();
PanelManager::GetInstance().OnRender(g); PanelManager::GetInstance().OnRender(g);
if (mpMapEditor) if (mpMapEditor)
@ -227,51 +230,108 @@ namespace editor
} }
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
// MENU BAR EVENTS // MENU BAR
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
void Editor::NewProject() void Editor::DoMainMenu()
{ {
mDoNewProject = true; ImGui::BeginMainMenuBar();
}
void Editor::OpenProject() // File
{ if (ImGui::BeginMenu("File"))
mDoOpenProject = true; {
} if (ImGui::MenuItem("New Project"))
{
mDoNewProject = true;
}
void Editor::SaveProject() if (ImGui::MenuItem("Open Project"))
{ {
mDoSaveProject = true; mDoOpenProject = true;
} }
void Editor::SaveAs() if (ImGui::MenuItem("Save Project"))
{ {
mDoSaveAs = true; mDoSaveProject = true;
} }
void Editor::Exit() if (ImGui::MenuItem("Save Project As"))
{ {
Core::GetInstance().SignalShutdown(); mDoSaveAs = true;
} }
void Editor::ShowAboutPanel() ImGui::Separator();
{
PanelManager::GetInstance().OpenPanel(PanelType::PT_ABOUT); if (ImGui::MenuItem("Exit"))
} {
Core::GetInstance().SignalShutdown();
}
ImGui::EndMenu();
}
if (ImGui::BeginMenu("Windows"))
{
if (ImGui::MenuItem("Reset Window Docking"))
{
PanelManager::GetInstance().ResetDocking();
}
ImGui::EndMenu();
}
// Tools
if (ImGui::BeginMenu("Tools"))
{
if (ImGui::MenuItem("Map Editor"))
{
if (!mpMapEditor)
{
mpMapEditor = new MapEditor;
mpMapEditor->Initialize(this);
}
mpMapEditor->Open();
}
ImGui::EndMenu();
}
if (ImGui::BeginMenu("Help"))
{
if (ImGui::MenuItem("About"))
{
PanelManager::GetInstance().OpenPanel(PanelType::PT_ABOUT);
}
ImGui::EndMenu();
}
ImGui::EndMainMenuBar();
}
void Editor::OpenMapEditor() void Editor::DoStatusBar()
{ {
if (!mpMapEditor) const ImGuiViewport* viewport = ImGui::GetMainViewport();
ImGui::SetNextWindowViewport(viewport->ID);
float height = viewport->WorkSize.y * 0.05f;
float ypos = (viewport->WorkPos.y + viewport->WorkSize.y) - height;
ImGui::SetNextWindowSize(ImVec2(viewport->WorkSize.x, height), ImGuiCond_Always);
ImGui::SetNextWindowPos(ImVec2(viewport->WorkPos.x, ypos), ImGuiCond_Always);
ImGui::Begin("status bar", nullptr, ImGuiWindowFlags_NoCollapse
| ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize
| ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoDocking );
if (ImGui::BeginTable("status", 3, ImGuiTableFlags_BordersInnerV))
{ {
mpMapEditor = new MapEditor; ImGui::AlignTextToFramePadding();
mpMapEditor->Initialize(this); ImGui::TableNextColumn();
ImGui::Text("Lunarium");
ImGui::TableNextColumn();
ImGui::Text("Testing");
ImGui::TableNextColumn();
ImGui::Text("Status Bar");
ImGui::EndTable();
} }
mpMapEditor->Open(); ImGui::End();
} }
} }

@ -43,16 +43,6 @@ namespace lunarium
uint32_t GetLogCat() const; uint32_t GetLogCat() const;
bool IsToolOpen(ToolType type) const; bool IsToolOpen(ToolType type) const;
// Menu Bar Events
void NewProject();
void OpenProject();
void SaveProject();
void SaveAs();
void Exit();
void OpenMapEditor();
void ShowAboutPanel();
private: private:
Editor(const Editor&) = delete; Editor(const Editor&) = delete;
const Editor& operator=(const Editor&) = delete; const Editor& operator=(const Editor&) = delete;
@ -77,8 +67,8 @@ namespace lunarium
private: // HELPERS private: // HELPERS
void CreatePanels(); void DoMainMenu();
void DestoryPanels(); void DoStatusBar();
void DestroyTools(); void DestroyTools();
void HandleMenuEvents(); void HandleMenuEvents();
}; };

@ -9,6 +9,9 @@
#include "panel_manager.h" #include "panel_manager.h"
#include "editor.h" #include "editor.h"
#include <utils/logger.h> #include <utils/logger.h>
#include <dearimgui/imgui.h>
#include <dearimgui/imgui_internal.h> // To use the DockWindowXXX methods
#include <filesystem>
// Panels // Panels
#include "panels/about.h" #include "panels/about.h"
@ -38,7 +41,7 @@ namespace lunarium { namespace editor
PanelManager::PanelManager() PanelManager::PanelManager()
: mpEditor(nullptr), mpMainPanel(nullptr) : mpEditor(nullptr), mResetDockSpace(false)
{ {
} }
@ -48,9 +51,14 @@ namespace lunarium { namespace editor
mpEditor = editor; mpEditor = editor;
mpMainPanel = &MainPanel::GetInstance(); //mpMainPanel = &MainPanel::GetInstance();
mpMainPanel->SetEditor(mpEditor); // mpMainPanel->SetEditor(mpEditor);
mpMainPanel->ResetDockSpace(); //mpMainPanel->ResetDockSpace();
if (!std::filesystem::exists("imgui.ini"))
{
mResetDockSpace = true;
}
CreatePanels(); CreatePanels();
@ -60,7 +68,7 @@ namespace lunarium { namespace editor
void PanelManager::Shutdown() void PanelManager::Shutdown()
{ {
DestoryPanels(); DestoryPanels();
MainPanel::FreeInstance(); //MainPanel::FreeInstance();
} }
void PanelManager::OpenPanel(PanelType type) void PanelManager::OpenPanel(PanelType type)
@ -108,20 +116,14 @@ namespace lunarium { namespace editor
return nullptr; return nullptr;
} }
const MainPanel::DockSpaces& PanelManager::GetDockSpaces() const const PanelManager::DockSpaces& PanelManager::GetDockSpaces() const
{ {
return mpMainPanel->GetDockSpaces(); return mDockSpaces;
} }
void PanelManager::ResetDocking() void PanelManager::ResetDocking()
{ {
for (auto iter = mPanels.begin(); iter != mPanels.end(); iter++) mResetDockSpace = true;
{
if (iter->second->IsOpen())
{
iter->second->ForceDock();
}
}
} }
void PanelManager::OnTick(double delta) void PanelManager::OnTick(double delta)
@ -137,7 +139,26 @@ namespace lunarium { namespace editor
void PanelManager::OnRender(lunarium::IGraphics* g) void PanelManager::OnRender(lunarium::IGraphics* g)
{ {
mpMainPanel->DoFrame(); // 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++) for (auto iter = mPanels.begin(); iter != mPanels.end(); iter++)
{ {
@ -171,4 +192,30 @@ namespace lunarium { namespace editor
mPanels.clear(); mPanels.clear();
} }
void PanelManager::MakeDockSpaces()
{
ImGuiViewport* Viewport = ImGui::GetMainViewport();
mDockSpaces.Main = ImGui::DockSpace(ImGui::GetID("Lunarium Editor Dockspace"));
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);
}
}
}} }}

@ -10,7 +10,7 @@
#define PANEL_MANAGER_H_ #define PANEL_MANAGER_H_
#include <utils/opRes.h> #include <utils/opRes.h>
#include "panels/mainPanel.h" //#include "panels/mainPanel.h"
#include "panels/iPanel.h" #include "panels/iPanel.h"
#include <map> #include <map>
@ -21,6 +21,16 @@ namespace editor
class Editor; class Editor;
class PanelManager class PanelManager
{ {
public:
struct DockSpaces
{
unsigned int Main;
unsigned int Left;
unsigned int Right;
unsigned int Center;
// unsigned int Top;
unsigned int Bottom;
};
public: public:
static PanelManager& GetInstance(); static PanelManager& GetInstance();
@ -33,7 +43,7 @@ namespace editor
bool IsOpen(PanelType type); bool IsOpen(PanelType type);
Panel* GetPanel(PanelType type); Panel* GetPanel(PanelType type);
const MainPanel::DockSpaces& GetDockSpaces() const; const DockSpaces& GetDockSpaces() const;
void ResetDocking(); void ResetDocking();
void OnTick(double delta); void OnTick(double delta);
@ -41,7 +51,9 @@ namespace editor
private: private:
Editor* mpEditor; Editor* mpEditor;
MainPanel* mpMainPanel; // MainPanel* mpMainPanel;
DockSpaces mDockSpaces;
bool mResetDockSpace;
std::map<PanelType, Panel*> mPanels; std::map<PanelType, Panel*> mPanels;
private: private:
@ -51,6 +63,8 @@ namespace editor
void CreatePanels(); void CreatePanels();
void DestoryPanels(); void DestoryPanels();
void MakeDockSpaces();
}; };
}} }}

@ -139,7 +139,7 @@ namespace editor
ImGui::DockBuilderRemoveNode(mDockSpaces.Main); ImGui::DockBuilderRemoveNode(mDockSpaces.Main);
ImGui::DockBuilderAddNode(mDockSpaces.Main, ImGuiDockNodeFlags_DockSpace); ImGui::DockBuilderAddNode(mDockSpaces.Main, ImGuiDockNodeFlags_DockSpace);
ImGui::DockBuilderSetNodeSize(mDockSpaces.Main, Viewport->Size); ImGui::DockBuilderSetNodeSize(mDockSpaces.Main, Viewport->Size);
ImGui::DockBuilderSetNodePos(mDockSpaces.Main, Viewport->WorkPos); //ImGui::DockBuilderSetNodePos(mDockSpaces.Main, Viewport->WorkPos);
ImGui::DockBuilderSplitNode(mDockSpaces.Main, ImGuiDir_Left, 0.25f, &mDockSpaces.Left, &mDockSpaces.Center); 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_Right, 0.25f, &mDockSpaces.Right, &mDockSpaces.Center);

Loading…
Cancel
Save