diff --git a/Glamourer/Gui/DesignQuickBar.cs b/Glamourer/Gui/DesignQuickBar.cs index b58643c..1e2904c 100644 --- a/Glamourer/Gui/DesignQuickBar.cs +++ b/Glamourer/Gui/DesignQuickBar.cs @@ -7,11 +7,13 @@ using Dalamud.Plugin.Services; using Glamourer.Automation; using Glamourer.Designs; using Glamourer.Interop; +using Glamourer.Interop.Penumbra; using Glamourer.Interop.Structs; using Glamourer.State; using ImGuiNET; using OtterGui; using OtterGui.Classes; +using OtterGui.Text; using Penumbra.GameData.Actors; namespace Glamourer.Gui; @@ -26,6 +28,7 @@ public enum QdbButtons RevertEquip = 0x10, RevertCustomize = 0x20, ReapplyAutomation = 0x40, + ResetSettings = 0x80, } public sealed class DesignQuickBar : Window, IDisposable @@ -40,6 +43,7 @@ public sealed class DesignQuickBar : Window, IDisposable private readonly StateManager _stateManager; private readonly AutoDesignApplier _autoDesignApplier; private readonly ObjectManager _objects; + private readonly PenumbraService _penumbra; private readonly IKeyState _keyState; private readonly ImRaii.Style _windowPadding = new(); private readonly ImRaii.Color _windowColor = new(); @@ -47,7 +51,7 @@ public sealed class DesignQuickBar : Window, IDisposable private int _numButtons; public DesignQuickBar(Configuration config, QuickDesignCombo designCombo, StateManager stateManager, IKeyState keyState, - ObjectManager objects, AutoDesignApplier autoDesignApplier) + ObjectManager objects, AutoDesignApplier autoDesignApplier, PenumbraService penumbra) : base("Glamourer Quick Bar", ImGuiWindowFlags.NoDecoration | ImGuiWindowFlags.NoDocking) { _config = config; @@ -56,6 +60,7 @@ public sealed class DesignQuickBar : Window, IDisposable _keyState = keyState; _objects = objects; _autoDesignApplier = autoDesignApplier; + _penumbra = penumbra; IsOpen = _config.Ephemeral.ShowDesignQuickBar; DisableWindowSounds = true; Size = Vector2.Zero; @@ -122,6 +127,7 @@ public sealed class DesignQuickBar : Window, IDisposable DrawRevertAdvancedCustomization(buttonSize); DrawRevertAutomationButton(buttonSize); DrawReapplyAutomationButton(buttonSize); + DrawResetSettingsButton(buttonSize); } private ActorIdentifier _playerIdentifier; @@ -392,10 +398,41 @@ public sealed class DesignQuickBar : Window, IDisposable _stateManager.ResetEquip(state!, StateSource.Manual); } + private void DrawResetSettingsButton(Vector2 buttonSize) + { + if (!_config.QdbButtons.HasFlag(QdbButtons.ResetSettings)) + return; + + var available = 0; + var tooltip = string.Empty; + + if (_playerIdentifier.IsValid && _playerData.Valid) + { + available |= 1; + tooltip = $"Left-Click: Reset all temporary settings applied by Glamourer to the collection affecting {_playerIdentifier}."; + } + + if (_targetIdentifier.IsValid && _targetData.Valid) + { + if (available != 0) + tooltip += '\n'; + available |= 2; + tooltip += $"Right-Click: Reset all temporary settings applied by Glamourer to the collection affecting {_targetIdentifier}."; + } + + if (available == 0) + tooltip = "Neither player character nor target are available to identify their collections."; + + var (clicked, _, data, _) = ResolveTarget(FontAwesomeIcon.Cog, buttonSize, tooltip, available); + ImGui.SameLine(); + if (clicked) + _penumbra.RemoveAllTemporarySettings(data.Objects[0].Index); + } + private (bool, ActorIdentifier, ActorData, ActorState?) ResolveTarget(FontAwesomeIcon icon, Vector2 buttonSize, string tooltip, int available) { - ImGuiUtil.DrawDisabledButton(icon.ToIconString(), buttonSize, tooltip, available == 0, true); + ImUtf8.IconButton(icon, tooltip, buttonSize, available == 0); if ((available & 1) == 1 && ImGui.IsItemClicked(ImGuiMouseButton.Left)) return (true, _playerIdentifier, _playerData, _playerState); if ((available & 2) == 2 && ImGui.IsItemClicked(ImGuiMouseButton.Right)) @@ -441,6 +478,8 @@ public sealed class DesignQuickBar : Window, IDisposable ++_numButtons; if (_config.QdbButtons.HasFlag(QdbButtons.RevertEquip)) ++_numButtons; + if (_config.UseTemporarySettings && _config.QdbButtons.HasFlag(QdbButtons.ResetSettings)) + ++_numButtons; if (_config.QdbButtons.HasFlag(QdbButtons.ApplyDesign)) { ++_numButtons; diff --git a/Glamourer/Gui/Tabs/SettingsTab/SettingsTab.cs b/Glamourer/Gui/Tabs/SettingsTab/SettingsTab.cs index ab40a48..4ee261b 100644 --- a/Glamourer/Gui/Tabs/SettingsTab/SettingsTab.cs +++ b/Glamourer/Gui/Tabs/SettingsTab/SettingsTab.cs @@ -9,7 +9,6 @@ using Glamourer.Gui.Tabs.DesignTab; using Glamourer.Interop; using Glamourer.Interop.PalettePlus; using ImGuiNET; -using OtterGui; using OtterGui.Raii; using OtterGui.Text; using OtterGui.Widgets; @@ -39,12 +38,12 @@ public class SettingsTab( public void DrawContent() { - using var child = ImRaii.Child("MainWindowChild"); + using var child = ImUtf8.Child("MainWindowChild"u8, default); if (!child) return; - Checkbox("Enable Auto Designs", - "Enable the application of designs associated to characters in the Automation tab to be applied automatically.", + Checkbox("Enable Auto Designs"u8, + "Enable the application of designs associated to characters in the Automation tab to be applied automatically."u8, config.EnableAutoDesigns, v => { config.EnableAutoDesigns = v; @@ -55,7 +54,7 @@ public class SettingsTab( ImGui.NewLine(); ImGui.NewLine(); - using (ImRaii.Child("SettingsChild")) + using (ImUtf8.Child("SettingsChild"u8, default)) { DrawBehaviorSettings(); DrawDesignDefaultSettings(); @@ -70,44 +69,44 @@ public class SettingsTab( private void DrawBehaviorSettings() { - if (!ImGui.CollapsingHeader("Glamourer Behavior")) + if (!ImUtf8.CollapsingHeader("Glamourer Behavior"u8)) return; - Checkbox("Always Apply Entire Weapon for Mainhand", - "When manually applying a mainhand item, will also apply a corresponding offhand and potentially gauntlets for certain fist weapons.", + Checkbox("Always Apply Entire Weapon for Mainhand"u8, + "When manually applying a mainhand item, will also apply a corresponding offhand and potentially gauntlets for certain fist weapons."u8, config.ChangeEntireItem, v => config.ChangeEntireItem = v); - Checkbox("Use Replacement Gear for Gear Unavailable to Your Race or Gender", - "Use different gender- and race-appropriate models as a substitute when detecting certain items not available for a characters current gender and race.", + Checkbox("Use Replacement Gear for Gear Unavailable to Your Race or Gender"u8, + "Use different gender- and race-appropriate models as a substitute when detecting certain items not available for a characters current gender and race."u8, config.UseRestrictedGearProtection, v => config.UseRestrictedGearProtection = v); - Checkbox("Do Not Apply Unobtained Items in Automation", - "Enable this if you want automatically applied designs to only consider items and customizations you have actually unlocked once, and skip those you have not.", + Checkbox("Do Not Apply Unobtained Items in Automation"u8, + "Enable this if you want automatically applied designs to only consider items and customizations you have actually unlocked once, and skip those you have not."u8, config.UnlockedItemMode, v => config.UnlockedItemMode = v); - Checkbox("Respect Manual Changes When Editing Automation", - "Whether changing any currently active automation group will respect manual changes to the character before re-applying the changed automation or not.", + Checkbox("Respect Manual Changes When Editing Automation"u8, + "Whether changing any currently active automation group will respect manual changes to the character before re-applying the changed automation or not."u8, config.RespectManualOnAutomationUpdate, v => config.RespectManualOnAutomationUpdate = v); - Checkbox("Enable Festival Easter-Eggs", - "Glamourer may do some fun things on specific dates. Disable this if you do not want your experience disrupted by this.", + Checkbox("Enable Festival Easter-Eggs"u8, + "Glamourer may do some fun things on specific dates. Disable this if you do not want your experience disrupted by this."u8, config.DisableFestivals == 0, v => config.DisableFestivals = v ? (byte)0 : (byte)2); - Checkbox("Auto-Reload Gear", - "Automatically reload equipment pieces on your own character when changing any mod options in Penumbra in their associated collection.", + Checkbox("Auto-Reload Gear"u8, + "Automatically reload equipment pieces on your own character when changing any mod options in Penumbra in their associated collection."u8, config.AutoRedrawEquipOnChanges, v => config.AutoRedrawEquipOnChanges = v); - Checkbox("Revert Manual Changes on Zone Change", - "Restores the old behaviour of reverting your character to its game or automation base whenever you change the zone.", + Checkbox("Revert Manual Changes on Zone Change"u8, + "Restores the old behaviour of reverting your character to its game or automation base whenever you change the zone."u8, config.RevertManualChangesOnZoneChange, v => config.RevertManualChangesOnZoneChange = v); - Checkbox("Enable Advanced Customization Options", - "Enable the display and editing of advanced customization options like arbitrary colors.", + Checkbox("Enable Advanced Customization Options"u8, + "Enable the display and editing of advanced customization options like arbitrary colors."u8, config.UseAdvancedParameters, paletteChecker.SetAdvancedParameters); PaletteImportButton(); - Checkbox("Enable Advanced Dye Options", - "Enable the display and editing of advanced dyes (color sets) for all equipment", + Checkbox("Enable Advanced Dye Options"u8, + "Enable the display and editing of advanced dyes (color sets) for all equipment"u8, config.UseAdvancedDyes, v => config.UseAdvancedDyes = v); - Checkbox("Always Apply Associated Mods", - "Whenever a design is applied to a character (including via automation), Glamourer will try to apply its associated mod settings to the collection currently associated with that character, if it is available.\n\n" - + "Glamourer will NOT revert these applied settings automatically. This may mess up your collection and configuration.\n\n" - + "If you enable this setting, you are aware that any resulting misconfiguration is your own fault.", + Checkbox("Always Apply Associated Mods"u8, + "Whenever a design is applied to a character (including via automation), Glamourer will try to apply its associated mod settings to the collection currently associated with that character, if it is available.\n\n"u8 + + "Glamourer will NOT revert these applied settings automatically. This may mess up your collection and configuration.\n\n"u8 + + "If you enable this setting, you are aware that any resulting misconfiguration is your own fault."u8, config.AlwaysApplyAssociatedMods, v => config.AlwaysApplyAssociatedMods = v); - Checkbox("Use Temporary Mod Settings", - "Apply all settings as temporary settings so they will be reset when Glamourer or the game shut down.", config.UseTemporarySettings, + Checkbox("Use Temporary Mod Settings"u8, + "Apply all settings as temporary settings so they will be reset when Glamourer or the game shut down."u8, config.UseTemporarySettings, v => config.UseTemporarySettings = v); ImGui.NewLine(); } @@ -117,33 +116,34 @@ public class SettingsTab( if (!ImUtf8.CollapsingHeader("Design Defaults")) return; - Checkbox("Show in Quick Design Bar", "Newly created designs will be shown in the quick design bar by default.", + Checkbox("Show in Quick Design Bar"u8, "Newly created designs will be shown in the quick design bar by default."u8, config.DefaultDesignSettings.ShowQuickDesignBar, v => config.DefaultDesignSettings.ShowQuickDesignBar = v); - Checkbox("Reset Advanced Dyes", "Newly created designs will be configured to reset advanced dyes on application by default.", + Checkbox("Reset Advanced Dyes"u8, "Newly created designs will be configured to reset advanced dyes on application by default."u8, config.DefaultDesignSettings.ResetAdvancedDyes, v => config.DefaultDesignSettings.ResetAdvancedDyes = v); - Checkbox("Always Force Redraw", "Newly created designs will be configured to force character redraws on application by default.", + Checkbox("Always Force Redraw"u8, "Newly created designs will be configured to force character redraws on application by default."u8, config.DefaultDesignSettings.AlwaysForceRedrawing, v => config.DefaultDesignSettings.AlwaysForceRedrawing = v); - Checkbox("Reset Temporary Settings", "Newly created designs will be configured to clear all advanced settings applied by Glamourer to the collection by default.", + Checkbox("Reset Temporary Settings"u8, + "Newly created designs will be configured to clear all advanced settings applied by Glamourer to the collection by default."u8, config.DefaultDesignSettings.ResetTemporarySettings, v => config.DefaultDesignSettings.ResetTemporarySettings = v); } private void DrawInterfaceSettings() { - if (!ImGui.CollapsingHeader("Interface")) + if (!ImUtf8.CollapsingHeader("Interface"u8)) return; - EphemeralCheckbox("Show Quick Design Bar", - "Show a bar separate from the main window that allows you to quickly apply designs or revert your character and target.", + EphemeralCheckbox("Show Quick Design Bar"u8, + "Show a bar separate from the main window that allows you to quickly apply designs or revert your character and target."u8, config.Ephemeral.ShowDesignQuickBar, v => config.Ephemeral.ShowDesignQuickBar = v); - EphemeralCheckbox("Lock Quick Design Bar", "Prevent the quick design bar from being moved and lock it in place.", + EphemeralCheckbox("Lock Quick Design Bar"u8, "Prevent the quick design bar from being moved and lock it in place."u8, config.Ephemeral.LockDesignQuickBar, v => config.Ephemeral.LockDesignQuickBar = v); if (Widget.ModifiableKeySelector("Hotkey to Toggle Quick Design Bar", "Set a hotkey that opens or closes the quick design bar.", 100 * ImGuiHelpers.GlobalScale, config.ToggleQuickDesignBar, v => config.ToggleQuickDesignBar = v, _validKeys)) config.Save(); - Checkbox("Show Quick Design Bar in Main Window", - "Show the quick design bar in the tab selection part of the main window, too.", + Checkbox("Show Quick Design Bar in Main Window"u8, + "Show the quick design bar in the tab selection part of the main window, too."u8, config.ShowQuickBarInTabs, v => config.ShowQuickBarInTabs = v); DrawQuickDesignBoxes(); @@ -151,7 +151,7 @@ public class SettingsTab( ImGui.Separator(); ImGui.Dummy(Vector2.Zero); - Checkbox("Enable Game Context Menus", "Whether to show a Try On via Glamourer button on context menus for equippable items.", + Checkbox("Enable Game Context Menus"u8, "Whether to show a Try On via Glamourer button on context menus for equippable items."u8, config.EnableGameContextMenu, v => { config.EnableGameContextMenu = v; @@ -160,41 +160,41 @@ public class SettingsTab( else contextMenuService.Disable(); }); - Checkbox("Show Window when UI is Hidden", "Whether to show Glamourer windows even when the games UI is hidden.", + Checkbox("Show Window when UI is Hidden"u8, "Whether to show Glamourer windows even when the games UI is hidden."u8, config.ShowWindowWhenUiHidden, v => { config.ShowWindowWhenUiHidden = v; uiBuilder.DisableUserUiHide = v; }); - Checkbox("Hide Window in Cutscenes", "Whether the main Glamourer window should automatically be hidden when entering cutscenes or not.", + Checkbox("Hide Window in Cutscenes"u8, "Whether the main Glamourer window should automatically be hidden when entering cutscenes or not."u8, config.HideWindowInCutscene, v => { config.HideWindowInCutscene = v; uiBuilder.DisableCutsceneUiHide = !v; }); - EphemeralCheckbox("Lock Main Window", "Prevent the main window from being moved and lock it in place.", + EphemeralCheckbox("Lock Main Window"u8, "Prevent the main window from being moved and lock it in place."u8, config.Ephemeral.LockMainWindow, v => config.Ephemeral.LockMainWindow = v); - Checkbox("Open Main Window at Game Start", "Whether the main Glamourer window should be open or closed after launching the game.", + Checkbox("Open Main Window at Game Start"u8, "Whether the main Glamourer window should be open or closed after launching the game."u8, config.OpenWindowAtStart, v => config.OpenWindowAtStart = v); ImGui.Dummy(Vector2.Zero); ImGui.Separator(); ImGui.Dummy(Vector2.Zero); - Checkbox("Smaller Equip Display", "Use single-line display without icons and small dye buttons instead of double-line display.", + Checkbox("Smaller Equip Display"u8, "Use single-line display without icons and small dye buttons instead of double-line display."u8, config.SmallEquip, v => config.SmallEquip = v); DrawHeightUnitSettings(); - Checkbox("Show Application Checkboxes", - "Show the application checkboxes in the Customization and Equipment panels of the design tab, instead of only showing them under Application Rules.", + Checkbox("Show Application Checkboxes"u8, + "Show the application checkboxes in the Customization and Equipment panels of the design tab, instead of only showing them under Application Rules."u8, !config.HideApplyCheckmarks, v => config.HideApplyCheckmarks = !v); if (Widget.DoubleModifierSelector("Design Deletion Modifier", "A modifier you need to hold while clicking the Delete Design button for it to take effect.", 100 * ImGuiHelpers.GlobalScale, config.DeleteDesignModifier, v => config.DeleteDesignModifier = v)) config.Save(); DrawRenameSettings(); - Checkbox("Auto-Open Design Folders", - "Have design folders open or closed as their default state after launching.", config.OpenFoldersByDefault, + Checkbox("Auto-Open Design Folders"u8, + "Have design folders open or closed as their default state after launching."u8, config.OpenFoldersByDefault, v => config.OpenFoldersByDefault = v); DrawFolderSortType(); @@ -202,32 +202,32 @@ public class SettingsTab( ImGui.Separator(); ImGui.Dummy(Vector2.Zero); - Checkbox("Allow Double-Clicking Designs to Apply", - "Tries to apply a design to the current player character When double-clicking it in the design selector.", + Checkbox("Allow Double-Clicking Designs to Apply"u8, + "Tries to apply a design to the current player character When double-clicking it in the design selector."u8, config.AllowDoubleClickToApply, v => config.AllowDoubleClickToApply = v); - Checkbox("Show all Application Rule Checkboxes for Automation", - "Show multiple separate application rule checkboxes for automated designs, instead of a single box for enabling or disabling.", + Checkbox("Show all Application Rule Checkboxes for Automation"u8, + "Show multiple separate application rule checkboxes for automated designs, instead of a single box for enabling or disabling."u8, config.ShowAllAutomatedApplicationRules, v => config.ShowAllAutomatedApplicationRules = v); - Checkbox("Show Unobtained Item Warnings", - "Show information whether you have unlocked all items and customizations in your automated design or not.", + Checkbox("Show Unobtained Item Warnings"u8, + "Show information whether you have unlocked all items and customizations in your automated design or not."u8, config.ShowUnlockedItemWarnings, v => config.ShowUnlockedItemWarnings = v); if (config.UseAdvancedParameters) { - Checkbox("Show Color Display Config", "Show the Color Display configuration options in the Advanced Customization panels.", + Checkbox("Show Color Display Config"u8, "Show the Color Display configuration options in the Advanced Customization panels."u8, config.ShowColorConfig, v => config.ShowColorConfig = v); - Checkbox("Show Palette+ Import Button", - "Show the import button that allows you to import Palette+ palettes onto a design in the Advanced Customization options section for designs.", + Checkbox("Show Palette+ Import Button"u8, + "Show the import button that allows you to import Palette+ palettes onto a design in the Advanced Customization options section for designs."u8, config.ShowPalettePlusImport, v => config.ShowPalettePlusImport = v); using var id = ImRaii.PushId(1); PaletteImportButton(); } if (config.UseAdvancedDyes) - Checkbox("Keep Advanced Dye Window Attached", - "Keeps the advanced dye window expansion attached to the main window, or makes it freely movable.", + Checkbox("Keep Advanced Dye Window Attached"u8, + "Keeps the advanced dye window expansion attached to the main window, or makes it freely movable."u8, config.KeepAdvancedDyesAttached, v => config.KeepAdvancedDyesAttached = v); - Checkbox("Debug Mode", "Show the debug tab. Only useful for debugging or advanced use. Not recommended in general.", config.DebugMode, + Checkbox("Debug Mode"u8, "Show the debug tab. Only useful for debugging or advanced use. Not recommended in general."u8, config.DebugMode, v => config.DebugMode = v); ImGui.NewLine(); } @@ -236,40 +236,48 @@ public class SettingsTab( { var showAuto = config.EnableAutoDesigns; var showAdvanced = config.UseAdvancedParameters || config.UseAdvancedDyes; - var numColumns = 7 - (showAuto ? 0 : 2) - (showAdvanced ? 0 : 1); + var numColumns = 8 - (showAuto ? 0 : 2) - (showAdvanced ? 0 : 1) - (config.UseTemporarySettings ? 0 : 1); ImGui.NewLine(); - ImGui.TextUnformatted("Show the Following Buttons in the Quick Design Bar:"); + ImUtf8.Text("Show the Following Buttons in the Quick Design Bar:"u8); ImGui.Dummy(Vector2.Zero); - using var table = ImRaii.Table("##tableQdb", numColumns, + using var table = ImUtf8.Table("##tableQdb"u8, numColumns, ImGuiTableFlags.SizingFixedFit | ImGuiTableFlags.Borders | ImGuiTableFlags.NoHostExtendX); if (!table) return; - var columns = new[] - { - (" Apply Design ", true, QdbButtons.ApplyDesign), - (" Revert All ", true, QdbButtons.RevertAll), - (" Revert to Auto ", showAuto, QdbButtons.RevertAutomation), - (" Reapply Auto ", showAuto, QdbButtons.ReapplyAutomation), - (" Revert Equip ", true, QdbButtons.RevertEquip), - (" Revert Customize ", true, QdbButtons.RevertCustomize), - (" Revert Advanced ", showAdvanced, QdbButtons.RevertAdvanced), - }; + ReadOnlySpan<(string, bool, QdbButtons)> columns = + [ + ("Apply Design", true, QdbButtons.ApplyDesign), + ("Revert All", true, QdbButtons.RevertAll), + ("Revert to Auto", showAuto, QdbButtons.RevertAutomation), + ("Reapply Auto", showAuto, QdbButtons.ReapplyAutomation), + ("Revert Equip", true, QdbButtons.RevertEquip), + ("Revert Customize", true, QdbButtons.RevertCustomize), + ("Revert Advanced", showAdvanced, QdbButtons.RevertAdvanced), + ("Reset Settings", config.UseTemporarySettings, QdbButtons.ResetSettings), + ]; - foreach (var (label, _, _) in columns.Where(t => t.Item2)) + for(var i = 0; i < columns.Length; ++i) { + if (!columns[i].Item2) + continue; + ImGui.TableNextColumn(); - ImGui.TableHeader(label); + ImUtf8.TableHeader(columns[i].Item1); } - foreach (var (_, _, flag) in columns.Where(t => t.Item2)) + for (var i = 0; i < columns.Length; ++i) { - using var id = ImRaii.PushId((int)flag); + if (!columns[i].Item2) + continue; + + var flag = columns[i].Item3; + using var id = ImUtf8.PushId((int)flag); ImGui.TableNextColumn(); var offset = (ImGui.GetContentRegionAvail().X - ImGui.GetFrameHeight()) / 2; ImGui.SetCursorPosX(ImGui.GetCursorPosX() + offset); var value = config.QdbButtons.HasFlag(flag); - if (!ImGui.Checkbox(string.Empty, ref value)) + if (!ImUtf8.Checkbox(""u8, ref value)) continue; var buttons = value ? config.QdbButtons | flag : config.QdbButtons & ~flag; @@ -287,31 +295,31 @@ public class SettingsTab( return; ImGui.SameLine(); - if (ImGui.Button("Import Palette+ to Designs")) + if (ImUtf8.Button("Import Palette+ to Designs"u8)) paletteImport.ImportDesigns(); - ImGuiUtil.HoverTooltip( + ImUtf8.HoverTooltip( $"Import all existing Palettes from your Palette+ Config into Designs at PalettePlus/[Name] if these do not exist. Existing Palettes are:\n\n\t - {string.Join("\n\t - ", paletteImport.Data.Keys)}"); } /// Draw the entire Color subsection. private void DrawColorSettings() { - if (!ImGui.CollapsingHeader("Colors")) + if (!ImUtf8.CollapsingHeader("Colors"u8)) return; - using (var tree = ImRaii.TreeNode("Custom Design Colors")) + using (var tree = ImUtf8.TreeNode("Custom Design Colors"u8)) { if (tree) designColorUi.Draw(); } - using (var tree = ImRaii.TreeNode("Color Settings")) + using (var tree = ImUtf8.TreeNode("Color Settings"u8)) { if (tree) foreach (var color in Enum.GetValues()) { var (defaultColor, name, description) = color.Data(); - var currentColor = config.Colors.TryGetValue(color, out var current) ? current : defaultColor; + var currentColor = config.Colors.GetValueOrDefault(color, defaultColor); if (Widget.ColorPicker(name, description, currentColor, c => config.Colors[color] = c, defaultColor)) config.Save(); } @@ -321,33 +329,33 @@ public class SettingsTab( } [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] - private void Checkbox(string label, string tooltip, bool current, Action setter) + private void Checkbox(ReadOnlySpan label, ReadOnlySpan tooltip, bool current, Action setter) { - using var id = ImRaii.PushId(label); + using var id = ImUtf8.PushId(label); var tmp = current; - if (ImGui.Checkbox(string.Empty, ref tmp) && tmp != current) + if (ImUtf8.Checkbox(""u8, ref tmp) && tmp != current) { setter(tmp); config.Save(); } ImGui.SameLine(); - ImGuiUtil.LabeledHelpMarker(label, tooltip); + ImUtf8.LabeledHelpMarker(label, tooltip); } [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] - private void EphemeralCheckbox(string label, string tooltip, bool current, Action setter) + private void EphemeralCheckbox(ReadOnlySpan label, ReadOnlySpan tooltip, bool current, Action setter) { - using var id = ImRaii.PushId(label); + using var id = ImUtf8.PushId(label); var tmp = current; - if (ImGui.Checkbox(string.Empty, ref tmp) && tmp != current) + if (ImUtf8.Checkbox(""u8, ref tmp) && tmp != current) { setter(tmp); config.Ephemeral.Save(); } ImGui.SameLine(); - ImGuiUtil.LabeledHelpMarker(label, tooltip); + ImUtf8.LabeledHelpMarker(label, tooltip); } /// Different supported sort modes as a combo. @@ -355,29 +363,29 @@ public class SettingsTab( { var sortMode = config.SortMode; ImGui.SetNextItemWidth(300 * ImGuiHelpers.GlobalScale); - using (var combo = ImRaii.Combo("##sortMode", sortMode.Name)) + using (var combo = ImUtf8.Combo("##sortMode"u8, sortMode.Name)) { if (combo) foreach (var val in Configuration.Constants.ValidSortModes) { - if (ImGui.Selectable(val.Name, val.GetType() == sortMode.GetType()) && val.GetType() != sortMode.GetType()) + if (ImUtf8.Selectable(val.Name, val.GetType() == sortMode.GetType()) && val.GetType() != sortMode.GetType()) { config.SortMode = val; selector.SetFilterDirty(); config.Save(); } - ImGuiUtil.HoverTooltip(val.Description); + ImUtf8.HoverTooltip(val.Description); } } - ImGuiUtil.LabeledHelpMarker("Sort Mode", "Choose the sort mode for the mod selector in the designs tab."); + ImUtf8.LabeledHelpMarker("Sort Mode"u8, "Choose the sort mode for the mod selector in the designs tab."u8); } private void DrawRenameSettings() { ImGui.SetNextItemWidth(300 * ImGuiHelpers.GlobalScale); - using (var combo = ImRaii.Combo("##renameSettings", config.ShowRename.GetData().Name)) + using (var combo = ImUtf8.Combo("##renameSettings"u8, config.ShowRename.GetData().Name)) { if (combo) foreach (var value in Enum.GetValues()) @@ -390,7 +398,7 @@ public class SettingsTab( config.Save(); } - ImGuiUtil.HoverTooltip(desc); + ImUtf8.HoverTooltip(desc); } } @@ -399,19 +407,19 @@ public class SettingsTab( "Select which of the two renaming input fields are visible when opening the right-click context menu of a design in the design selector."; ImGuiComponents.HelpMarker(tt); ImGui.SameLine(); - ImGui.TextUnformatted("Rename Fields in Design Context Menu"); - ImGuiUtil.HoverTooltip(tt); + ImUtf8.Text("Rename Fields in Design Context Menu"u8); + ImUtf8.HoverTooltip(tt); } private void DrawHeightUnitSettings() { ImGui.SetNextItemWidth(300 * ImGuiHelpers.GlobalScale); - using (var combo = ImRaii.Combo("##heightUnit", HeightDisplayTypeName(config.HeightDisplayType))) + using (var combo = ImUtf8.Combo("##heightUnit"u8, HeightDisplayTypeName(config.HeightDisplayType))) { if (combo) foreach (var type in Enum.GetValues()) { - if (ImGui.Selectable(HeightDisplayTypeName(type), type == config.HeightDisplayType) && type != config.HeightDisplayType) + if (ImUtf8.Selectable(HeightDisplayTypeName(type), type == config.HeightDisplayType) && type != config.HeightDisplayType) { config.HeightDisplayType = type; config.Save(); @@ -423,20 +431,20 @@ public class SettingsTab( const string tt = "Select how to display the height of characters in real-world units, if at all."; ImGuiComponents.HelpMarker(tt); ImGui.SameLine(); - ImGui.TextUnformatted("Character Height Display Type"); - ImGuiUtil.HoverTooltip(tt); + ImUtf8.Text("Character Height Display Type"u8); + ImUtf8.HoverTooltip(tt); } - private static string HeightDisplayTypeName(HeightDisplayType type) + private static ReadOnlySpan HeightDisplayTypeName(HeightDisplayType type) => type switch { - HeightDisplayType.None => "Do Not Display", - HeightDisplayType.Centimetre => "Centimetres (000.0 cm)", - HeightDisplayType.Metre => "Metres (0.00 m)", - HeightDisplayType.Wrong => "Inches (00.0 in)", - HeightDisplayType.WrongFoot => "Feet (0'00'')", - HeightDisplayType.Corgi => "Corgis (0.0 Corgis)", - HeightDisplayType.OlympicPool => "Olympic-size swimming Pools (0.000 Pools)", - _ => string.Empty, + HeightDisplayType.None => "Do Not Display"u8, + HeightDisplayType.Centimetre => "Centimetres (000.0 cm)"u8, + HeightDisplayType.Metre => "Metres (0.00 m)"u8, + HeightDisplayType.Wrong => "Inches (00.0 in)"u8, + HeightDisplayType.WrongFoot => "Feet (0'00'')"u8, + HeightDisplayType.Corgi => "Corgis (0.0 Corgis)"u8, + HeightDisplayType.OlympicPool => "Olympic-size swimming Pools (0.000 Pools)"u8, + _ => ""u8, }; } diff --git a/Glamourer/State/StateEditor.cs b/Glamourer/State/StateEditor.cs index 42058d2..fec5b13 100644 --- a/Glamourer/State/StateEditor.cs +++ b/Glamourer/State/StateEditor.cs @@ -407,7 +407,8 @@ public class StateEditor( } else if (!value.Revert) { - Editor.ChangeMaterialValue(state, idx, new MaterialValueState(ColorRow.Empty, value.Value, CharacterWeapon.Empty, source), + Editor.ChangeMaterialValue(state, idx, + new MaterialValueState(ColorRow.Empty, value.Value, CharacterWeapon.Empty, source), settings.Source, out _, settings.Key); } } diff --git a/OtterGui b/OtterGui index 0b6085c..332852f 160000 --- a/OtterGui +++ b/OtterGui @@ -1 +1 @@ -Subproject commit 0b6085ce720ffb7c78cf42d4e51861f34db27744 +Subproject commit 332852ffa81387b59f260781d7e5c967f24d8be2