diff --git a/src/Menu.cpp b/src/Menu.cpp index 56829e4b48..58a2667c41 100644 --- a/src/Menu.cpp +++ b/src/Menu.cpp @@ -152,6 +152,7 @@ NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT( OverlayToggleKey, ShaderBlockPrevKey, ShaderBlockNextKey, + WeatherEditorToggleKey, EnableShaderBlocking, FirstTimeSetupCompleted, SkipClearCacheConfirmation, @@ -262,6 +263,7 @@ void Menu::Load(json& o_json) migrateKey(o_json, "OverlayToggleKey", settings.OverlayToggleKey); migrateKey(o_json, "ShaderBlockPrevKey", settings.ShaderBlockPrevKey); migrateKey(o_json, "ShaderBlockNextKey", settings.ShaderBlockNextKey); + migrateKey(o_json, "WeatherEditorToggleKey", settings.WeatherEditorToggleKey); // Helper for new smart serialization with error handling auto loadComboList = [](const json& j, const char* keyName, std::vector& target) { @@ -281,6 +283,7 @@ void Menu::Load(json& o_json) loadComboList(o_json, "OverlayToggleKey", settings.OverlayToggleKey); loadComboList(o_json, "ShaderBlockPrevKey", settings.ShaderBlockPrevKey); loadComboList(o_json, "ShaderBlockNextKey", settings.ShaderBlockNextKey); + loadComboList(o_json, "WeatherEditorToggleKey", settings.WeatherEditorToggleKey); // Legacy support: If old config has Theme data and no SelectedThemePreset, load it if (o_json.contains("Theme") && o_json["Theme"].is_object() && settings.SelectedThemePreset.empty()) { @@ -343,6 +346,7 @@ void Menu::Save(json& o_json) InputCombo::ComboList::to_json(o_json["OverlayToggleKey"], settings.OverlayToggleKey); InputCombo::ComboList::to_json(o_json["ShaderBlockPrevKey"], settings.ShaderBlockPrevKey); InputCombo::ComboList::to_json(o_json["ShaderBlockNextKey"], settings.ShaderBlockNextKey); + InputCombo::ComboList::to_json(o_json["WeatherEditorToggleKey"], settings.WeatherEditorToggleKey); } void Menu::LoadTheme(json& o_json) @@ -683,11 +687,6 @@ void Menu::DrawSettings() ImGui::SetNextWindowSize(Util::GetNativeViewportSizeScaled(0.8f), ImGuiCond_FirstUseEver); auto title = std::format("Community Shaders {}", Util::GetFormattedVersion(Plugin::VERSION)); - if (EditorWindow::GetSingleton()->open) { - EditorWindow::GetSingleton()->Draw(); - return; - } - // Determine window flags based on docking state ImGuiWindowFlags windowFlags = ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoScrollbar; // Check if this will be docked (we need to peek at the docking state) @@ -773,7 +772,8 @@ void Menu::DrawGeneralSettings() .settingSkipCompilationKey = settingSkipCompilationKey, .settingOverlayToggleKey = settingOverlayToggleKey, .settingShaderBlockPrevKey = settingShaderBlockPrevKey, - .settingShaderBlockNextKey = settingShaderBlockNextKey + .settingShaderBlockNextKey = settingShaderBlockNextKey, + .settingWeatherEditorToggleKey = settingWeatherEditorToggleKey }; // Render settings using extracted component @@ -988,6 +988,7 @@ void Menu::ProcessInputEventQueue() { &settings.OverlayToggleKey, &settingOverlayToggleKey, [this](std::vector keys) { settings.OverlayToggleKey = keys; settingOverlayToggleKey = false; } }, { &settings.ShaderBlockPrevKey, &settingShaderBlockPrevKey, [this](std::vector keys) { settings.ShaderBlockPrevKey = keys; settingShaderBlockPrevKey = false; } }, { &settings.ShaderBlockNextKey, &settingShaderBlockNextKey, [this](std::vector keys) { settings.ShaderBlockNextKey = keys; settingShaderBlockNextKey = false; } }, + { &settings.WeatherEditorToggleKey, &settingWeatherEditorToggleKey, [this](std::vector keys) { settings.WeatherEditorToggleKey = keys; settingWeatherEditorToggleKey = false; } }, }; bool handled = false; for (auto& h : hotkeyActions) { @@ -1045,9 +1046,8 @@ void Menu::ProcessInputEventQueue() { settings.EffectToggleKey, [shaderCache]() { shaderCache->SetEnabled(!shaderCache->IsEnabled()); } }, { settings.ShaderBlockPrevKey, [this, shaderCache]() { if (settings.EnableShaderBlocking) shaderCache->IterateShaderBlock(); } }, { settings.ShaderBlockNextKey, [this, shaderCache]() { if (settings.EnableShaderBlocking) shaderCache->IterateShaderBlock(false); } }, - { settings.OverlayToggleKey, []() { - Menu::GetSingleton()->overlayVisible = !Menu::GetSingleton()->overlayVisible; - } }, + { settings.OverlayToggleKey, []() { Menu::GetSingleton()->overlayVisible = !Menu::GetSingleton()->overlayVisible; } }, + { settings.WeatherEditorToggleKey, []() { EditorWindow::GetSingleton()->open = !EditorWindow::GetSingleton()->open; } }, }; for (const auto& ka : keyActions) { // Check if key matches last key in combo and all modifiers are held (exact match) diff --git a/src/Menu.h b/src/Menu.h index 83e014e66b..1ec35f685b 100644 --- a/src/Menu.h +++ b/src/Menu.h @@ -137,8 +137,9 @@ class Menu bool settingSkipCompilationKey = false; bool settingsEffectsToggle = false; bool settingOverlayToggleKey = false; - bool settingShaderBlockPrevKey = false; // Debug: capture shader block prev key - bool settingShaderBlockNextKey = false; // Debug: capture shader block next key + bool settingShaderBlockPrevKey = false; // Debug: capture shader block prev key + bool settingShaderBlockNextKey = false; // Debug: capture shader block next key + bool settingWeatherEditorToggleKey = false; // Weather Editor toggle key // Font caching (made public for ThemeManager and OverlayRenderer access) // Marked mutable because they're cache fields that may be updated from const methods @@ -378,15 +379,16 @@ class Menu { std::vector ToggleKey = { InputCombo::Keyboard(VK_END) }; std::vector SkipCompilationKey = { InputCombo::Keyboard(VK_ESCAPE) }; - std::vector EffectToggleKey = { InputCombo::Keyboard(VK_MULTIPLY) }; // toggle all effects - std::vector OverlayToggleKey = { InputCombo::Keyboard(VK_F10) }; // Global overlay toggle key for all overlays - std::vector ShaderBlockPrevKey = { InputCombo::Keyboard(VK_PRIOR) }; // Debug: cycle backward through shaders (PageUp) - std::vector ShaderBlockNextKey = { InputCombo::Keyboard(VK_NEXT) }; // Debug: cycle forward through shaders (PageDown) - bool EnableShaderBlocking = false; // Enable shader blocking hotkeys for debugging - bool FirstTimeSetupCompleted = false; // Track if first-time setup has been completed - bool SkipClearCacheConfirmation = false; // Skip confirmation dialog when clearing shader cache - bool AutoHideFeatureList = false; // Auto-hide left feature list panel, show on hover - bool SkipConstraintWarning = false; // Skip popup when a setting change creates new constraints + std::vector EffectToggleKey = { InputCombo::Keyboard(VK_MULTIPLY) }; // toggle all effects + std::vector OverlayToggleKey = { InputCombo::Keyboard(VK_F10) }; // Global overlay toggle key for all overlays + std::vector ShaderBlockPrevKey = { InputCombo::Keyboard(VK_PRIOR) }; // Debug: cycle backward through shaders (PageUp) + std::vector ShaderBlockNextKey = { InputCombo::Keyboard(VK_NEXT) }; // Debug: cycle forward through shaders (PageDown) + std::vector WeatherEditorToggleKey = { InputCombo::Keyboard(VK_F11) }; // Weather Editor toggle key + bool EnableShaderBlocking = false; // Enable shader blocking hotkeys for debugging + bool FirstTimeSetupCompleted = false; // Track if first-time setup has been completed + bool SkipClearCacheConfirmation = false; // Skip confirmation dialog when clearing shader cache + bool AutoHideFeatureList = false; // Auto-hide left feature list panel, show on hover + bool SkipConstraintWarning = false; // Skip popup when a setting change creates new constraints ThemeSettings Theme; std::string SelectedThemePreset = ""; // Currently selected theme preset (empty = custom/user theme) }; diff --git a/src/Menu/OverlayRenderer.cpp b/src/Menu/OverlayRenderer.cpp index 16f9348386..60fe41e2a3 100644 --- a/src/Menu/OverlayRenderer.cpp +++ b/src/Menu/OverlayRenderer.cpp @@ -16,6 +16,7 @@ #include "ShaderCache.h" #include "State.h" #include "Util.h" +#include "WeatherEditor/EditorWindow.h" #include "Features/PerformanceOverlay.h" #include "Features/PerformanceOverlay/ABTesting/ABTesting.h" @@ -50,7 +51,11 @@ void OverlayRenderer::RenderOverlay( RenderShaderBlockingStatus(); RenderFirstTimeSetupOverlay(); - if (menu.IsEnabled || HomePageRenderer::ShouldShowFirstTimeSetup()) { + // Draw weather editor independently of main menu state + if (EditorWindow::GetSingleton()->open) { + ImGui::GetIO().MouseDrawCursor = true; + EditorWindow::GetSingleton()->Draw(); + } else if (menu.IsEnabled || HomePageRenderer::ShouldShowFirstTimeSetup()) { ImGui::GetIO().MouseDrawCursor = true; if (menu.IsEnabled) { drawSettings(); @@ -81,6 +86,7 @@ bool OverlayRenderer::ShouldSkipRendering() return !(shaderCache->IsCompiling() || Menu::GetSingleton()->IsEnabled || + EditorWindow::GetSingleton()->open || abTestingManager->IsEnabled() || (failed && !hide) || globals::features::performanceOverlay.settings.ShowInOverlay || diff --git a/src/Menu/SettingsTabRenderer.cpp b/src/Menu/SettingsTabRenderer.cpp index f302254f56..f96ffcd76b 100644 --- a/src/Menu/SettingsTabRenderer.cpp +++ b/src/Menu/SettingsTabRenderer.cpp @@ -263,6 +263,12 @@ void SettingsTabRenderer::RenderKeybindingsTab( state.settingOverlayToggleKey, "Change##OverlayToggle"); + Util::InputComboWidget( + "Weather Editor Toggle Key:", + settings.WeatherEditorToggleKey, + state.settingWeatherEditorToggleKey, + "Change##WeatherEditorToggle"); + ImGui::EndTabItem(); } } diff --git a/src/Menu/SettingsTabRenderer.h b/src/Menu/SettingsTabRenderer.h index 9b0513c6d1..8280c81978 100644 --- a/src/Menu/SettingsTabRenderer.h +++ b/src/Menu/SettingsTabRenderer.h @@ -17,8 +17,9 @@ class SettingsTabRenderer bool& settingsEffectsToggle; bool& settingSkipCompilationKey; bool& settingOverlayToggleKey; - bool& settingShaderBlockPrevKey; // Debug: shader block previous key - bool& settingShaderBlockNextKey; // Debug: shader block next key + bool& settingShaderBlockPrevKey; // Debug: shader block previous key + bool& settingShaderBlockNextKey; // Debug: shader block next key + bool& settingWeatherEditorToggleKey; // Weather Editor toggle key }; static void RenderGeneralSettings(