// MassBuilderSaveTool // Copyright (C) 2021-2022 Guillaume Jacquemin // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include #include "../FontAwesome/IconsFontAwesome5.h" #include "../FontAwesome/IconsFontAwesome5Brands.h" #include "SaveTool.h" void SaveTool::drawMainMenu() { if(ImGui::BeginMainMenuBar()) { if(ImGui::BeginMenu("Save Tool##SaveToolMenu")) { if(ImGui::BeginMenu(ICON_FA_FOLDER_OPEN " Open game data directory", Utility::Path::exists(_gameDataDir))) { if(ImGui::MenuItem(ICON_FA_COG " Configuration", nullptr, false, Utility::Path::exists(_configDir))) { openUri(Utility::Path::toNativeSeparators(_configDir)); } if(ImGui::MenuItem(ICON_FA_SAVE " Saves", nullptr, false, Utility::Path::exists(_saveDir))) { openUri(Utility::Path::toNativeSeparators(_saveDir)); } if(ImGui::MenuItem(ICON_FA_IMAGE " Screenshots", nullptr, false, Utility::Path::exists(_screenshotsDir))) { openUri(Utility::Path::toNativeSeparators(_screenshotsDir)); } ImGui::EndMenu(); } if(ImGui::BeginMenu(ICON_FA_FOLDER_OPEN " Open manager directory")) { if(ImGui::MenuItem(ICON_FA_FILE_ARCHIVE " Profile backups", nullptr, false, Utility::Path::exists(_backupsDir))) { openUri(Utility::Path::toNativeSeparators(_backupsDir)); } if(ImGui::MenuItem(ICON_FA_EXCHANGE_ALT " Staging area", nullptr, false, Utility::Path::exists(_stagingDir))) { openUri(Utility::Path::toNativeSeparators(_stagingDir)); } ImGui::EndMenu(); } ImGui::Separator(); if(ImGui::BeginMenu(ICON_FA_COG " Settings")) { ImGui::BeginGroup(); drawAlignedText("Vertical sync:"); if(_swapInterval == 0) { drawAlignedText("FPS cap:"); } ImGui::EndGroup(); ImGui::SameLine(); ImGui::BeginGroup(); static const char* framelimit_labels[] = { "Off", "Every VBLANK", "Every second VBLANK", "Every third VBLANK", }; ImGui::PushItemWidth(300.0f); if(ImGui::BeginCombo("##FrameLimit", framelimit_labels[_swapInterval])) { for(int i = 0; i <= 3; i++) { if(ImGui::Selectable(framelimit_labels[i], _swapInterval == i)) { _swapInterval = i; setSwapInterval(i); if(i == 0) { setMinimalLoopPeriod(0); } } } ImGui::EndCombo(); } if(_swapInterval == 0) { ImGui::SliderFloat("##FpsCapSlider", &_fpsCap, 15.0f, 301.0f, _fpsCap != 301.0f ? "%.0f" : "Uncapped", ImGuiSliderFlags_AlwaysClamp); } ImGui::PopItemWidth(); ImGui::EndGroup(); ImGui::Checkbox("Cheat mode", &_cheatMode); ImGui::SameLine(); ImGui::AlignTextToFramePadding(); drawHelpMarker("This gives access to save edition features that can be considered cheats.", Float(windowSize().x()) * 0.4f); ImGui::Checkbox("Advanced mode", &_advancedMode); ImGui::SameLine(); ImGui::AlignTextToFramePadding(); drawHelpMarker("This gives access to editing values that have unknown purposes or are undocumented.", Float(windowSize().x()) * 0.4f); ImGui::Checkbox("Check for updates on startup", &_checkUpdatesOnStartup); ImGui::SameLine(); if(ImGui::Button(ICON_FA_SYNC_ALT " Check now")) { _queue.addToast(Toast::Type::Default, "Checking for updates..."); _updateThread = std::thread{[this]{ checkForUpdates(); }}; } if(_updateAvailable) { drawAlignedText("Version %s is available.", _latestVersion.data()); if(ImGui::Button(ICON_FA_FILE_SIGNATURE " Release notes")) { openUri(_releaseLink); } ImGui::SameLine(); if(ImGui::Button(ICON_FA_DOWNLOAD " Download now")) { openUri(_downloadLink); } } ImGui::Checkbox("Skip disclaimer", &_skipDisclaimer); ImGui::EndMenu(); } ImGui::Separator(); if(ImGui::MenuItem(ICON_FA_SIGN_OUT_ALT " Quit##QuitMenuItem")) { exit(EXIT_SUCCESS); } ImGui::EndMenu(); } if(ImGui::BeginMenu("Game##GameMenu")) { if(ImGui::MenuItem(ICON_FA_PLAY " Run demo##RunDemoMenuItem")) { openUri("steam://run/1048390"); } drawTooltip("Will not work if you have the full game."); if(ImGui::MenuItem(ICON_FA_PLAY " Run full game##RunFullGameMenuItem")) { openUri("steam://run/956680"); } ImGui::Separator(); if(ImGui::BeginMenu(ICON_FA_DISCORD " Discord communities")) { if(ImGui::MenuItem("Official server")) { openUri("https://discord.gg/sekai-project"); } if(ImGui::MenuItem("Community server")) { openUri("https://discord.gg/massbuildercommunity"); } ImGui::EndMenu(); } ImGui::EndMenu(); } #ifdef SAVETOOL_DEBUG_BUILD if(ImGui::BeginMenu("Debug tools")) { ImGui::MenuItem("ImGui demo window", nullptr, &_demoWindow); ImGui::MenuItem("ImGui style editor", nullptr, &_styleEditor); ImGui::MenuItem("ImGui metrics window", nullptr, &_metricsWindow); ImGui::EndMenu(); } #endif if(ImGui::BeginMenu("Help")) { if(ImGui::BeginMenu(ICON_FA_KEYBOARD " Keyboard shortcuts")) { ImGui::BulletText("CTRL+Click on a slider or drag box to input value as text."); ImGui::BulletText("TAB/SHIFT+TAB to cycle through keyboard editable fields."); ImGui::BulletText("While inputing text:\n"); ImGui::Indent(); ImGui::BulletText("CTRL+Left/Right to word jump."); ImGui::BulletText("CTRL+A or double-click to select all."); ImGui::BulletText("CTRL+X/C/V to use clipboard cut/copy/paste."); ImGui::BulletText("CTRL+Z,CTRL+Y to undo/redo."); ImGui::BulletText("ESCAPE to revert."); ImGui::BulletText("You can apply arithmetic operators +,*,/ on numerical values.\nUse +- to subtract."); ImGui::Unindent(); ImGui::EndMenu(); } ImGui::MenuItem(ICON_FA_INFO_CIRCLE " About", nullptr, &_aboutPopup); ImGui::EndMenu(); } if(_gameCheckTimerId != 0) { if(ImGui::BeginTable("##MainMenuLayout", 2)) { ImGui::TableSetupColumn("##Dummy", ImGuiTableColumnFlags_WidthStretch); ImGui::TableSetupColumn("##GameState", ImGuiTableColumnFlags_WidthFixed); ImGui::TableNextRow(); ImGui::TableSetColumnIndex(1); drawGameState(); ImGui::EndTable(); } } ImGui::EndMainMenuBar(); } }