/****************************************************************************** * File - editor.cpp * Author - Joey Pollack * Date - 2021/11/01 (y/m/d) * Mod Date - 2021/11/01 (y/m/d) * Description - Entry point for the editor run mode. ******************************************************************************/ #include "editor.h" #include "panel_manager.h" #include #include #include #include #include #include "panels/assetBrowser.h" // Tools #include "tools/map_editor/map_editor.h" namespace lunarium { namespace editor { Editor::Editor() : mLogCat(-1), mpFileBrowser(nullptr), mpPath(nullptr), mDoNewProject(false), mDoOpenProject(false), mDoSaveProject(false), mDoSaveAs(false), mpMapEditor(nullptr) { } OpRes Editor::Initialize() { mLogCat = Logger::RegisterCategory("EDITOR"); // Initialize internal data DataManager::Initialize(); PanelManager::GetInstance().Initialize(this); return OpRes::OK(); } void Editor::Shutdown() { DataManager::Shutdown(); PanelManager::GetInstance().Shutdown(); PanelManager::FreeInstance(); } void Editor::OnTick(double delta) { // Panels PanelManager::GetInstance().OnTick(delta); // Tools if (mpMapEditor) { mpMapEditor->OnTick(delta); } HandleMenuEvents(); } void Editor::OnRender(lunarium::IGraphics* g) { DoMainMenu(); DoStatusBar(); PanelManager::GetInstance().OnRender(g); if (mpMapEditor) { mpMapEditor->OnRender(g); } if (mpFileBrowser) { if (!mpFileBrowser->DoFrame()) { mpPath = mpFileBrowser->GetSelectedItem(); } } } uint32_t Editor::GetLogCat() const { return mLogCat; } bool Editor::IsToolOpen(ToolType type) const { switch (type) { case ToolType::TT_MAP_EDITOR: { if (!mpMapEditor) return false; return mpMapEditor->IsOpen(); } } Logger::Log(mLogCat, LogLevel::WARNING, "And unknown ToolType was passed into Editor::IsToolOpen: %n", type); return false; } //////////////////////////////////////////////////////////// // HELPER METHODS //////////////////////////////////////////////////////////// void Editor::DestroyTools() { mpMapEditor->Shutdown(); delete mpMapEditor; mpMapEditor = nullptr; } void Editor::HandleMenuEvents() { /////////////////////////// // FILE if (mDoNewProject) { if (!mpFileBrowser) { 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("")) { delete mpFileBrowser; mpFileBrowser = nullptr; mDoNewProject = false; Logger::Log(mLogCat, LogLevel::ERROR, "Could not open the File Browser"); } } else { if (!mpFileBrowser->IsOpen()) { 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*)PanelManager::GetInstance().GetPanel(PanelType::PT_ASSET_BROWSER))->SetAssetDirectory(*mpPath / std::filesystem::path("contents/assets")); } else { Logger::Log(mLogCat, LogLevel::INFO, "New Project operation cancelled"); } mpPath = nullptr; delete mpFileBrowser; mpFileBrowser = nullptr; mDoNewProject = false; } } } if (mDoOpenProject) { if (!mpFileBrowser) { mpFileBrowser = new FileBrowser; // mpFileBrowser->WarnOnExistingFileSelection(true); mpFileBrowser->SetSelectionMode(FileBrowser::SelectionMode::FILES_ONLY); mpFileBrowser->SetPrompt("Locate the project to open"); if (!mpFileBrowser->OpenInDirectory("")) { delete mpFileBrowser; mpFileBrowser = nullptr; mDoOpenProject = false; Logger::Log(mLogCat, LogLevel::ERROR, "Could not open the File Browser"); } } else { if (!mpFileBrowser->IsOpen()) { 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*)PanelManager::GetInstance().GetPanel(PanelType::PT_ASSET_BROWSER))->SetAssetDirectory(mpPath->parent_path() / std::filesystem::path("contents/assets")); } else { Logger::Log(mLogCat, LogLevel::INFO, "New Project operation cancelled"); } mpPath = nullptr; delete mpFileBrowser; mpFileBrowser = nullptr; mDoOpenProject = false; } } } if (mDoSaveProject) { mDoSaveProject = false; } if (mDoSaveAs) { mDoSaveAs = false; } /////////////////////////// } //////////////////////////////////////////////////////////// // MENU BAR //////////////////////////////////////////////////////////// void Editor::DoMainMenu() { ImGui::BeginMainMenuBar(); // File if (ImGui::BeginMenu("File")) { if (ImGui::MenuItem("New Project")) { mDoNewProject = true; } if (ImGui::MenuItem("Open Project")) { mDoOpenProject = true; } if (ImGui::MenuItem("Save Project")) { mDoSaveProject = true; } if (ImGui::MenuItem("Save Project As")) { mDoSaveAs = true; } ImGui::Separator(); 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::DoStatusBar() { 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)) { ImGui::AlignTextToFramePadding(); ImGui::TableNextColumn(); ImGui::Text("Lunarium"); ImGui::TableNextColumn(); ImGui::Text("Testing"); ImGui::TableNextColumn(); ImGui::Text("Status Bar"); ImGui::EndTable(); } ImGui::End(); } } }