More updates.

This commit is contained in:
Ottermandias 2026-01-24 23:57:53 +01:00
parent 01f05e5330
commit d58d1e2e8a
58 changed files with 597 additions and 497 deletions

View file

@ -1,96 +1,103 @@
using Glamourer.Designs; using Luna.Generators;
using Dalamud.Bindings.ImGui; using ImSharp;
using OtterGui.Text; using Luna;
using OtterGui.Text.EndObjects;
namespace Glamourer; namespace Glamourer;
[Flags] [Flags]
[NamedEnum(Utf16: false)]
public enum DesignPanelFlag : uint public enum DesignPanelFlag : uint
{ {
[Name("Customization")]
Customization = 0x0001, Customization = 0x0001,
[Name("Equipment")]
Equipment = 0x0002, Equipment = 0x0002,
[Name("Advanced Customization")]
AdvancedCustomizations = 0x0004, AdvancedCustomizations = 0x0004,
[Name("Advanced Dyes")]
AdvancedDyes = 0x0008, AdvancedDyes = 0x0008,
[Name("Appearance Details")]
AppearanceDetails = 0x0010, AppearanceDetails = 0x0010,
[Name("Design Details")]
DesignDetails = 0x0020, DesignDetails = 0x0020,
[Name("Mod Associations")]
ModAssociations = 0x0040, ModAssociations = 0x0040,
[Name("Design Links")]
DesignLinks = 0x0080, DesignLinks = 0x0080,
[Name("Application Rules")]
ApplicationRules = 0x0100, ApplicationRules = 0x0100,
[Name("Debug Data")]
DebugData = 0x0200, DebugData = 0x0200,
} }
public static class DesignPanelFlagExtensions public static partial class DesignPanelFlagExtensions
{ {
public static ReadOnlySpan<byte> ToName(this DesignPanelFlag flag) private static readonly SizedString Expand = new("Expand"u8);
=> flag switch private static readonly SizedString AdvancedCustomization = new(DesignPanelFlag.AdvancedCustomizations.ToNameU8());
{
DesignPanelFlag.Customization => "Customization"u8,
DesignPanelFlag.Equipment => "Equipment"u8,
DesignPanelFlag.AdvancedCustomizations => "Advanced Customization"u8,
DesignPanelFlag.AdvancedDyes => "Advanced Dyes"u8,
DesignPanelFlag.DesignDetails => "Design Details"u8,
DesignPanelFlag.ApplicationRules => "Application Rules"u8,
DesignPanelFlag.ModAssociations => "Mod Associations"u8,
DesignPanelFlag.DesignLinks => "Design Links"u8,
DesignPanelFlag.DebugData => "Debug Data"u8,
DesignPanelFlag.AppearanceDetails => "Appearance Details"u8,
_ => ""u8,
};
public static CollapsingHeader Header(this DesignPanelFlag flag, Configuration config) public static Im.HeaderDisposable Header(this DesignPanelFlag flag, Configuration config)
{ {
if (config.HideDesignPanel.HasFlag(flag)) if (config.HideDesignPanel.HasFlag(flag))
return new CollapsingHeader() return default;
{
Disposed = true,
};
var expand = config.AutoExpandDesignPanel.HasFlag(flag); var expand = config.AutoExpandDesignPanel.HasFlag(flag);
return ImUtf8.CollapsingHeaderId(flag.ToName(), expand ? ImGuiTreeNodeFlags.DefaultOpen : ImGuiTreeNodeFlags.None); return Im.Tree.HeaderId(flag.ToNameU8(), expand ? TreeNodeFlags.DefaultOpen : TreeNodeFlags.None);
} }
public static void DrawTable(ReadOnlySpan<byte> label, DesignPanelFlag hidden, DesignPanelFlag expanded, Action<DesignPanelFlag> setterHide, public static void DrawTable(ReadOnlySpan<byte> label, DesignPanelFlag hidden, DesignPanelFlag expanded, Action<DesignPanelFlag> setterHide,
Action<DesignPanelFlag> setterExpand) Action<DesignPanelFlag> setterExpand)
{ {
var checkBoxWidth = Math.Max(ImGui.GetFrameHeight(), ImUtf8.CalcTextSize("Expand"u8).X); var checkBoxWidth = Math.Max(Im.Style.FrameHeight, Expand.Size.X);
var textWidth = ImUtf8.CalcTextSize(DesignPanelFlag.AdvancedCustomizations.ToName()).X; var textWidth = AdvancedCustomization.Size.X;
var tableSize = 2 * (textWidth + 2 * checkBoxWidth) + 10 * ImGui.GetStyle().CellPadding.X + 2 * ImGui.GetStyle().WindowPadding.X + 2 * ImGui.GetStyle().FrameBorderSize; var tableSize = 2 * (textWidth + 2 * checkBoxWidth)
using var table = ImUtf8.Table(label, 6, ImGuiTableFlags.RowBg | ImGuiTableFlags.SizingFixedFit | ImGuiTableFlags.Borders, new Vector2(tableSize, 6 * ImGui.GetFrameHeight())); + 10 * Im.Style.CellPadding.X
+ 2 * Im.Style.WindowPadding.X
+ 2 * Im.Style.FrameBorderThickness;
using var table = Im.Table.Begin(label, 6, TableFlags.RowBackground | TableFlags.SizingFixedFit | TableFlags.Borders,
new Vector2(tableSize, 6 * Im.Style.FrameHeight));
if (!table) if (!table)
return; return;
var headerColor = ImGui.GetColorU32(ImGuiCol.TableHeaderBg); var headerColor = Im.Color.Get(ImGuiColor.TableHeaderBackground);
var checkBoxOffset = (checkBoxWidth - ImGui.GetFrameHeight()) / 2; var checkBoxOffset = (checkBoxWidth - Im.Style.FrameHeight) / 2;
ImUtf8.TableSetupColumn("Panel##1"u8, ImGuiTableColumnFlags.WidthFixed, textWidth); table.SetupColumn("Panel##1"u8, TableColumnFlags.WidthFixed, textWidth);
ImUtf8.TableSetupColumn("Show##1"u8, ImGuiTableColumnFlags.WidthFixed, checkBoxWidth); table.SetupColumn("Show##1"u8, TableColumnFlags.WidthFixed, checkBoxWidth);
ImUtf8.TableSetupColumn("Expand##1"u8, ImGuiTableColumnFlags.WidthFixed, checkBoxWidth); table.SetupColumn("Expand##1"u8, TableColumnFlags.WidthFixed, checkBoxWidth);
ImUtf8.TableSetupColumn("Panel##2"u8, ImGuiTableColumnFlags.WidthFixed, textWidth); table.SetupColumn("Panel##2"u8, TableColumnFlags.WidthFixed, textWidth);
ImUtf8.TableSetupColumn("Show##2"u8, ImGuiTableColumnFlags.WidthFixed, checkBoxWidth); table.SetupColumn("Show##2"u8, TableColumnFlags.WidthFixed, checkBoxWidth);
ImUtf8.TableSetupColumn("Expand##2"u8, ImGuiTableColumnFlags.WidthFixed, checkBoxWidth); table.SetupColumn("Expand##2"u8, TableColumnFlags.WidthFixed, checkBoxWidth);
ImGui.TableHeadersRow(); table.HeaderRow();
foreach (var panel in Enum.GetValues<DesignPanelFlag>()) foreach (var panel in DesignPanelFlag.Values)
{ {
using var id = ImUtf8.PushId((int)panel); using var id = Im.Id.Push((int)panel);
ImGui.TableNextColumn(); table.NextColumn();
ImGui.TableSetBgColor(ImGuiTableBgTarget.CellBg, headerColor); table.SetBackgroundColor(TableBackgroundTarget.Cell, headerColor);
ImUtf8.TextFrameAligned(panel.ToName()); ImEx.TextFrameAligned(panel.ToNameU8());
var isShown = !hidden.HasFlag(panel); var isShown = !hidden.HasFlag(panel);
var isExpanded = expanded.HasFlag(panel); var isExpanded = expanded.HasFlag(panel);
ImGui.TableNextColumn(); table.NextColumn();
ImGui.SetCursorPosX(ImGui.GetCursorPosX() + checkBoxOffset); Im.Cursor.X += checkBoxOffset;
if (ImUtf8.Checkbox("##show"u8, ref isShown)) if (Im.Checkbox("##show"u8, ref isShown))
setterHide.Invoke(isShown ? hidden & ~panel : hidden | panel); setterHide.Invoke(isShown ? hidden & ~panel : hidden | panel);
ImUtf8.HoverTooltip( Im.Tooltip.OnHover(
"Show this panel and associated functionality in all relevant tabs.\n\nToggling this off does NOT disable any functionality, just the display of it, so hide panels at your own risk."u8); "Show this panel and associated functionality in all relevant tabs.\n\nToggling this off does NOT disable any functionality, just the display of it, so hide panels at your own risk."u8);
ImGui.TableNextColumn(); table.NextColumn();
ImGui.SetCursorPosX(ImGui.GetCursorPosX() + checkBoxOffset); Im.Cursor.X += checkBoxOffset;
if (ImUtf8.Checkbox("##expand"u8, ref isExpanded)) if (Im.Checkbox("##expand"u8, ref isExpanded))
setterExpand.Invoke(isExpanded ? expanded | panel : expanded & ~panel); setterExpand.Invoke(isExpanded ? expanded | panel : expanded & ~panel);
ImUtf8.HoverTooltip("Expand this panel by default in all relevant tabs."u8); Im.Tooltip.OnHover("Expand this panel by default in all relevant tabs."u8);
} }
} }
} }

View file

@ -1,19 +1,36 @@
using Glamourer.Api.Enums; using Glamourer.Api.Enums;
using Glamourer.State; using Glamourer.State;
using Luna.Generators;
namespace Glamourer.Designs; namespace Glamourer.Designs;
[NamedEnum]
[TooltipEnum]
public enum MetaIndex public enum MetaIndex
{ {
[Name("Force Wetness")]
[Tooltip("Force the character to be wet or not.")]
Wetness = StateIndex.MetaWetness, Wetness = StateIndex.MetaWetness,
[Name("Hat Visible")]
[Tooltip("Hide or show the characters head gear.")]
HatState = StateIndex.MetaHatState, HatState = StateIndex.MetaHatState,
[Name("Visor Toggled")]
[Tooltip("Toggle the visor state of the characters head gear.")]
VisorState = StateIndex.MetaVisorState, VisorState = StateIndex.MetaVisorState,
[Name("Weapon Visible")]
[Tooltip("Hide or show the characters weapons when not drawn.")]
WeaponState = StateIndex.MetaWeaponState, WeaponState = StateIndex.MetaWeaponState,
ModelId = StateIndex.MetaModelId, ModelId = StateIndex.MetaModelId,
[Name("Ears Visible")]
[Tooltip("Hide or show the characters ears through the head gear. (Viera only)")]
EarState = StateIndex.MetaEarState, EarState = StateIndex.MetaEarState,
} }
public static class MetaExtensions public static partial class MetaExtensions
{ {
public static readonly IReadOnlyList<MetaIndex> AllRelevant = public static readonly IReadOnlyList<MetaIndex> AllRelevant =
[MetaIndex.Wetness, MetaIndex.HatState, MetaIndex.VisorState, MetaIndex.WeaponState, MetaIndex.EarState]; [MetaIndex.Wetness, MetaIndex.HatState, MetaIndex.VisorState, MetaIndex.WeaponState, MetaIndex.EarState];
@ -55,26 +72,4 @@ public static class MetaExtensions
if (index.HasFlag(MetaFlag.EarState)) if (index.HasFlag(MetaFlag.EarState))
yield return MetaIndex.EarState; yield return MetaIndex.EarState;
} }
public static string ToName(this MetaIndex index)
=> index switch
{
MetaIndex.HatState => "Hat Visible",
MetaIndex.VisorState => "Visor Toggled",
MetaIndex.WeaponState => "Weapon Visible",
MetaIndex.Wetness => "Force Wetness",
MetaIndex.EarState => "Ears Visible",
_ => "Unknown Meta",
};
public static string ToTooltip(this MetaIndex index)
=> index switch
{
MetaIndex.HatState => "Hide or show the characters head gear.",
MetaIndex.VisorState => "Toggle the visor state of the characters head gear.",
MetaIndex.WeaponState => "Hide or show the characters weapons when not drawn.",
MetaIndex.Wetness => "Force the character to be wet or not.",
MetaIndex.EarState => "Hide or show the characters ears through the head gear. (Viera only)",
_ => string.Empty,
};
} }

View file

@ -1,4 +1,5 @@
using Penumbra.GameData.Enums; using ImSharp;
using Penumbra.GameData.Enums;
using Penumbra.GameData.Structs; using Penumbra.GameData.Structs;
namespace Glamourer.GameData; namespace Glamourer.GameData;
@ -28,7 +29,7 @@ public readonly struct CustomizeData : IEquatable<CustomizeData>
/// <summary> An ID for an associated color. </summary> /// <summary> An ID for an associated color. </summary>
[FieldOffset(4)] [FieldOffset(4)]
public readonly uint Color; public readonly Rgba32 Color;
/// <summary> Construct a CustomizeData from single data values. </summary> /// <summary> Construct a CustomizeData from single data values. </summary>
public CustomizeData(CustomizeIndex index, CustomizeValue value, uint data = 0, ushort customizeId = 0) public CustomizeData(CustomizeIndex index, CustomizeValue value, uint data = 0, ushort customizeId = 0)

View file

@ -1,41 +1,39 @@
using Dalamud.Interface; using Dalamud.Interface;
using Dalamud.Interface.Utility;
using Glamourer.GameData; using Glamourer.GameData;
using Dalamud.Bindings.ImGui;
using OtterGui;
using OtterGui.Raii;
using OtterGui.Text;
using OtterGui.Text.EndObjects;
using Penumbra.GameData.Enums; using Penumbra.GameData.Enums;
using Penumbra.GameData.Structs; using Penumbra.GameData.Structs;
using System; using ImSharp;
using Luna;
namespace Glamourer.Gui.Customization; namespace Glamourer.Gui.Customization;
public partial class CustomizationDrawer public partial class CustomizationDrawer
{ {
private const string ColorPickerPopupName = "ColorPicker"; private static ReadOnlySpan<byte> ColorPickerPopupName
=> "ColorPicker"u8;
private static readonly AwesomeIcon UnknownCustomization = FontAwesomeIcon.Question;
private CustomizeValue _draggedColorValue; private CustomizeValue _draggedColorValue;
private CustomizeIndex _draggedColorType; private CustomizeIndex _draggedColorType;
private void DrawDragDropSource(CustomizeIndex index, CustomizeData custom) private void DrawDragDropSource(CustomizeIndex index, CustomizeData custom)
{ {
using var dragDropSource = ImUtf8.DragDropSource(); using var dragDropSource = Im.DragDrop.Source();
if (!dragDropSource) if (!dragDropSource)
return; return;
if (!DragDropSource.SetPayload("##colorDragDrop"u8)) if (!dragDropSource.SetPayload("##colorDragDrop"u8))
_draggedColorValue = _customize[index]; _draggedColorValue = _customize[index];
ImUtf8.Text( Im.Text($"Dragging {(custom.Color == 0 ? $"{_currentOption} (NPC)" : _currentOption)} #{_draggedColorValue.Value}...");
$"Dragging {(custom.Color == 0 ? $"{_currentOption} (NPC)" : _currentOption)} #{_draggedColorValue.Value}...");
_draggedColorType = index; _draggedColorType = index;
} }
private void DrawDragDropTarget(CustomizeIndex index) private void DrawDragDropTarget(CustomizeIndex index)
{ {
using var dragDropTarget = ImUtf8.DragDropTarget(); using var dragDropTarget = Im.DragDrop.Target();
if (!dragDropTarget.Success || !dragDropTarget.IsDropping("##colorDragDrop"u8)) if (!dragDropTarget.IsDropping("##colorDragDrop"u8))
return; return;
var idx = _set.DataByValue(_draggedColorType, _draggedColorValue, out var draggedData, _customize.Face); var idx = _set.DataByValue(_draggedColorType, _draggedColorValue, out var draggedData, _customize.Face);
@ -70,12 +68,12 @@ public partial class CustomizationDrawer
UpdateValue(bestMatch); UpdateValue(bestMatch);
return; return;
static uint Diff(uint color1, uint color2) static uint Diff(Rgba32 color1, Rgba32 color2)
{ {
var r = (color1 & 0xFF) - (color2 & 0xFF); var r = color1.R - color2.R;
var g = ((color1 >> 8) & 0xFF) - ((color2 >> 8) & 0xFF); var g = color1.G - color2.G;
var b = ((color1 >> 16) & 0xFF) - ((color2 >> 16) & 0xFF); var b = color1.B - color2.B;
return 30 * r * r + 59 * g * g + 11 * b * b; return (uint) (30 * r * r + 59 * g * g + 11 * b * b);
} }
} }
@ -84,13 +82,13 @@ public partial class CustomizationDrawer
using var id = SetId(index); using var id = SetId(index);
var (current, custom) = GetCurrentCustomization(index); var (current, custom) = GetCurrentCustomization(index);
var color = ImGui.ColorConvertU32ToFloat4(current < 0 ? ImGui.GetColorU32(ImGuiCol.FrameBg) : custom.Color); var color = (current < 0 ? Im.Color.Get(ImGuiColor.FrameBackground) : custom.Color).ToVector();
using (_ = ImRaii.PushStyle(ImGuiStyleVar.FrameBorderSize, 2 * ImGuiHelpers.GlobalScale, current < 0)) using (ImStyleSingle.FrameBorderThickness.Push(2 * Im.Style.GlobalScale, current < 0))
{ {
if (ImGui.ColorButton($"{_customize[index].Value}##color", color, ImGuiColorEditFlags.NoDragDrop, _framedIconSize)) if (Im.Color.Button($"{_customize[index].Value}##color", color, ColorButtonFlags.NoDragDrop, _framedIconSize))
{ {
ImGui.OpenPopup(ColorPickerPopupName); Im.Popup.Open(ColorPickerPopupName);
} }
else if (current >= 0 && !_locked && CaptureMouseWheel(ref current, 0, _currentCount)) else if (current >= 0 && !_locked && CaptureMouseWheel(ref current, 0, _currentCount))
{ {
@ -105,27 +103,26 @@ public partial class CustomizationDrawer
var npc = false; var npc = false;
if (current < 0) if (current < 0)
{ {
using var font = ImRaii.PushFont(UiBuilder.IconFont); using var font = Im.Font.Push(AwesomeIcon.Font);
var size = ImGui.CalcTextSize(FontAwesomeIcon.Question.ToIconString()); var size = Im.Font.CalculateSize(UnknownCustomization.Span);
var pos = ImGui.GetItemRectMin() + (ImGui.GetItemRectSize() - size) / 2; var pos = Im.Item.UpperLeftCorner + (Im.Item.Size - size) / 2;
ImGui.GetWindowDrawList().AddText(pos, ImGui.GetColorU32(ImGuiCol.Text), FontAwesomeIcon.Question.ToIconString()); Im.Window.DrawList.Text(pos, Im.Color.Get(ImGuiColor.Text), UnknownCustomization.Span);
current = 0; current = 0;
npc = true; npc = true;
} }
ImGui.SameLine(); Im.Line.Same();
using (_ = ImRaii.Group()) using (Im.Group())
{ {
DataInputInt(current, npc); DataInputInt(current, npc);
if (_withApply) if (_withApply)
{ {
ApplyCheckbox(); ApplyCheckbox();
ImGui.SameLine(); Im.Line.Same();
} }
ImGui.AlignTextToFramePadding(); ImEx.TextFrameAligned(custom.Color.IsTransparent ? $"{_currentOption} (NPC)" : _currentOption);
ImGui.TextUnformatted(custom.Color == 0 ? $"{_currentOption} (NPC)" : _currentOption);
} }
DrawColorPickerPopup(current); DrawColorPickerPopup(current);
@ -133,30 +130,29 @@ public partial class CustomizationDrawer
private void DrawColorPickerPopup(int current) private void DrawColorPickerPopup(int current)
{ {
using var popup = ImRaii.Popup(ColorPickerPopupName, ImGuiWindowFlags.AlwaysAutoResize); using var popup = Im.Popup.Begin(ColorPickerPopupName, WindowFlags.AlwaysAutoResize);
if (!popup) if (!popup)
return; return;
using var style = ImRaii.PushStyle(ImGuiStyleVar.ItemSpacing, Vector2.Zero) using var style = ImStyleDouble.ItemSpacing.Push(Vector2.Zero)
.Push(ImGuiStyleVar.FrameRounding, 0); .Push(ImStyleSingle.FrameRounding, 0);
for (var i = 0; i < _currentCount; ++i) for (var i = 0; i < _currentCount; ++i)
{ {
var custom = _set.Data(_currentIndex, i, _customize[CustomizeIndex.Face]); var custom = _set.Data(_currentIndex, i, _customize[CustomizeIndex.Face]);
if (ImGui.ColorButton(custom.Value.ToString(), ImGui.ColorConvertU32ToFloat4(custom.Color)) && !_locked) if (Im.Color.Button($"{custom.Value}", custom.Color) && !_locked)
{ {
UpdateValue(custom.Value); UpdateValue(custom.Value);
ImGui.CloseCurrentPopup(); Im.Popup.CloseCurrent();
} }
if (i == current) if (i == current)
{ {
var size = ImGui.GetItemRectSize(); var size = Im.Item.Size;
ImGui.GetWindowDrawList() Im.Window.DrawList.Shape.CircleFilled(Im.Item.UpperLeftCorner + size / 2, size.X / 4, custom.Color.ContrastColor());
.AddCircleFilled(ImGui.GetItemRectMin() + size / 2, size.X / 4, ImGuiUtil.ContrastColorBw(custom.Color));
} }
if (i % 8 != 7) if (i % 8 is not 7)
ImGui.SameLine(); Im.Line.Same();
} }
} }

View file

@ -1,5 +1,6 @@
using Dalamud.Interface; using Dalamud.Interface;
using Dalamud.Bindings.ImGui; using Dalamud.Bindings.ImGui;
using ImSharp;
using OtterGui; using OtterGui;
using OtterGui.Raii; using OtterGui.Raii;
using Penumbra.GameData.Enums; using Penumbra.GameData.Enums;
@ -12,7 +13,7 @@ public partial class CustomizationDrawer
private void DrawRaceGenderSelector() private void DrawRaceGenderSelector()
{ {
DrawGenderSelector(); DrawGenderSelector();
ImGui.SameLine(); Im.Line.Same();
using var group = ImRaii.Group(); using var group = ImRaii.Group();
DrawRaceCombo(); DrawRaceCombo();
if (_withApply) if (_withApply)
@ -21,11 +22,11 @@ public partial class CustomizationDrawer
if (UiHelpers.DrawCheckbox("##applyGender", "Apply gender of this design.", ChangeApply.HasFlag(CustomizeFlag.Gender), if (UiHelpers.DrawCheckbox("##applyGender", "Apply gender of this design.", ChangeApply.HasFlag(CustomizeFlag.Gender),
out var applyGender, _locked)) out var applyGender, _locked))
ChangeApply = applyGender ? ChangeApply | CustomizeFlag.Gender : ChangeApply & ~CustomizeFlag.Gender; ChangeApply = applyGender ? ChangeApply | CustomizeFlag.Gender : ChangeApply & ~CustomizeFlag.Gender;
ImGui.SameLine(); Im.Line.Same();
if (UiHelpers.DrawCheckbox("##applyClan", "Apply clan of this design.", ChangeApply.HasFlag(CustomizeFlag.Clan), out var applyClan, if (UiHelpers.DrawCheckbox("##applyClan", "Apply clan of this design.", ChangeApply.HasFlag(CustomizeFlag.Clan), out var applyClan,
_locked)) _locked))
ChangeApply = applyClan ? ChangeApply | CustomizeFlag.Clan : ChangeApply & ~CustomizeFlag.Clan; ChangeApply = applyClan ? ChangeApply | CustomizeFlag.Clan : ChangeApply & ~CustomizeFlag.Clan;
ImGui.SameLine(); Im.Line.Same();
} }
ImGui.AlignTextToFramePadding(); ImGui.AlignTextToFramePadding();
@ -45,7 +46,7 @@ public partial class CustomizationDrawer
if (ImGuiUtil.DrawDisabledButton(icon.ToIconString(), _framedIconSize, string.Empty, if (ImGuiUtil.DrawDisabledButton(icon.ToIconString(), _framedIconSize, string.Empty,
icon is not FontAwesomeIcon.Mars and not FontAwesomeIcon.Venus, true)) icon is not FontAwesomeIcon.Mars and not FontAwesomeIcon.Venus, true))
Changed |= _service.ChangeGender(ref _customize, icon is FontAwesomeIcon.Mars ? Gender.Female : Gender.Male); Changed |= service.ChangeGender(ref _customize, icon is FontAwesomeIcon.Mars ? Gender.Female : Gender.Male);
} }
if (_lockedRedraw && ImGui.IsItemHovered(ImGuiHoveredFlags.AllowWhenDisabled)) if (_lockedRedraw && ImGui.IsItemHovered(ImGuiHoveredFlags.AllowWhenDisabled))
@ -58,13 +59,13 @@ public partial class CustomizationDrawer
using (ImRaii.Disabled(_locked || _lockedRedraw)) using (ImRaii.Disabled(_locked || _lockedRedraw))
{ {
ImGui.SetNextItemWidth(_raceSelectorWidth); ImGui.SetNextItemWidth(_raceSelectorWidth);
using (var combo = ImRaii.Combo("##subRaceCombo", _service.ClanName(_customize.Clan, _customize.Gender))) using (var combo = ImRaii.Combo("##subRaceCombo", service.ClanName(_customize.Clan, _customize.Gender)))
{ {
if (combo) if (combo)
foreach (var subRace in Enum.GetValues<SubRace>().Skip(1)) // Skip Unknown foreach (var subRace in Enum.GetValues<SubRace>().Skip(1)) // Skip Unknown
{ {
if (ImGui.Selectable(_service.ClanName(subRace, _customize.Gender), subRace == _customize.Clan)) if (ImGui.Selectable(service.ClanName(subRace, _customize.Gender), subRace == _customize.Clan))
Changed |= _service.ChangeClan(ref _customize, subRace); Changed |= service.ChangeClan(ref _customize, subRace);
} }
} }
} }

View file

@ -2,6 +2,7 @@
using Glamourer.GameData; using Glamourer.GameData;
using Glamourer.Unlocks; using Glamourer.Unlocks;
using Dalamud.Bindings.ImGui; using Dalamud.Bindings.ImGui;
using ImSharp;
using OtterGui; using OtterGui;
using OtterGui.Extensions; using OtterGui.Extensions;
using OtterGui.Raii; using OtterGui.Raii;
@ -31,7 +32,7 @@ public partial class CustomizationDrawer
npc = true; npc = true;
} }
var icon = _service.Manager.GetIcon(custom!.Value.IconId); var icon = service.Manager.GetIcon(custom!.Value.IconId);
var hasIcon = icon.TryGetWrap(out var wrap, out _); var hasIcon = icon.TryGetWrap(out var wrap, out _);
using (_ = ImRaii.Disabled(_locked || _currentIndex is CustomizeIndex.Face && _lockedRedraw)) using (_ = ImRaii.Disabled(_locked || _currentIndex is CustomizeIndex.Face && _lockedRedraw))
{ {
@ -49,7 +50,7 @@ public partial class CustomizationDrawer
if (hasIcon) if (hasIcon)
ImGuiUtil.HoverIconTooltip(wrap!, _iconSize); ImGuiUtil.HoverIconTooltip(wrap!, _iconSize);
ImGui.SameLine(); Im.Line.Same();
using (_ = ImRaii.Group()) using (_ = ImRaii.Group())
{ {
DataInputInt(current, npc); DataInputInt(current, npc);
@ -60,7 +61,7 @@ public partial class CustomizationDrawer
if (_withApply) if (_withApply)
{ {
ApplyCheckbox(); ApplyCheckbox();
ImGui.SameLine(); Im.Line.Same();
} }
ImGui.TextUnformatted(label); ImGui.TextUnformatted(label);
@ -80,10 +81,10 @@ public partial class CustomizationDrawer
for (var i = 0; i < _currentCount; ++i) for (var i = 0; i < _currentCount; ++i)
{ {
var custom = _set.Data(_currentIndex, i, _customize.Face); var custom = _set.Data(_currentIndex, i, _customize.Face);
var icon = _service.Manager.GetIcon(custom.IconId); var icon = service.Manager.GetIcon(custom.IconId);
using (var _ = ImRaii.Group()) using (var _ = ImRaii.Group())
{ {
var isFavorite = _favorites.Contains(_set.Gender, _set.Clan, _currentIndex, custom.Value); var isFavorite = favorites.Contains(_set.Gender, _set.Clan, _currentIndex, custom.Value);
using var frameColor = current == i using var frameColor = current == i
? ImRaii.PushColor(ImGuiCol.Button, Colors.SelectedRed) ? ImRaii.PushColor(ImGuiCol.Button, Colors.SelectedRed)
: ImRaii.PushColor(ImGuiCol.Button, ColorId.FavoriteStarOn.Value(), isFavorite); : ImRaii.PushColor(ImGuiCol.Button, ColorId.FavoriteStarOn.Value(), isFavorite);
@ -97,9 +98,9 @@ public partial class CustomizationDrawer
if (ImGui.IsItemClicked(ImGuiMouseButton.Right)) if (ImGui.IsItemClicked(ImGuiMouseButton.Right))
if (isFavorite) if (isFavorite)
_favorites.Remove(_set.Gender, _set.Clan, _currentIndex, custom.Value); favorites.Remove(_set.Gender, _set.Clan, _currentIndex, custom.Value);
else else
_favorites.TryAdd(_set.Gender, _set.Clan, _currentIndex, custom.Value); favorites.TryAdd(_set.Gender, _set.Clan, _currentIndex, custom.Value);
if (hasIcon) if (hasIcon)
ImGuiUtil.HoverIconTooltip(wrap!, _iconSize, ImGuiUtil.HoverIconTooltip(wrap!, _iconSize,
@ -112,7 +113,7 @@ public partial class CustomizationDrawer
} }
if (i % 8 != 7) if (i % 8 != 7)
ImGui.SameLine(); Im.Line.Same();
} }
} }
@ -123,19 +124,19 @@ public partial class CustomizationDrawer
using var bigGroup = ImRaii.Group(); using var bigGroup = ImRaii.Group();
using var disabled = ImRaii.Disabled(_locked); using var disabled = ImRaii.Disabled(_locked);
DrawMultiIcons(); DrawMultiIcons();
ImGui.SameLine(); Im.Line.Same();
using var group = ImRaii.Group(); using var group = ImRaii.Group();
_currentCount = 256; _currentCount = 256;
if (_withApply) if (_withApply)
{ {
ApplyCheckbox(CustomizeIndex.FacialFeature1); ApplyCheckbox(CustomizeIndex.FacialFeature1);
ImGui.SameLine(); Im.Line.Same();
ImGui.SetCursorPosX(ImGui.GetCursorPosX() + _spacing.X); ImGui.SetCursorPosX(ImGui.GetCursorPosX() + _spacing.X);
ApplyCheckbox(CustomizeIndex.FacialFeature2); ApplyCheckbox(CustomizeIndex.FacialFeature2);
ImGui.SameLine(); Im.Line.Same();
ApplyCheckbox(CustomizeIndex.FacialFeature3); ApplyCheckbox(CustomizeIndex.FacialFeature3);
ImGui.SameLine(); Im.Line.Same();
ApplyCheckbox(CustomizeIndex.FacialFeature4); ApplyCheckbox(CustomizeIndex.FacialFeature4);
} }
else else
@ -166,7 +167,7 @@ public partial class CustomizationDrawer
if (_set.DataByValue(CustomizeIndex.Face, _customize.Face, out _, _customize.Face) < 0) if (_set.DataByValue(CustomizeIndex.Face, _customize.Face, out _, _customize.Face) < 0)
{ {
ImGui.SameLine(); Im.Line.Same();
ImGui.AlignTextToFramePadding(); ImGui.AlignTextToFramePadding();
using var _ = ImRaii.Enabled(); using var _ = ImRaii.Enabled();
ImGui.TextUnformatted("(Using Face 1)"); ImGui.TextUnformatted("(Using Face 1)");
@ -182,12 +183,12 @@ public partial class CustomizationDrawer
if (_withApply) if (_withApply)
{ {
ApplyCheckbox(CustomizeIndex.FacialFeature5); ApplyCheckbox(CustomizeIndex.FacialFeature5);
ImGui.SameLine(); Im.Line.Same();
ImGui.SetCursorPosX(ImGui.GetCursorPosX() + _spacing.X); ImGui.SetCursorPosX(ImGui.GetCursorPosX() + _spacing.X);
ApplyCheckbox(CustomizeIndex.FacialFeature6); ApplyCheckbox(CustomizeIndex.FacialFeature6);
ImGui.SameLine(); Im.Line.Same();
ApplyCheckbox(CustomizeIndex.FacialFeature7); ApplyCheckbox(CustomizeIndex.FacialFeature7);
ImGui.SameLine(); Im.Line.Same();
ApplyCheckbox(CustomizeIndex.LegacyTattoo); ApplyCheckbox(CustomizeIndex.LegacyTattoo);
} }
} }
@ -204,7 +205,7 @@ public partial class CustomizationDrawer
var feature = _set.Data(featureIdx, 0, face); var feature = _set.Data(featureIdx, 0, face);
bool hasIcon; bool hasIcon;
IDalamudTextureWrap? wrap; IDalamudTextureWrap? wrap;
var icon = _service.Manager.GetIcon(feature.IconId); var icon = service.Manager.GetIcon(feature.IconId);
if (featureIdx is CustomizeIndex.LegacyTattoo) if (featureIdx is CustomizeIndex.LegacyTattoo)
{ {
wrap = _legacyTattoo; wrap = _legacyTattoo;
@ -225,7 +226,7 @@ public partial class CustomizationDrawer
if (hasIcon) if (hasIcon)
ImGuiUtil.HoverIconTooltip(wrap!, _iconSize); ImGuiUtil.HoverIconTooltip(wrap!, _iconSize);
if (idx % 4 != 3) if (idx % 4 != 3)
ImGui.SameLine(); Im.Line.Same();
} }
} }
} }

View file

@ -1,4 +1,5 @@
using Dalamud.Bindings.ImGui; using Dalamud.Bindings.ImGui;
using ImSharp;
using OtterGui; using OtterGui;
using OtterGui.Raii; using OtterGui.Raii;
using OtterGuiInternal; using OtterGuiInternal;
@ -17,16 +18,16 @@ public partial class CustomizationDrawer
using (var disabled = ImRaii.Disabled(_locked)) using (var disabled = ImRaii.Disabled(_locked))
{ {
DrawPercentageSlider(); DrawPercentageSlider();
ImGui.SameLine(); Im.Line.Same();
PercentageInputInt(); PercentageInputInt();
if (_withApply) if (_withApply)
{ {
ImGui.SameLine(); Im.Line.Same();
ApplyCheckbox(); ApplyCheckbox();
} }
} }
ImGui.SameLine(); Im.Line.Same();
ImGui.AlignTextToFramePadding(); ImGui.AlignTextToFramePadding();
ImGui.TextUnformatted(_currentOption); ImGui.TextUnformatted(_currentOption);
if (_currentIndex is CustomizeIndex.Height) if (_currentIndex is CustomizeIndex.Height)
@ -35,13 +36,13 @@ public partial class CustomizationDrawer
private void DrawHeight() private void DrawHeight()
{ {
if (_config.HeightDisplayType is HeightDisplayType.None) if (config.HeightDisplayType is HeightDisplayType.None)
return; return;
var height = _heightService.Height(_customize); var height = heightService.Height(_customize);
ImGui.SameLine(); Im.Line.Same();
var heightString = _config.HeightDisplayType switch var heightString = config.HeightDisplayType switch
{ {
HeightDisplayType.Centimetre => FormattableString.Invariant($"({height * 100:F1} cm)"), HeightDisplayType.Centimetre => FormattableString.Invariant($"({height * 100:F1} cm)"),
HeightDisplayType.Metre => FormattableString.Invariant($"({height:F2} m)"), HeightDisplayType.Metre => FormattableString.Invariant($"({height:F2} m)"),
@ -105,13 +106,13 @@ public partial class CustomizationDrawer
if (!_withApply) if (!_withApply)
ImGuiUtil.HoverTooltip("Hold Control to force updates with invalid/unknown options at your own risk."); ImGuiUtil.HoverTooltip("Hold Control to force updates with invalid/unknown options at your own risk.");
ImGui.SameLine(); Im.Line.Same();
if (ImGuiUtil.DrawDisabledButton("-", new Vector2(ImGui.GetFrameHeight()), "Select the previous available option in order.", if (ImGuiUtil.DrawDisabledButton("-", new Vector2(ImGui.GetFrameHeight()), "Select the previous available option in order.",
currentIndex <= 0)) currentIndex <= 0))
UpdateValue(_set.Data(_currentIndex, currentIndex - 1, _customize.Face).Value); UpdateValue(_set.Data(_currentIndex, currentIndex - 1, _customize.Face).Value);
else else
CheckWheel(); CheckWheel();
ImGui.SameLine(); Im.Line.Same();
if (ImGuiUtil.DrawDisabledButton("+", new Vector2(ImGui.GetFrameHeight()), "Select the next available option in order.", if (ImGuiUtil.DrawDisabledButton("+", new Vector2(ImGui.GetFrameHeight()), "Select the next available option in order.",
currentIndex >= _currentCount - 1 || npc)) currentIndex >= _currentCount - 1 || npc))
UpdateValue(_set.Data(_currentIndex, currentIndex + 1, _customize.Face).Value); UpdateValue(_set.Data(_currentIndex, currentIndex + 1, _customize.Face).Value);
@ -139,24 +140,24 @@ public partial class CustomizationDrawer
if (indexedBy1) if (indexedBy1)
{ {
ListCombo1(); ListCombo1();
ImGui.SameLine(); Im.Line.Same();
ListInputInt1(); ListInputInt1();
} }
else else
{ {
ListCombo0(); ListCombo0();
ImGui.SameLine(); Im.Line.Same();
ListInputInt0(); ListInputInt0();
} }
if (_withApply) if (_withApply)
{ {
ImGui.SameLine(); Im.Line.Same();
ApplyCheckbox(); ApplyCheckbox();
} }
} }
ImGui.SameLine(); Im.Line.Same();
ImGui.AlignTextToFramePadding(); ImGui.AlignTextToFramePadding();
ImGui.TextUnformatted(_currentOption); ImGui.TextUnformatted(_currentOption);
} }
@ -282,7 +283,7 @@ public partial class CustomizationDrawer
} }
} }
ImGui.SameLine(); Im.Line.Same();
ImGui.TextUnformatted(_currentIndex.ToDefaultName()); ImGui.TextUnformatted(_currentIndex.ToDefaultName());
} }
} }

View file

@ -4,9 +4,8 @@ using Dalamud.Plugin.Services;
using Glamourer.GameData; using Glamourer.GameData;
using Glamourer.Services; using Glamourer.Services;
using Glamourer.Unlocks; using Glamourer.Unlocks;
using Dalamud.Bindings.ImGui; using ImSharp;
using OtterGui; using Luna;
using OtterGui.Raii;
using Penumbra.GameData.Enums; using Penumbra.GameData.Enums;
using Penumbra.GameData.Structs; using Penumbra.GameData.Structs;
@ -14,10 +13,10 @@ namespace Glamourer.Gui.Customization;
public partial class CustomizationDrawer( public partial class CustomizationDrawer(
ITextureProvider textures, ITextureProvider textures,
CustomizeService _service, CustomizeService service,
Configuration _config, Configuration config,
FavoriteManager _favorites, FavoriteManager favorites,
HeightService _heightService) HeightService heightService)
: IDisposable : IDisposable
{ {
private readonly Vector4 _redTint = new(0.6f, 0.3f, 0.3f, 1f); private readonly Vector4 _redTint = new(0.6f, 0.3f, 0.3f, 1f);
@ -61,7 +60,7 @@ public partial class CustomizationDrawer(
{ {
ChangeApply = apply; ChangeApply = apply;
_initialApply = apply; _initialApply = apply;
_withApply = !_config.HideApplyCheckmarks; _withApply = !config.HideApplyCheckmarks;
Init(current, locked, lockedRedraw); Init(current, locked, lockedRedraw);
return DrawInternal(); return DrawInternal();
} }
@ -85,7 +84,7 @@ public partial class CustomizationDrawer(
private string _currentOption = string.Empty; private string _currentOption = string.Empty;
// Prepare a new customization option. // Prepare a new customization option.
private ImRaii.Id SetId(CustomizeIndex index) private Im.IdDisposable SetId(CustomizeIndex index)
{ {
_currentIndex = index; _currentIndex = index;
_currentFlag = index.ToFlag(); _currentFlag = index.ToFlag();
@ -93,7 +92,7 @@ public partial class CustomizationDrawer(
_currentByte = _customize[index]; _currentByte = _customize[index];
_currentCount = _set.Count(index, _customize.Face); _currentCount = _set.Count(index, _customize.Face);
_currentOption = _set.Option(index); _currentOption = _set.Option(index);
return ImRaii.PushId((int)index); return Im.Id.Push((int)index);
} }
// Update the current id with a new value. // Update the current id with a new value.
@ -112,19 +111,24 @@ public partial class CustomizationDrawer(
private bool DrawInternal() private bool DrawInternal()
{ {
using var spacing = ImRaii.PushStyle(ImGuiStyleVar.ItemSpacing, _spacing); using var spacing = ImStyleDouble.ItemSpacing.Push(_spacing);
try try
{ {
DrawRaceGenderSelector(); DrawRaceGenderSelector();
DrawBodyType(); DrawBodyType();
_set = _service.Manager.GetSet(_customize.Clan, _customize.Gender); _set = service.Manager.GetSet(_customize.Clan, _customize.Gender);
foreach (var id in _set.Order[MenuType.Percentage]) foreach (var id in _set.Order[MenuType.Percentage])
PercentageSelector(id); PercentageSelector(id);
Functions.IteratePairwise(_set.Order[MenuType.IconSelector], DrawIconSelector, ImGui.SameLine); foreach (var (i, icon) in _set.Order[MenuType.IconSelector].Index())
{
if ((i & 1) is 1)
Im.Line.Same();
DrawIconSelector(icon);
}
DrawMultiIconSelector(); DrawMultiIconSelector();
@ -134,29 +138,40 @@ public partial class CustomizationDrawer(
foreach (var id in _set.Order[MenuType.List1Selector]) foreach (var id in _set.Order[MenuType.List1Selector])
DrawListSelector(id, true); DrawListSelector(id, true);
Functions.IteratePairwise(_set.Order[MenuType.ColorPicker], DrawColorPicker, ImGui.SameLine); foreach (var (i, color) in _set.Order[MenuType.ColorPicker].Index())
{
if ((i & 1) is 1)
Im.Line.Same();
DrawColorPicker(color);
}
Functions.IteratePairwise(_set.Order[MenuType.Checkmark], DrawCheckbox, var offset = _comboSelectorSize - _framedIconSize.X + Im.Style.WindowPadding.X;
() => ImGui.SameLine(_comboSelectorSize - _framedIconSize.X + ImGui.GetStyle().WindowPadding.X)); foreach (var (i, check) in _set.Order[MenuType.Checkmark].Index())
return Changed != 0 || ChangeApply != _initialApply; {
if ((i & 1) is 1)
Im.Line.Same(offset);
DrawCheckbox(check);
}
return Changed is not 0 || ChangeApply != _initialApply;
} }
catch (Exception ex) catch (Exception ex)
{ {
_terminate = ex; _terminate = ex;
using var color = ImRaii.PushColor(ImGuiCol.Text, 0xFF4040FF); using var color = ImGuiColor.Text.Push(LunaStyle.ErrorBorderColor);
ImGui.NewLine(); Im.Line.New();
ImGuiUtil.TextWrapped(_terminate.ToString()); Im.TextWrapped($"{_terminate}");
return false; return false;
} }
} }
private void UpdateSizes() private void UpdateSizes()
{ {
_spacing = ImGui.GetStyle().ItemSpacing with { X = ImGui.GetStyle().ItemInnerSpacing.X }; _spacing = Im.Style.ItemSpacing with { X = Im.Style.ItemInnerSpacing.X };
_iconSize = new Vector2(ImGui.GetTextLineHeight() * 2 + _spacing.Y + 2 * ImGui.GetStyle().FramePadding.Y); _iconSize = new Vector2(Im.Style.TextHeight * 2 + _spacing.Y + 2 * Im.Style.FramePadding.Y);
_framedIconSize = _iconSize + 2 * ImGui.GetStyle().FramePadding; _framedIconSize = _iconSize + 2 * Im.Style.FramePadding;
_inputIntSize = 2 * _framedIconSize.X + 1 * _spacing.X; _inputIntSize = 2 * _framedIconSize.X + 1 * _spacing.X;
_inputIntSizeNoButtons = _inputIntSize - 2 * _spacing.X - 2 * ImGui.GetFrameHeight(); _inputIntSizeNoButtons = _inputIntSize - 2 * _spacing.X - 2 * Im.Style.FrameHeight;
_comboSelectorSize = 4 * _framedIconSize.X + 3 * _spacing.X; _comboSelectorSize = 4 * _framedIconSize.X + 3 * _spacing.X;
_raceSelectorWidth = _inputIntSize + _comboSelectorSize - _framedIconSize.X; _raceSelectorWidth = _inputIntSize + _comboSelectorSize - _framedIconSize.X;
} }

View file

@ -4,6 +4,7 @@ using Glamourer.GameData;
using Glamourer.Interop.PalettePlus; using Glamourer.Interop.PalettePlus;
using Glamourer.State; using Glamourer.State;
using Dalamud.Bindings.ImGui; using Dalamud.Bindings.ImGui;
using ImSharp;
using Luna; using Luna;
using OtterGui; using OtterGui;
using OtterGui.Raii; using OtterGui.Raii;
@ -131,7 +132,7 @@ public class CustomizeParameterDrawer(Configuration config, PaletteImport import
DrawColorDisplayOptions(); DrawColorDisplayOptions();
DrawColorFormatOptions(withApply); DrawColorFormatOptions(withApply);
var value = config.ShowColorConfig; var value = config.ShowColorConfig;
ImGui.SameLine(); Im.Line.Same();
if (ImGui.Checkbox("Show Config", ref value)) if (ImGui.Checkbox("Show Config", ref value))
{ {
config.ShowColorConfig = value; config.ShowColorConfig = value;
@ -151,7 +152,7 @@ public class CustomizeParameterDrawer(Configuration config, PaletteImport import
config.Save(); config.Save();
} }
ImGui.SameLine(); Im.Line.Same();
if (ImGui.RadioButton("HSV", !config.UseRgbForColors) && config.UseRgbForColors) if (ImGui.RadioButton("HSV", !config.UseRgbForColors) && config.UseRgbForColors)
{ {
config.UseRgbForColors = false; config.UseRgbForColors = false;
@ -177,7 +178,7 @@ public class CustomizeParameterDrawer(Configuration config, PaletteImport import
config.Save(); config.Save();
} }
ImGui.SameLine(); Im.Line.Same();
if (ImGui.RadioButton("Integer", !config.UseFloatForColors) && config.UseFloatForColors) if (ImGui.RadioButton("Integer", !config.UseFloatForColors) && config.UseFloatForColors)
{ {
config.UseFloatForColors = false; config.UseFloatForColors = false;

View file

@ -8,6 +8,7 @@ using Glamourer.Designs;
using Glamourer.Interop.Penumbra; using Glamourer.Interop.Penumbra;
using Glamourer.State; using Glamourer.State;
using Dalamud.Bindings.ImGui; using Dalamud.Bindings.ImGui;
using ImSharp;
using OtterGui.Text; using OtterGui.Text;
using Penumbra.GameData.Actors; using Penumbra.GameData.Actors;
using Penumbra.GameData.Interop; using Penumbra.GameData.Interop;
@ -117,7 +118,7 @@ public sealed class DesignQuickBar : Dalamud.Interface.Windowing.Window, IDispos
{ {
var comboSize = width - _numButtons * (buttonSize.X + spacing.X); var comboSize = width - _numButtons * (buttonSize.X + spacing.X);
_designCombo.Draw(comboSize); _designCombo.Draw(comboSize);
ImGui.SameLine(); Im.Line.Same();
DrawApplyButton(buttonSize); DrawApplyButton(buttonSize);
} }
@ -183,7 +184,7 @@ public sealed class DesignQuickBar : Dalamud.Interface.Windowing.Window, IDispos
var (clicked, id, data, state) = ResolveTarget(FontAwesomeIcon.PlayCircle, size, available); var (clicked, id, data, state) = ResolveTarget(FontAwesomeIcon.PlayCircle, size, available);
ImGui.SameLine(); Im.Line.Same();
if (!clicked) if (!clicked)
return; return;
@ -227,7 +228,7 @@ public sealed class DesignQuickBar : Dalamud.Interface.Windowing.Window, IDispos
"Neither player character nor target are available, have state modified by Glamourer, or their state is locked."); "Neither player character nor target are available, have state modified by Glamourer, or their state is locked.");
var (clicked, _, _, state) = ResolveTarget(FontAwesomeIcon.UndoAlt, buttonSize, available); var (clicked, _, _, state) = ResolveTarget(FontAwesomeIcon.UndoAlt, buttonSize, available);
ImGui.SameLine(); Im.Line.Same();
if (clicked) if (clicked)
_stateManager.ResetState(state!, StateSource.Manual, isFinal: true); _stateManager.ResetState(state!, StateSource.Manual, isFinal: true);
} }
@ -264,7 +265,7 @@ public sealed class DesignQuickBar : Dalamud.Interface.Windowing.Window, IDispos
"Neither player character nor target are available, have state modified by Glamourer, or their state is locked."); "Neither player character nor target are available, have state modified by Glamourer, or their state is locked.");
var (clicked, id, data, state) = ResolveTarget(FontAwesomeIcon.SyncAlt, buttonSize, available); var (clicked, id, data, state) = ResolveTarget(FontAwesomeIcon.SyncAlt, buttonSize, available);
ImGui.SameLine(); Im.Line.Same();
if (!clicked) if (!clicked)
return; return;
@ -307,7 +308,7 @@ public sealed class DesignQuickBar : Dalamud.Interface.Windowing.Window, IDispos
"Neither player character nor target are available, have state modified by Glamourer, or their state is locked."); "Neither player character nor target are available, have state modified by Glamourer, or their state is locked.");
var (clicked, id, data, state) = ResolveTarget(FontAwesomeIcon.Repeat, buttonSize, available); var (clicked, id, data, state) = ResolveTarget(FontAwesomeIcon.Repeat, buttonSize, available);
ImGui.SameLine(); Im.Line.Same();
if (!clicked) if (!clicked)
return; return;
@ -346,7 +347,7 @@ public sealed class DesignQuickBar : Dalamud.Interface.Windowing.Window, IDispos
_tooltipBuilder.Append("Neither player character nor target are available or their state is locked."); _tooltipBuilder.Append("Neither player character nor target are available or their state is locked.");
var (clicked, _, _, state) = ResolveTarget(FontAwesomeIcon.PaintBrush, buttonSize, available); var (clicked, _, _, state) = ResolveTarget(FontAwesomeIcon.PaintBrush, buttonSize, available);
ImGui.SameLine(); Im.Line.Same();
if (clicked) if (clicked)
_stateManager.ResetAdvancedCustomizations(state!, StateSource.Manual); _stateManager.ResetAdvancedCustomizations(state!, StateSource.Manual);
} }
@ -379,7 +380,7 @@ public sealed class DesignQuickBar : Dalamud.Interface.Windowing.Window, IDispos
_tooltipBuilder.Append("Neither player character nor target are available or their state is locked."); _tooltipBuilder.Append("Neither player character nor target are available or their state is locked.");
var (clicked, _, _, state) = ResolveTarget(FontAwesomeIcon.Palette, buttonSize, available); var (clicked, _, _, state) = ResolveTarget(FontAwesomeIcon.Palette, buttonSize, available);
ImGui.SameLine(); Im.Line.Same();
if (clicked) if (clicked)
_stateManager.ResetAdvancedDyes(state!, StateSource.Manual); _stateManager.ResetAdvancedDyes(state!, StateSource.Manual);
} }
@ -412,7 +413,7 @@ public sealed class DesignQuickBar : Dalamud.Interface.Windowing.Window, IDispos
_tooltipBuilder.Append("Neither player character nor target are available or their state is locked."); _tooltipBuilder.Append("Neither player character nor target are available or their state is locked.");
var (clicked, _, _, state) = ResolveTarget(FontAwesomeIcon.User, buttonSize, available); var (clicked, _, _, state) = ResolveTarget(FontAwesomeIcon.User, buttonSize, available);
ImGui.SameLine(); Im.Line.Same();
if (clicked) if (clicked)
_stateManager.ResetCustomize(state!, StateSource.Manual); _stateManager.ResetCustomize(state!, StateSource.Manual);
} }
@ -445,7 +446,7 @@ public sealed class DesignQuickBar : Dalamud.Interface.Windowing.Window, IDispos
_tooltipBuilder.Append("Neither player character nor target are available or their state is locked."); _tooltipBuilder.Append("Neither player character nor target are available or their state is locked.");
var (clicked, _, _, state) = ResolveTarget(FontAwesomeIcon.Vest, buttonSize, available); var (clicked, _, _, state) = ResolveTarget(FontAwesomeIcon.Vest, buttonSize, available);
ImGui.SameLine(); Im.Line.Same();
if (clicked) if (clicked)
_stateManager.ResetEquip(state!, StateSource.Manual); _stateManager.ResetEquip(state!, StateSource.Manual);
} }
@ -484,7 +485,7 @@ public sealed class DesignQuickBar : Dalamud.Interface.Windowing.Window, IDispos
_tooltipBuilder.Append("Neither player character nor target are available to identify their collections."); _tooltipBuilder.Append("Neither player character nor target are available to identify their collections.");
var (clicked, _, data, _) = ResolveTarget(FontAwesomeIcon.Cog, buttonSize, available); var (clicked, _, data, _) = ResolveTarget(FontAwesomeIcon.Cog, buttonSize, available);
ImGui.SameLine(); Im.Line.Same();
if (clicked) if (clicked)
{ {
_penumbra.RemoveAllTemporarySettings(data.Objects[0].Index, StateSource.Manual); _penumbra.RemoveAllTemporarySettings(data.Objects[0].Index, StateSource.Manual);

View file

@ -2,6 +2,7 @@
using Glamourer.Services; using Glamourer.Services;
using Glamourer.Unlocks; using Glamourer.Unlocks;
using Dalamud.Bindings.ImGui; using Dalamud.Bindings.ImGui;
using ImSharp;
using Lumina.Excel.Sheets; using Lumina.Excel.Sheets;
using OtterGui; using OtterGui;
using OtterGui.Classes; using OtterGui.Classes;
@ -11,6 +12,7 @@ using OtterGui.Raii;
using OtterGui.Widgets; using OtterGui.Widgets;
using Penumbra.GameData.Enums; using Penumbra.GameData.Enums;
using Penumbra.GameData.Structs; using Penumbra.GameData.Structs;
using MouseWheelType = OtterGui.Widgets.MouseWheelType;
namespace Glamourer.Gui.Equipment; namespace Glamourer.Gui.Equipment;
@ -72,9 +74,9 @@ public sealed class BonusItemCombo : FilterComboCache<EquipItem>
CurrentSelection = default; CurrentSelection = default;
} }
ImGui.SameLine(); Im.Line.Same();
var ret = ImGui.Selectable(name, selected); var ret = ImGui.Selectable(name, selected);
ImGui.SameLine(); Im.Line.Same();
using var color = ImRaii.PushColor(ImGuiCol.Text, 0xFF808080); using var color = ImRaii.PushColor(ImGuiCol.Text, 0xFF808080);
ImGuiUtil.RightAlign($"({obj.PrimaryId.Id}-{obj.Variant.Id})"); ImGuiUtil.RightAlign($"({obj.PrimaryId.Id}-{obj.Variant.Id})");
return ret; return ret;

View file

@ -6,15 +6,16 @@ using Glamourer.Gui.Materials;
using Glamourer.Services; using Glamourer.Services;
using Glamourer.Unlocks; using Glamourer.Unlocks;
using Dalamud.Bindings.ImGui; using Dalamud.Bindings.ImGui;
using ImSharp;
using OtterGui.Extensions; using OtterGui.Extensions;
using OtterGui.Raii; using OtterGui.Raii;
using OtterGui.Text; using OtterGui.Text;
using OtterGui.Text.EndObjects; using OtterGui.Text.EndObjects;
using OtterGui.Widgets;
using Penumbra.GameData.Data; using Penumbra.GameData.Data;
using Penumbra.GameData.DataContainers; using Penumbra.GameData.DataContainers;
using Penumbra.GameData.Enums; using Penumbra.GameData.Enums;
using Penumbra.GameData.Structs; using Penumbra.GameData.Structs;
using MouseWheelType = OtterGui.Widgets.MouseWheelType;
namespace Glamourer.Gui.Equipment; namespace Glamourer.Gui.Equipment;
@ -149,7 +150,7 @@ public class EquipmentDrawer
{ {
if (data.DisplayApplication) if (data.DisplayApplication)
{ {
var (valueChanged, applyChanged) = UiHelpers.DrawMetaToggle(data.Label, data.CurrentValue, data.CurrentApply, out var newValue, var (valueChanged, applyChanged) = UiHelpers.DrawMetaToggle(data.Label.ToString(), data.CurrentValue, data.CurrentApply, out var newValue,
out var newApply, data.Locked); out var newApply, data.Locked);
if (valueChanged) if (valueChanged)
data.SetValue(newValue); data.SetValue(newValue);
@ -158,7 +159,7 @@ public class EquipmentDrawer
} }
else else
{ {
if (UiHelpers.DrawCheckbox(data.Label, data.Tooltip, data.CurrentValue, out var newValue, data.Locked)) if (UiHelpers.DrawCheckbox(data.Label.ToString(), data.Tooltip.ToString(), data.CurrentValue, out var newValue, data.Locked))
data.SetValue(newValue); data.SetValue(newValue);
} }
} }
@ -194,13 +195,13 @@ public class EquipmentDrawer
private void DrawEquipSmall(in EquipDrawData equipDrawData) private void DrawEquipSmall(in EquipDrawData equipDrawData)
{ {
DrawStain(equipDrawData, true); DrawStain(equipDrawData, true);
ImGui.SameLine(); Im.Line.Same();
DrawItem(equipDrawData, out var label, true, false, false); DrawItem(equipDrawData, out var label, true, false, false);
if (equipDrawData.DisplayApplication) if (equipDrawData.DisplayApplication)
{ {
ImGui.SameLine(); Im.Line.Same();
DrawApply(equipDrawData); DrawApply(equipDrawData);
ImGui.SameLine(); Im.Line.Same();
DrawApplyStain(equipDrawData); DrawApplyStain(equipDrawData);
} }
else if (equipDrawData.IsState) else if (equipDrawData.IsState)
@ -217,11 +218,11 @@ public class EquipmentDrawer
private void DrawBonusItemSmall(in BonusDrawData bonusDrawData) private void DrawBonusItemSmall(in BonusDrawData bonusDrawData)
{ {
ImGui.Dummy(new Vector2(StainId.NumStains * ImUtf8.FrameHeight + (StainId.NumStains - 1) * ImUtf8.ItemSpacing.X, ImUtf8.FrameHeight)); ImGui.Dummy(new Vector2(StainId.NumStains * ImUtf8.FrameHeight + (StainId.NumStains - 1) * ImUtf8.ItemSpacing.X, ImUtf8.FrameHeight));
ImGui.SameLine(); Im.Line.Same();
DrawBonusItem(bonusDrawData, out var label, true, false, false); DrawBonusItem(bonusDrawData, out var label, true, false, false);
if (bonusDrawData.DisplayApplication) if (bonusDrawData.DisplayApplication)
{ {
ImGui.SameLine(); Im.Line.Same();
DrawApply(bonusDrawData); DrawApply(bonusDrawData);
} }
else if (bonusDrawData.IsState) else if (bonusDrawData.IsState)
@ -235,13 +236,13 @@ public class EquipmentDrawer
private void DrawWeaponsSmall(EquipDrawData mainhand, EquipDrawData offhand, bool allWeapons) private void DrawWeaponsSmall(EquipDrawData mainhand, EquipDrawData offhand, bool allWeapons)
{ {
DrawStain(mainhand, true); DrawStain(mainhand, true);
ImGui.SameLine(); Im.Line.Same();
DrawMainhand(ref mainhand, ref offhand, out var mainhandLabel, allWeapons, true, false); DrawMainhand(ref mainhand, ref offhand, out var mainhandLabel, allWeapons, true, false);
if (mainhand.DisplayApplication) if (mainhand.DisplayApplication)
{ {
ImGui.SameLine(); Im.Line.Same();
DrawApply(mainhand); DrawApply(mainhand);
ImGui.SameLine(); Im.Line.Same();
DrawApplyStain(mainhand); DrawApplyStain(mainhand);
} }
else if (mainhand.IsState) else if (mainhand.IsState)
@ -257,13 +258,13 @@ public class EquipmentDrawer
return; return;
DrawStain(offhand, true); DrawStain(offhand, true);
ImGui.SameLine(); Im.Line.Same();
DrawOffhand(mainhand, offhand, out var offhandLabel, true, false, false); DrawOffhand(mainhand, offhand, out var offhandLabel, true, false, false);
if (offhand.DisplayApplication) if (offhand.DisplayApplication)
{ {
ImGui.SameLine(); Im.Line.Same();
DrawApply(offhand); DrawApply(offhand);
ImGui.SameLine(); Im.Line.Same();
DrawApplyStain(offhand); DrawApplyStain(offhand);
} }
else if (offhand.IsState) else if (offhand.IsState)
@ -283,12 +284,12 @@ public class EquipmentDrawer
equipDrawData.CurrentItem.DrawIcon(_textures, _iconSize, equipDrawData.Slot); equipDrawData.CurrentItem.DrawIcon(_textures, _iconSize, equipDrawData.Slot);
var right = ImGui.IsItemClicked(ImGuiMouseButton.Right); var right = ImGui.IsItemClicked(ImGuiMouseButton.Right);
var left = ImGui.IsItemClicked(ImGuiMouseButton.Left); var left = ImGui.IsItemClicked(ImGuiMouseButton.Left);
ImGui.SameLine(); Im.Line.Same();
using var group = ImRaii.Group(); using var group = ImRaii.Group();
DrawItem(equipDrawData, out var label, false, right, left); DrawItem(equipDrawData, out var label, false, right, left);
if (equipDrawData.DisplayApplication) if (equipDrawData.DisplayApplication)
{ {
ImGui.SameLine(); Im.Line.Same();
DrawApply(equipDrawData); DrawApply(equipDrawData);
} }
@ -297,7 +298,7 @@ public class EquipmentDrawer
DrawStain(equipDrawData, false); DrawStain(equipDrawData, false);
if (equipDrawData.DisplayApplication) if (equipDrawData.DisplayApplication)
{ {
ImGui.SameLine(); Im.Line.Same();
DrawApplyStain(equipDrawData); DrawApplyStain(equipDrawData);
} }
else if (equipDrawData.IsState) else if (equipDrawData.IsState)
@ -307,7 +308,7 @@ public class EquipmentDrawer
if (VerifyRestrictedGear(equipDrawData)) if (VerifyRestrictedGear(equipDrawData))
{ {
ImGui.SameLine(); Im.Line.Same();
ImUtf8.Text("(Restricted)"u8); ImUtf8.Text("(Restricted)"u8);
} }
} }
@ -317,11 +318,11 @@ public class EquipmentDrawer
bonusDrawData.CurrentItem.DrawIcon(_textures, _iconSize, bonusDrawData.Slot); bonusDrawData.CurrentItem.DrawIcon(_textures, _iconSize, bonusDrawData.Slot);
var right = ImGui.IsItemClicked(ImGuiMouseButton.Right); var right = ImGui.IsItemClicked(ImGuiMouseButton.Right);
var left = ImGui.IsItemClicked(ImGuiMouseButton.Left); var left = ImGui.IsItemClicked(ImGuiMouseButton.Left);
ImGui.SameLine(); Im.Line.Same();
DrawBonusItem(bonusDrawData, out var label, false, right, left); DrawBonusItem(bonusDrawData, out var label, false, right, left);
if (bonusDrawData.DisplayApplication) if (bonusDrawData.DisplayApplication)
{ {
ImGui.SameLine(); Im.Line.Same();
DrawApply(bonusDrawData); DrawApply(bonusDrawData);
} }
else if (bonusDrawData.IsState) else if (bonusDrawData.IsState)
@ -339,13 +340,13 @@ public class EquipmentDrawer
mainhand.CurrentItem.DrawIcon(_textures, _iconSize, EquipSlot.MainHand); mainhand.CurrentItem.DrawIcon(_textures, _iconSize, EquipSlot.MainHand);
var left = ImGui.IsItemClicked(ImGuiMouseButton.Left); var left = ImGui.IsItemClicked(ImGuiMouseButton.Left);
ImGui.SameLine(); Im.Line.Same();
using (ImUtf8.Group()) using (ImUtf8.Group())
{ {
DrawMainhand(ref mainhand, ref offhand, out var mainhandLabel, allWeapons, false, left); DrawMainhand(ref mainhand, ref offhand, out var mainhandLabel, allWeapons, false, left);
if (mainhand.DisplayApplication) if (mainhand.DisplayApplication)
{ {
ImGui.SameLine(); Im.Line.Same();
DrawApply(mainhand); DrawApply(mainhand);
} }
@ -355,7 +356,7 @@ public class EquipmentDrawer
DrawStain(mainhand, false); DrawStain(mainhand, false);
if (mainhand.DisplayApplication) if (mainhand.DisplayApplication)
{ {
ImGui.SameLine(); Im.Line.Same();
DrawApplyStain(mainhand); DrawApplyStain(mainhand);
} }
else if (mainhand.IsState) else if (mainhand.IsState)
@ -370,13 +371,13 @@ public class EquipmentDrawer
offhand.CurrentItem.DrawIcon(_textures, _iconSize, EquipSlot.OffHand); offhand.CurrentItem.DrawIcon(_textures, _iconSize, EquipSlot.OffHand);
var right = ImGui.IsItemClicked(ImGuiMouseButton.Right); var right = ImGui.IsItemClicked(ImGuiMouseButton.Right);
left = ImGui.IsItemClicked(ImGuiMouseButton.Left); left = ImGui.IsItemClicked(ImGuiMouseButton.Left);
ImGui.SameLine(); Im.Line.Same();
using (ImUtf8.Group()) using (ImUtf8.Group())
{ {
DrawOffhand(mainhand, offhand, out var offhandLabel, false, right, left); DrawOffhand(mainhand, offhand, out var offhandLabel, false, right, left);
if (offhand.DisplayApplication) if (offhand.DisplayApplication)
{ {
ImGui.SameLine(); Im.Line.Same();
DrawApply(offhand); DrawApply(offhand);
} }
@ -385,7 +386,7 @@ public class EquipmentDrawer
DrawStain(offhand, false); DrawStain(offhand, false);
if (offhand.DisplayApplication) if (offhand.DisplayApplication)
{ {
ImGui.SameLine(); Im.Line.Same();
DrawApplyStain(offhand); DrawApplyStain(offhand);
} }
else if (offhand.IsState) else if (offhand.IsState)
@ -671,7 +672,7 @@ public class EquipmentDrawer
private void WeaponHelpMarker(bool hasAdvancedDyes, string label, string? type = null) private void WeaponHelpMarker(bool hasAdvancedDyes, string label, string? type = null)
{ {
ImGui.SameLine(); Im.Line.Same();
ImGuiComponents.HelpMarker( ImGuiComponents.HelpMarker(
"Changing weapons to weapons of different types can cause crashes, freezes, soft- and hard locks and cheating, " "Changing weapons to weapons of different types can cause crashes, freezes, soft- and hard locks and cheating, "
+ "thus it is only allowed to change weapons to other weapons of the same type."); + "thus it is only allowed to change weapons to other weapons of the same type.");
@ -688,7 +689,7 @@ public class EquipmentDrawer
[MethodImpl(MethodImplOptions.AggressiveOptimization | MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveOptimization | MethodImplOptions.AggressiveInlining)]
private void DrawEquipLabel(bool hasAdvancedDyes, string label) private void DrawEquipLabel(bool hasAdvancedDyes, string label)
{ {
ImGui.SameLine(); Im.Line.Same();
using (ImRaii.PushColor(ImGuiCol.Text, _advancedMaterialColor, hasAdvancedDyes)) using (ImRaii.PushColor(ImGuiCol.Text, _advancedMaterialColor, hasAdvancedDyes))
{ {
ImUtf8.Text(label); ImUtf8.Text(label);

View file

@ -3,9 +3,11 @@ using Dalamud.Interface.Utility;
using Dalamud.Interface.Utility.Raii; using Dalamud.Interface.Utility.Raii;
using Glamourer.Unlocks; using Glamourer.Unlocks;
using Dalamud.Bindings.ImGui; using Dalamud.Bindings.ImGui;
using ImSharp;
using OtterGui.Widgets; using OtterGui.Widgets;
using Penumbra.GameData.DataContainers; using Penumbra.GameData.DataContainers;
using Penumbra.GameData.Structs; using Penumbra.GameData.Structs;
using MouseWheelType = OtterGui.Widgets.MouseWheelType;
namespace Glamourer.Gui.Equipment; namespace Glamourer.Gui.Equipment;
@ -26,7 +28,7 @@ public sealed class GlamourerColorCombo(float _comboWidth, DictStain _stains, Fa
UiHelpers.DrawFavoriteStar(_favorites, Items[globalIdx].Key); UiHelpers.DrawFavoriteStar(_favorites, Items[globalIdx].Key);
} }
ImGui.SameLine(); Im.Line.Same();
} }
var buttonWidth = ImGui.GetContentRegionAvail().X; var buttonWidth = ImGui.GetContentRegionAvail().X;

View file

@ -2,6 +2,7 @@
using Glamourer.Services; using Glamourer.Services;
using Glamourer.Unlocks; using Glamourer.Unlocks;
using Dalamud.Bindings.ImGui; using Dalamud.Bindings.ImGui;
using ImSharp;
using Lumina.Excel.Sheets; using Lumina.Excel.Sheets;
using OtterGui.Classes; using OtterGui.Classes;
using OtterGui.Extensions; using OtterGui.Extensions;
@ -11,6 +12,7 @@ using OtterGui.Text;
using OtterGui.Widgets; using OtterGui.Widgets;
using Penumbra.GameData.Enums; using Penumbra.GameData.Enums;
using Penumbra.GameData.Structs; using Penumbra.GameData.Structs;
using MouseWheelType = OtterGui.Widgets.MouseWheelType;
namespace Glamourer.Gui.Equipment; namespace Glamourer.Gui.Equipment;
@ -72,9 +74,9 @@ public sealed class ItemCombo : FilterComboCache<EquipItem>
CurrentSelection = default; CurrentSelection = default;
} }
ImGui.SameLine(); Im.Line.Same();
var ret = ImGui.Selectable(name, selected); var ret = ImGui.Selectable(name, selected);
ImGui.SameLine(); Im.Line.Same();
using var color = ImRaii.PushColor(ImGuiCol.Text, 0xFF808080); using var color = ImRaii.PushColor(ImGuiCol.Text, 0xFF808080);
ImUtf8.TextRightAligned($"({obj.PrimaryId.Id}-{obj.Variant.Id})"); ImUtf8.TextRightAligned($"({obj.PrimaryId.Id}-{obj.Variant.Id})");
return ret; return ret;

View file

@ -1,6 +1,7 @@
using Glamourer.Services; using Glamourer.Services;
using Glamourer.Unlocks; using Glamourer.Unlocks;
using Dalamud.Bindings.ImGui; using Dalamud.Bindings.ImGui;
using ImSharp;
using OtterGui.Classes; using OtterGui.Classes;
using OtterGui.Extensions; using OtterGui.Extensions;
using OtterGui.Log; using OtterGui.Log;
@ -9,6 +10,7 @@ using OtterGui.Text;
using OtterGui.Widgets; using OtterGui.Widgets;
using Penumbra.GameData.Enums; using Penumbra.GameData.Enums;
using Penumbra.GameData.Structs; using Penumbra.GameData.Structs;
using MouseWheelType = OtterGui.Widgets.MouseWheelType;
namespace Glamourer.Gui.Equipment; namespace Glamourer.Gui.Equipment;
@ -71,9 +73,9 @@ public sealed class WeaponCombo : FilterComboCache<EquipItem>
CurrentSelection = default; CurrentSelection = default;
} }
ImGui.SameLine(); Im.Line.Same();
var ret = ImGui.Selectable(name, selected); var ret = ImGui.Selectable(name, selected);
ImGui.SameLine(); Im.Line.Same();
using var color = ImRaii.PushColor(ImGuiCol.Text, 0xFF808080); using var color = ImRaii.PushColor(ImGuiCol.Text, 0xFF808080);
ImUtf8.TextRightAligned($"({obj.PrimaryId.Id}-{obj.SecondaryId.Id}-{obj.Variant.Id})"); ImUtf8.TextRightAligned($"({obj.PrimaryId.Id}-{obj.SecondaryId.Id}-{obj.Variant.Id})");
return ret; return ret;

View file

@ -4,6 +4,7 @@ using Dalamud.Interface.Windowing;
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using Glamourer.Gui.Materials; using Glamourer.Gui.Materials;
using Dalamud.Bindings.ImGui; using Dalamud.Bindings.ImGui;
using ImSharp;
using OtterGui; using OtterGui;
using OtterGui.Raii; using OtterGui.Raii;
@ -84,7 +85,7 @@ public class GenericPopupWindow : Window
ImGui.CloseCurrentPopup(); ImGui.CloseCurrentPopup();
} }
ImGui.SameLine(); Im.Line.Same();
if (ImGui.Button("Not Right Now.", buttonWidth)) if (ImGui.Button("Not Right Now.", buttonWidth))
{ {
_config.DisableFestivals = 2; _config.DisableFestivals = 2;

View file

@ -12,6 +12,7 @@ using Glamourer.Gui.Tabs.SettingsTab;
using Glamourer.Gui.Tabs.UnlocksTab; using Glamourer.Gui.Tabs.UnlocksTab;
using Glamourer.Interop.Penumbra; using Glamourer.Interop.Penumbra;
using Dalamud.Bindings.ImGui; using Dalamud.Bindings.ImGui;
using ImSharp;
using Luna; using Luna;
using OtterGui; using OtterGui;
using OtterGui.Raii; using OtterGui.Raii;
@ -260,7 +261,7 @@ public class MainWindow : Window, IDisposable
_penumbra.Reattach(); _penumbra.Reattach();
var ignoreAllowed = _config.DeleteDesignModifier.IsActive(); var ignoreAllowed = _config.DeleteDesignModifier.IsActive();
ImGui.SameLine(); Im.Line.Same();
if (ImUtf8.ButtonEx("Ignore Penumbra This Time"u8, if (ImUtf8.ButtonEx("Ignore Penumbra This Time"u8,
$"Some functionality, like automation or retaining state, will not work correctly without Penumbra.\n\nIgnore this at your own risk!{(ignoreAllowed ? string.Empty : $"\n\nHold {_config.DeleteDesignModifier} while clicking to enable this button.")}", $"Some functionality, like automation or retaining state, will not work correctly without Penumbra.\n\nIgnore this at your own risk!{(ignoreAllowed ? string.Empty : $"\n\nHold {_config.DeleteDesignModifier} while clicking to enable this button.")}",
default, !ignoreAllowed)) default, !ignoreAllowed))
@ -269,7 +270,7 @@ public class MainWindow : Window, IDisposable
ImGui.NewLine(); ImGui.NewLine();
ImGui.NewLine(); ImGui.NewLine();
SupportButton.Discord(Glamourer.Messager, 0); SupportButton.Discord(Glamourer.Messager, 0);
ImGui.SameLine(); Im.Line.Same();
ImGui.NewLine(); ImGui.NewLine();
ImGui.NewLine(); ImGui.NewLine();
} }

View file

@ -4,11 +4,11 @@ using Dalamud.Interface.Utility;
using FFXIVClientStructs.FFXIV.Client.Graphics.Kernel; using FFXIVClientStructs.FFXIV.Client.Graphics.Kernel;
using FFXIVClientStructs.FFXIV.Client.Graphics.Render; using FFXIVClientStructs.FFXIV.Client.Graphics.Render;
using FFXIVClientStructs.FFXIV.Client.System.Resource.Handle; using FFXIVClientStructs.FFXIV.Client.System.Resource.Handle;
using FFXIVClientStructs.Interop;
using Glamourer.Designs; using Glamourer.Designs;
using Glamourer.Interop.Material; using Glamourer.Interop.Material;
using Glamourer.State; using Glamourer.State;
using Dalamud.Bindings.ImGui; using Dalamud.Bindings.ImGui;
using ImSharp;
using Luna; using Luna;
using OtterGui.Raii; using OtterGui.Raii;
using OtterGui.Text; using OtterGui.Text;
@ -60,7 +60,7 @@ public sealed unsafe class AdvancedDyePopup(
if (config.HideDesignPanel.HasFlag(DesignPanelFlag.AdvancedDyes)) if (config.HideDesignPanel.HasFlag(DesignPanelFlag.AdvancedDyes))
return; return;
ImGui.SameLine(); Im.Line.Same();
using var id = ImUtf8.PushId(index.SlotIndex | ((int)index.DrawObject << 8)); using var id = ImUtf8.PushId(index.SlotIndex | ((int)index.DrawObject << 8));
var isOpen = index == _drawIndex; var isOpen = index == _drawIndex;
@ -98,7 +98,7 @@ public sealed unsafe class AdvancedDyePopup(
return (path, gamePath); return (path, gamePath);
} }
private void DrawTabBar(ReadOnlySpan<Pointer<Texture>> textures, ReadOnlySpan<Pointer<Material>> materials, ref bool firstAvailable) private void DrawTabBar(ReadOnlySpan<FFXIVClientStructs.Interop.Pointer<Texture>> textures, ReadOnlySpan<FFXIVClientStructs.Interop.Pointer<Material>> materials, ref bool firstAvailable)
{ {
using var bar = ImUtf8.TabBar("tabs"u8); using var bar = ImUtf8.TabBar("tabs"u8);
if (!bar) if (!bar)
@ -180,7 +180,7 @@ public sealed unsafe class AdvancedDyePopup(
} }
} }
private void DrawContent(ReadOnlySpan<Pointer<Texture>> textures, ReadOnlySpan<Pointer<Material>> materials) private void DrawContent(ReadOnlySpan<FFXIVClientStructs.Interop.Pointer<Texture>> textures, ReadOnlySpan<FFXIVClientStructs.Interop.Pointer<Material>> materials)
{ {
var firstAvailable = true; var firstAvailable = true;
DrawTabBar(textures, materials, ref firstAvailable); DrawTabBar(textures, materials, ref firstAvailable);
@ -189,7 +189,7 @@ public sealed unsafe class AdvancedDyePopup(
ImUtf8.Text("No Editable Materials available."u8); ImUtf8.Text("No Editable Materials available."u8);
} }
private void DrawWindow(ReadOnlySpan<Pointer<Texture>> textures, ReadOnlySpan<Pointer<Material>> materials) private void DrawWindow(ReadOnlySpan<FFXIVClientStructs.Interop.Pointer<Texture>> textures, ReadOnlySpan<FFXIVClientStructs.Interop.Pointer<Material>> materials)
{ {
var flags = ImGuiWindowFlags.NoFocusOnAppearing var flags = ImGuiWindowFlags.NoFocusOnAppearing
| ImGuiWindowFlags.NoCollapse | ImGuiWindowFlags.NoCollapse
@ -326,7 +326,7 @@ public sealed unsafe class AdvancedDyePopup(
ImUtf8.IconButton(FontAwesomeIcon.Crosshairs, "Highlight all affected colors on the character."u8, buttonSize); ImUtf8.IconButton(FontAwesomeIcon.Crosshairs, "Highlight all affected colors on the character."u8, buttonSize);
if (ImGui.IsItemHovered()) if (ImGui.IsItemHovered())
preview.OnHover(materialIndex with { RowIndex = byte.MaxValue }, _actor.Index, table); preview.OnHover(materialIndex with { RowIndex = byte.MaxValue }, _actor.Index, table);
ImGui.SameLine(); Im.Line.Same();
ImGui.AlignTextToFramePadding(); ImGui.AlignTextToFramePadding();
using (ImRaii.PushFont(UiBuilder.MonoFont)) using (ImRaii.PushFont(UiBuilder.MonoFont))
{ {
@ -391,7 +391,7 @@ public sealed unsafe class AdvancedDyePopup(
if (ImGui.IsItemHovered()) if (ImGui.IsItemHovered())
preview.OnHover(index, _actor.Index, table); preview.OnHover(index, _actor.Index, table);
ImGui.SameLine(); Im.Line.Same();
ImGui.AlignTextToFramePadding(); ImGui.AlignTextToFramePadding();
using (ImRaii.PushFont(UiBuilder.MonoFont)) using (ImRaii.PushFont(UiBuilder.MonoFont))
{ {

View file

@ -4,6 +4,7 @@ using Dalamud.Interface.Utility.Raii;
using Glamourer.Designs; using Glamourer.Designs;
using Glamourer.Interop.Material; using Glamourer.Interop.Material;
using Dalamud.Bindings.ImGui; using Dalamud.Bindings.ImGui;
using ImSharp;
using Luna; using Luna;
using OtterGui; using OtterGui;
using OtterGui.Text; using OtterGui.Text;
@ -58,7 +59,7 @@ public class MaterialDrawer(DesignManager designManager, Configuration config) :
; ;
if (disabled && any) if (disabled && any)
ImUtf8.HoverTooltip($"Hold {config.DeleteDesignModifier} while clicking to enable."); ImUtf8.HoverTooltip($"Hold {config.DeleteDesignModifier} while clicking to enable.");
ImGui.SameLine(); Im.Line.Same();
if (ImUtf8.ButtonEx("Disable All Advanced Dyes"u8, if (ImUtf8.ButtonEx("Disable All Advanced Dyes"u8,
any any
? "Disable the application of all contained advanced dyes without deleting them."u8 ? "Disable the application of all contained advanced dyes without deleting them."u8

View file

@ -12,15 +12,16 @@ using Glamourer.Gui.Materials;
using Glamourer.Interop; using Glamourer.Interop;
using Glamourer.State; using Glamourer.State;
using Dalamud.Bindings.ImGui; using Dalamud.Bindings.ImGui;
using ImSharp;
using Luna; using Luna;
using OtterGui; using OtterGui;
using OtterGui.Raii; using OtterGui.Raii;
using OtterGui.Text; using OtterGui.Text;
using OtterGui.Text.HelperObjects;
using Penumbra.GameData.Actors; using Penumbra.GameData.Actors;
using Penumbra.GameData.DataContainers; using Penumbra.GameData.DataContainers;
using Penumbra.GameData.Enums; using Penumbra.GameData.Enums;
using Penumbra.GameData.Interop; using Penumbra.GameData.Interop;
using TextStringHandlerBuffer = OtterGui.Text.HelperObjects.TextStringHandlerBuffer;
namespace Glamourer.Gui.Tabs.ActorTab; namespace Glamourer.Gui.Tabs.ActorTab;
@ -165,7 +166,7 @@ public class ActorPanel
-Vector2.UnitX, Colors.SelectedRed); -Vector2.UnitX, Colors.SelectedRed);
DrawApplyToSelf(); DrawApplyToSelf();
ImGui.SameLine(); Im.Line.Same();
DrawApplyToTarget(); DrawApplyToTarget();
RevertButtons(); RevertButtons();
@ -276,7 +277,7 @@ public class ActorPanel
ImUtf8.DrawTableColumn("Game Object ID"u8); ImUtf8.DrawTableColumn("Game Object ID"u8);
DrawCopyColumn($"{string.Join(", ", _data.Objects.Select(d => d.AsObject->GetGameObjectId().ObjectId))}"); DrawCopyColumn($"{string.Join(", ", _data.Objects.Select(d => d.AsObject->GetGameObjectId().ObjectId))}");
static void DrawCopyColumn(ref Utf8StringHandler<TextStringHandlerBuffer> text) static void DrawCopyColumn(ref OtterGui.Text.HelperObjects.Utf8StringHandler<TextStringHandlerBuffer> text)
{ {
ImUtf8.DrawTableColumn(ref text); ImUtf8.DrawTableColumn(ref text);
if (ImGui.IsItemClicked(ImGuiMouseButton.Right)) if (ImGui.IsItemClicked(ImGuiMouseButton.Right))
@ -292,21 +293,21 @@ public class ActorPanel
EquipmentDrawer.DrawMetaToggle(ToggleDrawData.CrestFromState(CrestFlag.Head, _stateManager, _state!)); EquipmentDrawer.DrawMetaToggle(ToggleDrawData.CrestFromState(CrestFlag.Head, _stateManager, _state!));
} }
ImGui.SameLine(); Im.Line.Same();
using (_ = ImRaii.Group()) using (_ = ImRaii.Group())
{ {
EquipmentDrawer.DrawMetaToggle(ToggleDrawData.FromState(MetaIndex.VisorState, _stateManager, _state!)); EquipmentDrawer.DrawMetaToggle(ToggleDrawData.FromState(MetaIndex.VisorState, _stateManager, _state!));
EquipmentDrawer.DrawMetaToggle(ToggleDrawData.CrestFromState(CrestFlag.Body, _stateManager, _state!)); EquipmentDrawer.DrawMetaToggle(ToggleDrawData.CrestFromState(CrestFlag.Body, _stateManager, _state!));
} }
ImGui.SameLine(); Im.Line.Same();
using (_ = ImRaii.Group()) using (_ = ImRaii.Group())
{ {
EquipmentDrawer.DrawMetaToggle(ToggleDrawData.FromState(MetaIndex.WeaponState, _stateManager, _state!)); EquipmentDrawer.DrawMetaToggle(ToggleDrawData.FromState(MetaIndex.WeaponState, _stateManager, _state!));
EquipmentDrawer.DrawMetaToggle(ToggleDrawData.CrestFromState(CrestFlag.OffHand, _stateManager, _state!)); EquipmentDrawer.DrawMetaToggle(ToggleDrawData.CrestFromState(CrestFlag.OffHand, _stateManager, _state!));
} }
ImGui.SameLine(); Im.Line.Same();
using (_ = ImRaii.Group()) using (_ = ImRaii.Group())
{ {
EquipmentDrawer.DrawMetaToggle(ToggleDrawData.FromState(MetaIndex.EarState, _stateManager, _state!)); EquipmentDrawer.DrawMetaToggle(ToggleDrawData.FromState(MetaIndex.EarState, _stateManager, _state!));
@ -340,7 +341,7 @@ public class ActorPanel
ImGui.TextUnformatted($"{b.Value,3}"); ImGui.TextUnformatted($"{b.Value,3}");
} }
ImGui.SameLine(); Im.Line.Same();
if (ImGui.GetContentRegionAvail().X < ImGui.GetStyle().ItemSpacing.X + ImGui.CalcTextSize("XXX").X) if (ImGui.GetContentRegionAvail().X < ImGui.GetStyle().ItemSpacing.X + ImGui.CalcTextSize("XXX").X)
ImGui.NewLine(); ImGui.NewLine();
} }
@ -361,7 +362,7 @@ public class ActorPanel
ImGui.TextUnformatted($"{b,3}"); ImGui.TextUnformatted($"{b,3}");
} }
ImGui.SameLine(); Im.Line.Same();
if (ImGui.GetContentRegionAvail().X < ImGui.GetStyle().ItemSpacing.X + ImGui.CalcTextSize("XXX").X) if (ImGui.GetContentRegionAvail().X < ImGui.GetStyle().ItemSpacing.X + ImGui.CalcTextSize("XXX").X)
ImGui.NewLine(); ImGui.NewLine();
} }
@ -394,7 +395,7 @@ public class ActorPanel
_state!.IsLocked)) _state!.IsLocked))
_stateManager.ResetState(_state!, StateSource.Manual, isFinal: true); _stateManager.ResetState(_state!, StateSource.Manual, isFinal: true);
ImGui.SameLine(); Im.Line.Same();
if (ImGuiUtil.DrawDisabledButton("Reapply Automation", Vector2.Zero, if (ImGuiUtil.DrawDisabledButton("Reapply Automation", Vector2.Zero,
"Reapply the current automation state for the character on top of its current state..", "Reapply the current automation state for the character on top of its current state..",
@ -404,7 +405,7 @@ public class ActorPanel
_stateManager.ReapplyAutomationState(_actor, forcedRedraw, false, StateSource.Manual); _stateManager.ReapplyAutomationState(_actor, forcedRedraw, false, StateSource.Manual);
} }
ImGui.SameLine(); Im.Line.Same();
if (ImGuiUtil.DrawDisabledButton("Revert to Automation", Vector2.Zero, if (ImGuiUtil.DrawDisabledButton("Revert to Automation", Vector2.Zero,
"Try to revert the character to the state it would have using automated designs.", "Try to revert the character to the state it would have using automated designs.",
!_config.EnableAutoDesigns || _state!.IsLocked)) !_config.EnableAutoDesigns || _state!.IsLocked))
@ -413,7 +414,7 @@ public class ActorPanel
_stateManager.ReapplyAutomationState(_actor, forcedRedraw, true, StateSource.Manual); _stateManager.ReapplyAutomationState(_actor, forcedRedraw, true, StateSource.Manual);
} }
ImGui.SameLine(); Im.Line.Same();
if (ImGuiUtil.DrawDisabledButton("Reapply", Vector2.Zero, if (ImGuiUtil.DrawDisabledButton("Reapply", Vector2.Zero,
"Try to reapply the configured state if something went wrong. Should generally not be necessary.", "Try to reapply the configured state if something went wrong. Should generally not be necessary.",
_state!.IsLocked)) _state!.IsLocked))

View file

@ -1,5 +1,6 @@
using Dalamud.Interface; using Dalamud.Interface;
using Dalamud.Bindings.ImGui; using Dalamud.Bindings.ImGui;
using ImSharp;
using OtterGui; using OtterGui;
using OtterGui.Classes; using OtterGui.Classes;
using OtterGui.Raii; using OtterGui.Raii;
@ -124,7 +125,7 @@ public class ActorSelector(ActorObjectManager objects, ActorManager actors, Ephe
if (ImUtf8.IconButton(FontAwesomeIcon.UserCircle, "Select the local player character."u8, buttonWidth, !objects.Player)) if (ImUtf8.IconButton(FontAwesomeIcon.UserCircle, "Select the local player character."u8, buttonWidth, !objects.Player))
_identifier = objects.Player.GetIdentifier(actors); _identifier = objects.Player.GetIdentifier(actors);
ImGui.SameLine(); Im.Line.Same();
var (id, data) = objects.TargetData; var (id, data) = objects.TargetData;
var tt = data.Valid ? $"Select the current target {id} in the list." : var tt = data.Valid ? $"Select the current target {id} in the list." :
id.IsValid ? $"The target {id} is not in the list." : "No target selected."; id.IsValid ? $"The target {id} is not in the list." : "No target selected.";

View file

@ -1,5 +1,6 @@
using Dalamud.Interface.Utility; using Dalamud.Interface.Utility;
using Dalamud.Bindings.ImGui; using Dalamud.Bindings.ImGui;
using ImSharp;
using OtterGui.Widgets; using OtterGui.Widgets;
namespace Glamourer.Gui.Tabs.ActorTab; namespace Glamourer.Gui.Tabs.ActorTab;
@ -12,7 +13,7 @@ public class ActorTab(ActorSelector selector, ActorPanel panel) : ITab
public void DrawContent() public void DrawContent()
{ {
selector.Draw(200 * ImGuiHelpers.GlobalScale); selector.Draw(200 * ImGuiHelpers.GlobalScale);
ImGui.SameLine(); Im.Line.Same();
panel.Draw(); panel.Draw();
} }
} }

View file

@ -1,5 +1,6 @@
using Dalamud.Interface.Utility; using Dalamud.Interface.Utility;
using Dalamud.Bindings.ImGui; using Dalamud.Bindings.ImGui;
using ImSharp;
using OtterGui.Widgets; using OtterGui.Widgets;
namespace Glamourer.Gui.Tabs.AutomationTab; namespace Glamourer.Gui.Tabs.AutomationTab;
@ -15,7 +16,7 @@ public class AutomationTab(SetSelector selector, SetPanel panel, Configuration c
public void DrawContent() public void DrawContent()
{ {
selector.Draw(GetSetSelectorSize()); selector.Draw(GetSetSelectorSize());
ImGui.SameLine(); Im.Line.Same();
panel.Draw(); panel.Draw();
} }

View file

@ -5,6 +5,7 @@ using Glamourer.Designs;
using Glamourer.Designs.Special; using Glamourer.Designs.Special;
using Glamourer.Events; using Glamourer.Events;
using Dalamud.Bindings.ImGui; using Dalamud.Bindings.ImGui;
using ImSharp;
using Luna; using Luna;
using OtterGui; using OtterGui;
using OtterGui.Raii; using OtterGui.Raii;
@ -260,7 +261,7 @@ public sealed class RandomRestrictionDrawer : IService, IDisposable
_autoDesignManager.ChangeData(_set!, _designIndex, list); _autoDesignManager.ChangeData(_set!, _designIndex, list);
} }
ImGui.SameLine(); Im.Line.Same();
DrawLookup(predicate, buttonSize); DrawLookup(predicate, buttonSize);
} }
} }

View file

@ -7,6 +7,7 @@ using Glamourer.Interop;
using Glamourer.Services; using Glamourer.Services;
using Glamourer.Unlocks; using Glamourer.Unlocks;
using Dalamud.Bindings.ImGui; using Dalamud.Bindings.ImGui;
using ImSharp;
using OtterGui; using OtterGui;
using OtterGui.Extensions; using OtterGui.Extensions;
using OtterGui.Log; using OtterGui.Log;
@ -16,6 +17,7 @@ using OtterGui.Widgets;
using Penumbra.GameData.Enums; using Penumbra.GameData.Enums;
using Penumbra.GameData.Structs; using Penumbra.GameData.Structs;
using Action = System.Action; using Action = System.Action;
using MouseWheelType = OtterGui.Widgets.MouseWheelType;
namespace Glamourer.Gui.Tabs.AutomationTab; namespace Glamourer.Gui.Tabs.AutomationTab;
@ -81,7 +83,7 @@ public class SetPanel(
} }
} }
ImGui.SameLine(); Im.Line.Same();
using (ImUtf8.Group()) using (ImUtf8.Group())
{ {
using (ImRaii.PushStyle(ImGuiStyleVar.ItemSpacing, spacing)) using (ImRaii.PushStyle(ImGuiStyleVar.ItemSpacing, spacing))
@ -381,12 +383,12 @@ public class SetPanel(
$"{type.ToDefaultName()} Customization {customizeUnlocks.Unlockable[data.Value].Name} is not unlocked but should be applied."); $"{type.ToDefaultName()} Customization {customizeUnlocks.Unlockable[data.Value].Name} is not unlocked but should be applied.");
} }
ImGui.SameLine(); Im.Line.Same();
tt = config.UnlockedItemMode tt = config.UnlockedItemMode
? "\nThese customizations will be skipped when applied automatically.\n\nTo change this, disable the Obtained Item Mode setting." ? "\nThese customizations will be skipped when applied automatically.\n\nTo change this, disable the Obtained Item Mode setting."
: string.Empty; : string.Empty;
DrawWarning(sb2, config.UnlockedItemMode ? 0xA03030F0 : 0x0, size, tt, "All customizations to be applied are unlocked."); DrawWarning(sb2, config.UnlockedItemMode ? 0xA03030F0 : 0x0, size, tt, "All customizations to be applied are unlocked.");
ImGui.SameLine(); Im.Line.Same();
return; return;
static void DrawWarning(StringBuilder sb, uint color, Vector2 size, string suffix, string good) static void DrawWarning(StringBuilder sb, uint color, Vector2 size, string suffix, string good)
@ -466,17 +468,17 @@ public class SetPanel(
ImUtf8.HoverTooltip(description); ImUtf8.HoverTooltip(description);
} }
ImGui.SameLine(); Im.Line.Same();
Box(0); Box(0);
ImGui.SameLine(); Im.Line.Same();
Box(1); Box(1);
if (singleLine) if (singleLine)
ImGui.SameLine(); Im.Line.Same();
Box(2); Box(2);
ImGui.SameLine(); Im.Line.Same();
Box(3); Box(3);
ImGui.SameLine(); Im.Line.Same();
Box(4); Box(4);
} }
@ -487,19 +489,19 @@ public class SetPanel(
{ {
using var id = ImUtf8.PushId("Identifiers"u8); using var id = ImUtf8.PushId("Identifiers"u8);
identifierDrawer.DrawWorld(130); identifierDrawer.DrawWorld(130);
ImGui.SameLine(); Im.Line.Same();
identifierDrawer.DrawName(200 - ImGui.GetStyle().ItemSpacing.X); identifierDrawer.DrawName(200 - ImGui.GetStyle().ItemSpacing.X);
identifierDrawer.DrawNpcs(330); identifierDrawer.DrawNpcs(330);
var buttonWidth = new Vector2(165 * ImGuiHelpers.GlobalScale - ImGui.GetStyle().ItemSpacing.X / 2, 0); var buttonWidth = new Vector2(165 * ImGuiHelpers.GlobalScale - ImGui.GetStyle().ItemSpacing.X / 2, 0);
if (ImUtf8.ButtonEx("Set to Character"u8, string.Empty, buttonWidth, !identifierDrawer.CanSetPlayer)) if (ImUtf8.ButtonEx("Set to Character"u8, string.Empty, buttonWidth, !identifierDrawer.CanSetPlayer))
manager.ChangeIdentifier(setIndex, identifierDrawer.PlayerIdentifier); manager.ChangeIdentifier(setIndex, identifierDrawer.PlayerIdentifier);
ImGui.SameLine(); Im.Line.Same();
if (ImUtf8.ButtonEx("Set to NPC"u8, string.Empty, buttonWidth, !identifierDrawer.CanSetNpc)) if (ImUtf8.ButtonEx("Set to NPC"u8, string.Empty, buttonWidth, !identifierDrawer.CanSetNpc))
manager.ChangeIdentifier(setIndex, identifierDrawer.NpcIdentifier); manager.ChangeIdentifier(setIndex, identifierDrawer.NpcIdentifier);
if (ImUtf8.ButtonEx("Set to Retainer"u8, string.Empty, buttonWidth, !identifierDrawer.CanSetRetainer)) if (ImUtf8.ButtonEx("Set to Retainer"u8, string.Empty, buttonWidth, !identifierDrawer.CanSetRetainer))
manager.ChangeIdentifier(setIndex, identifierDrawer.RetainerIdentifier); manager.ChangeIdentifier(setIndex, identifierDrawer.RetainerIdentifier);
ImGui.SameLine(); Im.Line.Same();
if (ImUtf8.ButtonEx("Set to Mannequin"u8, string.Empty, buttonWidth, !identifierDrawer.CanSetRetainer)) if (ImUtf8.ButtonEx("Set to Mannequin"u8, string.Empty, buttonWidth, !identifierDrawer.CanSetRetainer))
manager.ChangeIdentifier(setIndex, identifierDrawer.MannequinIdentifier); manager.ChangeIdentifier(setIndex, identifierDrawer.MannequinIdentifier);

View file

@ -3,6 +3,7 @@ using Dalamud.Interface.Utility;
using Glamourer.Automation; using Glamourer.Automation;
using Glamourer.Events; using Glamourer.Events;
using Dalamud.Bindings.ImGui; using Dalamud.Bindings.ImGui;
using ImSharp;
using OtterGui; using OtterGui;
using OtterGui.Classes; using OtterGui.Classes;
using OtterGui.Extensions; using OtterGui.Extensions;
@ -141,7 +142,7 @@ public class SetSelector : IDisposable
ImGui.SetNextItemWidth(_width - ImGui.GetFrameHeight()); ImGui.SetNextItemWidth(_width - ImGui.GetFrameHeight());
if (LowerString.InputWithHint("##filter", "Filter...", ref _filter, 64)) if (LowerString.InputWithHint("##filter", "Filter...", ref _filter, 64))
_dirty = true; _dirty = true;
ImGui.SameLine(); Im.Line.Same();
var f = _enabledFilter; var f = _enabledFilter;
if (ImGui.CheckboxFlags("##enabledFilter", ref f, 3u)) if (ImGui.CheckboxFlags("##enabledFilter", ref f, 3u))
@ -214,11 +215,11 @@ public class SetSelector : IDisposable
.Push(ImGuiStyleVar.FrameRounding, 0); .Push(ImGuiStyleVar.FrameRounding, 0);
var buttonWidth = new Vector2(_width / 4, 0); var buttonWidth = new Vector2(_width / 4, 0);
NewSetButton(buttonWidth); NewSetButton(buttonWidth);
ImGui.SameLine(); Im.Line.Same();
DuplicateSetButton(buttonWidth); DuplicateSetButton(buttonWidth);
ImGui.SameLine(); Im.Line.Same();
HelpButton(buttonWidth); HelpButton(buttonWidth);
ImGui.SameLine(); Im.Line.Same();
DeleteSetButton(buttonWidth); DeleteSetButton(buttonWidth);
} }

View file

@ -28,7 +28,7 @@ public sealed class ActiveStatePanel(StateManager stateManager, ActorObjectManag
string.Empty, !stateManager.ContainsKey(identifier), true)) string.Empty, !stateManager.ContainsKey(identifier), true))
stateManager.DeleteState(identifier); stateManager.DeleteState(identifier);
ImGui.SameLine(); Im.Line.Same();
using var t = ImRaii.TreeNode(actors.Label); using var t = ImRaii.TreeNode(actors.Label);
if (!t) if (!t)
continue; continue;

View file

@ -2,6 +2,7 @@
using Glamourer.Designs; using Glamourer.Designs;
using Glamourer.Services; using Glamourer.Services;
using Dalamud.Bindings.ImGui; using Dalamud.Bindings.ImGui;
using ImSharp;
using OtterGui; using OtterGui;
using OtterGui.Extensions; using OtterGui.Extensions;
using OtterGui.Raii; using OtterGui.Raii;
@ -87,7 +88,7 @@ public sealed class DesignTesterPanel(ItemManager items, HumanModelList humans)
{ {
using var color = ImRaii.PushColor(ImGuiCol.Text, 0xFF4040D0, c1 != c2); using var color = ImRaii.PushColor(ImGuiCol.Text, 0xFF4040D0, c1 != c2);
ImGui.TextUnformatted(c1.ToString()); ImGui.TextUnformatted(c1.ToString());
ImGui.SameLine(); Im.Line.Same();
} }
} }
@ -103,7 +104,7 @@ public sealed class DesignTesterPanel(ItemManager items, HumanModelList humans)
ImGui.TextUnformatted(b2.ToString("X2")); ImGui.TextUnformatted(b2.ToString("X2"));
} }
ImGui.SameLine(); Im.Line.Same();
} }
ImGui.NewLine(); ImGui.NewLine();
@ -123,7 +124,7 @@ public sealed class DesignTesterPanel(ItemManager items, HumanModelList humans)
ImGui.TextUnformatted(b.ToString("X2")); ImGui.TextUnformatted(b.ToString("X2"));
} }
ImGui.SameLine(); Im.Line.Same();
} }
ImGui.NewLine(); ImGui.NewLine();

View file

@ -6,6 +6,7 @@ using Glamourer.Designs;
using Glamourer.Services; using Glamourer.Services;
using Glamourer.State; using Glamourer.State;
using Dalamud.Bindings.ImGui; using Dalamud.Bindings.ImGui;
using ImSharp;
using OtterGui.Extensions; using OtterGui.Extensions;
using OtterGui.Text; using OtterGui.Text;
using Penumbra.GameData; using Penumbra.GameData;
@ -51,13 +52,13 @@ public sealed unsafe class GlamourPlatePanel : IGameDataDrawer
ImUtf8.Text("Is Applying Glamour Plates:"u8); ImUtf8.Text("Is Applying Glamour Plates:"u8);
} }
ImGui.SameLine(); Im.Line.Same();
using (ImRaii.Group()) using (ImRaii.Group())
{ {
ImUtf8.CopyOnClickSelectable($"0x{(ulong)manager:X}"); ImUtf8.CopyOnClickSelectable($"0x{(ulong)manager:X}");
ImUtf8.Text(manager == null ? "-" : manager->GlamourPlates.Length.ToString()); ImUtf8.Text(manager == null ? "-" : manager->GlamourPlates.Length.ToString());
ImUtf8.Text(manager == null ? "-" : manager->GlamourPlatesRequested.ToString()); ImUtf8.Text(manager == null ? "-" : manager->GlamourPlatesRequested.ToString());
ImGui.SameLine(); Im.Line.Same();
if (ImUtf8.SmallButton("Request Update"u8)) if (ImUtf8.SmallButton("Request Update"u8))
RequestGlamour(); RequestGlamour();
ImUtf8.Text(manager == null ? "-" : manager->GlamourPlatesLoaded.ToString()); ImUtf8.Text(manager == null ? "-" : manager->GlamourPlatesLoaded.ToString());
@ -90,7 +91,7 @@ public sealed unsafe class GlamourPlatePanel : IGameDataDrawer
ImUtf8.Text(slot.ToName()); ImUtf8.Text(slot.ToName());
} }
ImGui.SameLine(); Im.Line.Same();
using (ImRaii.Group()) using (ImRaii.Group())
{ {
foreach (var (_, index) in EquipSlotExtensions.FullSlots.WithIndex()) foreach (var (_, index) in EquipSlotExtensions.FullSlots.WithIndex())

View file

@ -1,5 +1,6 @@
using Glamourer.Api.Enums; using Glamourer.Api.Enums;
using Dalamud.Bindings.ImGui; using Dalamud.Bindings.ImGui;
using ImSharp;
namespace Glamourer.Gui.Tabs.DebugTab.IpcTester; namespace Glamourer.Gui.Tabs.DebugTab.IpcTester;
@ -11,17 +12,17 @@ public static class IpcTesterHelpers
if (ImGui.Checkbox("Apply Once", ref value)) if (ImGui.Checkbox("Apply Once", ref value))
flags = value ? flags | ApplyFlag.Once : flags & ~ApplyFlag.Once; flags = value ? flags | ApplyFlag.Once : flags & ~ApplyFlag.Once;
ImGui.SameLine(); Im.Line.Same();
value = (flags & ApplyFlag.Equipment) != 0; value = (flags & ApplyFlag.Equipment) != 0;
if (ImGui.Checkbox("Apply Equipment", ref value)) if (ImGui.Checkbox("Apply Equipment", ref value))
flags = value ? flags | ApplyFlag.Equipment : flags & ~ApplyFlag.Equipment; flags = value ? flags | ApplyFlag.Equipment : flags & ~ApplyFlag.Equipment;
ImGui.SameLine(); Im.Line.Same();
value = (flags & ApplyFlag.Customization) != 0; value = (flags & ApplyFlag.Customization) != 0;
if (ImGui.Checkbox("Apply Customization", ref value)) if (ImGui.Checkbox("Apply Customization", ref value))
flags = value ? flags | ApplyFlag.Customization : flags & ~ApplyFlag.Customization; flags = value ? flags | ApplyFlag.Customization : flags & ~ApplyFlag.Customization;
ImGui.SameLine(); Im.Line.Same();
value = (flags & ApplyFlag.Lock) != 0; value = (flags & ApplyFlag.Lock) != 0;
if (ImGui.Checkbox("Lock Actor", ref value)) if (ImGui.Checkbox("Lock Actor", ref value))
flags = value ? flags | ApplyFlag.Lock : flags & ~ApplyFlag.Lock; flags = value ? flags | ApplyFlag.Lock : flags & ~ApplyFlag.Lock;

View file

@ -2,6 +2,7 @@
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using Glamourer.Api.IpcSubscribers; using Glamourer.Api.IpcSubscribers;
using Dalamud.Bindings.ImGui; using Dalamud.Bindings.ImGui;
using ImSharp;
using Penumbra.GameData.Gui.Debug; using Penumbra.GameData.Gui.Debug;
namespace Glamourer.Gui.Tabs.DebugTab.IpcTester; namespace Glamourer.Gui.Tabs.DebugTab.IpcTester;
@ -30,12 +31,12 @@ public sealed class IpcTesterPanel(
Subscribe(); Subscribe();
ImGui.TextUnformatted(ApiVersion.Label); ImGui.TextUnformatted(ApiVersion.Label);
var (major, minor) = new ApiVersion(pluginInterface).Invoke(); var (major, minor) = new ApiVersion(pluginInterface).Invoke();
ImGui.SameLine(); Im.Line.Same();
ImGui.TextUnformatted($"({major}.{minor:D4})"); ImGui.TextUnformatted($"({major}.{minor:D4})");
ImGui.TextUnformatted(AutoReloadGearEnabled.Label); ImGui.TextUnformatted(AutoReloadGearEnabled.Label);
var autoRedraw = new AutoReloadGearEnabled(pluginInterface).Invoke(); var autoRedraw = new AutoReloadGearEnabled(pluginInterface).Invoke();
ImGui.SameLine(); Im.Line.Same();
ImGui.TextUnformatted(autoRedraw ? "Enabled" : "Disabled"); ImGui.TextUnformatted(autoRedraw ? "Enabled" : "Disabled");
designs.Draw(); designs.Draw();

View file

@ -6,6 +6,7 @@ using Glamourer.Api.Enums;
using Glamourer.Api.Helpers; using Glamourer.Api.Helpers;
using Glamourer.Api.IpcSubscribers; using Glamourer.Api.IpcSubscribers;
using Glamourer.Designs; using Glamourer.Designs;
using ImSharp;
using Luna; using Luna;
using Newtonsoft.Json; using Newtonsoft.Json;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
@ -136,14 +137,14 @@ public class StateIpcTester : IUiService, IDisposable
IpcTesterHelpers.DrawIntro(ApplyState.Label); IpcTesterHelpers.DrawIntro(ApplyState.Label);
if (ImGuiUtil.DrawDisabledButton("Apply Last##Idx", Vector2.Zero, string.Empty, _state == null)) if (ImGuiUtil.DrawDisabledButton("Apply Last##Idx", Vector2.Zero, string.Empty, _state == null))
_lastError = new ApplyState(_pluginInterface).Invoke(_state!, _gameObjectIndex, _key, _flags); _lastError = new ApplyState(_pluginInterface).Invoke(_state!, _gameObjectIndex, _key, _flags);
ImGui.SameLine(); Im.Line.Same();
if (ImUtf8.Button("Apply Base64##Idx"u8)) if (ImUtf8.Button("Apply Base64##Idx"u8))
_lastError = new ApplyState(_pluginInterface).Invoke(_base64State, _gameObjectIndex, _key, _flags); _lastError = new ApplyState(_pluginInterface).Invoke(_base64State, _gameObjectIndex, _key, _flags);
IpcTesterHelpers.DrawIntro(ApplyStateName.Label); IpcTesterHelpers.DrawIntro(ApplyStateName.Label);
if (ImGuiUtil.DrawDisabledButton("Apply Last##Name", Vector2.Zero, string.Empty, _state == null)) if (ImGuiUtil.DrawDisabledButton("Apply Last##Name", Vector2.Zero, string.Empty, _state == null))
_lastError = new ApplyStateName(_pluginInterface).Invoke(_state!, _gameObjectName, _key, _flags); _lastError = new ApplyStateName(_pluginInterface).Invoke(_state!, _gameObjectName, _key, _flags);
ImGui.SameLine(); Im.Line.Same();
if (ImUtf8.Button("Apply Base64##Name"u8)) if (ImUtf8.Button("Apply Base64##Name"u8))
_lastError = new ApplyStateName(_pluginInterface).Invoke(_base64State, _gameObjectName, _key, _flags); _lastError = new ApplyStateName(_pluginInterface).Invoke(_base64State, _gameObjectName, _key, _flags);
@ -174,7 +175,7 @@ public class StateIpcTester : IUiService, IDisposable
IpcTesterHelpers.DrawIntro(UnlockAll.Label); IpcTesterHelpers.DrawIntro(UnlockAll.Label);
if (ImUtf8.Button("Unlock##All"u8)) if (ImUtf8.Button("Unlock##All"u8))
_numUnlocked = new UnlockAll(_pluginInterface).Invoke(_key); _numUnlocked = new UnlockAll(_pluginInterface).Invoke(_key);
ImGui.SameLine(); Im.Line.Same();
ImGui.TextUnformatted($"Unlocked {_numUnlocked}"); ImGui.TextUnformatted($"Unlocked {_numUnlocked}");
IpcTesterHelpers.DrawIntro(RevertToAutomation.Label); IpcTesterHelpers.DrawIntro(RevertToAutomation.Label);
@ -200,7 +201,7 @@ public class StateIpcTester : IUiService, IDisposable
ImUtf8.SetClipboardText(_stateString); ImUtf8.SetClipboardText(_stateString);
if (_stateString[0] is '{') if (_stateString[0] is '{')
{ {
ImGui.SameLine(); Im.Line.Same();
if (ImUtf8.Button("Copy as Base64"u8) && _state != null) if (ImUtf8.Button("Copy as Base64"u8) && _state != null)
ImUtf8.SetClipboardText(DesignConverter.ToBase64(_state)); ImUtf8.SetClipboardText(DesignConverter.ToBase64(_state));
} }
@ -217,13 +218,13 @@ public class StateIpcTester : IUiService, IDisposable
ImUtf8.Text(_lastStateChangeName.Span); ImUtf8.Text(_lastStateChangeName.Span);
ImGui.SameLine(0, 0); ImGui.SameLine(0, 0);
ImUtf8.Text($" ({_lastStateChangeType})"); ImUtf8.Text($" ({_lastStateChangeType})");
ImGui.SameLine(); Im.Line.Same();
using (ImRaii.PushFont(UiBuilder.MonoFont)) using (ImRaii.PushFont(UiBuilder.MonoFont))
{ {
ImUtf8.CopyOnClickSelectable($"0x{_lastStateChangeActor:X}"); ImUtf8.CopyOnClickSelectable($"0x{_lastStateChangeActor:X}");
} }
ImGui.SameLine(); Im.Line.Same();
ImUtf8.Text($"at {_lastStateChangeTime.ToLocalTime().TimeOfDay}"); ImUtf8.Text($"at {_lastStateChangeTime.ToLocalTime().TimeOfDay}");
} }
@ -232,13 +233,13 @@ public class StateIpcTester : IUiService, IDisposable
ImUtf8.Text(_lastStateFinalizeName.Span); ImUtf8.Text(_lastStateFinalizeName.Span);
ImGui.SameLine(0, 0); ImGui.SameLine(0, 0);
ImUtf8.Text($" ({_lastStateFinalizeType})"); ImUtf8.Text($" ({_lastStateFinalizeType})");
ImGui.SameLine(); Im.Line.Same();
using (ImRaii.PushFont(UiBuilder.MonoFont)) using (ImRaii.PushFont(UiBuilder.MonoFont))
{ {
ImUtf8.CopyOnClickSelectable($"0x{_lastStateFinalizeActor:X}"); ImUtf8.CopyOnClickSelectable($"0x{_lastStateFinalizeActor:X}");
} }
ImGui.SameLine(); Im.Line.Same();
ImUtf8.Text($"at {_lastStateFinalizeTime.ToLocalTime().TimeOfDay}"); ImUtf8.Text($"at {_lastStateFinalizeTime.ToLocalTime().TimeOfDay}");
} }

View file

@ -3,6 +3,7 @@ using Glamourer.GameData;
using Glamourer.Interop; using Glamourer.Interop;
using Glamourer.Interop.Structs; using Glamourer.Interop.Structs;
using Dalamud.Bindings.ImGui; using Dalamud.Bindings.ImGui;
using ImSharp;
using OtterGui; using OtterGui;
using OtterGui.Raii; using OtterGui.Raii;
using OtterGui.Text; using OtterGui.Text;
@ -129,10 +130,10 @@ public sealed unsafe class ModelEvaluationPanel(
if (ImGui.SmallButton("Set True")) if (ImGui.SmallButton("Set True"))
visorService.SetVisorState(model, true); visorService.SetVisorState(model, true);
ImGui.SameLine(); Im.Line.Same();
if (ImGui.SmallButton("Set False")) if (ImGui.SmallButton("Set False"))
visorService.SetVisorState(model, false); visorService.SetVisorState(model, false);
ImGui.SameLine(); Im.Line.Same();
if (ImGui.SmallButton("Toggle")) if (ImGui.SmallButton("Toggle"))
visorService.SetVisorState(model, !VisorService.GetVisorState(model)); visorService.SetVisorState(model, !VisorService.GetVisorState(model));
} }
@ -149,10 +150,10 @@ public sealed unsafe class ModelEvaluationPanel(
if (ImGui.SmallButton("Set True")) if (ImGui.SmallButton("Set True"))
vieraEarService.SetVieraEarState(model, true); vieraEarService.SetVieraEarState(model, true);
ImGui.SameLine(); Im.Line.Same();
if (ImGui.SmallButton("Set False")) if (ImGui.SmallButton("Set False"))
vieraEarService.SetVieraEarState(model, false); vieraEarService.SetVieraEarState(model, false);
ImGui.SameLine(); Im.Line.Same();
if (ImGui.SmallButton("Toggle")) if (ImGui.SmallButton("Toggle"))
vieraEarService.SetVieraEarState(model, !model.VieraEarsVisible); vieraEarService.SetVieraEarState(model, !model.VieraEarsVisible);
} }
@ -173,10 +174,10 @@ public sealed unsafe class ModelEvaluationPanel(
if (ImGui.SmallButton("Hide")) if (ImGui.SmallButton("Hide"))
updateSlotService.UpdateEquipSlot(model, EquipSlot.Head, CharacterArmor.Empty); updateSlotService.UpdateEquipSlot(model, EquipSlot.Head, CharacterArmor.Empty);
ImGui.SameLine(); Im.Line.Same();
if (ImGui.SmallButton("Show")) if (ImGui.SmallButton("Show"))
updateSlotService.UpdateEquipSlot(model, EquipSlot.Head, actor.GetArmor(EquipSlot.Head)); updateSlotService.UpdateEquipSlot(model, EquipSlot.Head, actor.GetArmor(EquipSlot.Head));
ImGui.SameLine(); Im.Line.Same();
if (ImGui.SmallButton("Toggle")) if (ImGui.SmallButton("Toggle"))
updateSlotService.UpdateEquipSlot(model, EquipSlot.Head, updateSlotService.UpdateEquipSlot(model, EquipSlot.Head,
model.AsHuman->Head.Value == 0 ? actor.GetArmor(EquipSlot.Head) : CharacterArmor.Empty); model.AsHuman->Head.Value == 0 ? actor.GetArmor(EquipSlot.Head) : CharacterArmor.Empty);
@ -226,10 +227,10 @@ public sealed unsafe class ModelEvaluationPanel(
if (ImGui.SmallButton("GPose On")) if (ImGui.SmallButton("GPose On"))
actor.IsGPoseWet = true; actor.IsGPoseWet = true;
ImGui.SameLine(); Im.Line.Same();
if (ImGui.SmallButton("GPose Off")) if (ImGui.SmallButton("GPose Off"))
actor.IsGPoseWet = false; actor.IsGPoseWet = false;
ImGui.SameLine(); Im.Line.Same();
if (ImGui.SmallButton("GPose Toggle")) if (ImGui.SmallButton("GPose Toggle"))
actor.IsGPoseWet = !actor.IsGPoseWet; actor.IsGPoseWet = !actor.IsGPoseWet;
} }
@ -250,10 +251,10 @@ public sealed unsafe class ModelEvaluationPanel(
if (ImGui.SmallButton("Change Piece")) if (ImGui.SmallButton("Change Piece"))
updateSlotService.UpdateArmor(model, slot, updateSlotService.UpdateArmor(model, slot,
new CharacterArmor((PrimaryId)(slot == EquipSlot.Hands ? 6064 : slot == EquipSlot.Head ? 6072 : 1), 1, StainIds.None)); new CharacterArmor((PrimaryId)(slot == EquipSlot.Hands ? 6064 : slot == EquipSlot.Head ? 6072 : 1), 1, StainIds.None));
ImGui.SameLine(); Im.Line.Same();
if (ImGui.SmallButton("Change Stain")) if (ImGui.SmallButton("Change Stain"))
updateSlotService.UpdateStain(model, slot, new StainIds(5, 7)); updateSlotService.UpdateStain(model, slot, new StainIds(5, 7));
ImGui.SameLine(); Im.Line.Same();
if (ImGui.SmallButton("Reset")) if (ImGui.SmallButton("Reset"))
updateSlotService.UpdateEquipSlot(model, slot, actor.GetArmor(slot)); updateSlotService.UpdateEquipSlot(model, slot, actor.GetArmor(slot));
} }
@ -314,7 +315,7 @@ public sealed unsafe class ModelEvaluationPanel(
changeCustomizeService.UpdateCustomize(model, modelCustomize); changeCustomizeService.UpdateCustomize(model, modelCustomize);
} }
ImGui.SameLine(); Im.Line.Same();
if (ImGui.SmallButton("--")) if (ImGui.SmallButton("--"))
{ {
var value = modelCustomize[type].Value; var value = modelCustomize[type].Value;
@ -325,7 +326,7 @@ public sealed unsafe class ModelEvaluationPanel(
changeCustomizeService.UpdateCustomize(model, modelCustomize); changeCustomizeService.UpdateCustomize(model, modelCustomize);
} }
ImGui.SameLine(); Im.Line.Same();
if (ImGui.SmallButton("Reset")) if (ImGui.SmallButton("Reset"))
{ {
modelCustomize.Set(type, actorCustomize[type]); modelCustomize.Set(type, actorCustomize[type]);

View file

@ -1,6 +1,7 @@
using Dalamud.Interface.Utility; using Dalamud.Interface.Utility;
using Glamourer.Interop.Penumbra; using Glamourer.Interop.Penumbra;
using Dalamud.Bindings.ImGui; using Dalamud.Bindings.ImGui;
using ImSharp;
using OtterGui; using OtterGui;
using OtterGui.Raii; using OtterGui.Raii;
using Penumbra.Api.Enums; using Penumbra.Api.Enums;
@ -33,7 +34,7 @@ public sealed class PenumbraPanel(PenumbraService penumbra, PenumbraChangedItemT
ImGui.TableNextColumn(); ImGui.TableNextColumn();
if (ImGui.SmallButton("Unattach")) if (ImGui.SmallButton("Unattach"))
penumbra.Unattach(); penumbra.Unattach();
ImGui.SameLine(); Im.Line.Same();
if (ImGui.SmallButton("Reattach")) if (ImGui.SmallButton("Reattach"))
penumbra.Reattach(); penumbra.Reattach();

View file

@ -135,7 +135,7 @@ public class DesignDetailTab
if (ImUtf8.RadioButton("Display##qdb"u8, _selector.Selected.QuickDesign)) if (ImUtf8.RadioButton("Display##qdb"u8, _selector.Selected.QuickDesign))
_manager.SetQuickDesign(_selector.Selected!, true); _manager.SetQuickDesign(_selector.Selected!, true);
var hovered = ImGui.IsItemHovered(); var hovered = ImGui.IsItemHovered();
ImGui.SameLine(); Im.Line.Same();
if (ImUtf8.RadioButton("Hide##qdb"u8, !_selector.Selected.QuickDesign)) if (ImUtf8.RadioButton("Hide##qdb"u8, !_selector.Selected.QuickDesign))
_manager.SetQuickDesign(_selector.Selected!, false); _manager.SetQuickDesign(_selector.Selected!, false);
if (hovered || ImGui.IsItemHovered()) if (hovered || ImGui.IsItemHovered())
@ -184,13 +184,13 @@ public class DesignDetailTab
if (_colors.TryGetValue(_selector.Selected!.Color, out var currentColor)) if (_colors.TryGetValue(_selector.Selected!.Color, out var currentColor))
{ {
ImGui.SameLine(); Im.Line.Same();
if (DesignColorUi.DrawColorButton($"Color associated with {_selector.Selected!.Color}", currentColor, out var newColor)) if (DesignColorUi.DrawColorButton($"Color associated with {_selector.Selected!.Color}", currentColor, out var newColor))
_colors.SetColor(_selector.Selected!.Color, newColor); _colors.SetColor(_selector.Selected!.Color, newColor);
} }
else if (_selector.Selected!.Color.Length != 0) else if (_selector.Selected!.Color.Length != 0)
{ {
ImGui.SameLine(); Im.Line.Same();
ImEx.Icon.Draw(LunaStyle.WarningIcon, _colors.MissingColor); ImEx.Icon.Draw(LunaStyle.WarningIcon, _colors.MissingColor);
Im.Tooltip.OnHover("The color associated with this design does not exist."u8); Im.Tooltip.OnHover("The color associated with this design does not exist."u8);
} }

View file

@ -26,7 +26,7 @@ public class DesignLinkDrawer(
public void Draw() public void Draw()
{ {
using var h = DesignPanelFlag.DesignLinks.Header(config); using var h = DesignPanelFlag.DesignLinks.Header(config);
if (h.Disposed) if (!h.Alive)
return; return;
ImGuiUtil.HoverTooltip( ImGuiUtil.HoverTooltip(
@ -185,7 +185,7 @@ public class DesignLinkDrawer(
linkManager.MoveDesignLink(selector.Selected!, selector.Selected!.Links.Before.Count - 1, LinkOrder.Before, 0, LinkOrder.Before); linkManager.MoveDesignLink(selector.Selected!, selector.Selected!.Links.Before.Count - 1, LinkOrder.Before, 0, LinkOrder.Before);
} }
ImGui.SameLine(); Im.Line.Same();
if (ImGuiUtil.DrawDisabledButton(FontAwesomeIcon.ArrowCircleDown.ToIconString(), buttonSize, ttAfter, !canAddAfter, true)) if (ImGuiUtil.DrawDisabledButton(FontAwesomeIcon.ArrowCircleDown.ToIconString(), buttonSize, ttAfter, !canAddAfter, true))
linkManager.AddDesignLink(selector.Selected!, design!, LinkOrder.After); linkManager.AddDesignLink(selector.Selected!, design!, LinkOrder.After);
} }
@ -227,16 +227,16 @@ public class DesignLinkDrawer(
ImGuiUtil.HoverTooltip("Toggle all application modes at once."); ImGuiUtil.HoverTooltip("Toggle all application modes at once.");
ImGui.SameLine(); Im.Line.Same();
Box(0); Box(0);
ImGui.SameLine(); Im.Line.Same();
Box(1); Box(1);
ImGui.SameLine(); Im.Line.Same();
Box(2); Box(2);
ImGui.SameLine(); Im.Line.Same();
Box(3); Box(3);
ImGui.SameLine(); Im.Line.Same();
Box(4); Box(4);
if (newType != current) if (newType != current)
linkManager.ChangeApplicationType(selector.Selected!, idx, order, newType); linkManager.ChangeApplicationType(selector.Selected!, idx, order, newType);

View file

@ -13,6 +13,7 @@ using Glamourer.Gui.Materials;
using Glamourer.Interop; using Glamourer.Interop;
using Glamourer.State; using Glamourer.State;
using Dalamud.Bindings.ImGui; using Dalamud.Bindings.ImGui;
using ImSharp;
using Luna; using Luna;
using OtterGui; using OtterGui;
using OtterGui.Raii; using OtterGui.Raii;
@ -141,21 +142,21 @@ public class DesignPanel
EquipmentDrawer.DrawMetaToggle(ToggleDrawData.CrestFromDesign(CrestFlag.Head, _manager, _selector.Selected!)); EquipmentDrawer.DrawMetaToggle(ToggleDrawData.CrestFromDesign(CrestFlag.Head, _manager, _selector.Selected!));
} }
ImGui.SameLine(); Im.Line.Same();
using (var _ = ImRaii.Group()) using (var _ = ImRaii.Group())
{ {
EquipmentDrawer.DrawMetaToggle(ToggleDrawData.FromDesign(MetaIndex.VisorState, _manager, _selector.Selected!)); EquipmentDrawer.DrawMetaToggle(ToggleDrawData.FromDesign(MetaIndex.VisorState, _manager, _selector.Selected!));
EquipmentDrawer.DrawMetaToggle(ToggleDrawData.CrestFromDesign(CrestFlag.Body, _manager, _selector.Selected!)); EquipmentDrawer.DrawMetaToggle(ToggleDrawData.CrestFromDesign(CrestFlag.Body, _manager, _selector.Selected!));
} }
ImGui.SameLine(); Im.Line.Same();
using (var _ = ImRaii.Group()) using (var _ = ImRaii.Group())
{ {
EquipmentDrawer.DrawMetaToggle(ToggleDrawData.FromDesign(MetaIndex.WeaponState, _manager, _selector.Selected!)); EquipmentDrawer.DrawMetaToggle(ToggleDrawData.FromDesign(MetaIndex.WeaponState, _manager, _selector.Selected!));
EquipmentDrawer.DrawMetaToggle(ToggleDrawData.CrestFromDesign(CrestFlag.OffHand, _manager, _selector.Selected!)); EquipmentDrawer.DrawMetaToggle(ToggleDrawData.CrestFromDesign(CrestFlag.OffHand, _manager, _selector.Selected!));
} }
ImGui.SameLine(); Im.Line.Same();
using (var _ = ImRaii.Group()) using (var _ = ImRaii.Group())
{ {
EquipmentDrawer.DrawMetaToggle(ToggleDrawData.FromDesign(MetaIndex.EarState, _manager, _selector.Selected!)); EquipmentDrawer.DrawMetaToggle(ToggleDrawData.FromDesign(MetaIndex.EarState, _manager, _selector.Selected!));
@ -338,7 +339,7 @@ public class DesignPanel
if (!enabled) if (!enabled)
ImUtf8.HoverTooltip(ImGuiHoveredFlags.AllowWhenDisabled, $"Hold {_config.DeleteDesignModifier} while clicking."); ImUtf8.HoverTooltip(ImGuiHoveredFlags.AllowWhenDisabled, $"Hold {_config.DeleteDesignModifier} while clicking.");
ImGui.SameLine(); Im.Line.Same();
if (ImUtf8.ButtonEx("Enable Everything"u8, if (ImUtf8.ButtonEx("Enable Everything"u8,
"Enable application of everything, including any existing advanced dyes, advanced customizations, crests and wetness."u8, size, "Enable application of everything, including any existing advanced dyes, advanced customizations, crests and wetness."u8, size,
!enabled)) !enabled))
@ -361,7 +362,7 @@ public class DesignPanel
if (!enabled) if (!enabled)
ImUtf8.HoverTooltip(ImGuiHoveredFlags.AllowWhenDisabled, $"Hold {_config.DeleteDesignModifier} while clicking."); ImUtf8.HoverTooltip(ImGuiHoveredFlags.AllowWhenDisabled, $"Hold {_config.DeleteDesignModifier} while clicking.");
ImGui.SameLine(); Im.Line.Same();
if (ImUtf8.ButtonEx("Customization Only"u8, if (ImUtf8.ButtonEx("Customization Only"u8,
"Enable application of anything related to customization, disable anything that is not related to customization."u8, size, "Enable application of anything related to customization, disable anything that is not related to customization."u8, size,
!enabled)) !enabled))
@ -385,7 +386,7 @@ public class DesignPanel
if (!enabled) if (!enabled)
ImUtf8.HoverTooltip(ImGuiHoveredFlags.AllowWhenDisabled, $"Hold {_config.DeleteDesignModifier} while clicking."); ImUtf8.HoverTooltip(ImGuiHoveredFlags.AllowWhenDisabled, $"Hold {_config.DeleteDesignModifier} while clicking.");
ImGui.SameLine(); Im.Line.Same();
if (ImUtf8.ButtonEx("Disable Advanced"u8, "Disable all advanced dyes and customizations but keep everything else as is."u8, if (ImUtf8.ButtonEx("Disable Advanced"u8, "Disable all advanced dyes and customizations but keep everything else as is."u8,
size, size,
!enabled)) !enabled))
@ -530,11 +531,11 @@ public class DesignPanel
private void DrawButtonRow() private void DrawButtonRow()
{ {
DrawApplyToSelf(); DrawApplyToSelf();
ImGui.SameLine(); Im.Line.Same();
DrawApplyToTarget(); DrawApplyToTarget();
ImGui.SameLine(); Im.Line.Same();
_modAssociations.DrawApplyButton(); _modAssociations.DrawApplyButton();
ImGui.SameLine(); Im.Line.Same();
DrawSaveToDat(); DrawSaveToDat();
} }

View file

@ -2,6 +2,7 @@
using Glamourer.Designs; using Glamourer.Designs;
using Glamourer.Interop; using Glamourer.Interop;
using Dalamud.Bindings.ImGui; using Dalamud.Bindings.ImGui;
using ImSharp;
using Luna; using Luna;
namespace Glamourer.Gui.Tabs.DesignTab; namespace Glamourer.Gui.Tabs.DesignTab;
@ -21,7 +22,7 @@ public class DesignTab(DesignFileSystemSelector selector, DesignPanel panel, Imp
Glamourer.Messager.NotificationMessage($"Imported Anamnesis .chara file {name} as new design {newDesign.Name}", NotificationType.Success, false); Glamourer.Messager.NotificationMessage($"Imported Anamnesis .chara file {name} as new design {newDesign.Name}", NotificationType.Success, false);
} }
ImGui.SameLine(); Im.Line.Same();
panel.Draw(); panel.Draw();
importService.CreateCharaSource(); importService.CreateCharaSource();
} }

View file

@ -6,6 +6,7 @@ using Glamourer.Designs;
using Glamourer.Interop.Penumbra; using Glamourer.Interop.Penumbra;
using Glamourer.State; using Glamourer.State;
using Dalamud.Bindings.ImGui; using Dalamud.Bindings.ImGui;
using ImSharp;
using Luna; using Luna;
using OtterGui; using OtterGui;
using OtterGui.Classes; using OtterGui.Classes;
@ -24,7 +25,7 @@ public class ModAssociationsTab(PenumbraService penumbra, DesignFileSystemSelect
public void Draw() public void Draw()
{ {
using var h = DesignPanelFlag.ModAssociations.Header(config); using var h = DesignPanelFlag.ModAssociations.Header(config);
if (h.Disposed) if (!h.Alive)
return; return;
ImGuiUtil.HoverTooltip( ImGuiUtil.HoverTooltip(
@ -46,7 +47,7 @@ public class ModAssociationsTab(PenumbraService penumbra, DesignFileSystemSelect
if (ImGui.Button("Copy All to Clipboard", size)) if (ImGui.Button("Copy All to Clipboard", size))
_copy = selector.Selected!.AssociatedMods.Select(kvp => (kvp.Key, kvp.Value)).ToArray(); _copy = selector.Selected!.AssociatedMods.Select(kvp => (kvp.Key, kvp.Value)).ToArray();
ImGui.SameLine(); Im.Line.Same();
if (ImGuiUtil.DrawDisabledButton("Add from Clipboard", size, if (ImGuiUtil.DrawDisabledButton("Add from Clipboard", size,
_copy != null _copy != null
@ -55,7 +56,7 @@ public class ModAssociationsTab(PenumbraService penumbra, DesignFileSystemSelect
foreach (var (mod, setting) in _copy!) foreach (var (mod, setting) in _copy!)
manager.UpdateMod(selector.Selected!, mod, setting); manager.UpdateMod(selector.Selected!, mod, setting);
ImGui.SameLine(); Im.Line.Same();
if (ImGuiUtil.DrawDisabledButton("Set from Clipboard", size, if (ImGuiUtil.DrawDisabledButton("Set from Clipboard", size,
_copy != null _copy != null

View file

@ -3,6 +3,7 @@ using Dalamud.Interface.Utility;
using Glamourer.Designs; using Glamourer.Designs;
using Glamourer.Interop.Material; using Glamourer.Interop.Material;
using Dalamud.Bindings.ImGui; using Dalamud.Bindings.ImGui;
using ImSharp;
using OtterGui.Extensions; using OtterGui.Extensions;
using OtterGui.Raii; using OtterGui.Raii;
using OtterGui.Text; using OtterGui.Text;
@ -159,7 +160,7 @@ public class MultiDesignPanel(
private float DrawMultiTagger(Vector2 width) private float DrawMultiTagger(Vector2 width)
{ {
ImUtf8.TextFrameAligned("Multi Tagger:"u8); ImUtf8.TextFrameAligned("Multi Tagger:"u8);
ImGui.SameLine(); Im.Line.Same();
var offset = ImGui.GetItemRectSize().X + ImGui.GetStyle().WindowPadding.X; var offset = ImGui.GetItemRectSize().X + ImGui.GetStyle().WindowPadding.X;
ImGui.SetNextItemWidth(ImGui.GetContentRegionAvail().X - 2 * (width.X + ImGui.GetStyle().ItemSpacing.X)); ImGui.SetNextItemWidth(ImGui.GetContentRegionAvail().X - 2 * (width.X + ImGui.GetStyle().ItemSpacing.X));
ImUtf8.InputText("##tag"u8, ref _tag, "Tag Name..."u8); ImUtf8.InputText("##tag"u8, ref _tag, "Tag Name..."u8);
@ -173,7 +174,7 @@ public class MultiDesignPanel(
? "No tag specified." ? "No tag specified."
: $"All designs selected already contain the tag \"{_tag}\"." : $"All designs selected already contain the tag \"{_tag}\"."
: $"Add the tag \"{_tag}\" to {_addDesigns.Count} designs as a local tag:\n\n\t{string.Join("\n\t", _addDesigns.Select(m => m.Name.Text))}"; : $"Add the tag \"{_tag}\" to {_addDesigns.Count} designs as a local tag:\n\n\t{string.Join("\n\t", _addDesigns.Select(m => m.Name.Text))}";
ImGui.SameLine(); Im.Line.Same();
if (ImUtf8.ButtonEx(label, tooltip, width, _addDesigns.Count == 0)) if (ImUtf8.ButtonEx(label, tooltip, width, _addDesigns.Count == 0))
foreach (var design in _addDesigns) foreach (var design in _addDesigns)
editor.AddTag(design, _tag); editor.AddTag(design, _tag);
@ -186,7 +187,7 @@ public class MultiDesignPanel(
? "No tag specified." ? "No tag specified."
: $"No selected design contains the tag \"{_tag}\" locally." : $"No selected design contains the tag \"{_tag}\" locally."
: $"Remove the local tag \"{_tag}\" from {_removeDesigns.Count} designs:\n\n\t{string.Join("\n\t", _removeDesigns.Select(m => m.Item1.Name.Text))}"; : $"Remove the local tag \"{_tag}\" from {_removeDesigns.Count} designs:\n\n\t{string.Join("\n\t", _removeDesigns.Select(m => m.Item1.Name.Text))}";
ImGui.SameLine(); Im.Line.Same();
if (ImUtf8.ButtonEx(label, tooltip, width, _removeDesigns.Count == 0)) if (ImUtf8.ButtonEx(label, tooltip, width, _removeDesigns.Count == 0))
foreach (var (design, index) in _removeDesigns) foreach (var (design, index) in _removeDesigns)
editor.RemoveTag(design, index); editor.RemoveTag(design, index);
@ -209,7 +210,7 @@ public class MultiDesignPanel(
editor.SetQuickDesign(design.Value, true); editor.SetQuickDesign(design.Value, true);
} }
ImGui.SameLine(); Im.Line.Same();
tt = _numQuickDesignEnabled == 0 tt = _numQuickDesignEnabled == 0
? $"All {_numDesigns} selected designs are already hidden in the quick design bar." ? $"All {_numDesigns} selected designs are already hidden in the quick design bar."
: $"Hide all {_numDesigns} selected designs in the quick design bar. Changes {_numQuickDesignEnabled} designs."; : $"Hide all {_numDesigns} selected designs in the quick design bar. Changes {_numQuickDesignEnabled} designs.";
@ -235,7 +236,7 @@ public class MultiDesignPanel(
foreach (var design in selector.SelectedPaths.OfType<DesignFileSystem.Leaf>()) foreach (var design in selector.SelectedPaths.OfType<DesignFileSystem.Leaf>())
editor.SetWriteProtection(design.Value, true); editor.SetWriteProtection(design.Value, true);
ImGui.SameLine(); Im.Line.Same();
tt = _numDesignsLocked == 0 tt = _numDesignsLocked == 0
? $"None of the {_numDesigns} selected designs are write-protected." ? $"None of the {_numDesigns} selected designs are write-protected."
: $"Remove the write protection of the {_numDesigns} selected designs. Changes {_numDesignsLocked} designs."; : $"Remove the write protection of the {_numDesigns} selected designs. Changes {_numDesignsLocked} designs.";
@ -258,7 +259,7 @@ public class MultiDesignPanel(
foreach (var design in selector.SelectedPaths.OfType<DesignFileSystem.Leaf>()) foreach (var design in selector.SelectedPaths.OfType<DesignFileSystem.Leaf>())
editor.ChangeResetTemporarySettings(design.Value, true); editor.ChangeResetTemporarySettings(design.Value, true);
ImGui.SameLine(); Im.Line.Same();
tt = _numDesignsResetSettings == 0 tt = _numDesignsResetSettings == 0
? $"None of the {_numDesigns} selected designs reset temporary settings." ? $"None of the {_numDesigns} selected designs reset temporary settings."
: $"Stop all {_numDesigns} selected designs from resetting temporary settings. Changes {_numDesignsResetSettings} designs."; : $"Stop all {_numDesigns} selected designs from resetting temporary settings. Changes {_numDesignsResetSettings} designs.";
@ -281,7 +282,7 @@ public class MultiDesignPanel(
foreach (var design in selector.SelectedPaths.OfType<DesignFileSystem.Leaf>()) foreach (var design in selector.SelectedPaths.OfType<DesignFileSystem.Leaf>())
editor.ChangeResetAdvancedDyes(design.Value, true); editor.ChangeResetAdvancedDyes(design.Value, true);
ImGui.SameLine(); Im.Line.Same();
tt = _numDesignsLocked == 0 tt = _numDesignsLocked == 0
? $"None of the {_numDesigns} selected designs reset advanced dyes." ? $"None of the {_numDesigns} selected designs reset advanced dyes."
: $"Stop all {_numDesigns} selected designs from resetting advanced dyes. Changes {_numDesignsResetDyes} designs."; : $"Stop all {_numDesigns} selected designs from resetting advanced dyes. Changes {_numDesignsResetDyes} designs.";
@ -304,7 +305,7 @@ public class MultiDesignPanel(
foreach (var design in selector.SelectedPaths.OfType<DesignFileSystem.Leaf>()) foreach (var design in selector.SelectedPaths.OfType<DesignFileSystem.Leaf>())
editor.ChangeForcedRedraw(design.Value, true); editor.ChangeForcedRedraw(design.Value, true);
ImGui.SameLine(); Im.Line.Same();
tt = _numDesignsLocked == 0 tt = _numDesignsLocked == 0
? $"None of the {_numDesigns} selected designs force redraws." ? $"None of the {_numDesigns} selected designs force redraws."
: $"Stop all {_numDesigns} selected designs from forcing redraws. Changes {_numDesignsForcedRedraw} designs."; : $"Stop all {_numDesigns} selected designs from forcing redraws. Changes {_numDesignsForcedRedraw} designs.";
@ -333,7 +334,7 @@ public class MultiDesignPanel(
_ => $"All designs selected are already set to the color \"{_colorCombo.CurrentSelection}\".", _ => $"All designs selected are already set to the color \"{_colorCombo.CurrentSelection}\".",
} }
: $"Set the color of {_addDesigns.Count} designs to \"{_colorCombo.CurrentSelection}\"\n\n\t{string.Join("\n\t", _addDesigns.Select(m => m.Name.Text))}"; : $"Set the color of {_addDesigns.Count} designs to \"{_colorCombo.CurrentSelection}\"\n\n\t{string.Join("\n\t", _addDesigns.Select(m => m.Name.Text))}";
ImGui.SameLine(); Im.Line.Same();
if (ImUtf8.ButtonEx(label, tooltip, width, _addDesigns.Count == 0)) if (ImUtf8.ButtonEx(label, tooltip, width, _addDesigns.Count == 0))
{ {
foreach (var design in _addDesigns) foreach (var design in _addDesigns)
@ -346,7 +347,7 @@ public class MultiDesignPanel(
tooltip = _removeDesigns.Count == 0 tooltip = _removeDesigns.Count == 0
? "No selected design is set to a non-automatic color." ? "No selected design is set to a non-automatic color."
: $"Set {_removeDesigns.Count} designs to use automatic color again:\n\n\t{string.Join("\n\t", _removeDesigns.Select(m => m.Item1.Name.Text))}"; : $"Set {_removeDesigns.Count} designs to use automatic color again:\n\n\t{string.Join("\n\t", _removeDesigns.Select(m => m.Item1.Name.Text))}";
ImGui.SameLine(); Im.Line.Same();
if (ImUtf8.ButtonEx(label, tooltip, width, _removeDesigns.Count == 0)) if (ImUtf8.ButtonEx(label, tooltip, width, _removeDesigns.Count == 0))
{ {
foreach (var (design, _) in _removeDesigns) foreach (var (design, _) in _removeDesigns)
@ -399,7 +400,7 @@ public class MultiDesignPanel(
if (!enabled) if (!enabled)
ImUtf8.HoverTooltip(ImGuiHoveredFlags.AllowWhenDisabled, $"Hold {config.DeleteDesignModifier} while clicking."); ImUtf8.HoverTooltip(ImGuiHoveredFlags.AllowWhenDisabled, $"Hold {config.DeleteDesignModifier} while clicking.");
ImGui.SameLine(); Im.Line.Same();
if (ImUtf8.ButtonEx("Enable Everything"u8, if (ImUtf8.ButtonEx("Enable Everything"u8,
_numDesigns > 0 _numDesigns > 0
? $"Enable application of everything, including any existing advanced dyes, advanced customizations, crests and wetness for all {_numDesigns} designs." ? $"Enable application of everything, including any existing advanced dyes, advanced customizations, crests and wetness for all {_numDesigns} designs."
@ -424,7 +425,7 @@ public class MultiDesignPanel(
if (!enabled) if (!enabled)
ImUtf8.HoverTooltip(ImGuiHoveredFlags.AllowWhenDisabled, $"Hold {config.DeleteDesignModifier} while clicking."); ImUtf8.HoverTooltip(ImGuiHoveredFlags.AllowWhenDisabled, $"Hold {config.DeleteDesignModifier} while clicking.");
ImGui.SameLine(); Im.Line.Same();
if (ImUtf8.ButtonEx("Customization Only"u8, if (ImUtf8.ButtonEx("Customization Only"u8,
_numDesigns > 0 _numDesigns > 0
? $"Enable application of anything related to customization, disable anything that is not related to customization for all {_numDesigns} designs." ? $"Enable application of anything related to customization, disable anything that is not related to customization for all {_numDesigns} designs."
@ -450,7 +451,7 @@ public class MultiDesignPanel(
if (!enabled) if (!enabled)
ImUtf8.HoverTooltip(ImGuiHoveredFlags.AllowWhenDisabled, $"Hold {config.DeleteDesignModifier} while clicking."); ImUtf8.HoverTooltip(ImGuiHoveredFlags.AllowWhenDisabled, $"Hold {config.DeleteDesignModifier} while clicking.");
ImGui.SameLine(); Im.Line.Same();
if (ImUtf8.ButtonEx("Disable Advanced"u8, _numDesigns > 0 if (ImUtf8.ButtonEx("Disable Advanced"u8, _numDesigns > 0
? $"Disable all advanced dyes and customizations but keep everything else as is for all {_numDesigns} designs." ? $"Disable all advanced dyes and customizations but keep everything else as is for all {_numDesigns} designs."
: "No designs selected.", width, !enabled)) : "No designs selected.", width, !enabled))

View file

@ -1,6 +1,7 @@
using Dalamud.Interface; using Dalamud.Interface;
using Dalamud.Interface.Utility; using Dalamud.Interface.Utility;
using Dalamud.Bindings.ImGui; using Dalamud.Bindings.ImGui;
using ImSharp;
using OtterGui; using OtterGui;
using OtterGui.Raii; using OtterGui.Raii;
@ -88,7 +89,7 @@ public static class HeaderDrawer
foreach (var button in leftButtons.Where(b => b.Visible)) foreach (var button in leftButtons.Where(b => b.Visible))
{ {
button.Draw(width); button.Draw(width);
ImGui.SameLine(); Im.Line.Same();
leftButtonSize += width; leftButtonSize += width;
} }
@ -106,7 +107,7 @@ public static class HeaderDrawer
foreach (var button in rightButtons.Where(b => b.Visible)) foreach (var button in rightButtons.Where(b => b.Visible))
{ {
ImGui.SameLine(); Im.Line.Same();
button.Draw(width); button.Draw(width);
} }
} }

View file

@ -138,7 +138,7 @@ public class NpcPanel
private void DrawButtonRow() private void DrawButtonRow()
{ {
DrawApplyToSelf(); DrawApplyToSelf();
ImGui.SameLine(); Im.Line.Same();
DrawApplyToTarget(); DrawApplyToTarget();
} }
@ -277,13 +277,13 @@ public class NpcPanel
if (_colors.TryGetValue(color, out var currentColor)) if (_colors.TryGetValue(color, out var currentColor))
{ {
ImGui.SameLine(); Im.Line.Same();
if (DesignColorUi.DrawColorButton($"Color associated with {color}", currentColor, out var newColor)) if (DesignColorUi.DrawColorButton($"Color associated with {color}", currentColor, out var newColor))
_colors.SetColor(color, newColor); _colors.SetColor(color, newColor);
} }
else if (color.Length is not 0) else if (color.Length is not 0)
{ {
ImGui.SameLine(); Im.Line.Same();
var size = new Vector2(ImGui.GetFrameHeight()); var size = new Vector2(ImGui.GetFrameHeight());
using var font = ImRaii.PushFont(UiBuilder.IconFont); using var font = ImRaii.PushFont(UiBuilder.IconFont);
ImEx.TextFramed(LunaStyle.WarningIcon.Span, size, _colors.MissingColor); ImEx.TextFramed(LunaStyle.WarningIcon.Span, size, _colors.MissingColor);

View file

@ -1,5 +1,6 @@
using Dalamud.Interface.Utility; using Dalamud.Interface.Utility;
using Dalamud.Bindings.ImGui; using Dalamud.Bindings.ImGui;
using ImSharp;
using OtterGui.Widgets; using OtterGui.Widgets;
namespace Glamourer.Gui.Tabs.NpcTab; namespace Glamourer.Gui.Tabs.NpcTab;
@ -12,7 +13,7 @@ public class NpcTab(NpcSelector _selector, NpcPanel _panel) : ITab
public void DrawContent() public void DrawContent()
{ {
_selector.Draw(200 * ImGuiHelpers.GlobalScale); _selector.Draw(200 * ImGuiHelpers.GlobalScale);
ImGui.SameLine(); Im.Line.Same();
_panel.Draw(); _panel.Draw();
} }
} }

View file

@ -2,6 +2,7 @@
using Glamourer.Services; using Glamourer.Services;
using Glamourer.State; using Glamourer.State;
using Dalamud.Bindings.ImGui; using Dalamud.Bindings.ImGui;
using ImSharp;
using Luna; using Luna;
using OtterGui.Filesystem; using OtterGui.Filesystem;
using OtterGui.Raii; using OtterGui.Raii;
@ -49,7 +50,7 @@ public class CodeDrawer(Configuration config, CodeService codeService, FunModule
_currentCode = string.Empty; _currentCode = string.Empty;
} }
ImGui.SameLine(); Im.Line.Same();
ImUtf8.Icon(FontAwesomeIcon.ExclamationCircle, ImGui.GetColorU32(ImGuiCol.TextDisabled)); ImUtf8.Icon(FontAwesomeIcon.ExclamationCircle, ImGui.GetColorU32(ImGuiCol.TextDisabled));
DrawTooltip(); DrawTooltip();
} }
@ -62,7 +63,7 @@ public class CodeDrawer(Configuration config, CodeService codeService, FunModule
ImUtf8.HoverTooltip( ImUtf8.HoverTooltip(
"Copy your characters actual current appearance including cheat codes or holiday events to the clipboard as a design."u8); "Copy your characters actual current appearance including cheat codes or holiday events to the clipboard as a design."u8);
ImGui.SameLine(); Im.Line.Same();
if (ImUtf8.Button("Who is that!?!"u8, buttonSize)) if (ImUtf8.Button("Who is that!?!"u8, buttonSize))
funModule.WhoIsThat(); funModule.WhoIsThat();
@ -102,7 +103,7 @@ public class CodeDrawer(Configuration config, CodeService codeService, FunModule
} }
var hovered = ImGui.IsItemHovered(); var hovered = ImGui.IsItemHovered();
ImGui.SameLine(); Im.Line.Same();
ImUtf8.Selectable(code, false); ImUtf8.Selectable(code, false);
hovered |= ImGui.IsItemHovered(); hovered |= ImGui.IsItemHovered();
DrawSource(i, code); DrawSource(i, code);

View file

@ -1,11 +1,13 @@
using Dalamud.Interface; using Dalamud.Interface;
using Glamourer.Interop.Penumbra; using Glamourer.Interop.Penumbra;
using Dalamud.Bindings.ImGui; using Dalamud.Bindings.ImGui;
using ImSharp;
using Luna; using Luna;
using OtterGui; using OtterGui;
using OtterGui.Raii; using OtterGui.Raii;
using OtterGui.Widgets; using OtterGui.Widgets;
using Logger = OtterGui.Log.Logger; using Logger = OtterGui.Log.Logger;
using MouseWheelType = OtterGui.Widgets.MouseWheelType;
namespace Glamourer.Gui.Tabs.SettingsTab; namespace Glamourer.Gui.Tabs.SettingsTab;
@ -24,7 +26,7 @@ public sealed class CollectionCombo(Configuration config, PenumbraService penumb
} }
var ret = ImGui.Selectable(name, selected); var ret = ImGui.Selectable(name, selected);
ImGui.SameLine(); Im.Line.Same();
using (ImRaii.PushFont(UiBuilder.MonoFont)) using (ImRaii.PushFont(UiBuilder.MonoFont))
{ {
using var color = ImRaii.PushColor(ImGuiCol.Text, ImGui.GetColorU32(ImGuiCol.TextDisabled)); using var color = ImRaii.PushColor(ImGuiCol.Text, ImGui.GetColorU32(ImGuiCol.TextDisabled));

View file

@ -126,7 +126,7 @@ public class SettingsTab(
"Add the actor's glamourer state when a PCP is created by Penumbra, and create a design and apply it if possible when a PCP is installed by Penumbra."u8, "Add the actor's glamourer state when a PCP is created by Penumbra, and create a design and apply it if possible when a PCP is installed by Penumbra."u8,
config.AttachToPcp, pcpService.Set); config.AttachToPcp, pcpService.Set);
var active = config.DeleteDesignModifier.IsActive(); var active = config.DeleteDesignModifier.IsActive();
ImGui.SameLine(); Im.Line.Same();
if (ImUtf8.ButtonEx("Delete all PCP Designs"u8, "Deletes all designs tagged with 'PCP' from the design list."u8, disabled: !active)) if (ImUtf8.ButtonEx("Delete all PCP Designs"u8, "Deletes all designs tagged with 'PCP' from the design list."u8, disabled: !active))
pcpService.CleanPcpDesigns(); pcpService.CleanPcpDesigns();
if (!active) if (!active)
@ -371,7 +371,7 @@ public class SettingsTab(
if (!config.ShowPalettePlusImport) if (!config.ShowPalettePlusImport)
return; return;
ImGui.SameLine(); Im.Line.Same();
if (ImUtf8.Button("Import Palette+ to Designs"u8)) if (ImUtf8.Button("Import Palette+ to Designs"u8))
paletteImport.ImportDesigns(); paletteImport.ImportDesigns();
ImUtf8.HoverTooltip( ImUtf8.HoverTooltip(
@ -416,7 +416,7 @@ public class SettingsTab(
config.Save(); config.Save();
} }
ImGui.SameLine(); Im.Line.Same();
ImUtf8.LabeledHelpMarker(label, tooltip); ImUtf8.LabeledHelpMarker(label, tooltip);
} }
@ -431,7 +431,7 @@ public class SettingsTab(
config.Ephemeral.Save(); config.Ephemeral.Save();
} }
ImGui.SameLine(); Im.Line.Same();
ImUtf8.LabeledHelpMarker(label, tooltip); ImUtf8.LabeledHelpMarker(label, tooltip);
} }
@ -479,11 +479,11 @@ public class SettingsTab(
} }
} }
ImGui.SameLine(); Im.Line.Same();
const string tt = const string tt =
"Select which of the two renaming input fields are visible when opening the right-click context menu of a design in the design selector."; "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); ImGuiComponents.HelpMarker(tt);
ImGui.SameLine(); Im.Line.Same();
ImUtf8.Text("Rename Fields in Design Context Menu"u8); ImUtf8.Text("Rename Fields in Design Context Menu"u8);
ImUtf8.HoverTooltip(tt); ImUtf8.HoverTooltip(tt);
} }
@ -504,10 +504,10 @@ public class SettingsTab(
} }
} }
ImGui.SameLine(); Im.Line.Same();
const string tt = "Select how to display the height of characters in real-world units, if at all."; const string tt = "Select how to display the height of characters in real-world units, if at all.";
ImGuiComponents.HelpMarker(tt); ImGuiComponents.HelpMarker(tt);
ImGui.SameLine(); Im.Line.Same();
ImUtf8.Text("Character Height Display Type"u8); ImUtf8.Text("Character Height Display Type"u8);
ImUtf8.HoverTooltip(tt); ImUtf8.HoverTooltip(tt);
} }

View file

@ -6,6 +6,7 @@ using Glamourer.Interop.Penumbra;
using Glamourer.Services; using Glamourer.Services;
using Glamourer.Unlocks; using Glamourer.Unlocks;
using Dalamud.Bindings.ImGui; using Dalamud.Bindings.ImGui;
using ImSharp;
using OtterGui.Raii; using OtterGui.Raii;
using OtterGui.Text; using OtterGui.Text;
using Penumbra.GameData.Enums; using Penumbra.GameData.Enums;
@ -84,7 +85,7 @@ public class UnlockOverview(
{ {
using var color = ImRaii.PushColor(ImGuiCol.Border, ImGui.GetColorU32(ImGuiCol.TableBorderStrong)); using var color = ImRaii.PushColor(ImGuiCol.Border, ImGui.GetColorU32(ImGuiCol.TableBorderStrong));
DrawSelector(); DrawSelector();
ImGui.SameLine(); Im.Line.Same();
DrawPanel(); DrawPanel();
} }
@ -143,7 +144,7 @@ public class UnlockOverview(
if (counter != iconsPerRow - 1) if (counter != iconsPerRow - 1)
{ {
ImGui.SameLine(); Im.Line.Same();
++counter; ++counter;
} }
else else
@ -172,7 +173,7 @@ public class UnlockOverview(
DrawItem(item); DrawItem(item);
if (counter != iconsPerRow - 1) if (counter != iconsPerRow - 1)
{ {
ImGui.SameLine(); Im.Line.Same();
++counter; ++counter;
} }
else else
@ -243,7 +244,7 @@ public class UnlockOverview(
DrawItem(value[idx]); DrawItem(value[idx]);
if (counter != iconsPerRow - 1) if (counter != iconsPerRow - 1)
{ {
ImGui.SameLine(); Im.Line.Same();
++counter; ++counter;
} }
else else

View file

@ -7,6 +7,7 @@ using Glamourer.Interop.Penumbra;
using Glamourer.Services; using Glamourer.Services;
using Glamourer.Unlocks; using Glamourer.Unlocks;
using Dalamud.Bindings.ImGui; using Dalamud.Bindings.ImGui;
using ImSharp;
using OtterGui; using OtterGui;
using OtterGui.Raii; using OtterGui.Raii;
using OtterGui.Table; using OtterGui.Table;
@ -192,7 +193,7 @@ public class UnlockTable : Table<EquipItem>, IDisposable
ImGuiUtil.HoverIcon(iconHandle, new Vector2(ImGui.GetFrameHeight())); ImGuiUtil.HoverIcon(iconHandle, new Vector2(ImGui.GetFrameHeight()));
else else
ImGui.Dummy(new Vector2(ImGui.GetFrameHeight())); ImGui.Dummy(new Vector2(ImGui.GetFrameHeight()));
ImGui.SameLine(); Im.Line.Same();
ImGui.AlignTextToFramePadding(); ImGui.AlignTextToFramePadding();
if (ImGui.Selectable(item.Name) && item.Id is { IsBonusItem: false, IsCustom: false }) if (ImGui.Selectable(item.Name) && item.Id is { IsBonusItem: false, IsCustom: false })
Glamourer.Messager.Chat.Print(new SeStringBuilder().AddItemLink(item.ItemId.Id, false).BuiltString); Glamourer.Messager.Chat.Print(new SeStringBuilder().AddItemLink(item.ItemId.Id, false).BuiltString);

View file

@ -1,6 +1,7 @@
using Dalamud.Interface; using Dalamud.Interface;
using Dalamud.Interface.Windowing; using Dalamud.Interface.Windowing;
using Dalamud.Bindings.ImGui; using Dalamud.Bindings.ImGui;
using ImSharp;
using OtterGui.Raii; using OtterGui.Raii;
using OtterGui; using OtterGui;
using OtterGui.Widgets; using OtterGui.Widgets;
@ -70,14 +71,14 @@ public class UnlocksTab : Window, ITab
if (ImGuiUtil.DrawDisabledButton("Overview Mode", buttonSize, "Show tinted icons of sets of unlocks.", !DetailMode)) if (ImGuiUtil.DrawDisabledButton("Overview Mode", buttonSize, "Show tinted icons of sets of unlocks.", !DetailMode))
DetailMode = false; DetailMode = false;
ImGui.SameLine(); Im.Line.Same();
if (ImGuiUtil.DrawDisabledButton("Detailed Mode", buttonSize, "Show all unlockable data as a combined filterable and sortable table.", if (ImGuiUtil.DrawDisabledButton("Detailed Mode", buttonSize, "Show all unlockable data as a combined filterable and sortable table.",
DetailMode)) DetailMode))
DetailMode = true; DetailMode = true;
if (DetailMode) if (DetailMode)
{ {
ImGui.SameLine(); Im.Line.Same();
if (ImGuiUtil.DrawDisabledButton(FontAwesomeIcon.Expand.ToIconString(), new Vector2(ImGui.GetFrameHeight()), if (ImGuiUtil.DrawDisabledButton(FontAwesomeIcon.Expand.ToIconString(), new Vector2(ImGui.GetFrameHeight()),
"Restore all columns to their original size.", false, true)) "Restore all columns to their original size.", false, true))
_table.Flags &= ~ImGuiTableFlags.Resizable; _table.Flags &= ~ImGuiTableFlags.Resizable;
@ -85,7 +86,7 @@ public class UnlocksTab : Window, ITab
if (!IsOpen) if (!IsOpen)
{ {
ImGui.SameLine(); Im.Line.Same();
if (ImGuiUtil.DrawDisabledButton(FontAwesomeIcon.SquareArrowUpRight.ToIconString(), new Vector2(ImGui.GetFrameHeight()), if (ImGuiUtil.DrawDisabledButton(FontAwesomeIcon.SquareArrowUpRight.ToIconString(), new Vector2(ImGui.GetFrameHeight()),
"Pop the unlocks tab out into its own window.", false, true)) "Pop the unlocks tab out into its own window.", false, true))
IsOpen = true; IsOpen = true;

View file

@ -1,6 +1,7 @@
using Glamourer.Api.Enums; using Glamourer.Api.Enums;
using Glamourer.Designs; using Glamourer.Designs;
using Glamourer.State; using Glamourer.State;
using ImSharp;
using Penumbra.GameData.Enums; using Penumbra.GameData.Enums;
namespace Glamourer.Gui; namespace Glamourer.Gui;
@ -17,8 +18,8 @@ public struct ToggleDrawData
public bool CurrentValue; public bool CurrentValue;
public bool CurrentApply; public bool CurrentApply;
public string Label = string.Empty; public StringU8 Label = StringU8.Empty;
public string Tooltip = string.Empty; public StringU8 Tooltip = StringU8.Empty;
public ToggleDrawData() public ToggleDrawData()
@ -58,8 +59,8 @@ public struct ToggleDrawData
_index = index, _index = index,
_editor = manager, _editor = manager,
_data = design, _data = design,
Label = index.ToName(), Label = index.ToNameU8(),
Tooltip = string.Empty, Tooltip = StringU8.Empty,
Locked = design.WriteProtected(), Locked = design.WriteProtected(),
DisplayApplication = true, DisplayApplication = true,
CurrentValue = design.DesignData.GetMeta(index), CurrentValue = design.DesignData.GetMeta(index),
@ -72,8 +73,8 @@ public struct ToggleDrawData
_index = index, _index = index,
_editor = manager, _editor = manager,
_data = state, _data = state,
Label = index.ToName(), Label = index.ToNameU8(),
Tooltip = index.ToTooltip(), Tooltip = index.Tooltip(),
Locked = state.IsLocked, Locked = state.IsLocked,
CurrentValue = state.ModelData.GetMeta(index), CurrentValue = state.ModelData.GetMeta(index),
}; };
@ -84,22 +85,24 @@ public struct ToggleDrawData
_index = slot, _index = slot,
_editor = manager, _editor = manager,
_data = design, _data = design,
Label = $"{slot.ToLabel()} Crest", Label = slot.Tooltip(),
Tooltip = string.Empty, Tooltip = StringU8.Empty,
Locked = design.WriteProtected(), Locked = design.WriteProtected(),
DisplayApplication = true, DisplayApplication = true,
CurrentValue = design.DesignData.Crest(slot), CurrentValue = design.DesignData.Crest(slot),
CurrentApply = design.DoApplyCrest(slot), CurrentApply = design.DoApplyCrest(slot),
}; };
private static readonly StringU8 CrestTooltip = new("Hide or show your free company crest on this piece of gear."u8);
public static ToggleDrawData CrestFromState(CrestFlag slot, StateManager manager, ActorState state) public static ToggleDrawData CrestFromState(CrestFlag slot, StateManager manager, ActorState state)
=> new() => new()
{ {
_index = slot, _index = slot,
_editor = manager, _editor = manager,
_data = state, _data = state,
Label = $"{slot.ToLabel()} Crest", Label = slot.Tooltip(),
Tooltip = "Hide or show your free company crest on this piece of gear.", Tooltip = CrestTooltip,
Locked = state.IsLocked, Locked = state.IsLocked,
CurrentValue = state.ModelData.Crest(slot), CurrentValue = state.ModelData.Crest(slot),
}; };
@ -108,8 +111,8 @@ public struct ToggleDrawData
=> new() => new()
{ {
_index = index, _index = index,
Label = index.ToName(), Label = index.ToNameU8(),
Tooltip = index.ToTooltip(), Tooltip = index.Tooltip(),
Locked = true, Locked = true,
CurrentValue = value, CurrentValue = value,
}; };

View file

@ -3,6 +3,7 @@ using Dalamud.Interface.Utility;
using Glamourer.Services; using Glamourer.Services;
using Glamourer.Unlocks; using Glamourer.Unlocks;
using Dalamud.Bindings.ImGui; using Dalamud.Bindings.ImGui;
using ImSharp;
using Lumina.Misc; using Lumina.Misc;
using OtterGui; using OtterGui;
using OtterGui.Raii; using OtterGui.Raii;
@ -33,14 +34,14 @@ public static class UiHelpers
: (ImGui.GetColorU32(ImGuiCol.FrameBgActive), new Vector4(0.3f, 0.3f, 0.3f, 1f)); : (ImGui.GetColorU32(ImGuiCol.FrameBgActive), new Vector4(0.3f, 0.3f, 0.3f, 1f));
var pos = ImGui.GetCursorScreenPos(); var pos = ImGui.GetCursorScreenPos();
ImGui.GetWindowDrawList().AddRectFilled(pos, pos + size, bgColor, 5 * ImGuiHelpers.GlobalScale); ImGui.GetWindowDrawList().AddRectFilled(pos, pos + size, bgColor, 5 * ImGuiHelpers.GlobalScale);
if (ptr != nint.Zero) if (!ptr.IsNull)
ImGui.Image(ptr, size, Vector2.Zero, Vector2.One, tint); Im.Image.Draw(ptr, size, Vector2.Zero, Vector2.One, tint);
else else
ImGui.Dummy(size); ImGui.Dummy(size);
} }
else else
{ {
ImGuiUtil.HoverIcon(ptr, textureSize, size); Im.Image.DrawScaled(ptr, size, textureSize);
} }
} }
@ -55,14 +56,14 @@ public static class UiHelpers
: (ImGui.GetColorU32(ImGuiCol.FrameBgActive), new Vector4(0.3f, 0.3f, 0.3f, 1f)); : (ImGui.GetColorU32(ImGuiCol.FrameBgActive), new Vector4(0.3f, 0.3f, 0.3f, 1f));
var pos = ImGui.GetCursorScreenPos(); var pos = ImGui.GetCursorScreenPos();
ImGui.GetWindowDrawList().AddRectFilled(pos, pos + size, bgColor, 5 * ImGuiHelpers.GlobalScale); ImGui.GetWindowDrawList().AddRectFilled(pos, pos + size, bgColor, 5 * ImGuiHelpers.GlobalScale);
if (ptr != nint.Zero) if (!ptr.IsNull)
ImGui.Image(ptr, size, Vector2.Zero, Vector2.One, tint); Im.Image.Draw(ptr, size, Vector2.Zero, Vector2.One, tint);
else else
ImGui.Dummy(size); ImGui.Dummy(size);
} }
else else
{ {
ImGuiUtil.HoverIcon(ptr, textureSize, size); Im.Image.DrawScaled(ptr, size, textureSize);
} }
} }

View file

@ -3,7 +3,7 @@ using Dalamud.Interface.ImGuiNotification;
using Glamourer.Designs; using Glamourer.Designs;
using Glamourer.Interop.CharaFile; using Glamourer.Interop.CharaFile;
using Glamourer.Services; using Glamourer.Services;
using Dalamud.Bindings.ImGui; using ImSharp;
using Luna; using Luna;
using Penumbra.GameData.Enums; using Penumbra.GameData.Enums;
using Penumbra.GameData.Files; using Penumbra.GameData.Files;
@ -16,14 +16,15 @@ public class ImportService(CustomizeService customizations, IDragDropManager dra
public void CreateDatSource() public void CreateDatSource()
=> dragDropManager.CreateImGuiSource("DatDragger", m => m.Files.Count == 1 && m.Extensions.Contains(".dat"), m => => dragDropManager.CreateImGuiSource("DatDragger", m => m.Files.Count == 1 && m.Extensions.Contains(".dat"), m =>
{ {
ImGui.TextUnformatted($"Dragging {Path.GetFileName(m.Files[0])} to import customizations for Glamourer..."); Im.Text($"Dragging {Path.GetFileName(m.Files[0])} to import customizations for Glamourer...");
return true; return true;
}); });
public void CreateCharaSource() public void CreateCharaSource()
=> dragDropManager.CreateImGuiSource("CharaDragger", m => m.Files.Count == 1 && m.Extensions.Contains(".chara") || m.Extensions.Contains(".cma"), m => => dragDropManager.CreateImGuiSource("CharaDragger",
m => m.Files.Count == 1 && m.Extensions.Contains(".chara") || m.Extensions.Contains(".cma"), m =>
{ {
ImGui.TextUnformatted($"Dragging {Path.GetFileName(m.Files[0])} to import Anamnesis/CMTool data for Glamourer..."); Im.Text($"Dragging {Path.GetFileName(m.Files[0])} to import Anamnesis/CMTool data for Glamourer...");
return true; return true;
}); });

View file

@ -1,5 +1,5 @@
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using Dalamud.Bindings.ImGui; using ImSharp;
using Luna; using Luna;
using Penumbra.GameData.Files.MaterialStructs; using Penumbra.GameData.Files.MaterialStructs;
using Penumbra.GameData.Structs; using Penumbra.GameData.Structs;
@ -114,9 +114,7 @@ public sealed unsafe class LiveColorTablePreviewer : IService, IDisposable
var frame = DateTimeOffset.UtcNow.UtcTicks; var frame = DateTimeOffset.UtcNow.UtcTicks;
var hueByte = frame % (steps * frameLength) / frameLength; var hueByte = frame % (steps * frameLength) / frameLength;
var hue = (float)hueByte / steps; var hue = (float)hueByte / steps;
Vector3 ret; return Im.Color.ToRgb(new Vector3(hue, 1, 1));
ImGui.ColorConvertHSVtoRGB(hue, 1, 1, &ret.X, &ret.Y, &ret.Z);
return ret;
} }
public void Dispose() public void Dispose()

View file

@ -9,9 +9,8 @@ using Glamourer.Gui;
using Glamourer.Gui.Tabs.DesignTab; using Glamourer.Gui.Tabs.DesignTab;
using Glamourer.Interop.Penumbra; using Glamourer.Interop.Penumbra;
using Glamourer.State; using Glamourer.State;
using Dalamud.Bindings.ImGui; using ImSharp;
using Luna; using Luna;
using OtterGui.Extensions;
using Penumbra.GameData.Actors; using Penumbra.GameData.Actors;
using Penumbra.GameData.Enums; using Penumbra.GameData.Enums;
using Penumbra.GameData.Interop; using Penumbra.GameData.Interop;
@ -103,10 +102,13 @@ public class CommandService : IDisposable, IApiService
return; return;
default: default:
_chat.Print("Use without argument to toggle the main window."); _chat.Print("Use without argument to toggle the main window.");
_chat.Print(SeStringBuilderExtensions.AddRed(new SeStringBuilder().AddText("Use ").AddPurple("/glamour").AddText(" instead of "), "/glamourer") _chat.Print(SeStringBuilderExtensions
.AddRed(new SeStringBuilder().AddText("Use ").AddPurple("/glamour").AddText(" instead of "), "/glamourer")
.AddText(" for application commands.").BuiltString); .AddText(" for application commands.").BuiltString);
_chat.Print(SeStringBuilderExtensions.AddCommand(new SeStringBuilder(), "qdb", "Toggles the quick design bar on or off.").BuiltString); _chat.Print(SeStringBuilderExtensions.AddCommand(new SeStringBuilder(), "qdb", "Toggles the quick design bar on or off.")
_chat.Print(SeStringBuilderExtensions.AddCommand(new SeStringBuilder(), "lock", "Toggles the lock of the main window on or off.").BuiltString); .BuiltString);
_chat.Print(SeStringBuilderExtensions
.AddCommand(new SeStringBuilder(), "lock", "Toggles the lock of the main window on or off.").BuiltString);
return; return;
} }
@ -150,10 +152,13 @@ public class CommandService : IDisposable, IApiService
else else
_chat.Print("Valid arguments for /glamour are:"); _chat.Print("Valid arguments for /glamour are:");
_chat.Print(SeStringBuilderExtensions.AddCommand(new SeStringBuilder(), "apply", "Applies a given design to a given character. Use without arguments for help.") _chat.Print(SeStringBuilderExtensions
.AddCommand(new SeStringBuilder(), "apply", "Applies a given design to a given character. Use without arguments for help.")
.BuiltString); .BuiltString);
_chat.Print(SeStringBuilderExtensions.AddCommand(new SeStringBuilder(), "reapply", "Re-applies the current supposed state of a given character. Use without arguments for help.").BuiltString); _chat.Print(SeStringBuilderExtensions.AddCommand(new SeStringBuilder(), "reapply",
_chat.Print(SeStringBuilderExtensions.AddCommand(new SeStringBuilder(), "revert", "Reverts a given character to its game state. Use without arguments for help.") "Re-applies the current supposed state of a given character. Use without arguments for help.").BuiltString);
_chat.Print(SeStringBuilderExtensions
.AddCommand(new SeStringBuilder(), "revert", "Reverts a given character to its game state. Use without arguments for help.")
.BuiltString); .BuiltString);
_chat.Print(SeStringBuilderExtensions.AddCommand(new SeStringBuilder(), "reapplyautomation", _chat.Print(SeStringBuilderExtensions.AddCommand(new SeStringBuilder(), "reapplyautomation",
"Reapplies the current automation state on top of the characters current state.. Use without arguments for help.").BuiltString); "Reapplies the current automation state on top of the characters current state.. Use without arguments for help.").BuiltString);
@ -161,12 +166,19 @@ public class CommandService : IDisposable, IApiService
"Reverts a given character to its supposed state using automated designs. Use without arguments for help.").BuiltString); "Reverts a given character to its supposed state using automated designs. Use without arguments for help.").BuiltString);
_chat.Print(SeStringBuilderExtensions.AddCommand(new SeStringBuilder(), "resetdesign", _chat.Print(SeStringBuilderExtensions.AddCommand(new SeStringBuilder(), "resetdesign",
"Reapplies the current automation and resets the random design. Use without arguments for help.").BuiltString); "Reapplies the current automation and resets the random design. Use without arguments for help.").BuiltString);
_chat.Print(SeStringBuilderExtensions.AddCommand(new SeStringBuilder(), "clearsettings", "Clears all temporary settings applied by Glamourer. Use without arguments for help.").BuiltString); _chat.Print(SeStringBuilderExtensions.AddCommand(new SeStringBuilder(), "clearsettings",
_chat.Print(SeStringBuilderExtensions.AddCommand(new SeStringBuilder(), "copy", "Copy the current state of a character to clipboard. Use without arguments for help.").BuiltString); "Clears all temporary settings applied by Glamourer. Use without arguments for help.").BuiltString);
_chat.Print(SeStringBuilderExtensions.AddCommand(new SeStringBuilder(), "save", "Save the current state of a character to a named design. Use without arguments for help.").BuiltString); _chat.Print(SeStringBuilderExtensions.AddCommand(new SeStringBuilder(), "copy",
_chat.Print(SeStringBuilderExtensions.AddCommand(new SeStringBuilder(), "automation", "Change the state of automated design sets. Use without arguments for help.").BuiltString); "Copy the current state of a character to clipboard. Use without arguments for help.").BuiltString);
_chat.Print(SeStringBuilderExtensions.AddCommand(new SeStringBuilder(), "applyitem", "Apply a specific item to a character. Use without arguments for help.").BuiltString); _chat.Print(SeStringBuilderExtensions.AddCommand(new SeStringBuilder(), "save",
_chat.Print(SeStringBuilderExtensions.AddCommand(new SeStringBuilder(), "applycustomization", "Apply a specific customization value to a character. Use without arguments for help.") "Save the current state of a character to a named design. Use without arguments for help.").BuiltString);
_chat.Print(SeStringBuilderExtensions.AddCommand(new SeStringBuilder(), "automation",
"Change the state of automated design sets. Use without arguments for help.").BuiltString);
_chat.Print(SeStringBuilderExtensions
.AddCommand(new SeStringBuilder(), "applyitem", "Apply a specific item to a character. Use without arguments for help.")
.BuiltString);
_chat.Print(SeStringBuilderExtensions.AddCommand(new SeStringBuilder(), "applycustomization",
"Apply a specific customization value to a character. Use without arguments for help.")
.BuiltString); .BuiltString);
return true; return true;
} }
@ -176,13 +188,15 @@ public class CommandService : IDisposable, IApiService
var argumentList = argument.Split('|', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); var argumentList = argument.Split('|', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
if (argumentList.Length < 1) if (argumentList.Length < 1)
{ {
_chat.Print(SeStringBuilderExtensions.AddBlue(new SeStringBuilder().AddText("Use with /glamour clearsettings ").AddGreen("[Character Identifier]").AddText(" | ") _chat.Print(SeStringBuilderExtensions.AddBlue(new SeStringBuilder().AddText("Use with /glamour clearsettings ")
.AddGreen("[Character Identifier]").AddText(" | ")
.AddPurple("<true or false>").AddText(" | "), "<true or false>").BuiltString); .AddPurple("<true or false>").AddText(" | "), "<true or false>").BuiltString);
PlayerIdentifierHelp(false, true); PlayerIdentifierHelp(false, true);
_chat.Print(SeStringBuilderExtensions.AddGreen(new SeStringBuilder() _chat.Print(SeStringBuilderExtensions.AddGreen(new SeStringBuilder()
.AddText(" 》 The character identifier specifies the collection to clear settings from. It also accepts '"), "all") .AddText(" 》 The character identifier specifies the collection to clear settings from. It also accepts '"), "all")
.AddText("' to clear all collections.").BuiltString); .AddText("' to clear all collections.").BuiltString);
_chat.Print(SeStringBuilderExtensions.AddBlue(new SeStringBuilder().AddText(" 》 The booleans are optional and default to 'true', the ").AddPurple("first") _chat.Print(SeStringBuilderExtensions.AddBlue(new SeStringBuilder()
.AddText(" 》 The booleans are optional and default to 'true', the ").AddPurple("first")
.AddText(" determines whether ").AddPurple("manually").AddText(" applied settings are cleared, the ").AddBlue("second") .AddText(" determines whether ").AddPurple("manually").AddText(" applied settings are cleared, the ").AddBlue("second")
.AddText(" determines whether "), "automatically").AddText(" applied settings are cleared.").BuiltString); .AddText(" determines whether "), "automatically").AddText(" applied settings are cleared.").BuiltString);
return false; return false;
@ -234,9 +248,11 @@ public class CommandService : IDisposable, IApiService
var argumentList = arguments.Split(' ', 2, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); var argumentList = arguments.Split(' ', 2, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
if (argumentList.Length != 2) if (argumentList.Length != 2)
{ {
_chat.Print(SeStringBuilderExtensions.AddPurple(new SeStringBuilder().AddText("Use with /glamour automation ").AddBlue("enable, disable or application", true) _chat.Print(SeStringBuilderExtensions.AddPurple(new SeStringBuilder().AddText("Use with /glamour automation ")
.AddBlue("enable, disable or application", true)
.AddText(" ") .AddText(" ")
.AddRed("Automated Design Set Index or Name", true).AddText(" | ").AddYellow("<Design Index>").AddText(" "), "<Application Flags>") .AddRed("Automated Design Set Index or Name", true).AddText(" | ").AddYellow("<Design Index>").AddText(" "),
"<Application Flags>")
.BuiltString); .BuiltString);
_chat.Print( _chat.Print(
" 》 If the design set name is a valid natural number it will be used as a index. Design names that are such numbers can not be dealt with."); " 》 If the design set name is a valid natural number it will be used as a index. Design names that are such numbers can not be dealt with.");
@ -246,7 +262,8 @@ public class CommandService : IDisposable, IApiService
.AddText(" the ").AddYellow("design index").AddText(" and "), "flags").AddText(" are required.").BuiltString); .AddText(" the ").AddYellow("design index").AddText(" and "), "flags").AddText(" are required.").BuiltString);
_chat.Print(SeStringBuilderExtensions.AddYellow(new SeStringBuilder().AddText(" 》 The "), "design index") _chat.Print(SeStringBuilderExtensions.AddYellow(new SeStringBuilder().AddText(" 》 The "), "design index")
.AddText(" is the number in front of the relevant design in the automated design set.").BuiltString); .AddText(" is the number in front of the relevant design in the automated design set.").BuiltString);
_chat.Print(SeStringBuilderExtensions.AddPurple(new SeStringBuilder().AddText(" 》 The ").AddPurple("Application Flags").AddText(" are a combination of the letters ") _chat.Print(SeStringBuilderExtensions.AddPurple(new SeStringBuilder().AddText(" 》 The ").AddPurple("Application Flags")
.AddText(" are a combination of the letters ")
.AddInitialPurple("Customizations, ") .AddInitialPurple("Customizations, ")
.AddInitialPurple("Equipment, ") .AddInitialPurple("Equipment, ")
.AddInitialPurple("Accessories, ") .AddInitialPurple("Accessories, ")
@ -278,7 +295,8 @@ public class CommandService : IDisposable, IApiService
case "application": return HandleApplication(argumentList[1]); case "application": return HandleApplication(argumentList[1]);
default: default:
_chat.Print(SeStringBuilderExtensions.AddBlue(new SeStringBuilder().AddText("The command ") _chat.Print(SeStringBuilderExtensions.AddBlue(new SeStringBuilder().AddText("The command ")
.AddBlue(argumentList[0], true).AddText(" is unknown. Currently only ").AddBlue("enable").AddText(", ").AddBlue("disable") .AddBlue(argumentList[0], true).AddText(" is unknown. Currently only ").AddBlue("enable").AddText(", ")
.AddBlue("disable")
.AddText(" or "), "application") .AddText(" or "), "application")
.AddText(" are supported.").BuiltString); .AddText(" are supported.").BuiltString);
return false; return false;
@ -301,7 +319,9 @@ public class CommandService : IDisposable, IApiService
if (idx >= 0) if (idx >= 0)
return true; return true;
_chat.Print(SeStringBuilderExtensions.AddRed(new SeStringBuilder().AddText("Could not change state of automated design set "), name, true).AddText(" No automated design set of that name or index exists.").BuiltString); _chat.Print(SeStringBuilderExtensions
.AddRed(new SeStringBuilder().AddText("Could not change state of automated design set "), name, true)
.AddText(" No automated design set of that name or index exists.").BuiltString);
return false; return false;
} }
@ -362,7 +382,8 @@ public class CommandService : IDisposable, IApiService
{ {
if (argument.Length == 0) if (argument.Length == 0)
{ {
_chat.Print(SeStringBuilderExtensions.AddGreen(new SeStringBuilder().AddText($"Use with /glamour {command} "), "[Character Identifier]").BuiltString); _chat.Print(SeStringBuilderExtensions
.AddGreen(new SeStringBuilder().AddText($"Use with /glamour {command} "), "[Character Identifier]").BuiltString);
PlayerIdentifierHelp(false, true); PlayerIdentifierHelp(false, true);
return true; return true;
} }
@ -392,7 +413,8 @@ public class CommandService : IDisposable, IApiService
{ {
if (argument.Length == 0) if (argument.Length == 0)
{ {
_chat.Print(SeStringBuilderExtensions.AddGreen(new SeStringBuilder().AddText("Use with /glamour revert "), "[Character Identifier]").BuiltString); _chat.Print(SeStringBuilderExtensions.AddGreen(new SeStringBuilder().AddText("Use with /glamour revert "), "[Character Identifier]")
.BuiltString);
PlayerIdentifierHelp(false, true); PlayerIdentifierHelp(false, true);
return true; return true;
} }
@ -414,7 +436,8 @@ public class CommandService : IDisposable, IApiService
{ {
if (argument.Length == 0) if (argument.Length == 0)
{ {
_chat.Print(SeStringBuilderExtensions.AddGreen(new SeStringBuilder().AddText("Use with /glamour revert "), "[Character Identifier]").BuiltString); _chat.Print(SeStringBuilderExtensions.AddGreen(new SeStringBuilder().AddText("Use with /glamour revert "), "[Character Identifier]")
.BuiltString);
PlayerIdentifierHelp(false, true); PlayerIdentifierHelp(false, true);
return true; return true;
} }
@ -440,7 +463,8 @@ public class CommandService : IDisposable, IApiService
var split = arguments.Split('|', 2, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); var split = arguments.Split('|', 2, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
if (split.Length is not 2) if (split.Length is not 2)
{ {
_chat.Print(SeStringBuilderExtensions.AddGreen(new SeStringBuilder().AddText("Use with /glamour applyitem ").AddYellow("[Item ID or Item Name]") _chat.Print(SeStringBuilderExtensions.AddGreen(new SeStringBuilder().AddText("Use with /glamour applyitem ")
.AddYellow("[Item ID or Item Name]")
.AddText(" | "), "[Character Identifier]") .AddText(" | "), "[Character Identifier]")
.BuiltString); .BuiltString);
_chat.Print(new SeStringBuilder() _chat.Print(new SeStringBuilder()
@ -457,7 +481,7 @@ public class CommandService : IDisposable, IApiService
if (_items.ItemData.Primary.TryGetValue(id, out var main)) if (_items.ItemData.Primary.TryGetValue(id, out var main))
items[0] = main; items[0] = main;
} }
else if (ArrayExtensions.FindFirst(_items.ItemData.Primary, pair => string.Equals(pair.Value.Name, split[0], StringComparison.OrdinalIgnoreCase), else if (_items.ItemData.Primary.FindFirst(pair => string.Equals(pair.Value.Name, split[0], StringComparison.OrdinalIgnoreCase),
out var i)) out var i))
{ {
items[0] = i.Value; items[0] = i.Value;
@ -523,7 +547,8 @@ public class CommandService : IDisposable, IApiService
|| customizeInt < 0 || customizeInt < 0
|| customizeInt >= CustomizationExtensions.AllBasic.Length) || customizeInt >= CustomizationExtensions.AllBasic.Length)
{ {
_chat.Print(SeStringBuilderExtensions.AddYellow(new SeStringBuilder().AddText("The customization type "), customizationSplit[0], true) _chat.Print(SeStringBuilderExtensions
.AddYellow(new SeStringBuilder().AddText("The customization type "), customizationSplit[0], true)
.AddText(" could not be identified as a valid type.").BuiltString); .AddText(" could not be identified as a valid type.").BuiltString);
return false; return false;
} }
@ -623,17 +648,20 @@ public class CommandService : IDisposable, IApiService
bool PrintCustomizationHelp() bool PrintCustomizationHelp()
{ {
_chat.Print(SeStringBuilderExtensions.AddGreen(new SeStringBuilder().AddText("Use with /glamour applycustomization ").AddYellow("[Customization Type]") _chat.Print(SeStringBuilderExtensions.AddGreen(new SeStringBuilder().AddText("Use with /glamour applycustomization ")
.AddYellow("[Customization Type]")
.AddPurple(" [Value, Next, Previous, Minus, or Plus] ") .AddPurple(" [Value, Next, Previous, Minus, or Plus] ")
.AddBlue("<Amount>") .AddBlue("<Amount>")
.AddText(" | "), "[Character Identifier]") .AddText(" | "), "[Character Identifier]")
.BuiltString); .BuiltString);
_chat.Print(SeStringBuilderExtensions.AddPurple(new SeStringBuilder().AddText(" 》 Valid "), "values") _chat.Print(SeStringBuilderExtensions.AddPurple(new SeStringBuilder().AddText(" 》 Valid "), "values")
.AddText(" depend on the the character's gender, clan, and the customization type.").BuiltString); .AddText(" depend on the the character's gender, clan, and the customization type.").BuiltString);
_chat.Print(SeStringBuilderExtensions.AddBlue(new SeStringBuilder().AddText(" 》 ").AddPurple("Plus").AddText(" and ").AddPurple("Minus") _chat.Print(SeStringBuilderExtensions.AddBlue(new SeStringBuilder().AddText(" 》 ").AddPurple("Plus").AddText(" and ")
.AddPurple("Minus")
.AddText(" are the same as pressing the + and - buttons in the UI, times the optional "), " amount").AddText(".") .AddText(" are the same as pressing the + and - buttons in the UI, times the optional "), " amount").AddText(".")
.BuiltString); .BuiltString);
_chat.Print(SeStringBuilderExtensions.AddPurple(new SeStringBuilder().AddText(" 》 ").AddPurple("Next").AddText(" and "), "Previous") _chat.Print(SeStringBuilderExtensions
.AddPurple(new SeStringBuilder().AddText(" 》 ").AddPurple("Next").AddText(" and "), "Previous")
.AddText(" is similar to Plus and Minus, but with wrap-around on reaching the end.").BuiltString); .AddText(" is similar to Plus and Minus, but with wrap-around on reaching the end.").BuiltString);
var builder = SeStringBuilderExtensions.AddYellow(new SeStringBuilder().AddText(" 》 Available ").AddYellow("Customization Types") var builder = SeStringBuilderExtensions.AddYellow(new SeStringBuilder().AddText(" 》 Available ").AddYellow("Customization Types")
.AddText(" are either a number in "), $"[0, {CustomizationExtensions.AllBasic.Length}]") .AddText(" are either a number in "), $"[0, {CustomizationExtensions.AllBasic.Length}]")
@ -749,7 +777,8 @@ public class CommandService : IDisposable, IApiService
{ {
if (argument.Length == 0) if (argument.Length == 0)
{ {
_chat.Print(SeStringBuilderExtensions.AddYellow(new SeStringBuilder().AddText("Use with /glamour delete "), "[Design Name, Path or Identifier]").BuiltString); _chat.Print(SeStringBuilderExtensions
.AddYellow(new SeStringBuilder().AddText("Use with /glamour delete "), "[Design Name, Path or Identifier]").BuiltString);
_chat.Print(new SeStringBuilder() _chat.Print(new SeStringBuilder()
.AddText( .AddText(
" 》 The design name is case-insensitive. If multiple designs of that name up to case exist, the first one is chosen.") " 》 The design name is case-insensitive. If multiple designs of that name up to case exist, the first one is chosen.")
@ -776,7 +805,8 @@ public class CommandService : IDisposable, IApiService
{ {
if (argument.Length == 0) if (argument.Length == 0)
{ {
_chat.Print(SeStringBuilderExtensions.AddGreen(new SeStringBuilder().AddText("Use with /glamour copy "), "[Character Identifier]").BuiltString); _chat.Print(SeStringBuilderExtensions.AddGreen(new SeStringBuilder().AddText("Use with /glamour copy "), "[Character Identifier]")
.BuiltString);
PlayerIdentifierHelp(false, true); PlayerIdentifierHelp(false, true);
} }
@ -794,7 +824,7 @@ public class CommandService : IDisposable, IApiService
try try
{ {
var text = _converter.ShareBase64(state, ApplicationRules.AllButParameters(state)); var text = _converter.ShareBase64(state, ApplicationRules.AllButParameters(state));
ImGui.SetClipboardText(text); Im.Clipboard.Set(text);
return true; return true;
} }
catch catch
@ -815,7 +845,9 @@ public class CommandService : IDisposable, IApiService
var split = arguments.Split('|', 2, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); var split = arguments.Split('|', 2, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
if (split.Length != 2) if (split.Length != 2)
{ {
_chat.Print(SeStringBuilderExtensions.AddGreen(new SeStringBuilder().AddText("Use with /glamour save ").AddYellow("[New Design Name]").AddText(" | "), "[Character Identifier]").BuiltString); _chat.Print(SeStringBuilderExtensions
.AddGreen(new SeStringBuilder().AddText("Use with /glamour save ").AddYellow("[New Design Name]").AddText(" | "),
"[Character Identifier]").BuiltString);
PlayerIdentifierHelp(false, true); PlayerIdentifierHelp(false, true);
} }
@ -889,26 +921,32 @@ public class CommandService : IDisposable, IApiService
private void PlayerIdentifierHelp(bool allowAnyWorld, bool allowIndex) private void PlayerIdentifierHelp(bool allowAnyWorld, bool allowIndex)
{ {
var npcGuide = SeStringBuilderExtensions.AddInitialPurple(new SeStringBuilder().AddText(" 》》》").AddGreen("n").AddText(" | ").AddPurple("[NPC Type]").AddText(" : ") var npcGuide = SeStringBuilderExtensions.AddInitialPurple(new SeStringBuilder().AddText(" 》》》").AddGreen("n").AddText(" | ")
.AddPurple("[NPC Type]").AddText(" : ")
.AddRed("[NPC Name]").AddBlue(allowIndex ? "@<Object Index>" : string.Empty).AddText(", where NPC Type can be ") .AddRed("[NPC Name]").AddBlue(allowIndex ? "@<Object Index>" : string.Empty).AddText(", where NPC Type can be ")
.AddInitialPurple("Mount") .AddInitialPurple("Mount")
.AddInitialPurple("Companion") .AddInitialPurple("Companion")
.AddInitialPurple("Accessory").AddInitialPurple("Event NPC").AddText("or "), "Battle NPC", false); .AddInitialPurple("Accessory").AddInitialPurple("Event NPC").AddText("or "), "Battle NPC", false);
if (allowIndex) if (allowIndex)
npcGuide = SeStringBuilderExtensions.AddBlue(npcGuide.AddText(", and the "), "index").AddText(" is an optional non-negative number in the object table."); npcGuide = SeStringBuilderExtensions.AddBlue(npcGuide.AddText(", and the "), "index")
.AddText(" is an optional non-negative number in the object table.");
else else
npcGuide = npcGuide.AddText("."); npcGuide = npcGuide.AddText(".");
_chat.Print(new SeStringBuilder().AddText(" 》 Valid Character Identifiers have the form:").BuiltString); _chat.Print(new SeStringBuilder().AddText(" 》 Valid Character Identifiers have the form:").BuiltString);
_chat.Print(SeStringBuilderExtensions.AddGreen(new SeStringBuilder().AddText(" 》》》").AddGreen("<me>").AddText(" or ").AddGreen("<t>").AddText(" or ").AddGreen("<mo>") _chat.Print(SeStringBuilderExtensions.AddGreen(new SeStringBuilder().AddText(" 》》》").AddGreen("<me>").AddText(" or ").AddGreen("<t>")
.AddText(" or ").AddGreen("<mo>")
.AddText(" or "), "<f>") .AddText(" or "), "<f>")
.AddText(" as placeholders for your character, your target, your mouseover or your focus, if they exist.").BuiltString); .AddText(" as placeholders for your character, your target, your mouseover or your focus, if they exist.").BuiltString);
_chat.Print(SeStringBuilderExtensions.AddWhite(new SeStringBuilder().AddText(" 》》》").AddGreen("p").AddText(" | "), "[Player Name]@[World Name]") _chat.Print(SeStringBuilderExtensions
.AddWhite(new SeStringBuilder().AddText(" 》》》").AddGreen("p").AddText(" | "), "[Player Name]@[World Name]")
.AddText(allowAnyWorld ? ", if no @ is provided, Any World is used." : ".") .AddText(allowAnyWorld ? ", if no @ is provided, Any World is used." : ".")
.BuiltString); .BuiltString);
_chat.Print(SeStringBuilderExtensions.AddWhite(new SeStringBuilder().AddText(" 》》》").AddGreen("r").AddText(" | "), "[Retainer Name]").AddText(".").BuiltString); _chat.Print(SeStringBuilderExtensions.AddWhite(new SeStringBuilder().AddText(" 》》》").AddGreen("r").AddText(" | "), "[Retainer Name]")
.AddText(".").BuiltString);
_chat.Print(npcGuide.BuiltString); _chat.Print(npcGuide.BuiltString);
_chat.Print(SeStringBuilderExtensions.AddWhite(new SeStringBuilder().AddText(" 》》》 ").AddGreen("o").AddText(" | ").AddPurple("[NPC Type]") _chat.Print(SeStringBuilderExtensions.AddWhite(new SeStringBuilder().AddText(" 》》》 ").AddGreen("o").AddText(" | ")
.AddPurple("[NPC Type]")
.AddText(" : ") .AddText(" : ")
.AddRed("[NPC Name]").AddText(" | "), "[Player Name]@<World Name>").AddText(".").BuiltString); .AddRed("[NPC Name]").AddText(" | "), "[Player Name]@<World Name>").AddText(".").BuiltString);
} }

View file

@ -4,8 +4,8 @@ using Glamourer.Designs;
using Glamourer.Designs.Special; using Glamourer.Designs.Special;
using Glamourer.Gui; using Glamourer.Gui;
using Glamourer.Gui.Tabs.DesignTab; using Glamourer.Gui.Tabs.DesignTab;
using Dalamud.Bindings.ImGui;
using Luna; using Luna;
using ImSharp;
namespace Glamourer.Services; namespace Glamourer.Services;
@ -91,7 +91,7 @@ public class DesignResolver(
{ {
try try
{ {
var clipboardText = ImGui.GetClipboardText(); var clipboardText = Im.Clipboard.GetUtf16();
if (clipboardText.Length > 0) if (clipboardText.Length > 0)
design = converter.FromBase64(clipboardText, true, true, out _); design = converter.FromBase64(clipboardText, true, true, out _);
} }

View file

@ -1,7 +1,8 @@
using Dalamud.Bindings.ImGui;
using Dalamud.Interface; using Dalamud.Interface;
using Dalamud.Interface.Textures.TextureWraps; using Dalamud.Interface.Textures.TextureWraps;
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using ImSharp;
using Luna;
using OtterGui.Classes; using OtterGui.Classes;
using Penumbra.GameData.Enums; using Penumbra.GameData.Enums;
using Penumbra.GameData.Structs; using Penumbra.GameData.Structs;
@ -13,21 +14,21 @@ public sealed class TextureService(IUiBuilder uiBuilder, IDataManager dataManage
{ {
private readonly IDalamudTextureWrap?[] _slotIcons = CreateSlotIcons(uiBuilder); private readonly IDalamudTextureWrap?[] _slotIcons = CreateSlotIcons(uiBuilder);
public (ImTextureID, Vector2, bool) GetIcon(EquipItem item, EquipSlot slot) public (ImTextureId, Vector2, bool) GetIcon(EquipItem item, EquipSlot slot)
{ {
if (item.IconId.Id != 0 && TryLoadIcon(item.IconId.Id, out var ret)) if (item.IconId.Id != 0 && TryLoadIcon(item.IconId.Id, out var ret))
return (ret.Handle, new Vector2(ret.Width, ret.Height), false); return (ret.Id, new Vector2(ret.Width, ret.Height), false);
var idx = slot.ToIndex(); var idx = slot.ToIndex();
return idx < 12 && _slotIcons[idx] != null return idx < 12 && _slotIcons[idx] != null
? (_slotIcons[idx]!.Handle, new Vector2(_slotIcons[idx]!.Width, _slotIcons[idx]!.Height), true) ? (_slotIcons[idx]!.Id, new Vector2(_slotIcons[idx]!.Width, _slotIcons[idx]!.Height), true)
: (default, Vector2.Zero, true); : (default, Vector2.Zero, true);
} }
public (ImTextureID, Vector2, bool) GetIcon(EquipItem item, BonusItemFlag slot) public (ImTextureId, Vector2, bool) GetIcon(EquipItem item, BonusItemFlag slot)
{ {
if (item.IconId.Id != 0 && TryLoadIcon(item.IconId.Id, out var ret)) if (item.IconId.Id != 0 && TryLoadIcon(item.IconId.Id, out var ret))
return (ret.Handle, new Vector2(ret.Width, ret.Height), false); return (ret.Id, new Vector2(ret.Width, ret.Height), false);
var idx = slot.ToIndex(); var idx = slot.ToIndex();
if (idx == uint.MaxValue) if (idx == uint.MaxValue)
@ -35,7 +36,7 @@ public sealed class TextureService(IUiBuilder uiBuilder, IDataManager dataManage
idx += 12; idx += 12;
return idx < 13 && _slotIcons[idx] != null return idx < 13 && _slotIcons[idx] != null
? (_slotIcons[idx]!.Handle, new Vector2(_slotIcons[idx]!.Width, _slotIcons[idx]!.Height), true) ? (_slotIcons[idx]!.Id, new Vector2(_slotIcons[idx]!.Width, _slotIcons[idx]!.Height), true)
: (default, Vector2.Zero, true); : (default, Vector2.Zero, true);
} }

View file

@ -4,7 +4,7 @@ using Glamourer.Designs;
using Glamourer.GameData; using Glamourer.GameData;
using Glamourer.Gui; using Glamourer.Gui;
using Glamourer.Services; using Glamourer.Services;
using Dalamud.Bindings.ImGui; using ImSharp;
using Penumbra.GameData.Enums; using Penumbra.GameData.Enums;
using Penumbra.GameData.Interop; using Penumbra.GameData.Interop;
using Penumbra.GameData.Structs; using Penumbra.GameData.Structs;
@ -471,7 +471,7 @@ public unsafe class FunModule : IDisposable
var tmp = _designManager.CreateTemporary(); var tmp = _designManager.CreateTemporary();
tmp.SetDesignData(_customizations, _stateManager.FromActor(actor, true, true)); tmp.SetDesignData(_customizations, _stateManager.FromActor(actor, true, true));
var data = _designConverter.ShareBase64(tmp); var data = _designConverter.ShareBase64(tmp);
ImGui.SetClipboardText(data); Im.Clipboard.Set(data);
Glamourer.Messager.NotificationMessage($"Copied current actual design of {actor.Utf8Name} to clipboard.", NotificationType.Info, Glamourer.Messager.NotificationMessage($"Copied current actual design of {actor.Utf8Name} to clipboard.", NotificationType.Info,
false); false);
} }

2
Luna

@ -1 +1 @@
Subproject commit 1887502aa892743e9db84c9adc084d748219f1f3 Subproject commit 4f9ff17be4a1235a3bf66d9a80932e59e97d7e99