From e5d6ac0e0afbd38d024d7d2b5f69148a09c88f41 Mon Sep 17 00:00:00 2001 From: pizzaboxer Date: Sun, 23 Jul 2023 15:45:25 +0100 Subject: [PATCH] Abstract preset flags centralize where flag names are stored, and hide from editor list by default --- Bloxstrap/FastFlagManager.cs | 141 +++++++++++++----- .../Menu/Pages/FastFlagEditorPage.xaml | 1 + .../Menu/Pages/FastFlagEditorPage.xaml.cs | 35 +++-- .../UI/Elements/Menu/Pages/FastFlagsPage.xaml | 2 +- .../UI/ViewModels/Menu/FastFlagsViewModel.cs | 105 +++---------- 5 files changed, 144 insertions(+), 140 deletions(-) diff --git a/Bloxstrap/FastFlagManager.cs b/Bloxstrap/FastFlagManager.cs index 90d4f97..02450be 100644 --- a/Bloxstrap/FastFlagManager.cs +++ b/Bloxstrap/FastFlagManager.cs @@ -1,4 +1,7 @@ -namespace Bloxstrap +using System.Windows.Input; +using System.Windows.Media.Animation; + +namespace Bloxstrap { public class FastFlagManager : JsonManager> { @@ -7,22 +10,57 @@ // this is the value of the 'FStringPartTexturePackTablePre2022' flag public const string OldTexturesFlagValue = "{\"foil\":{\"ids\":[\"rbxassetid://7546645012\",\"rbxassetid://7546645118\"],\"color\":[255,255,255,255]},\"brick\":{\"ids\":[\"rbxassetid://7546650097\",\"rbxassetid://7546645118\"],\"color\":[204,201,200,232]},\"cobblestone\":{\"ids\":[\"rbxassetid://7546652947\",\"rbxassetid://7546645118\"],\"color\":[212,200,187,250]},\"concrete\":{\"ids\":[\"rbxassetid://7546653951\",\"rbxassetid://7546654144\"],\"color\":[208,208,208,255]},\"diamondplate\":{\"ids\":[\"rbxassetid://7547162198\",\"rbxassetid://7546645118\"],\"color\":[170,170,170,255]},\"fabric\":{\"ids\":[\"rbxassetid://7547101130\",\"rbxassetid://7546645118\"],\"color\":[105,104,102,244]},\"glass\":{\"ids\":[\"rbxassetid://7547304948\",\"rbxassetid://7546645118\"],\"color\":[254,254,254,7]},\"granite\":{\"ids\":[\"rbxassetid://7547164710\",\"rbxassetid://7546645118\"],\"color\":[113,113,113,255]},\"grass\":{\"ids\":[\"rbxassetid://7547169285\",\"rbxassetid://7546645118\"],\"color\":[165,165,159,255]},\"ice\":{\"ids\":[\"rbxassetid://7547171356\",\"rbxassetid://7546645118\"],\"color\":[255,255,255,255]},\"marble\":{\"ids\":[\"rbxassetid://7547177270\",\"rbxassetid://7546645118\"],\"color\":[199,199,199,255]},\"metal\":{\"ids\":[\"rbxassetid://7547288171\",\"rbxassetid://7546645118\"],\"color\":[199,199,199,255]},\"pebble\":{\"ids\":[\"rbxassetid://7547291361\",\"rbxassetid://7546645118\"],\"color\":[208,208,208,255]},\"corrodedmetal\":{\"ids\":[\"rbxassetid://7547184629\",\"rbxassetid://7546645118\"],\"color\":[159,119,95,200]},\"sand\":{\"ids\":[\"rbxassetid://7547295153\",\"rbxassetid://7546645118\"],\"color\":[220,220,220,255]},\"slate\":{\"ids\":[\"rbxassetid://7547298114\",\"rbxassetid://7547298323\"],\"color\":[193,193,193,255]},\"wood\":{\"ids\":[\"rbxassetid://7547303225\",\"rbxassetid://7547298786\"],\"color\":[227,227,227,255]},\"woodplanks\":{\"ids\":[\"rbxassetid://7547332968\",\"rbxassetid://7546645118\"],\"color\":[212,209,203,255]},\"asphalt\":{\"ids\":[\"rbxassetid://9873267379\",\"rbxassetid://9438410548\"],\"color\":[123,123,123,234]},\"basalt\":{\"ids\":[\"rbxassetid://9873270487\",\"rbxassetid://9438413638\"],\"color\":[154,154,153,238]},\"crackedlava\":{\"ids\":[\"rbxassetid://9438582231\",\"rbxassetid://9438453972\"],\"color\":[74,78,80,156]},\"glacier\":{\"ids\":[\"rbxassetid://9438851661\",\"rbxassetid://9438453972\"],\"color\":[226,229,229,243]},\"ground\":{\"ids\":[\"rbxassetid://9439044431\",\"rbxassetid://9438453972\"],\"color\":[114,114,112,240]},\"leafygrass\":{\"ids\":[\"rbxassetid://9873288083\",\"rbxassetid://9438453972\"],\"color\":[121,117,113,234]},\"limestone\":{\"ids\":[\"rbxassetid://9873289812\",\"rbxassetid://9438453972\"],\"color\":[235,234,230,250]},\"mud\":{\"ids\":[\"rbxassetid://9873319819\",\"rbxassetid://9438453972\"],\"color\":[130,130,130,252]},\"pavement\":{\"ids\":[\"rbxassetid://9873322398\",\"rbxassetid://9438453972\"],\"color\":[142,142,144,236]},\"rock\":{\"ids\":[\"rbxassetid://9873515198\",\"rbxassetid://9438453972\"],\"color\":[154,154,154,248]},\"salt\":{\"ids\":[\"rbxassetid://9439566986\",\"rbxassetid://9438453972\"],\"color\":[220,220,221,255]},\"sandstone\":{\"ids\":[\"rbxassetid://9873521380\",\"rbxassetid://9438453972\"],\"color\":[174,171,169,246]},\"snow\":{\"ids\":[\"rbxassetid://9439632387\",\"rbxassetid://9438453972\"],\"color\":[218,218,218,255]}}"; + public static IReadOnlyDictionary PresetFlags = new Dictionary + { + { "HTTP.Log", "DFLogHttpTraceLight" }, + + { "HTTP.Proxy.Enable", "DFFlagDebugEnableHttpProxy" }, + { "HTTP.Proxy.Address.1", "DFStringDebugPlayerHttpProxyUrl" }, + { "HTTP.Proxy.Address.2", "DFStringHttpCurlProxyHostAndPort" }, + { "HTTP.Proxy.Address.3", "DFStringHttpCurlProxyHostAndPortForExternalUrl" }, + + { "Rendering.Framerate", "DFIntTaskSchedulerTargetFps" }, + { "Rendering.Fullscreen", "FFlagHandleAltEnterFullscreenManually" }, + { "Rendering.TexturePack", "FStringPartTexturePackTable2022" }, + + { "Rendering.DPI.Disable", "DFFlagDisableDPIScale" }, + { "Rendering.DPI.Variable", "DFFlagVariableDPIScale2" }, + + { "Rendering.Mode.D3D11", "FFlagDebugGraphicsPreferD3D11" }, + { "Rendering.Mode.D3D10", "FFlagDebugGraphicsPreferD3D11FL10" }, + { "Rendering.Mode.Vulkan", "FFlagDebugGraphicsPreferVulkan" }, + { "Rendering.Mode.Vulkan.Fix", "FFlagRenderVulkanFixMinimizeWindow" }, + { "Rendering.Mode.OpenGL", "FFlagDebugGraphicsPreferOpenGL" }, + + { "Rendering.Lighting.Voxel", "DFFlagDebugRenderForceTechnologyVoxel" }, + { "Rendering.Lighting.ShadowMap", "FFlagDebugForceFutureIsBrightPhase2" }, + { "Rendering.Lighting.Future", "FFlagDebugForceFutureIsBrightPhase3" }, + + { "UI.Hide", "DFIntCanHideGuiGroupId" }, + { "UI.FlagState", "FStringDebugShowFlagState" }, + + { "UI.Menu.GraphicsSlider", "FFlagFixGraphicsQuality" }, + + { "UI.Menu.Style.DisableV2", "FFlagDisableNewIGMinDUA" }, + { "UI.Menu.Style.EnableV4", "FFlagEnableInGameMenuControls" } + }; + // only one missing here is Metal because lol public static IReadOnlyDictionary RenderingModes => new Dictionary { - { "Automatic", "" }, - { "Vulkan", "FFlagDebugGraphicsPreferVulkan" }, - { "Direct3D 11", "FFlagDebugGraphicsPreferD3D11" }, - { "Direct3D 10", "FFlagDebugGraphicsPreferD3D11FL10" }, - { "OpenGL", "FFlagDebugGraphicsPreferOpenGL" } + { "Automatic", "None" }, + { "Vulkan", "Vulkan" }, + { "Direct3D 11", "D3D11" }, + { "Direct3D 10", "D3D10" }, + { "OpenGL", "OpenGL" } }; - public static IReadOnlyDictionary LightingTechnologies => new Dictionary + public static IReadOnlyDictionary LightingModes => new Dictionary { - { "Chosen by game", "" }, - { "Voxel (Phase 1)", "DFFlagDebugRenderForceTechnologyVoxel" }, - { "ShadowMap (Phase 2)", "FFlagDebugForceFutureIsBrightPhase2" }, - { "Future (Phase 3)", "FFlagDebugForceFutureIsBrightPhase3" } + { "Chosen by game", "None" }, + { "Voxel (Phase 1)", "Voxel" }, + { "ShadowMap (Phase 2)", "ShadowMap" }, + { "Future (Phase 3)", "Future" } }; // this is one hell of a dictionary definition lmao @@ -33,8 +71,8 @@ "Default", new Dictionary { - { "FFlagDisableNewIGMinDUA", null }, - { "FFlagEnableInGameMenuControls", null } + { "DisableV2", null }, + { "EnableV4", null } } }, @@ -42,8 +80,8 @@ "Version 1 (2015)", new Dictionary { - { "FFlagDisableNewIGMinDUA", "True" }, - { "FFlagEnableInGameMenuControls", "False" } + { "DisableV2", "True" }, + { "EnableV4", "False" } } }, @@ -51,8 +89,8 @@ "Version 2 (2020)", new Dictionary { - { "FFlagDisableNewIGMinDUA", "False" }, - { "FFlagEnableInGameMenuControls", "False" } + { "DisableV2", "False" }, + { "EnableV4", "False" } } }, @@ -60,8 +98,8 @@ "Version 4 (2023)", new Dictionary { - { "FFlagDisableNewIGMinDUA", "True" }, - { "FFlagEnableInGameMenuControls", "True" } + { "DisableV2", "True" }, + { "EnableV4", "True" } } } }; @@ -82,22 +120,6 @@ } } - // this will set the flag to the corresponding value if the condition is true - // if the condition is not true, the flag will be erased - public void SetValueIf(bool condition, string key, object? value) - { - if (condition) - SetValue(key, value); - else if (GetValue(key) is not null) - SetValue(key, null); - } - - public void SetValueOnce(string key, object? value) - { - if (GetValue(key) is null) - SetValue(key, value); - } - // this returns null if the fflag doesn't exist public string? GetValue(string key) { @@ -108,15 +130,54 @@ return null; } + public void SetPreset(string prefix, object? value) + { + foreach (var pair in PresetFlags.Where(x => x.Key.StartsWith(prefix))) + SetValue(pair.Value, value); + } + + public void SetPresetOnce(string key, object? value) + { + if (GetPreset(key) is null) + SetPreset(key, value); + } + + public void SetPresetEnum(string prefix, string target, object? value) + { + foreach (var pair in PresetFlags.Where(x => x.Key.StartsWith(prefix))) + { + if (pair.Key.StartsWith($"{prefix}.{target}")) + SetValue(pair.Value, value); + else + SetValue(pair.Value, null); + } + } + + public string? GetPreset(string name) => GetValue(PresetFlags[name]); + + public string GetPresetEnum(IReadOnlyDictionary mapping, string prefix, string value) + { + foreach (var mode in mapping) + { + if (mode.Key == mapping.First().Key) + continue; + + if (App.FastFlags.GetPreset($"{prefix}.{mode.Value}") == value) + return mode.Key; + } + + return mapping.First().Key; + } + public override void Load() { base.Load(); - // set to 9999 by default if it doesnt already exist - SetValueOnce("DFIntTaskSchedulerTargetFps", 9999); - SetValueOnce("FFlagHandleAltEnterFullscreenManually", "False"); - SetValueOnce("DFFlagDisableDPIScale", "True"); - SetValueOnce("DFFlagVariableDPIScale2", "False"); + SetPresetOnce("Rendering.Framerate", 9999); + SetPresetOnce("Rendering.Fullscreen", "False"); + + SetPresetOnce("Rendering.DPI.Disable", "True"); + SetPresetOnce("Rendering.DPI.Variable", "False"); } } } diff --git a/Bloxstrap/UI/Elements/Menu/Pages/FastFlagEditorPage.xaml b/Bloxstrap/UI/Elements/Menu/Pages/FastFlagEditorPage.xaml index 99f4c58..48fdf10 100644 --- a/Bloxstrap/UI/Elements/Menu/Pages/FastFlagEditorPage.xaml +++ b/Bloxstrap/UI/Elements/Menu/Pages/FastFlagEditorPage.xaml @@ -39,6 +39,7 @@ + diff --git a/Bloxstrap/UI/Elements/Menu/Pages/FastFlagEditorPage.xaml.cs b/Bloxstrap/UI/Elements/Menu/Pages/FastFlagEditorPage.xaml.cs index ea4561e..2bee58a 100644 --- a/Bloxstrap/UI/Elements/Menu/Pages/FastFlagEditorPage.xaml.cs +++ b/Bloxstrap/UI/Elements/Menu/Pages/FastFlagEditorPage.xaml.cs @@ -1,20 +1,7 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Collections.Specialized; -using System.Linq; -using System.Text; -using System.Text.RegularExpressions; -using System.Threading.Tasks; +using System.Collections.ObjectModel; using System.Windows; using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; -using System.Windows.Input; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Navigation; -using System.Windows.Shapes; +using System.Windows.Controls.Primitives; using Bloxstrap.UI.Elements.Dialogs; @@ -35,14 +22,17 @@ namespace Bloxstrap.UI.Elements.Menu.Pages InitializeComponent(); } - private void Page_Loaded(object sender, RoutedEventArgs e) + private void ReloadList(bool showPresets = false) { - // refresh list on page load to synchronize with preset page - _fastFlagList.Clear(); + var presetFlags = FastFlagManager.PresetFlags.Values; + foreach (var pair in App.FastFlags.Prop) { + if (!showPresets && presetFlags.Contains(pair.Key)) + continue; + var entry = new FastFlag { Enabled = true, @@ -62,6 +52,9 @@ namespace Bloxstrap.UI.Elements.Menu.Pages DataGrid.ItemsSource = _fastFlagList; } + // refresh list on page load to synchronize with preset page + private void Page_Loaded(object sender, RoutedEventArgs e) => ReloadList(); + private void DataGrid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e) { int index = e.Row.GetIndex(); @@ -135,5 +128,11 @@ namespace Bloxstrap.UI.Elements.Menu.Pages App.FastFlags.SetValue(entry.Name, null); } } + + private void ToggleButton_Click(object sender, RoutedEventArgs e) + { + if (sender is ToggleButton button) + ReloadList(button.IsChecked ?? false); + } } } diff --git a/Bloxstrap/UI/Elements/Menu/Pages/FastFlagsPage.xaml b/Bloxstrap/UI/Elements/Menu/Pages/FastFlagsPage.xaml index 72000c9..b7c2491 100644 --- a/Bloxstrap/UI/Elements/Menu/Pages/FastFlagsPage.xaml +++ b/Bloxstrap/UI/Elements/Menu/Pages/FastFlagsPage.xaml @@ -122,7 +122,7 @@ - + diff --git a/Bloxstrap/UI/ViewModels/Menu/FastFlagsViewModel.cs b/Bloxstrap/UI/ViewModels/Menu/FastFlagsViewModel.cs index 3ba02f6..ca32a4f 100644 --- a/Bloxstrap/UI/ViewModels/Menu/FastFlagsViewModel.cs +++ b/Bloxstrap/UI/ViewModels/Menu/FastFlagsViewModel.cs @@ -15,85 +15,51 @@ namespace Bloxstrap.UI.ViewModels.Menu public bool HttpRequestLogging { - get => App.FastFlags.GetValue("DFLogHttpTraceLight") is not null; - set => App.FastFlags.SetValue("DFLogHttpTraceLight", value ? 12 : null); + get => App.FastFlags.GetPreset("HTTP.Log") is not null; + set => App.FastFlags.SetPreset("HTTP.Log", value ? 12 : null); } public string HttpRequestProxy { - get => App.FastFlags.GetValue("DFStringDebugPlayerHttpProxyUrl") ?? ""; + get => App.FastFlags.GetPreset("HTTP.Proxy.Address.1") ?? ""; set { - bool? boolValue = null; - string? stringValue = null; - - if (!String.IsNullOrEmpty(value)) - { - boolValue = true; - stringValue = value; - } - - App.FastFlags.SetValue("DFFlagDebugEnableHttpProxy", boolValue); - App.FastFlags.SetValue("DFStringDebugPlayerHttpProxyUrl", stringValue); - App.FastFlags.SetValue("DFStringHttpCurlProxyHostAndPort", stringValue); - App.FastFlags.SetValue("DFStringHttpCurlProxyHostAndPortForExternalUrl", stringValue); + App.FastFlags.SetPreset("HTTP.Proxy.Enable", String.IsNullOrEmpty(value) ? null : true); + App.FastFlags.SetPreset("HTTP.Proxy.Address", String.IsNullOrEmpty(value) ? null : value); } } public string StateOverlayFlags { - get => App.FastFlags.GetValue("FStringDebugShowFlagState") ?? ""; - set => App.FastFlags.SetValue("FStringDebugShowFlagState", String.IsNullOrEmpty(value) ? null : value); + get => App.FastFlags.GetPreset("UI.FlagState") ?? ""; + set => App.FastFlags.SetPreset("UI.FlagState", String.IsNullOrEmpty(value) ? null : value); } public int FramerateLimit { - get => int.TryParse(App.FastFlags.GetValue("DFIntTaskSchedulerTargetFps"), out int x) ? x : 60; - set => App.FastFlags.SetValue("DFIntTaskSchedulerTargetFps", value); + get => int.TryParse(App.FastFlags.GetPreset("Rendering.Framerate"), out int x) ? x : 60; + set => App.FastFlags.SetPreset("Rendering.Framerate", value); } public IReadOnlyDictionary RenderingModes => FastFlagManager.RenderingModes; public string SelectedRenderingMode { - get - { - foreach (var mode in RenderingModes) - { - if (App.FastFlags.GetValue(mode.Value) == "True") - return mode.Key; - } - - return "Automatic"; - } - - set - { - foreach (var mode in RenderingModes) - { - if (mode.Key != "Automatic") - App.FastFlags.SetValue(mode.Value, null); - } - - if (value == "Automatic") - return; - - App.FastFlags.SetValue(RenderingModes[value], "True"); - App.FastFlags.SetValueIf(value == "Vulkan", "FFlagRenderVulkanFixMinimizeWindow", "True"); - } + get => App.FastFlags.GetPresetEnum(RenderingModes, "Rendering.Mode", "True"); + set => App.FastFlags.SetPresetEnum("Rendering.Mode", RenderingModes[value], "True"); } public bool AlternateGraphicsSelectorEnabled { - get => App.FastFlags.GetValue("FFlagFixGraphicsQuality") == "True"; - set => App.FastFlags.SetValue("FFlagFixGraphicsQuality", value ? "True" : null); + get => App.FastFlags.GetPreset("UI.Menu.GraphicsSlider") == "True"; + set => App.FastFlags.SetPreset("UI.Menu.GraphicsSlider", value ? "True" : null); } public bool Pre2022TexturesEnabled { - get => App.FastFlags.GetValue("FStringPartTexturePackTable2022") == FastFlagManager.OldTexturesFlagValue; - set => App.FastFlags.SetValue("FStringPartTexturePackTable2022", value ? FastFlagManager.OldTexturesFlagValue : null); + get => App.FastFlags.GetPreset("Rendering.TexturePack") == FastFlagManager.OldTexturesFlagValue; + set => App.FastFlags.SetPreset("Rendering.TexturePack", value ? FastFlagManager.OldTexturesFlagValue : null); } public IReadOnlyDictionary> IGMenuVersions => FastFlagManager.IGMenuVersions; @@ -109,7 +75,7 @@ namespace Bloxstrap.UI.ViewModels.Menu foreach (var flag in version.Value) { - if (App.FastFlags.GetValue(flag.Key) != flag.Value) + if (App.FastFlags.GetPreset($"UI.Menu.Style.{flag.Key}") != flag.Value) flagsMatch = false; } @@ -117,51 +83,28 @@ namespace Bloxstrap.UI.ViewModels.Menu return version.Key; } - return "Default"; + return IGMenuVersions.First().Key; } set { foreach (var flag in IGMenuVersions[value]) - { - App.FastFlags.SetValue(flag.Key, flag.Value); - } + App.FastFlags.SetPreset($"UI.Menu.Style.{flag.Key}", flag.Value); } } - public IReadOnlyDictionary LightingTechnologies => FastFlagManager.LightingTechnologies; + public IReadOnlyDictionary LightingModes => FastFlagManager.LightingModes; - // this is basically the same as the code for rendering selection, maybe this could be abstracted in some way? - public string SelectedLightingTechnology + public string SelectedLightingMode { - get - { - foreach (var mode in LightingTechnologies) - { - if (App.FastFlags.GetValue(mode.Value) == "True") - return mode.Key; - } - - return LightingTechnologies.First().Key; - } - - set - { - foreach (var mode in LightingTechnologies) - { - if (mode.Key != LightingTechnologies.First().Key) - App.FastFlags.SetValue(mode.Value, null); - } - - if (value != LightingTechnologies.First().Key) - App.FastFlags.SetValue(LightingTechnologies[value], "True"); - } + get => App.FastFlags.GetPresetEnum(LightingModes, "Rendering.Lighting", "True"); + set => App.FastFlags.SetPresetEnum("Rendering.Lighting", LightingModes[value], "True"); } public bool GuiHidingEnabled { - get => App.FastFlags.GetValue("DFIntCanHideGuiGroupId") == "32380007"; - set => App.FastFlags.SetValue("DFIntCanHideGuiGroupId", value ? "32380007" : null); + get => App.FastFlags.GetPreset("UI.Hide") == "32380007"; + set => App.FastFlags.SetPreset("UI.Hide", value ? "32380007" : null); } } }