diff --git a/Glamourer.sln b/Glamourer.sln index 7509c7a..9c31800 100644 --- a/Glamourer.sln +++ b/Glamourer.sln @@ -3,8 +3,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.2.32210.308 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GlamourerOld", "GlamourerOld\GlamourerOld.csproj", "{A5439F6B-83C1-4078-9371-354A147FF554}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{383AEE76-D423-431C-893A-7AB3DEA13630}" ProjectSection(SolutionItems) = preProject .editorconfig = .editorconfig @@ -25,10 +23,6 @@ Global Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {A5439F6B-83C1-4078-9371-354A147FF554}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A5439F6B-83C1-4078-9371-354A147FF554}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A5439F6B-83C1-4078-9371-354A147FF554}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A5439F6B-83C1-4078-9371-354A147FF554}.Release|Any CPU.Build.0 = Release|Any CPU {51F4DDB0-1FA0-4629-9CFE-C55B6062907B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {51F4DDB0-1FA0-4629-9CFE-C55B6062907B}.Debug|Any CPU.Build.0 = Debug|Any CPU {51F4DDB0-1FA0-4629-9CFE-C55B6062907B}.Release|Any CPU.ActiveCfg = Release|Any CPU diff --git a/Glamourer/Configuration.cs b/Glamourer/Configuration.cs index ec5f323..6bd3490 100644 --- a/Glamourer/Configuration.cs +++ b/Glamourer/Configuration.cs @@ -22,6 +22,7 @@ public class Configuration : IPluginConfiguration, ISavable public bool OpenFoldersByDefault { get; set; } = false; public bool AutoRedrawEquipOnChanges { get; set; } = false; public bool EnableAutoDesigns { get; set; } = true; + public bool IncognitoMode { get; set; } = false; public MainWindow.TabType SelectedTab { get; set; } = MainWindow.TabType.Settings; public DoubleModifier DeleteDesignModifier { get; set; } = new(ModifierHotkey.Control, ModifierHotkey.Shift); diff --git a/Glamourer/Designs/Design.cs b/Glamourer/Designs/Design.cs index 274b9ce..86f8ae2 100644 --- a/Glamourer/Designs/Design.cs +++ b/Glamourer/Designs/Design.cs @@ -35,6 +35,9 @@ public class Design : ISavable internal DesignData DesignData; + public string Incognito + => Identifier.ToString()[..8]; + /// Unconditionally apply a design to a designdata. /// Whether a redraw is required for the changes to take effect. public (bool, CustomizeFlag, EquipFlag) ApplyDesign(ref DesignData data) diff --git a/Glamourer/Gui/Tabs/ActorTab/ActorPanel.cs b/Glamourer/Gui/Tabs/ActorTab/ActorPanel.cs index e77b042..e83ecf9 100644 --- a/Glamourer/Gui/Tabs/ActorTab/ActorPanel.cs +++ b/Glamourer/Gui/Tabs/ActorTab/ActorPanel.cs @@ -1,4 +1,5 @@ using System.Numerics; +using Dalamud.Interface; using Glamourer.Events; using Glamourer.Gui.Customization; using Glamourer.Gui.Equipment; @@ -36,42 +37,52 @@ public class ActorPanel public void Draw() { - if (!_selector.HasSelection) - return; - - (_identifier, _data) = _selector.Selection; - if (_data.Valid) - { - _actorName = _data.Label; - _actor = _data.Objects[0]; - } - else - { - _actorName = _identifier.ToString(); - _actor = Actor.Null; - } - - if (!_stateManager.GetOrCreate(_identifier, _actor, out _state)) - return; - using var group = ImRaii.Group(); + (_identifier, _data) = _selector.Selection; + (_actorName, _actor) = GetHeaderName(); DrawHeader(); DrawPanel(); } private void DrawHeader() { - var color = _data.Valid ? ColorId.ActorAvailable.Value() : ColorId.ActorUnavailable.Value(); + var frameHeight = ImGui.GetFrameHeightWithSpacing(); + var color = !_identifier.IsValid ? ImGui.GetColorU32(ImGuiCol.Text) : _data.Valid ? ColorId.ActorAvailable.Value() : ColorId.ActorUnavailable.Value(); var buttonColor = ImGui.GetColorU32(ImGuiCol.FrameBg); using var style = ImRaii.PushStyle(ImGuiStyleVar.ItemSpacing, Vector2.Zero) .Push(ImGuiStyleVar.FrameRounding, 0); - ImGuiUtil.DrawTextButton($"{(_data.Valid ? _data.Label : _identifier.ToString())}##playerHeader", -Vector2.UnitX, buttonColor, color); + ImGuiUtil.DrawTextButton($"{_actorName}##playerHeader", new Vector2(-frameHeight, ImGui.GetFrameHeight()), buttonColor, color); + ImGui.SameLine(); + style.Push(ImGuiStyleVar.FrameBorderSize, ImGuiHelpers.GlobalScale); + using (var c = ImRaii.PushColor(ImGuiCol.Text, ColorId.FolderExpanded.Value()) + .Push(ImGuiCol.Border, ColorId.FolderExpanded.Value())) + { + if (ImGuiUtil.DrawDisabledButton( + $"{(_selector.IncognitoMode ? FontAwesomeIcon.Eye : FontAwesomeIcon.EyeSlash).ToIconString()}###IncognitoMode", + new Vector2(frameHeight, ImGui.GetFrameHeight()), string.Empty, false, true)) + _selector.IncognitoMode = !_selector.IncognitoMode; + } + + var hovered = ImGui.IsItemHovered(); + if (hovered) + ImGui.SetTooltip(_selector.IncognitoMode ? "Toggle incognito mode off." : "Toggle incognito mode on."); + } + + private (string, Actor) GetHeaderName() + { + if (!_identifier.IsValid) + return ("No Selection", Actor.Null); + + if (_data.Valid) + return (_selector.IncognitoMode ? _identifier.Incognito(_data.Label) : _data.Label, _data.Objects[0]); + + return (_selector.IncognitoMode ? _identifier.Incognito(null) : _identifier.ToString(), Actor.Null); } private unsafe void DrawPanel() { - using var child = ImRaii.Child("##ActorPanel", -Vector2.One, true); - if (!child || _state == null) + using var child = ImRaii.Child("##Panel", -Vector2.One, true); + if (!child || !_selector.HasSelection || !_stateManager.GetOrCreate(_identifier, _actor, out _state)) return; if (_customizationDrawer.Draw(_state.ModelData.Customize, false)) diff --git a/Glamourer/Gui/Tabs/ActorTab/ActorSelector.cs b/Glamourer/Gui/Tabs/ActorTab/ActorSelector.cs index 4576808..67059ba 100644 --- a/Glamourer/Gui/Tabs/ActorTab/ActorSelector.cs +++ b/Glamourer/Gui/Tabs/ActorTab/ActorSelector.cs @@ -16,17 +16,29 @@ namespace Glamourer.Gui.Tabs.ActorTab; public class ActorSelector { + private readonly Configuration _config; private readonly ObjectManager _objects; private readonly ActorService _actors; private readonly TargetManager _targets; private ActorIdentifier _identifier = ActorIdentifier.Invalid; - public ActorSelector(ObjectManager objects, TargetManager targets, ActorService actors) + public ActorSelector(ObjectManager objects, TargetManager targets, ActorService actors, Configuration config) { _objects = objects; _targets = targets; _actors = actors; + _config = config; + } + + public bool IncognitoMode + { + get => _config.IncognitoMode; + set + { + _config.IncognitoMode = value; + _config.Save(); + } } private LowerString _actorFilter = LowerString.Empty; @@ -55,7 +67,7 @@ public class ActorSelector private void DrawSelector() { - using var child = ImRaii.Child("##actorSelector", new Vector2(_width, -ImGui.GetFrameHeight()), true); + using var child = ImRaii.Child("##Selector", new Vector2(_width, -ImGui.GetFrameHeight()), true); if (!child) return; @@ -72,7 +84,7 @@ public class ActorSelector private void DrawSelectable(KeyValuePair pair) { var equals = pair.Key.Equals(_identifier); - if (ImGui.Selectable(pair.Value.Label, equals) && !equals) + if (ImGui.Selectable(IncognitoMode ? pair.Key.Incognito(pair.Value.Label) : pair.Value.Label, equals) && !equals) _identifier = pair.Key.CreatePermanent(); } diff --git a/Glamourer/Gui/Tabs/AutomationTab/SetPanel.cs b/Glamourer/Gui/Tabs/AutomationTab/SetPanel.cs index ae106c3..62041e2 100644 --- a/Glamourer/Gui/Tabs/AutomationTab/SetPanel.cs +++ b/Glamourer/Gui/Tabs/AutomationTab/SetPanel.cs @@ -40,9 +40,6 @@ public class SetPanel public void Draw() { - if (!_selector.HasSelection) - return; - using var group = ImRaii.Group(); DrawHeader(); DrawPanel(); @@ -51,15 +48,28 @@ public class SetPanel private void DrawHeader() { var buttonColor = ImGui.GetColorU32(ImGuiCol.FrameBg); + var frameHeight = ImGui.GetFrameHeightWithSpacing(); using var style = ImRaii.PushStyle(ImGuiStyleVar.ItemSpacing, Vector2.Zero) .Push(ImGuiStyleVar.FrameRounding, 0); - ImGuiUtil.DrawTextButton(Selection.Name, -Vector2.UnitX, buttonColor); + ImGuiUtil.DrawTextButton(_selector.SelectionName, new Vector2(-frameHeight, ImGui.GetFrameHeight()), buttonColor); + ImGui.SameLine(); + style.Push(ImGuiStyleVar.FrameBorderSize, ImGuiHelpers.GlobalScale); + using var color = ImRaii.PushColor(ImGuiCol.Text, ColorId.FolderExpanded.Value()) + .Push(ImGuiCol.Border, ColorId.FolderExpanded.Value()); + if (ImGuiUtil.DrawDisabledButton( + $"{(_selector.IncognitoMode ? FontAwesomeIcon.Eye : FontAwesomeIcon.EyeSlash).ToIconString()}###IncognitoMode", + new Vector2(frameHeight, ImGui.GetFrameHeight()), string.Empty, false, true)) + _selector.IncognitoMode = !_selector.IncognitoMode; + var hovered = ImGui.IsItemHovered(); + color.Pop(2); + if (hovered) + ImGui.SetTooltip(_selector.IncognitoMode ? "Toggle incognito mode off." : "Toggle incognito mode on."); } private void DrawPanel() { - using var child = ImRaii.Child("##SetPanel", -Vector2.One, true); - if (!child) + using var child = ImRaii.Child("##Panel", -Vector2.One, true); + if (!child || !_selector.HasSelection) return; var name = _tempName ?? Selection.Name; @@ -104,7 +114,7 @@ public class SetPanel ImGui.Selectable($"#{idx + 1:D2}"); DrawDragDrop(Selection, idx); ImGui.TableNextColumn(); - _designCombo.Draw(Selection, design, idx); + _designCombo.Draw(Selection, design, idx, _selector.IncognitoMode); DrawDragDrop(Selection, idx); ImGui.TableNextColumn(); DrawApplicationTypeBoxes(Selection, design, idx); @@ -117,7 +127,7 @@ public class SetPanel ImGui.AlignTextToFramePadding(); ImGui.TextUnformatted("New"); ImGui.TableNextColumn(); - _designCombo.Draw(Selection, null, -1); + _designCombo.Draw(Selection, null, -1, _selector.IncognitoMode); ImGui.TableNextColumn(); ImGui.TableNextColumn(); @@ -219,11 +229,12 @@ public class SetPanel _manager = manager; } - public void Draw(AutoDesignSet set, AutoDesign? design, int autoDesignIndex) + public void Draw(AutoDesignSet set, AutoDesign? design, int autoDesignIndex, bool incognito) { CurrentSelection = design?.Design ?? (Items.Count > 0 ? Items[0] : null); CurrentSelectionIdx = design?.Design.Index ?? (Items.Count > 0 ? 0 : -1); - if (Draw("##design", CurrentSelection?.Name.Text ?? string.Empty, string.Empty, 220 * ImGuiHelpers.GlobalScale, + var name = (incognito ? CurrentSelection?.Incognito : CurrentSelection?.Name.Text) ?? string.Empty; + if (Draw("##design", name, string.Empty, 220 * ImGuiHelpers.GlobalScale, ImGui.GetTextLineHeight()) && CurrentSelection != null) { diff --git a/Glamourer/Gui/Tabs/AutomationTab/SetSelector.cs b/Glamourer/Gui/Tabs/AutomationTab/SetSelector.cs index bf0d52a..3d04de0 100644 --- a/Glamourer/Gui/Tabs/AutomationTab/SetSelector.cs +++ b/Glamourer/Gui/Tabs/AutomationTab/SetSelector.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; -using System.Linq; -using System.Text.RegularExpressions; +using System.Numerics; using Dalamud.Interface; using Glamourer.Automation; using Glamourer.Events; @@ -12,7 +11,6 @@ using OtterGui; using OtterGui.Classes; using OtterGui.Raii; using Penumbra.String; -using Vector2 = FFXIVClientStructs.FFXIV.Common.Math.Vector2; namespace Glamourer.Gui.Tabs.AutomationTab; @@ -28,7 +26,16 @@ public class SetSelector : IDisposable public AutoDesignSet? Selection { get; private set; } public int SelectionIndex { get; private set; } = -1; - private bool IncognitoMode; + public bool IncognitoMode + { + get => _config.IncognitoMode; + set + { + _config.IncognitoMode = value; + _config.Save(); + } + } + private int _dragIndex = -1; private Action? _endAction; @@ -47,6 +54,12 @@ public class SetSelector : IDisposable _event.Unsubscribe(OnAutomationChanged); } + public string SelectionName + => GetSetName(Selection, SelectionIndex); + + public string GetSetName(AutoDesignSet? set, int index) + => set == null ? "No Selection" : IncognitoMode ? $"Auto Design Set #{index + 1}" : set.Name; + private void OnAutomationChanged(AutomationChanged.Type type, AutoDesignSet? set, object? data) { switch (type) @@ -151,7 +164,7 @@ public class SetSelector : IDisposable private void DrawSelector() { - using var child = ImRaii.Child("##actorSelector", new Vector2(_width, -ImGui.GetFrameHeight()), true); + using var child = ImRaii.Child("##Selector", new Vector2(_width, -ImGui.GetFrameHeight()), true); if (!child) return; @@ -169,13 +182,17 @@ public class SetSelector : IDisposable using var id = ImRaii.PushId(index); using (var color = ImRaii.PushColor(ImGuiCol.Text, set.Enabled ? ColorId.EnabledAutoSet.Value() : ColorId.DisabledAutoSet.Value())) { - if (ImGui.Selectable(set.Name, set == Selection, ImGuiSelectableFlags.None, _selectableSize)) + if (ImGui.Selectable(GetSetName(set, index), set == Selection, ImGuiSelectableFlags.None, _selectableSize)) { Selection = set; SelectionIndex = index; } } + var lineEnd = ImGui.GetItemRectMax(); + var lineStart = new Vector2(ImGui.GetItemRectMin().X, lineEnd.Y); + ImGui.GetWindowDrawList().AddLine(lineStart, lineEnd, ImGui.GetColorU32(ImGuiCol.Border), ImGuiHelpers.GlobalScale); + DrawDragDrop(set, index); var text = set.Identifier.ToString(); @@ -252,7 +269,7 @@ public class SetSelector : IDisposable if (source.Success && ImGui.SetDragDropPayload(dragDropLabel, nint.Zero, 0)) { _dragIndex = index; - ImGui.TextUnformatted($"Moving design set {set.Name} from position {index + 1}..."); + ImGui.TextUnformatted($"Moving design set {GetSetName(set, index)} from position {index + 1}..."); } } } diff --git a/Glamourer/Gui/Tabs/DesignTab/DesignFileSystemSelector.cs b/Glamourer/Gui/Tabs/DesignTab/DesignFileSystemSelector.cs index 3e4a627..fd86675 100644 --- a/Glamourer/Gui/Tabs/DesignTab/DesignFileSystemSelector.cs +++ b/Glamourer/Gui/Tabs/DesignTab/DesignFileSystemSelector.cs @@ -3,9 +3,11 @@ using Dalamud.Game.ClientState.Keys; using Dalamud.Interface; using Glamourer.Designs; using Glamourer.Events; +using ImGuiNET; using OtterGui; using OtterGui.Filesystem; using OtterGui.FileSystem.Selector; +using OtterGui.Raii; namespace Glamourer.Gui.Tabs.DesignTab; @@ -15,6 +17,16 @@ public sealed class DesignFileSystemSelector : FileSystemSelector _config.IncognitoMode; + set + { + _config.IncognitoMode = value; + _config.Save(); + } + } + public struct DesignState { } @@ -29,6 +41,13 @@ public sealed class DesignFileSystemSelector : FileSystemSelector.Leaf leaf, in DesignState state, bool selected) + { + var flag = selected ? ImGuiTreeNodeFlags.Selected | LeafFlags : LeafFlags; + var name = IncognitoMode ? leaf.Value.Incognito : leaf.Name; + using var _ = ImRaii.TreeNode(name, flag); + } + public override void Dispose() { base.Dispose(); diff --git a/Glamourer/Gui/Tabs/DesignTab/DesignPanel.cs b/Glamourer/Gui/Tabs/DesignTab/DesignPanel.cs index f4be9ab..f06ee56 100644 --- a/Glamourer/Gui/Tabs/DesignTab/DesignPanel.cs +++ b/Glamourer/Gui/Tabs/DesignTab/DesignPanel.cs @@ -1,10 +1,12 @@ using System.Numerics; +using Dalamud.Interface; using Glamourer.Designs; using Glamourer.Gui.Customization; using Glamourer.Gui.Equipment; using Glamourer.Interop; using Glamourer.State; using ImGuiNET; +using OtterGui; using OtterGui.Raii; using Penumbra.GameData.Enums; @@ -30,14 +32,38 @@ public class DesignPanel _equipmentDrawer = equipmentDrawer; } + private void DrawHeader() + { + var buttonColor = ImGui.GetColorU32(ImGuiCol.FrameBg); + var frameHeight = ImGui.GetFrameHeightWithSpacing(); + using var style = ImRaii.PushStyle(ImGuiStyleVar.ItemSpacing, Vector2.Zero) + .Push(ImGuiStyleVar.FrameRounding, 0); + ImGuiUtil.DrawTextButton(SelectionName, new Vector2(-frameHeight, ImGui.GetFrameHeight()), buttonColor); + ImGui.SameLine(); + style.Push(ImGuiStyleVar.FrameBorderSize, ImGuiHelpers.GlobalScale); + using var color = ImRaii.PushColor(ImGuiCol.Text, ColorId.FolderExpanded.Value()) + .Push(ImGuiCol.Border, ColorId.FolderExpanded.Value()); + if (ImGuiUtil.DrawDisabledButton( + $"{(_selector.IncognitoMode ? FontAwesomeIcon.Eye : FontAwesomeIcon.EyeSlash).ToIconString()}###IncognitoMode", + new Vector2(frameHeight, ImGui.GetFrameHeight()), string.Empty, false, true)) + _selector.IncognitoMode = !_selector.IncognitoMode; + var hovered = ImGui.IsItemHovered(); + color.Pop(2); + if (hovered) + ImGui.SetTooltip(_selector.IncognitoMode ? "Toggle incognito mode off." : "Toggle incognito mode on."); + } + + private string SelectionName + => _selector.Selected == null ? "No Selection" : _selector.IncognitoMode ? _selector.Selected.Incognito : _selector.Selected.Name.Text; + public void Draw() { - var design = _selector.Selected; - if (design == null) - return; - - using var child = ImRaii.Child("##panel", -Vector2.One, true); - if (!child) + using var group = ImRaii.Group(); + DrawHeader(); + + var design = _selector.Selected; + using var child = ImRaii.Child("##Panel", -Vector2.One, true); + if (!child || design == null) return; if (ImGui.Button("TEST"))