diff --git a/include/dusk/settings.h b/include/dusk/settings.h index ea3d090e6b..2676c461cd 100644 --- a/include/dusk/settings.h +++ b/include/dusk/settings.h @@ -110,6 +110,7 @@ struct UserSettings { ConfigVar showPipelineCompilation; ConfigVar wasPresetChosen; ConfigVar enableCrashReporting; + ConfigVar duskMenuOpen; } backend; }; diff --git a/src/dusk/imgui/ImGuiConsole.cpp b/src/dusk/imgui/ImGuiConsole.cpp index f71dc8c278..eccf9b3c20 100644 --- a/src/dusk/imgui/ImGuiConsole.cpp +++ b/src/dusk/imgui/ImGuiConsole.cpp @@ -234,31 +234,40 @@ namespace dusk { ImGuiMenuGame::ToggleFullscreen(); } - bool showMenu = !dusk::IsGameLaunched || !CheckMenuViewToggle(ImGuiKey_F1, m_isHidden); + if (!dusk::IsGameLaunched) { + m_preLaunchWindow.draw(); + } + + m_isHidden = getSettings().backend.duskMenuOpen; + CheckMenuViewToggle(ImGuiKey_F1, m_isHidden); - if (showMenu && ImGui::BeginMainMenuBar()) { + if (dusk::IsGameLaunched) { + if (getSettings().backend.duskMenuOpen != m_isHidden) { + m_isHidden = !getSettings().backend.duskMenuOpen; + getSettings().backend.duskMenuOpen.setValue(m_isHidden); + config::Save(); + } + } + + if ((!dusk::IsGameLaunched || getSettings().backend.duskMenuOpen) && ImGui::BeginMainMenuBar()) { m_menuGame.draw(); m_menuEnhancements.draw(); m_menuTools.draw(); - ImGui::SetCursorPosX(ImGui::GetWindowWidth() - 80.0f * ImGuiScale()); + ImGui::SetCursorPosX(ImGui::GetWindowWidth() - 100.0f * ImGuiScale()); ImGuiIO& io = ImGui::GetIO(); ImGuiStringViewText(fmt::format(FMT_STRING("FPS: {:.2f}\n"), io.Framerate)); ImGui::EndMainMenuBar(); } - if (!dusk::IsGameLaunched) { - m_preLaunchWindow.draw(); - } - if (!getSettings().backend.wasPresetChosen) { m_firstRunPreset.draw(); return; } if (dusk::IsGameLaunched && !m_isLaunchInitialized) { - m_toasts.emplace_back("Press F1 to toggle menu"s, 5.f); + m_toasts.emplace_back("Press F1 to toggle menu"s, 2.5f); m_isLaunchInitialized = true; } @@ -280,7 +289,8 @@ namespace dusk { DuskDebugPad(); // temporary, remove later // Only show cursor when menu or any windows are open - if (showMenu || ImGui::GetIO().MetricsRenderWindows > 0) { + if ((!dusk::IsGameLaunched || getSettings().backend.duskMenuOpen) || ImGui::GetIO().MetricsRenderWindows > 0) + { ImGui::GetIO().ConfigFlags &= ~ImGuiConfigFlags_NoMouseCursorChange; // Imgui will re-show cursor. } else { diff --git a/src/dusk/imgui/ImGuiMenuGame.cpp b/src/dusk/imgui/ImGuiMenuGame.cpp index 48c64f8f0e..c40e362db8 100644 --- a/src/dusk/imgui/ImGuiMenuGame.cpp +++ b/src/dusk/imgui/ImGuiMenuGame.cpp @@ -304,6 +304,7 @@ namespace dusk { m_controllerConfig.m_pendingButtonMapping = nullptr; m_controllerConfig.m_pendingPort = -1; PADBlockInput(false); + PADSerializeMappings(); } } @@ -316,6 +317,7 @@ namespace dusk { m_controllerConfig.m_pendingAxisMapping = nullptr; m_controllerConfig.m_pendingPort = -1; PADBlockInput(false); + PADSerializeMappings(); } else { auto nativeButton = PADGetNativeButtonPressed(m_controllerConfig.m_pendingPort); if (nativeButton != -1) { @@ -324,6 +326,7 @@ namespace dusk { m_controllerConfig.m_pendingAxisMapping = nullptr; m_controllerConfig.m_pendingPort = -1; PADBlockInput(false); + PADSerializeMappings(); } } } @@ -400,11 +403,6 @@ namespace dusk { // if "None" selected PADClearPort(m_controllerConfig.m_selectedPort); } - } - - // save mappings button - ImGui::SameLine(); - if (ImGui::Button("Save")) { PADSerializeMappings(); } @@ -412,6 +410,7 @@ namespace dusk { ImGui::SameLine(); if (ImGui::Button("Default")) { PADRestoreDefaultMapping(m_controllerConfig.m_selectedPort); + PADSerializeMappings(); } // buttons panel @@ -508,6 +507,7 @@ namespace dusk { float tmp = static_cast(deadZones->leftTriggerActivationZone * 100.f) / 32767.f; if (ImGui::DragFloat("##LThreshold", &tmp, 0.5f, 0.f, 100.f, "%.3f%%")) { deadZones->leftTriggerActivationZone = static_cast((tmp / 100.f) * 32767); + PADSerializeMappings(); } } } @@ -519,6 +519,7 @@ namespace dusk { float tmp = static_cast(deadZones->rightTriggerActivationZone * 100.f) / 32767.f; if (ImGui::DragFloat("##RThreshold", &tmp, 0.5f, 0.f, 100.f, "%.3f%%")) { deadZones->rightTriggerActivationZone = static_cast((tmp / 100.f) * 32767); + PADSerializeMappings(); } } } @@ -581,6 +582,7 @@ namespace dusk { float tmp = static_cast(deadZones->stickDeadZone * 100.f) / 32767.f; if (ImGui::DragFloat("##mainDeadZone", &tmp, 0.5f, 0.f, 100.f, "%.3f%%")) { deadZones->stickDeadZone = static_cast((tmp / 100.f) * 32767); + PADSerializeMappings(); } } } @@ -643,6 +645,7 @@ namespace dusk { float tmp = static_cast(deadZones->substickDeadZone * 100.f) / 32767.f; if (ImGui::DragFloat("##subDeadZone", &tmp, 0.5f, 0.f, 100.f, "%.3f%%")) { deadZones->substickDeadZone = static_cast((tmp / 100.f) * 32767); + PADSerializeMappings(); } } } @@ -654,8 +657,12 @@ namespace dusk { ImGuiBeginGroupPanel("Options", ImVec2(150 * scale, 20 * scale)); if (deadZones != nullptr) { - ImGui::Checkbox("Enable Dead Zones", &deadZones->useDeadzones); - ImGui::Checkbox("Emulate Triggers", &deadZones->emulateTriggers); + if (ImGui::Checkbox("Enable Dead Zones", &deadZones->useDeadzones)) { + PADSerializeMappings(); + } + if (ImGui::Checkbox("Emulate Triggers", &deadZones->emulateTriggers)) { + PADSerializeMappings(); + } } ImGuiEndGroupPanel(); diff --git a/src/dusk/settings.cpp b/src/dusk/settings.cpp index 6718297f9a..e4cace9ff0 100644 --- a/src/dusk/settings.cpp +++ b/src/dusk/settings.cpp @@ -83,7 +83,8 @@ UserSettings g_userSettings = { .skipPreLaunchUI {"backend.skipPreLaunchUI", false}, .showPipelineCompilation {"backend.showPipelineCompilation", false}, .wasPresetChosen {"backend.wasPresetChosen", false}, - .enableCrashReporting {"backend.enableCrashReporting", true} + .enableCrashReporting {"backend.enableCrashReporting", true}, + .duskMenuOpen {"backend.duskMenuOpen", false} } }; @@ -153,6 +154,7 @@ void registerSettings() { Register(g_userSettings.backend.showPipelineCompilation); Register(g_userSettings.backend.wasPresetChosen); Register(g_userSettings.backend.enableCrashReporting); + Register(g_userSettings.backend.duskMenuOpen); } // Transient settings