From cd0196ddb4b42c58cf6340425a7592ec5a54f3eb Mon Sep 17 00:00:00 2001 From: Ottermandias Date: Sun, 26 Nov 2023 00:29:15 +0100 Subject: [PATCH] UI for crests. --- Glamourer.GameData/Structs/CrestFlag.cs | 18 ++++ Glamourer/Gui/Tabs/ActorTab/ActorPanel.cs | 30 +++++-- Glamourer/Gui/Tabs/DesignTab/DesignPanel.cs | 94 ++++++++++++++------- Glamourer/Gui/ToggleDrawData.cs | 25 ++++++ 4 files changed, 132 insertions(+), 35 deletions(-) diff --git a/Glamourer.GameData/Structs/CrestFlag.cs b/Glamourer.GameData/Structs/CrestFlag.cs index d39fd0a..3ef9f1e 100644 --- a/Glamourer.GameData/Structs/CrestFlag.cs +++ b/Glamourer.GameData/Structs/CrestFlag.cs @@ -77,4 +77,22 @@ public static class CrestExtensions CrestFlag.LFinger => EquipSlot.LFinger, _ => 0, }; + + public static string ToLabel(this CrestFlag flag) + => flag switch + { + CrestFlag.Head => "Head", + CrestFlag.Body => "Chest", + CrestFlag.Hands => "Gauntlets", + CrestFlag.Legs => "Pants", + CrestFlag.Feet => "Boot", + CrestFlag.Ears => "Earrings", + CrestFlag.Neck => "Necklace", + CrestFlag.Wrists => "Bracelet", + CrestFlag.RFinger => "Right Ring", + CrestFlag.LFinger => "Left Ring", + CrestFlag.MainHand => "Weapon", + CrestFlag.OffHand => "Shield", + _ => string.Empty, + }; } diff --git a/Glamourer/Gui/Tabs/ActorTab/ActorPanel.cs b/Glamourer/Gui/Tabs/ActorTab/ActorPanel.cs index 5f54965..e4006ad 100644 --- a/Glamourer/Gui/Tabs/ActorTab/ActorPanel.cs +++ b/Glamourer/Gui/Tabs/ActorTab/ActorPanel.cs @@ -5,6 +5,7 @@ using Dalamud.Interface; using Dalamud.Interface.Internal.Notifications; using Dalamud.Plugin.Services; using FFXIVClientStructs.FFXIV.Client.Game; +using FFXIVClientStructs.FFXIV.Client.Graphics.Render; using Glamourer.Automation; using Glamourer.Customization; using Glamourer.Designs; @@ -157,14 +158,33 @@ public class ActorPanel(ActorSelector _selector, StateManager _stateManager, Cus _equipmentDrawer.DrawWeapons(mainhand, offhand, GameMain.IsInGPose()); ImGui.Dummy(new Vector2(ImGui.GetTextLineHeight() / 2)); - EquipmentDrawer.DrawMetaToggle(ToggleDrawData.FromState(ActorState.MetaIndex.HatState, _stateManager, _state)); - ImGui.SameLine(); - EquipmentDrawer.DrawMetaToggle(ToggleDrawData.FromState(ActorState.MetaIndex.VisorState, _stateManager, _state)); - ImGui.SameLine(); - EquipmentDrawer.DrawMetaToggle(ToggleDrawData.FromState(ActorState.MetaIndex.WeaponState, _stateManager, _state)); + DrawEquipmentMetaToggles(); ImGui.Dummy(new Vector2(ImGui.GetTextLineHeight() / 2)); } + private void DrawEquipmentMetaToggles() + { + using (var _ = ImRaii.Group()) + { + EquipmentDrawer.DrawMetaToggle(ToggleDrawData.FromState(ActorState.MetaIndex.HatState, _stateManager, _state!)); + EquipmentDrawer.DrawMetaToggle(ToggleDrawData.CrestFromState(EquipSlot.Head, _stateManager, _state!)); + } + + ImGui.SameLine(); + using (var _ = ImRaii.Group()) + { + EquipmentDrawer.DrawMetaToggle(ToggleDrawData.FromState(ActorState.MetaIndex.VisorState, _stateManager, _state!)); + EquipmentDrawer.DrawMetaToggle(ToggleDrawData.CrestFromState(EquipSlot.Body, _stateManager, _state!)); + } + + ImGui.SameLine(); + using (var _ = ImRaii.Group()) + { + EquipmentDrawer.DrawMetaToggle(ToggleDrawData.FromState(ActorState.MetaIndex.WeaponState, _stateManager, _state!)); + EquipmentDrawer.DrawMetaToggle(ToggleDrawData.CrestFromState(EquipSlot.OffHand, _stateManager, _state!)); + } + } + private void DrawMonsterPanel() { var names = _identification.AwaitedService.ModelCharaNames(_state!.ModelData.ModelId); diff --git a/Glamourer/Gui/Tabs/DesignTab/DesignPanel.cs b/Glamourer/Gui/Tabs/DesignTab/DesignPanel.cs index c4cf023..129b5c7 100644 --- a/Glamourer/Gui/Tabs/DesignTab/DesignPanel.cs +++ b/Glamourer/Gui/Tabs/DesignTab/DesignPanel.cs @@ -110,11 +110,25 @@ public class DesignPanel(DesignFileSystemSelector _selector, CustomizationDrawer private void DrawEquipmentMetaToggles() { - EquipmentDrawer.DrawMetaToggle(ToggleDrawData.FromDesign(ActorState.MetaIndex.HatState, _manager, _selector.Selected!)); + using (var _ = ImRaii.Group()) + { + EquipmentDrawer.DrawMetaToggle(ToggleDrawData.FromDesign(ActorState.MetaIndex.HatState, _manager, _selector.Selected!)); + EquipmentDrawer.DrawMetaToggle(ToggleDrawData.CrestFromDesign(EquipSlot.Head, _manager, _selector.Selected!)); + } + ImGui.SameLine(); - EquipmentDrawer.DrawMetaToggle(ToggleDrawData.FromDesign(ActorState.MetaIndex.VisorState, _manager, _selector.Selected!)); + using (var _ = ImRaii.Group()) + { + EquipmentDrawer.DrawMetaToggle(ToggleDrawData.FromDesign(ActorState.MetaIndex.VisorState, _manager, _selector.Selected!)); + EquipmentDrawer.DrawMetaToggle(ToggleDrawData.CrestFromDesign(EquipSlot.Body, _manager, _selector.Selected!)); + } + ImGui.SameLine(); - EquipmentDrawer.DrawMetaToggle(ToggleDrawData.FromDesign(ActorState.MetaIndex.WeaponState, _manager, _selector.Selected!)); + using (var _ = ImRaii.Group()) + { + EquipmentDrawer.DrawMetaToggle(ToggleDrawData.FromDesign(ActorState.MetaIndex.WeaponState, _manager, _selector.Selected!)); + EquipmentDrawer.DrawMetaToggle(ToggleDrawData.CrestFromDesign(EquipSlot.OffHand, _manager, _selector.Selected!)); + } } private void DrawCustomize() @@ -140,6 +154,50 @@ public class DesignPanel(DesignFileSystemSelector _selector, CustomizationDrawer ImGui.Dummy(new Vector2(ImGui.GetTextLineHeight() / 2)); } + private void DrawCustomizeApplication() + { + var set = _selector.Selected!.CustomizationSet; + var available = set.SettingAvailable | CustomizeFlag.Clan | CustomizeFlag.Gender; + var flags = _selector.Selected!.ApplyCustomize == 0 ? 0 : (_selector.Selected!.ApplyCustomize & available) == available ? 3 : 1; + if (ImGui.CheckboxFlags("Apply All Customizations", ref flags, 3)) + { + var newFlags = flags == 3; + _manager.ChangeApplyCustomize(_selector.Selected!, CustomizeIndex.Clan, newFlags); + _manager.ChangeApplyCustomize(_selector.Selected!, CustomizeIndex.Gender, newFlags); + foreach (var index in CustomizationExtensions.AllBasic) + _manager.ChangeApplyCustomize(_selector.Selected!, index, newFlags); + } + + var applyClan = _selector.Selected!.DoApplyCustomize(CustomizeIndex.Clan); + if (ImGui.Checkbox($"Apply {CustomizeIndex.Clan.ToDefaultName()}", ref applyClan)) + _manager.ChangeApplyCustomize(_selector.Selected!, CustomizeIndex.Clan, applyClan); + + var applyGender = _selector.Selected!.DoApplyCustomize(CustomizeIndex.Gender); + if (ImGui.Checkbox($"Apply {CustomizeIndex.Gender.ToDefaultName()}", ref applyGender)) + _manager.ChangeApplyCustomize(_selector.Selected!, CustomizeIndex.Gender, applyGender); + + + foreach (var index in CustomizationExtensions.All.Where(set.IsAvailable)) + { + var apply = _selector.Selected!.DoApplyCustomize(index); + if (ImGui.Checkbox($"Apply {set.Option(index)}", ref apply)) + _manager.ChangeApplyCustomize(_selector.Selected!, index, apply); + } + } + + private void DrawCrestApplication() + { + var flags = (uint)_selector.Selected!.ApplyCrest; + var bigChange = ImGui.CheckboxFlags("Apply All Crests", ref flags, (uint)CrestExtensions.AllRelevant); + foreach (var flag in CrestExtensions.AllRelevantSet) + { + var slot = flag.ToSlot(); + var apply = bigChange ? ((CrestFlag)flags & flag) == flag : _selector.Selected!.DoApplyCrest(slot); + if (ImGui.Checkbox($"Apply {flag.ToLabel()} Crest", ref apply) || bigChange) + _manager.ChangeApplyCrest(_selector.Selected!, slot, apply); + } + } + private void DrawApplicationRules() { if (!ImGui.CollapsingHeader("Application Rules")) @@ -147,33 +205,9 @@ public class DesignPanel(DesignFileSystemSelector _selector, CustomizationDrawer using (var _ = ImRaii.Group()) { - var set = _selector.Selected!.CustomizationSet; - var available = set.SettingAvailable | CustomizeFlag.Clan | CustomizeFlag.Gender; - var flags = _selector.Selected!.ApplyCustomize == 0 ? 0 : (_selector.Selected!.ApplyCustomize & available) == available ? 3 : 1; - if (ImGui.CheckboxFlags("Apply All Customizations", ref flags, 3)) - { - var newFlags = flags == 3; - _manager.ChangeApplyCustomize(_selector.Selected!, CustomizeIndex.Clan, newFlags); - _manager.ChangeApplyCustomize(_selector.Selected!, CustomizeIndex.Gender, newFlags); - foreach (var index in CustomizationExtensions.AllBasic) - _manager.ChangeApplyCustomize(_selector.Selected!, index, newFlags); - } - - var applyClan = _selector.Selected!.DoApplyCustomize(CustomizeIndex.Clan); - if (ImGui.Checkbox($"Apply {CustomizeIndex.Clan.ToDefaultName()}", ref applyClan)) - _manager.ChangeApplyCustomize(_selector.Selected!, CustomizeIndex.Clan, applyClan); - - var applyGender = _selector.Selected!.DoApplyCustomize(CustomizeIndex.Gender); - if (ImGui.Checkbox($"Apply {CustomizeIndex.Gender.ToDefaultName()}", ref applyGender)) - _manager.ChangeApplyCustomize(_selector.Selected!, CustomizeIndex.Gender, applyGender); - - - foreach (var index in CustomizationExtensions.All.Where(set.IsAvailable)) - { - var apply = _selector.Selected!.DoApplyCustomize(index); - if (ImGui.Checkbox($"Apply {set.Option(index)}", ref apply)) - _manager.ChangeApplyCustomize(_selector.Selected!, index, apply); - } + DrawCustomizeApplication(); + ImGui.NewLine(); + DrawCrestApplication(); } ImGui.SameLine(ImGui.GetContentRegionAvail().X / 2); diff --git a/Glamourer/Gui/ToggleDrawData.cs b/Glamourer/Gui/ToggleDrawData.cs index f78cf6f..edb06ae 100644 --- a/Glamourer/Gui/ToggleDrawData.cs +++ b/Glamourer/Gui/ToggleDrawData.cs @@ -2,6 +2,8 @@ using Glamourer.Designs; using Glamourer.Events; using Glamourer.State; +using Glamourer.Structs; +using Penumbra.GameData.Enums; namespace Glamourer.Gui; @@ -50,6 +52,29 @@ public ref struct ToggleDrawData }; } + public static ToggleDrawData CrestFromDesign(EquipSlot slot, DesignManager manager, Design design) + => new() + { + Label = $"{slot.ToCrestFlag().ToLabel()} Crest", + Tooltip = string.Empty, + Locked = design.WriteProtected(), + DisplayApplication = true, + CurrentValue = design.DesignData.Crest(slot), + CurrentApply = design.DoApplyCrest(slot), + SetValue = v => manager.ChangeCrest(design, slot, v), + SetApply = v => manager.ChangeApplyCrest(design, slot, v), + }; + + public static ToggleDrawData CrestFromState(EquipSlot slot, StateManager manager, ActorState state) + => new() + { + Label = $"{slot.ToCrestFlag().ToLabel()} Crest", + Tooltip = "Hide or show your free company crest on this piece of gear.", + Locked = state.IsLocked, + CurrentValue = state.ModelData.Crest(slot), // TODO + SetValue = v => { }, //manager.ChangeCrest(state, slot, v, StateChanged.Source.Manual), + }; + public static ToggleDrawData FromState(ActorState.MetaIndex index, StateManager manager, ActorState state) { var (label, tooltip, value, setValue) = index switch