mirror of
https://github.com/goatcorp/Dalamud.git
synced 2025-12-12 18:27:23 +01:00
refactor: generic style model API; push & pop (not implemented yet)
This commit is contained in:
parent
e8f395b8cc
commit
c82f6aa0a6
7 changed files with 234 additions and 105 deletions
|
|
@ -3,7 +3,7 @@ using System.Collections.Generic;
|
|||
using System.IO;
|
||||
|
||||
using Dalamud.Game.Text;
|
||||
using Dalamud.Interface.Internal.Windows.StyleEditor;
|
||||
using Dalamud.Interface.Style;
|
||||
using Newtonsoft.Json;
|
||||
using Serilog;
|
||||
using Serilog.Events;
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@ using Dalamud.Interface.Internal.ManagedAsserts;
|
|||
using Dalamud.Interface.Internal.Windows;
|
||||
using Dalamud.Interface.Internal.Windows.SelfTest;
|
||||
using Dalamud.Interface.Internal.Windows.StyleEditor;
|
||||
using Dalamud.Interface.Style;
|
||||
using Dalamud.Interface.Windowing;
|
||||
using Dalamud.Logging;
|
||||
using Dalamud.Logging.Internal;
|
||||
|
|
@ -513,7 +514,7 @@ namespace Dalamud.Interface.Internal
|
|||
if (ImGui.MenuItem("Dump style"))
|
||||
{
|
||||
var info = string.Empty;
|
||||
var style = StyleModel.Get();
|
||||
var style = StyleModelV1.Get();
|
||||
var enCulture = new CultureInfo("en-US");
|
||||
|
||||
foreach (var propertyInfo in typeof(StyleModel).GetProperties(BindingFlags.Public | BindingFlags.Instance))
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@ using Dalamud.Hooking.Internal;
|
|||
using Dalamud.Interface.Internal.ManagedAsserts;
|
||||
using Dalamud.Interface.Internal.Notifications;
|
||||
using Dalamud.Interface.Internal.Windows.StyleEditor;
|
||||
using Dalamud.Interface.Style;
|
||||
using Dalamud.Interface.Windowing;
|
||||
using Dalamud.Utility;
|
||||
using ImGuiNET;
|
||||
|
|
@ -368,27 +369,27 @@ namespace Dalamud.Interface.Internal
|
|||
|
||||
this.SetupFonts();
|
||||
|
||||
if (configuration.SavedStyles == null || configuration.SavedStyles.All(x => x.Name != StyleModel.DalamudStandard.Name))
|
||||
if (configuration.SavedStyles == null || configuration.SavedStyles.All(x => x.Name != StyleModelV1.DalamudStandard.Name))
|
||||
{
|
||||
configuration.SavedStyles = new List<StyleModel> { StyleModel.DalamudStandard, StyleModel.DalamudClassic };
|
||||
configuration.ChosenStyle = StyleModel.DalamudStandard.Name;
|
||||
configuration.SavedStyles = new List<StyleModel> { StyleModelV1.DalamudStandard, StyleModelV1.DalamudClassic };
|
||||
configuration.ChosenStyle = StyleModelV1.DalamudStandard.Name;
|
||||
}
|
||||
else if (configuration.SavedStyles.Count == 1)
|
||||
{
|
||||
configuration.SavedStyles.Add(StyleModel.DalamudClassic);
|
||||
configuration.SavedStyles.Add(StyleModelV1.DalamudClassic);
|
||||
}
|
||||
else if (configuration.SavedStyles[1].Name != StyleModel.DalamudClassic.Name)
|
||||
else if (configuration.SavedStyles[1].Name != StyleModelV1.DalamudClassic.Name)
|
||||
{
|
||||
configuration.SavedStyles.Insert(1, StyleModel.DalamudClassic);
|
||||
configuration.SavedStyles.Insert(1, StyleModelV1.DalamudClassic);
|
||||
}
|
||||
|
||||
configuration.SavedStyles[0] = StyleModel.DalamudStandard;
|
||||
configuration.SavedStyles[1] = StyleModel.DalamudClassic;
|
||||
configuration.SavedStyles[0] = StyleModelV1.DalamudStandard;
|
||||
configuration.SavedStyles[1] = StyleModelV1.DalamudClassic;
|
||||
|
||||
var style = configuration.SavedStyles.FirstOrDefault(x => x.Name == configuration.ChosenStyle);
|
||||
if (style == null)
|
||||
{
|
||||
style = StyleModel.DalamudStandard;
|
||||
style = StyleModelV1.DalamudStandard;
|
||||
configuration.ChosenStyle = style.Name;
|
||||
configuration.Save();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ using Dalamud.Configuration.Internal;
|
|||
using Dalamud.Data;
|
||||
using Dalamud.Interface.Colors;
|
||||
using Dalamud.Interface.Components;
|
||||
using Dalamud.Interface.Style;
|
||||
using Dalamud.Interface.Windowing;
|
||||
using ImGuiNET;
|
||||
using Lumina.Excel.GeneratedSheets;
|
||||
|
|
@ -78,7 +79,7 @@ namespace Dalamud.Interface.Internal.Windows.StyleEditor
|
|||
var renameModalTitle = Loc.Localize("RenameStyleModalTitle", "Rename Style");
|
||||
|
||||
var workStyle = config.SavedStyles[this.currentSel];
|
||||
workStyle.BuiltInColors ??= StyleModel.DalamudStandard.BuiltInColors;
|
||||
workStyle.BuiltInColors ??= StyleModelV1.DalamudStandard.BuiltInColors;
|
||||
|
||||
var appliedThisFrame = false;
|
||||
|
||||
|
|
@ -95,7 +96,7 @@ namespace Dalamud.Interface.Internal.Windows.StyleEditor
|
|||
{
|
||||
this.SaveStyle();
|
||||
|
||||
var newStyle = StyleModel.DalamudStandard;
|
||||
var newStyle = StyleModelV1.DalamudStandard;
|
||||
newStyle.Name = GetRandomName();
|
||||
config.SavedStyles.Add(newStyle);
|
||||
|
||||
|
|
@ -146,9 +147,9 @@ namespace Dalamud.Interface.Internal.Windows.StyleEditor
|
|||
if (ImGuiComponents.IconButton(FontAwesomeIcon.FileExport))
|
||||
{
|
||||
var selectedStyle = config.SavedStyles[this.currentSel];
|
||||
var newStyle = StyleModel.Get();
|
||||
var newStyle = StyleModelV1.Get();
|
||||
newStyle.Name = selectedStyle.Name;
|
||||
ImGui.SetClipboardText(newStyle.ToEncoded());
|
||||
ImGui.SetClipboardText(newStyle.Serialize());
|
||||
}
|
||||
|
||||
if (ImGui.IsItemHovered())
|
||||
|
|
@ -164,7 +165,7 @@ namespace Dalamud.Interface.Internal.Windows.StyleEditor
|
|||
|
||||
try
|
||||
{
|
||||
var newStyle = StyleModel.FromEncoded(styleJson);
|
||||
var newStyle = StyleModel.Deserialize(styleJson);
|
||||
|
||||
newStyle.Name ??= GetRandomName();
|
||||
|
||||
|
|
@ -296,11 +297,19 @@ namespace Dalamud.Interface.Internal.Windows.StyleEditor
|
|||
|
||||
ImGui.Separator();
|
||||
|
||||
foreach (var property in typeof(StyleModel.DalamudColors).GetProperties(BindingFlags.Public | BindingFlags.Instance))
|
||||
foreach (var property in typeof(DalamudColors).GetProperties(BindingFlags.Public | BindingFlags.Instance))
|
||||
{
|
||||
ImGui.PushID(property.Name);
|
||||
|
||||
var color = (Vector4)property.GetValue(workStyle.BuiltInColors);
|
||||
var colorVal = property.GetValue(workStyle.BuiltInColors);
|
||||
if (colorVal == null)
|
||||
{
|
||||
colorVal = property.GetValue(StyleModelV1.DalamudStandard.BuiltInColors);
|
||||
property.SetValue(workStyle.BuiltInColors, colorVal);
|
||||
}
|
||||
|
||||
var color = (Vector4)colorVal;
|
||||
|
||||
if (ImGui.ColorEdit4("##color", ref color, ImGuiColorEditFlags.AlphaBar | this.alphaFlags))
|
||||
{
|
||||
property.SetValue(workStyle.BuiltInColors, color);
|
||||
|
|
@ -382,7 +391,7 @@ namespace Dalamud.Interface.Internal.Windows.StyleEditor
|
|||
|
||||
var config = Service<DalamudConfiguration>.Get();
|
||||
|
||||
var newStyle = StyleModel.Get();
|
||||
var newStyle = StyleModelV1.Get();
|
||||
newStyle.Name = config.SavedStyles[this.currentSel].Name;
|
||||
config.SavedStyles[this.currentSel] = newStyle;
|
||||
newStyle.Apply();
|
||||
|
|
|
|||
97
Dalamud/Interface/Style/DalamudColors.cs
Normal file
97
Dalamud/Interface/Style/DalamudColors.cs
Normal file
|
|
@ -0,0 +1,97 @@
|
|||
using System.Numerics;
|
||||
|
||||
using Dalamud.Interface.Colors;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace Dalamud.Interface.Style
|
||||
{
|
||||
#pragma warning disable SA1600
|
||||
|
||||
public class DalamudColors
|
||||
{
|
||||
[JsonProperty("a")]
|
||||
public Vector4? DalamudRed { get; set; }
|
||||
|
||||
[JsonProperty("b")]
|
||||
public Vector4? DalamudGrey { get; set; }
|
||||
|
||||
[JsonProperty("c")]
|
||||
public Vector4? DalamudGrey2 { get; set; }
|
||||
|
||||
[JsonProperty("d")]
|
||||
public Vector4? DalamudGrey3 { get; set; }
|
||||
|
||||
[JsonProperty("e")]
|
||||
public Vector4? DalamudWhite { get; set; }
|
||||
|
||||
[JsonProperty("f")]
|
||||
public Vector4? DalamudWhite2 { get; set; }
|
||||
|
||||
[JsonProperty("g")]
|
||||
public Vector4? DalamudOrange { get; set; }
|
||||
|
||||
[JsonProperty("h")]
|
||||
public Vector4? TankBlue { get; set; }
|
||||
|
||||
[JsonProperty("i")]
|
||||
public Vector4? HealerGreen { get; set; }
|
||||
|
||||
[JsonProperty("j")]
|
||||
public Vector4? DPSRed { get; set; }
|
||||
|
||||
public void Apply()
|
||||
{
|
||||
if (this.DalamudRed.HasValue)
|
||||
{
|
||||
ImGuiColors.DalamudRed = this.DalamudRed.Value;
|
||||
}
|
||||
|
||||
if (this.DalamudGrey.HasValue)
|
||||
{
|
||||
ImGuiColors.DalamudGrey = this.DalamudGrey.Value;
|
||||
}
|
||||
|
||||
if (this.DalamudGrey2.HasValue)
|
||||
{
|
||||
ImGuiColors.DalamudGrey2 = this.DalamudGrey2.Value;
|
||||
}
|
||||
|
||||
if (this.DalamudGrey3.HasValue)
|
||||
{
|
||||
ImGuiColors.DalamudGrey3 = this.DalamudGrey3.Value;
|
||||
}
|
||||
|
||||
if (this.DalamudWhite.HasValue)
|
||||
{
|
||||
ImGuiColors.DalamudWhite = this.DalamudWhite.Value;
|
||||
}
|
||||
|
||||
if (this.DalamudWhite2.HasValue)
|
||||
{
|
||||
ImGuiColors.DalamudWhite2 = this.DalamudWhite2.Value;
|
||||
}
|
||||
|
||||
if (this.DalamudOrange.HasValue)
|
||||
{
|
||||
ImGuiColors.DalamudOrange = this.DalamudOrange.Value;
|
||||
}
|
||||
|
||||
if (this.TankBlue.HasValue)
|
||||
{
|
||||
ImGuiColors.TankBlue = this.TankBlue.Value;
|
||||
}
|
||||
|
||||
if (this.HealerGreen.HasValue)
|
||||
{
|
||||
ImGuiColors.HealerGreen = this.HealerGreen.Value;
|
||||
}
|
||||
|
||||
if (this.DPSRed.HasValue)
|
||||
{
|
||||
ImGuiColors.DPSRed = this.DPSRed.Value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#pragma warning restore SA1600
|
||||
}
|
||||
83
Dalamud/Interface/Style/StyleModel.cs
Normal file
83
Dalamud/Interface/Style/StyleModel.cs
Normal file
|
|
@ -0,0 +1,83 @@
|
|||
using System;
|
||||
|
||||
using Dalamud.Interface.Colors;
|
||||
using Dalamud.Utility;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace Dalamud.Interface.Style
|
||||
{
|
||||
/// <summary>
|
||||
/// Superclass for all versions of the Dalamud style model.
|
||||
/// </summary>
|
||||
public abstract class StyleModel
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets or sets the name of the style model.
|
||||
/// </summary>
|
||||
[JsonProperty("name")]
|
||||
public string Name { get; set; } = "Unknown";
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets class representing Dalamud-builtin <see cref="ImGuiColors"/>.
|
||||
/// </summary>
|
||||
[JsonProperty("dol")]
|
||||
public DalamudColors? BuiltInColors { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets version number of this model.
|
||||
/// </summary>
|
||||
[JsonProperty("ver")]
|
||||
public int Version { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Deserialize a style model.
|
||||
/// </summary>
|
||||
/// <param name="model">The serialized model.</param>
|
||||
/// <returns>The deserialized model.</returns>
|
||||
/// <exception cref="ArgumentException">Thrown in case the version of the model is not known.</exception>
|
||||
public static StyleModel? Deserialize(string model)
|
||||
{
|
||||
var json = Util.DecompressString(Convert.FromBase64String(model.Substring(3)));
|
||||
|
||||
if (model.StartsWith(StyleModelV1.SerializedPrefix))
|
||||
return JsonConvert.DeserializeObject<StyleModelV1>(json);
|
||||
|
||||
throw new ArgumentException("Was not a compressed style model.");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Serialize this style model.
|
||||
/// </summary>
|
||||
/// <returns>Serialized style model as string.</returns>
|
||||
/// <exception cref="ArgumentOutOfRangeException">Thrown when the version of the style model is unknown.</exception>
|
||||
public string Serialize()
|
||||
{
|
||||
string prefix;
|
||||
switch (this)
|
||||
{
|
||||
case StyleModelV1:
|
||||
prefix = StyleModelV1.SerializedPrefix;
|
||||
break;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException();
|
||||
}
|
||||
|
||||
return prefix + Convert.ToBase64String(Util.CompressString(JsonConvert.SerializeObject(this)));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Apply this style model to ImGui.
|
||||
/// </summary>
|
||||
public abstract void Apply();
|
||||
|
||||
/// <summary>
|
||||
/// Push this StyleModel into the ImGui style/color stack.
|
||||
/// </summary>
|
||||
public abstract void Push();
|
||||
|
||||
/// <summary>
|
||||
/// Pop this style model from the ImGui style/color stack.
|
||||
/// </summary>
|
||||
public abstract void Pop();
|
||||
}
|
||||
}
|
||||
|
|
@ -1,23 +1,22 @@
|
|||
using System;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Numerics;
|
||||
|
||||
using Dalamud.Interface.Colors;
|
||||
using Dalamud.Utility;
|
||||
using ImGuiNET;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace Dalamud.Interface.Internal.Windows.StyleEditor
|
||||
namespace Dalamud.Interface.Style
|
||||
{
|
||||
/// <summary>
|
||||
/// Class representing a serializable ImGui style.
|
||||
/// Version one of the Dalamud style model.
|
||||
/// </summary>
|
||||
internal class StyleModel
|
||||
public class StyleModelV1 : StyleModel
|
||||
{
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="StyleModel"/> class.
|
||||
/// Initializes a new instance of the <see cref="StyleModelV1"/> class.
|
||||
/// </summary>
|
||||
private StyleModel()
|
||||
private StyleModelV1()
|
||||
{
|
||||
this.Colors = new Dictionary<string, Vector4>();
|
||||
this.Name = "Unknown";
|
||||
|
|
@ -26,7 +25,7 @@ namespace Dalamud.Interface.Internal.Windows.StyleEditor
|
|||
/// <summary>
|
||||
/// Gets the standard Dalamud look.
|
||||
/// </summary>
|
||||
public static StyleModel DalamudStandard => new()
|
||||
public static StyleModelV1 DalamudStandard => new()
|
||||
{
|
||||
Name = "Dalamud Standard",
|
||||
|
||||
|
|
@ -135,7 +134,7 @@ namespace Dalamud.Interface.Internal.Windows.StyleEditor
|
|||
/// <summary>
|
||||
/// Gets the standard Dalamud look.
|
||||
/// </summary>
|
||||
public static StyleModel DalamudClassic => new()
|
||||
public static StyleModelV1 DalamudClassic => new()
|
||||
{
|
||||
Name = "Dalamud Classic",
|
||||
|
||||
|
|
@ -241,10 +240,12 @@ namespace Dalamud.Interface.Internal.Windows.StyleEditor
|
|||
},
|
||||
};
|
||||
|
||||
#pragma warning disable SA1600
|
||||
/// <summary>
|
||||
/// Gets the version prefix for this version.
|
||||
/// </summary>
|
||||
public static string SerializedPrefix => "DS1";
|
||||
|
||||
[JsonProperty("name")]
|
||||
public string Name { get; set; }
|
||||
#pragma warning disable SA1600
|
||||
|
||||
[JsonProperty("a")]
|
||||
public float Alpha { get; set; }
|
||||
|
|
@ -335,19 +336,13 @@ namespace Dalamud.Interface.Internal.Windows.StyleEditor
|
|||
[JsonProperty("col")]
|
||||
public Dictionary<string, Vector4> Colors { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets class representing Dalamud-builtin <see cref="ImGuiColors"/>.
|
||||
/// </summary>
|
||||
[JsonProperty("dol")]
|
||||
public DalamudColors? BuiltInColors { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Get a <see cref="StyleModel"/> instance via ImGui.
|
||||
/// </summary>
|
||||
/// <returns>The newly created <see cref="StyleModel"/> instance.</returns>
|
||||
public static StyleModel Get()
|
||||
public static StyleModelV1 Get()
|
||||
{
|
||||
var model = new StyleModel();
|
||||
var model = new StyleModelV1();
|
||||
var style = ImGui.GetStyle();
|
||||
|
||||
model.Alpha = style.Alpha;
|
||||
|
|
@ -407,27 +402,10 @@ namespace Dalamud.Interface.Internal.Windows.StyleEditor
|
|||
return model;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get a <see cref="StyleModel"/> instance from a compressed base64 string.
|
||||
/// </summary>
|
||||
/// <param name="data">The string to decode.</param>
|
||||
/// <returns>A decompressed <see cref="StyleModel"/>.</returns>
|
||||
public static StyleModel? FromEncoded(string data)
|
||||
{
|
||||
var json = Util.DecompressString(Convert.FromBase64String(data.Substring(3)));
|
||||
return JsonConvert.DeserializeObject<StyleModel>(json);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get this <see cref="StyleModel"/> instance as a encoded base64 string.
|
||||
/// </summary>
|
||||
/// <returns>The encoded base64 string.</returns>
|
||||
public string ToEncoded() => "DS1" + Convert.ToBase64String(Util.CompressString(JsonConvert.SerializeObject(this)));
|
||||
|
||||
/// <summary>
|
||||
/// Apply this StyleModel via ImGui.
|
||||
/// </summary>
|
||||
public void Apply()
|
||||
public override void Apply()
|
||||
{
|
||||
var style = ImGui.GetStyle();
|
||||
|
||||
|
|
@ -472,56 +450,16 @@ namespace Dalamud.Interface.Internal.Windows.StyleEditor
|
|||
this.BuiltInColors?.Apply();
|
||||
}
|
||||
|
||||
#pragma warning disable SA1600
|
||||
|
||||
public class DalamudColors
|
||||
/// <inheritdoc/>
|
||||
public override void Push()
|
||||
{
|
||||
[JsonProperty("a")]
|
||||
public Vector4 DalamudRed { get; set; }
|
||||
|
||||
[JsonProperty("b")]
|
||||
public Vector4 DalamudGrey { get; set; }
|
||||
|
||||
[JsonProperty("c")]
|
||||
public Vector4 DalamudGrey2 { get; set; }
|
||||
|
||||
[JsonProperty("d")]
|
||||
public Vector4 DalamudGrey3 { get; set; }
|
||||
|
||||
[JsonProperty("e")]
|
||||
public Vector4 DalamudWhite { get; set; }
|
||||
|
||||
[JsonProperty("f")]
|
||||
public Vector4 DalamudWhite2 { get; set; }
|
||||
|
||||
[JsonProperty("g")]
|
||||
public Vector4 DalamudOrange { get; set; }
|
||||
|
||||
[JsonProperty("h")]
|
||||
public Vector4 TankBlue { get; set; }
|
||||
|
||||
[JsonProperty("i")]
|
||||
public Vector4 HealerGreen { get; set; }
|
||||
|
||||
[JsonProperty("j")]
|
||||
public Vector4 DPSRed { get; set; }
|
||||
|
||||
public void Apply()
|
||||
{
|
||||
ImGuiColors.DalamudRed = this.DalamudRed;
|
||||
ImGuiColors.DalamudGrey = this.DalamudGrey;
|
||||
ImGuiColors.DalamudGrey2 = this.DalamudGrey2;
|
||||
ImGuiColors.DalamudGrey3 = this.DalamudGrey3;
|
||||
ImGuiColors.DalamudWhite = this.DalamudWhite;
|
||||
ImGuiColors.DalamudWhite2 = this.DalamudWhite2;
|
||||
ImGuiColors.DalamudOrange = this.DalamudOrange;
|
||||
ImGuiColors.TankBlue = this.TankBlue;
|
||||
ImGuiColors.HealerGreen = this.HealerGreen;
|
||||
ImGuiColors.DPSRed = this.DPSRed;
|
||||
}
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
#pragma warning restore SA1600
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override void Pop()
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue