diff --git a/src/internal_libs/gui/file_browser.cpp b/src/internal_libs/gui/file_browser.cpp index 4eacca6..262a05c 100644 --- a/src/internal_libs/gui/file_browser.cpp +++ b/src/internal_libs/gui/file_browser.cpp @@ -28,23 +28,8 @@ namespace lunarium memset(mDirNameBuffer, 0, mBufferSize); memset(mInputBuffer, 0, mBufferSize); - int x,y,n; - // unsigned char* pData = stbi_load("folder16.png", &x, &y, &n, 0); - // mpFolderIcon = new Image(pData, x, y, ImageFormat::RGBA); - // Core::Graphics().RegisterImage(*mpFolderIcon); - // mpFolderIcon->FreeRawData(); mpFolderIcon = DataManager::mFolderIcon; - - // unsigned char* pData = stbi_load("new_dir_icon.png", &x, &y, &n, 0); - // mpNewFolderIcon = new Image(pData, x, y, ImageFormat::RGBA); - // Core::Graphics().RegisterImage(*mpNewFolderIcon); - // mpNewFolderIcon->FreeRawData(); mpNewFolderIcon = DataManager::mNewFolderIcon; - - // pData = stbi_load("up_arrow_icon.png", &x, &y, &n, 0); - // mpUpFolderIcon = new Image(pData, x, y, ImageFormat::RGBA); - // Core::Graphics().RegisterImage(*mpUpFolderIcon); - // mpUpFolderIcon->FreeRawData(); mpUpFolderIcon = DataManager::mUpArrowIcon; } @@ -62,6 +47,7 @@ namespace lunarium return false; mCurrentDirectory = path; + mResult = Result::STILL_WAITING; // Get list of items in the current directory ReloadItems(); @@ -168,6 +154,11 @@ namespace lunarium { return mIsOpen; } + + void FileBrowser::Close() + { + mIsOpen = false; + } void FileBrowser::ReloadItems() { diff --git a/src/internal_libs/gui/file_browser.h b/src/internal_libs/gui/file_browser.h index 0c818e7..7321571 100644 --- a/src/internal_libs/gui/file_browser.h +++ b/src/internal_libs/gui/file_browser.h @@ -45,6 +45,7 @@ namespace lunarium bool OpenInDirectory(std::filesystem::path path); bool DoFrame(); bool IsOpen() const; + void Close(); void SetPrompt(std::string prompt); void AddExtensionFilter(std::string ext); diff --git a/src/internal_libs/gui/panel_defs.h b/src/internal_libs/gui/panel_defs.h index 2f75fc8..63c3d1b 100644 --- a/src/internal_libs/gui/panel_defs.h +++ b/src/internal_libs/gui/panel_defs.h @@ -24,6 +24,14 @@ namespace lunarium { namespace gui PT_ASSET_BROWSER, PT_PROPERTIES_VIEW, PT_EDITOR_CONSOLE, + + // Map Editor + PT_MAP_CANVAS, + PT_TILE_PALLET, + PT_TILE_PROPERTIES, + PT_MAP_PROPERTIES, + PT_MAP_PREVIEW, + PT_UNKNOWN, }; diff --git a/src/run_modes/editor/editor.cpp b/src/run_modes/editor/editor.cpp index 232ab93..94c3701 100644 --- a/src/run_modes/editor/editor.cpp +++ b/src/run_modes/editor/editor.cpp @@ -12,7 +12,6 @@ #include #include #include -#include #include #include @@ -88,8 +87,12 @@ namespace editor void Editor::OnRender(lunarium::IGraphics* g) { DoMainMenu(); - DoStatusBar(); - mPanelManager.OnRender(g); + //DoStatusBar(); + RenderWindow(); + + //mPanelManager.OnRender(g); + + if (mpMapEditor) { @@ -101,12 +104,9 @@ namespace editor mAboutPanel.DoFrame(); } - if (mpFileBrowser) + if (mFileBrowser.IsOpen()) { - if (!mpFileBrowser->DoFrame()) - { - mpPath = mpFileBrowser->GetSelectedItem(); - } + mFileBrowser.DoFrame(); } } @@ -141,6 +141,30 @@ namespace editor //////////////////////////////////////////////////////////// // HELPER METHODS //////////////////////////////////////////////////////////// + + void Editor::RenderWindow() + { + 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("Lunarium Editor", nullptr, WindowFlags); + ImGui::PopStyleVar(3); + + mPanelManager.MakeDockSpaces(); + + ImGui::End(); + + mPanelManager.RenderPanels(); + } void Editor::DestroyTools() @@ -156,92 +180,75 @@ namespace editor // FILE if (mDoNewProject) { - if (!mpFileBrowser) + if (!mFileBrowser.IsOpen()) { - mpFileBrowser = new FileBrowser; - // mpFileBrowser->WarnOnExistingFileSelection(true); - mpFileBrowser->SetSelectionMode(FileBrowser::SelectionMode::FILES_ONLY); - mpFileBrowser->SetPrompt("Pick a location and name for the project"); - if (!mpFileBrowser->OpenInDirectory("")) + mFileBrowser.SetSelectionMode(FileBrowser::SelectionMode::FILES_ONLY); + mFileBrowser.SetPrompt("Pick a location and name for the project"); + if (!mFileBrowser.OpenInDirectory("")) { - delete mpFileBrowser; - mpFileBrowser = nullptr; mDoNewProject = false; Logger::Log(mLogCat, LogLevel::ERROR, "Could not open the File Browser"); } } else { - if (!mpFileBrowser->IsOpen()) + if (mFileBrowser.GetResult() == FileBrowser::Result::OK) { - if (mpFileBrowser->GetResult() == FileBrowser::Result::OK) - { - Logger::Log(mLogCat, LogLevel::INFO, "Generating new project at %s", mpPath->string().c_str()); - - // Generate new project at mpPath - OpRes result = mProject.GenerateProject(mpPath->filename().string(), mpPath->parent_path()); - if (Failed(result)) - { - Logger::Log(mLogCat, LogLevel::ERROR, "Could not create a new project: %s", result.Description); - } - ((AssetBrowser*)mPanelManager.GetPanel(PanelType::PT_ASSET_BROWSER))->SetAssetDirectory(*mpPath / std::filesystem::path("contents/assets")); - } - else + mpPath = mFileBrowser.GetSelectedItem(); + Logger::Log(mLogCat, LogLevel::INFO, "Generating new project at %s", mpPath->string().c_str()); + + // Generate new project at mpPath + OpRes result = mProject.GenerateProject(mpPath->filename().string(), mpPath->parent_path()); + if (Failed(result)) { - Logger::Log(mLogCat, LogLevel::INFO, "New Project operation cancelled"); + Logger::Log(mLogCat, LogLevel::ERROR, "Could not create a new project: %s", result.Description); } - - mpPath = nullptr; - delete mpFileBrowser; - mpFileBrowser = nullptr; + ((AssetBrowser*)mPanelManager.GetPanel(PanelType::PT_ASSET_BROWSER))->SetAssetDirectory(*mpPath / std::filesystem::path("contents/assets")); mDoNewProject = false; } + else if (mFileBrowser.GetResult() == FileBrowser::Result::CANCEL) + { + Logger::Log(mLogCat, LogLevel::INFO, "New Project operation cancelled"); + mDoNewProject = false; + } + } } if (mDoOpenProject) { - if (!mpFileBrowser) + if (!mFileBrowser.IsOpen()) { - mpFileBrowser = new FileBrowser; - // mpFileBrowser->WarnOnExistingFileSelection(true); - mpFileBrowser->SetSelectionMode(FileBrowser::SelectionMode::FILES_ONLY); - mpFileBrowser->SetPrompt("Locate the project to open"); - if (!mpFileBrowser->OpenInDirectory("")) + mFileBrowser.SetSelectionMode(FileBrowser::SelectionMode::FILES_ONLY); + mFileBrowser.SetPrompt("Pick a location and name for the project"); + if (!mFileBrowser.OpenInDirectory("")) { - delete mpFileBrowser; - mpFileBrowser = nullptr; - mDoOpenProject = false; + mDoNewProject = false; Logger::Log(mLogCat, LogLevel::ERROR, "Could not open the File Browser"); } } else { - if (!mpFileBrowser->IsOpen()) + if (mFileBrowser.GetResult() == FileBrowser::Result::OK) { - if (mpFileBrowser->GetResult() == FileBrowser::Result::OK) - { - Logger::Log(mLogCat, LogLevel::INFO, "Generating new project at %s", mpPath->string().c_str()); - - // Generate new project at mpPath - OpRes result = mProject.LoadProject(*mpPath); - if (Failed(result)) - { - Logger::Log(mLogCat, LogLevel::ERROR, "Could not open project: %s -- reason: %s", mpPath->string().c_str(), result.Description); - } - ((AssetBrowser*)mPanelManager.GetPanel(PanelType::PT_ASSET_BROWSER))->SetAssetDirectory(mpPath->parent_path() / std::filesystem::path("contents/assets")); - } - else + mpPath = mFileBrowser.GetSelectedItem(); + Logger::Log(mLogCat, LogLevel::INFO, "Generating new project at %s", mpPath->string().c_str()); + + // Open project at mpPath + OpRes result = mProject.LoadProject(*mpPath); + if (Failed(result)) { - Logger::Log(mLogCat, LogLevel::INFO, "New Project operation cancelled"); + Logger::Log(mLogCat, LogLevel::ERROR, "Could not open project: %s -- reason: %s", mpPath->string().c_str(), result.Description); } - - mpPath = nullptr; - delete mpFileBrowser; - mpFileBrowser = nullptr; + ((AssetBrowser*)mPanelManager.GetPanel(PanelType::PT_ASSET_BROWSER))->SetAssetDirectory(*mpPath / std::filesystem::path("contents/assets")); mDoOpenProject = false; } - } + else if (mFileBrowser.GetResult() == FileBrowser::Result::CANCEL) + { + Logger::Log(mLogCat, LogLevel::INFO, "Open Project operation cancelled"); + mDoOpenProject = false; + } + } } if (mDoSaveProject) diff --git a/src/run_modes/editor/editor.h b/src/run_modes/editor/editor.h index 0312952..52d51bd 100644 --- a/src/run_modes/editor/editor.h +++ b/src/run_modes/editor/editor.h @@ -15,6 +15,7 @@ #include "project/project.h" #include "panel_manager.h" #include "panels/about.h" +#include #include #include @@ -59,7 +60,7 @@ namespace lunarium unsigned int mNextWindowID; MapEditor* mpMapEditor; - FileBrowser* mpFileBrowser; + FileBrowser mFileBrowser; const std::filesystem::path* mpPath; // Non-Docking panels @@ -74,6 +75,8 @@ namespace lunarium private: // HELPERS + void RenderWindow(); + void DoMainMenu(); void DoStatusBar(); void DestroyTools(); diff --git a/src/run_modes/editor/panel_manager.cpp b/src/run_modes/editor/panel_manager.cpp index 1db1319..019f4f0 100644 --- a/src/run_modes/editor/panel_manager.cpp +++ b/src/run_modes/editor/panel_manager.cpp @@ -141,30 +141,42 @@ namespace lunarium { namespace editor } } - void PanelManager::OnRender(lunarium::IGraphics* g) - { - // mpMainPanel->DoFrame(); + // 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(); + // //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(); - + // ImGui::End(); + + // for (auto iter = mPanels.begin(); iter != mPanels.end(); iter++) + // { + // if (iter->second->IsOpen()) + // { + // ImGui::SetNextWindowClass(&mWindowClass); + // iter->second->DoFrame(); + // } + // } + // } + + void PanelManager::RenderPanels() + { for (auto iter = mPanels.begin(); iter != mPanels.end(); iter++) { if (iter->second->IsOpen()) diff --git a/src/run_modes/editor/panel_manager.h b/src/run_modes/editor/panel_manager.h index 3c50ab8..b18f1e3 100644 --- a/src/run_modes/editor/panel_manager.h +++ b/src/run_modes/editor/panel_manager.h @@ -43,7 +43,8 @@ namespace editor void ResetDocking(); void OnTick(double delta); - void OnRender(lunarium::IGraphics* g); + void MakeDockSpaces(); + void RenderPanels(); private: Editor* mpEditor; @@ -58,7 +59,6 @@ namespace editor private: void DestoryPanels(); - void MakeDockSpaces(); }; }} diff --git a/src/run_modes/editor/tools/map_editor/map_editor.cpp b/src/run_modes/editor/tools/map_editor/map_editor.cpp index 9acd6a9..d90dbab 100644 --- a/src/run_modes/editor/tools/map_editor/map_editor.cpp +++ b/src/run_modes/editor/tools/map_editor/map_editor.cpp @@ -29,6 +29,10 @@ namespace lunarium { namespace editor } mpEditor = editor; + if (Failed(mPanelManager.Initialize(mpEditor, "Map Editor").LogIfFailed(mpEditor->GetLogCat(), "Map Editor - "))) + { + return OpRes::Fail("Could not initialize the panel manager!"); + } Open(); @@ -42,10 +46,7 @@ namespace lunarium { namespace editor void MapEditor::OnTick(double delta) { - for (int i = 0; i < mPanels.size(); i++) - { - mPanels[i]->Update(delta); - } + mPanelManager.OnTick(delta); } bool MapEditor::OnRender(lunarium::IGraphics* g) @@ -56,18 +57,18 @@ namespace lunarium { namespace editor return false; } + ImGui::SetNextWindowSize(ImVec2(800, 500), ImGuiCond_FirstUseEver); - if (!ImGui::Begin("Map Editor", &mIsOpen, ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoBringToFrontOnFocus)) + if (!ImGui::Begin("Map Editor", &mIsOpen, ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoBringToFrontOnFocus | ImGuiWindowFlags_MenuBar)) { + mPanelManager.MakeDockSpaces(); Close(); ImGui::End(); return false; } + DoMenu(); - for (int i = 0; i < mPanels.size(); i++) - { - mPanels[i]->DoFrame(); - } + mPanelManager.RenderPanels(); ImGui::End(); return true; @@ -81,21 +82,11 @@ namespace lunarium { namespace editor return; } - for (int i = 0; i < mPanels.size(); i++) - { - mPanels[i]->SetOpen(true); - } - mIsOpen = true; } void MapEditor::Close() - { - for (int i = 0; i < mPanels.size(); i++) - { - mPanels[i]->SetOpen(false); - } - + { mIsOpen = false; } @@ -124,4 +115,30 @@ namespace lunarium { namespace editor { return mMapLoaded; } + + //////////////////////////////////////////////////////////// + // HELPERS + //////////////////////////////////////////////////////////// + void MapEditor::DoMenu() + { + ImGui::BeginMenuBar(); + + if (ImGui::BeginMenu("File")) + { + if (ImGui::MenuItem("Exit")) + { + Close(); + } + + ImGui::EndMenu(); + } + + + ImGui::EndMenuBar(); + } + + void MapEditor::HandleMenuEvents() + { + + } }} diff --git a/src/run_modes/editor/tools/map_editor/map_editor.h b/src/run_modes/editor/tools/map_editor/map_editor.h index b5b2506..e17cf1e 100644 --- a/src/run_modes/editor/tools/map_editor/map_editor.h +++ b/src/run_modes/editor/tools/map_editor/map_editor.h @@ -12,6 +12,7 @@ #include #include #include +#include "../../panel_manager.h" namespace lunarium { class IGraphics; @@ -48,14 +49,12 @@ namespace editor bool mMapLoaded; bool mIsDirty; Editor* mpEditor; - std::vector mPanels; - - enum PanelTypes - { - MPPT_MAP_VIEW, - MPPT_TILE_PALLET, - MPPT_PROPERTIES - }; + + PanelManager mPanelManager; + + private: + void DoMenu(); + void HandleMenuEvents(); }; }}