style editor setup WIP

This commit is contained in:
goat 2021-09-18 18:23:10 +02:00
parent e29a312c52
commit 5fdf07aead
No known key found for this signature in database
GPG key ID: F18F057873895461
7 changed files with 572 additions and 29 deletions

View file

@ -1,8 +1,8 @@
using System;
using System.Collections.Generic;
using System.IO;
using Dalamud.Game.Text;
using Dalamud.Interface.Internal.Windows.StyleEditor;
using Newtonsoft.Json;
using Serilog;
using Serilog.Events;
@ -195,6 +195,16 @@ namespace Dalamud.Configuration.Internal
/// </summary>
public bool PluginSafeMode { get; set; }
/// <summary>
/// Gets or sets a list of saved styles.
/// </summary>
public List<StyleModel>? SavedStyles { get; set; }
/// <summary>
/// Gets or sets the name of the currently chosen style.
/// </summary>
public string ChosenStyle { get; set; } = "Dalamud Standard";
/// <summary>
/// Load a configuration from the provided path.
/// </summary>

View file

@ -1,7 +1,9 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Numerics;
using System.Reflection;
using System.Runtime.InteropServices;
using Dalamud.Configuration.Internal;
@ -11,12 +13,14 @@ using Dalamud.Game.Internal;
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.Windowing;
using Dalamud.Logging;
using Dalamud.Logging.Internal;
using Dalamud.Plugin.Internal;
using Dalamud.Utility;
using ImGuiNET;
using Newtonsoft.Json;
using PInvoke;
using Serilog.Events;
@ -496,6 +500,38 @@ namespace Dalamud.Interface.Internal
ImGui.SetWindowFocus(null);
}
if (ImGui.MenuItem("Dump style"))
{
var info = string.Empty;
var style = StyleModel.Get();
foreach (var propertyInfo in typeof(StyleModel).GetProperties(BindingFlags.Public | BindingFlags.Instance))
{
if (propertyInfo.PropertyType == typeof(Vector2))
{
var vec2 = (Vector2)propertyInfo.GetValue(style);
info += $"{propertyInfo.Name} = new Vector2({vec2.X}, {vec2.Y}),\n";
}
else
{
info += $"{propertyInfo.Name} = {propertyInfo.GetValue(style)},\n";
}
}
info += "Colors = new Dictionary<string, Vector4>()\n";
info += "{\n";
foreach (var color in style.Colors)
{
info +=
$"{{\"{color.Key}\", new Vector4({color.Value.X}, {color.Value.Y}, {color.Value.Z}, {color.Value.W})}},\n";
}
info += "},";
Log.Information(info);
}
ImGui.EndMenu();
}

View file

@ -2,6 +2,7 @@ using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Numerics;
using System.Runtime.InteropServices;
using System.Text;
@ -17,6 +18,7 @@ using Dalamud.Hooking;
using Dalamud.Hooking.Internal;
using Dalamud.Interface.Internal.ManagedAsserts;
using Dalamud.Interface.Internal.Notifications;
using Dalamud.Interface.Internal.Windows.StyleEditor;
using Dalamud.Interface.Windowing;
using Dalamud.Utility;
using ImGuiNET;
@ -336,34 +338,15 @@ namespace Dalamud.Interface.Internal
this.SetupFonts();
ImGui.GetStyle().GrabRounding = 3f;
ImGui.GetStyle().FrameRounding = 4f;
ImGui.GetStyle().WindowRounding = 4f;
ImGui.GetStyle().WindowBorderSize = 0f;
ImGui.GetStyle().WindowMenuButtonPosition = ImGuiDir.Right;
ImGui.GetStyle().ScrollbarSize = 16f;
if (configuration.SavedStyles == null || configuration.SavedStyles.All(x => x.Name != StyleModel.DalamudStandard.Name))
{
configuration.SavedStyles = new List<StyleModel>();
configuration.SavedStyles.Add(StyleModel.DalamudStandard);
configuration.ChosenStyle = StyleModel.DalamudStandard.Name;
}
ImGui.GetStyle().Colors[(int)ImGuiCol.WindowBg] = new Vector4(0.06f, 0.06f, 0.06f, 0.87f);
ImGui.GetStyle().Colors[(int)ImGuiCol.FrameBg] = new Vector4(0.29f, 0.29f, 0.29f, 0.54f);
ImGui.GetStyle().Colors[(int)ImGuiCol.FrameBgHovered] = new Vector4(0.54f, 0.54f, 0.54f, 0.40f);
ImGui.GetStyle().Colors[(int)ImGuiCol.FrameBgActive] = new Vector4(0.64f, 0.64f, 0.64f, 0.67f);
ImGui.GetStyle().Colors[(int)ImGuiCol.TitleBgActive] = new Vector4(0.29f, 0.29f, 0.29f, 1.00f);
ImGui.GetStyle().Colors[(int)ImGuiCol.CheckMark] = new Vector4(0.86f, 0.86f, 0.86f, 1.00f);
ImGui.GetStyle().Colors[(int)ImGuiCol.SliderGrab] = new Vector4(0.54f, 0.54f, 0.54f, 1.00f);
ImGui.GetStyle().Colors[(int)ImGuiCol.SliderGrabActive] = new Vector4(0.67f, 0.67f, 0.67f, 1.00f);
ImGui.GetStyle().Colors[(int)ImGuiCol.Button] = new Vector4(0.71f, 0.71f, 0.71f, 0.40f);
ImGui.GetStyle().Colors[(int)ImGuiCol.ButtonHovered] = new Vector4(0.47f, 0.47f, 0.47f, 1.00f);
ImGui.GetStyle().Colors[(int)ImGuiCol.ButtonActive] = new Vector4(0.74f, 0.74f, 0.74f, 1.00f);
ImGui.GetStyle().Colors[(int)ImGuiCol.Header] = new Vector4(0.59f, 0.59f, 0.59f, 0.31f);
ImGui.GetStyle().Colors[(int)ImGuiCol.HeaderHovered] = new Vector4(0.50f, 0.50f, 0.50f, 0.80f);
ImGui.GetStyle().Colors[(int)ImGuiCol.HeaderActive] = new Vector4(0.60f, 0.60f, 0.60f, 1.00f);
ImGui.GetStyle().Colors[(int)ImGuiCol.ResizeGrip] = new Vector4(0.79f, 0.79f, 0.79f, 0.25f);
ImGui.GetStyle().Colors[(int)ImGuiCol.ResizeGripHovered] = new Vector4(0.78f, 0.78f, 0.78f, 0.67f);
ImGui.GetStyle().Colors[(int)ImGuiCol.ResizeGripActive] = new Vector4(0.88f, 0.88f, 0.88f, 0.95f);
ImGui.GetStyle().Colors[(int)ImGuiCol.Tab] = new Vector4(0.23f, 0.23f, 0.23f, 0.86f);
ImGui.GetStyle().Colors[(int)ImGuiCol.TabHovered] = new Vector4(0.71f, 0.71f, 0.71f, 0.80f);
ImGui.GetStyle().Colors[(int)ImGuiCol.TabActive] = new Vector4(0.36f, 0.36f, 0.36f, 1.00f);
ImGui.GetStyle().Colors[(int)ImGuiCol.ScrollbarBg] = Vector4.Zero;
var style = configuration.SavedStyles.FirstOrDefault(x => x.Name == configuration.ChosenStyle) ?? StyleModel.DalamudStandard;
style.Apply();
ImGui.GetIO().FontGlobalScale = configuration.GlobalUiScale;

View file

@ -416,7 +416,7 @@ namespace Dalamud.Interface.Internal.Windows
private void AddAndFilter(string line, LogEventLevel level, DateTimeOffset offset, bool isMultiline)
{
if (line.StartsWith("TROUBLESHOOTING:") || line.StartsWith("EXCEPTION:"))
if (line.StartsWith("TROUBLESHOOTING:") || line.StartsWith("LASTEXCEPTION:"))
return;
var entry = new LogEntry

View file

@ -0,0 +1,320 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
using System.Numerics;
using System.Text;
using ImGuiNET;
using Newtonsoft.Json;
namespace Dalamud.Interface.Internal.Windows.StyleEditor
{
public class StyleModel
{
public static StyleModel DalamudStandard => new()
{
Name = "Dalamud Standard",
Alpha = 1,
WindowPadding = new Vector2(8, 8),
WindowRounding = 4,
WindowBorderSize = 0,
WindowTitleAlign = new Vector2(0, 0.5f),
WindowMenuButtonPosition = ImGuiDir.Right,
ChildRounding = 0,
ChildBorderSize = 1,
PopupRounding = 0,
FramePadding = new Vector2(4, 3),
FrameRounding = 4,
FrameBorderSize = 0,
ItemSpacing = new Vector2(8, 4),
ItemInnerSpacing = new Vector2(4, 4),
CellPadding = new Vector2(4, 2),
TouchExtraPadding = new Vector2(0, 0),
IndentSpacing = 21,
ScrollbarSize = 16,
ScrollbarRounding = 9,
GrabMinSize = 10,
GrabRounding = 3,
LogSliderDeadzone = 4,
TabRounding = 4,
TabBorderSize = 0,
ButtonTextAlign = new Vector2(0.5f, 0.5f),
SelectableTextAlign = new Vector2(0, 0),
DisplaySafeAreaPadding = new Vector2(3, 3),
Colors = new Dictionary<string, Vector4>
{
{ "Text", new Vector4(1, 1, 1, 1) },
{ "TextDisabled", new Vector4(0.5f, 0.5f, 0.5f, 1) },
{ "WindowBg", new Vector4(0.06f, 0.06f, 0.06f, 0.87f) },
{ "ChildBg", new Vector4(0, 0, 0, 0) },
{ "PopupBg", new Vector4(0.08f, 0.08f, 0.08f, 0.94f) },
{ "Border", new Vector4(0.43f, 0.43f, 0.5f, 0.5f) },
{ "BorderShadow", new Vector4(0, 0, 0, 0) },
{ "FrameBg", new Vector4(0.29f, 0.29f, 0.29f, 0.54f) },
{ "FrameBgHovered", new Vector4(0.54f, 0.54f, 0.54f, 0.4f) },
{ "FrameBgActive", new Vector4(0.64f, 0.64f, 0.64f, 0.67f) },
{ "TitleBg", new Vector4(0.04f, 0.04f, 0.04f, 1) },
{ "TitleBgActive", new Vector4(0.29f, 0.29f, 0.29f, 1) },
{ "TitleBgCollapsed", new Vector4(0, 0, 0, 0.51f) },
{ "MenuBarBg", new Vector4(0.14f, 0.14f, 0.14f, 1) },
{ "ScrollbarBg", new Vector4(0, 0, 0, 0) },
{ "ScrollbarGrab", new Vector4(0.31f, 0.31f, 0.31f, 1) },
{ "ScrollbarGrabHovered", new Vector4(0.41f, 0.41f, 0.41f, 1) },
{ "ScrollbarGrabActive", new Vector4(0.51f, 0.51f, 0.51f, 1) },
{ "CheckMark", new Vector4(0.86f, 0.86f, 0.86f, 1) },
{ "SliderGrab", new Vector4(0.54f, 0.54f, 0.54f, 1) },
{ "SliderGrabActive", new Vector4(0.67f, 0.67f, 0.67f, 1) },
{ "Button", new Vector4(0.71f, 0.71f, 0.71f, 0.4f) },
{ "ButtonHovered", new Vector4(0.47f, 0.47f, 0.47f, 1) },
{ "ButtonActive", new Vector4(0.74f, 0.74f, 0.74f, 1) },
{ "Header", new Vector4(0.59f, 0.59f, 0.59f, 0.31f) },
{ "HeaderHovered", new Vector4(0.5f, 0.5f, 0.5f, 0.8f) },
{ "HeaderActive", new Vector4(0.6f, 0.6f, 0.6f, 1) },
{ "Separator", new Vector4(0.43f, 0.43f, 0.5f, 0.5f) },
{ "SeparatorHovered", new Vector4(0.1f, 0.4f, 0.75f, 0.78f) },
{ "SeparatorActive", new Vector4(0.1f, 0.4f, 0.75f, 1) },
{ "ResizeGrip", new Vector4(0.79f, 0.79f, 0.79f, 0.25f) },
{ "ResizeGripHovered", new Vector4(0.78f, 0.78f, 0.78f, 0.67f) },
{ "ResizeGripActive", new Vector4(0.88f, 0.88f, 0.88f, 0.95f) },
{ "Tab", new Vector4(0.23f, 0.23f, 0.23f, 0.86f) },
{ "TabHovered", new Vector4(0.71f, 0.71f, 0.71f, 0.8f) },
{ "TabActive", new Vector4(0.36f, 0.36f, 0.36f, 1) },
{ "TabUnfocused", new Vector4(0.068f, 0.10199998f, 0.14800003f, 0.9724f) },
{ "TabUnfocusedActive", new Vector4(0.13599998f, 0.26199996f, 0.424f, 1) },
{ "DockingPreview", new Vector4(0.26f, 0.59f, 0.98f, 0.7f) },
{ "DockingEmptyBg", new Vector4(0.2f, 0.2f, 0.2f, 1) },
{ "PlotLines", new Vector4(0.61f, 0.61f, 0.61f, 1) },
{ "PlotLinesHovered", new Vector4(1, 0.43f, 0.35f, 1) },
{ "PlotHistogram", new Vector4(0.9f, 0.7f, 0, 1) },
{ "PlotHistogramHovered", new Vector4(1, 0.6f, 0, 1) },
{ "TableHeaderBg", new Vector4(0.19f, 0.19f, 0.2f, 1) },
{ "TableBorderStrong", new Vector4(0.31f, 0.31f, 0.35f, 1) },
{ "TableBorderLight", new Vector4(0.23f, 0.23f, 0.25f, 1) },
{ "TableRowBg", new Vector4(0, 0, 0, 0) },
{ "TableRowBgAlt", new Vector4(1, 1, 1, 0.06f) },
{ "TextSelectedBg", new Vector4(0.26f, 0.59f, 0.98f, 0.35f) },
{ "DragDropTarget", new Vector4(1, 1, 0, 0.9f) },
{ "NavHighlight", new Vector4(0.26f, 0.59f, 0.98f, 1) },
{ "NavWindowingHighlight", new Vector4(1, 1, 1, 0.7f) },
{ "NavWindowingDimBg", new Vector4(0.8f, 0.8f, 0.8f, 0.2f) },
{ "ModalWindowDimBg", new Vector4(0.8f, 0.8f, 0.8f, 0.35f) },
},
};
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("a")]
public float Alpha { get; set; }
[JsonProperty("b")]
public Vector2 WindowPadding { get; set; }
[JsonProperty("c")]
public float WindowRounding { get; set; }
[JsonProperty("d")]
public float WindowBorderSize { get; set; }
[JsonProperty("e")]
public Vector2 WindowTitleAlign { get; set; }
[JsonProperty("f")]
public ImGuiDir WindowMenuButtonPosition { get; set; }
[JsonProperty("g")]
public float ChildRounding { get; set; }
[JsonProperty("h")]
public float ChildBorderSize { get; set; }
[JsonProperty("i")]
public float PopupRounding { get; set; }
[JsonProperty("j")]
public Vector2 FramePadding { get; set; }
[JsonProperty("k")]
public float FrameRounding { get; set; }
[JsonProperty("l")]
public float FrameBorderSize { get; set; }
[JsonProperty("m")]
public Vector2 ItemSpacing { get; set; }
[JsonProperty("n")]
public Vector2 ItemInnerSpacing { get; set; }
[JsonProperty("o")]
public Vector2 CellPadding { get; set; }
[JsonProperty("p")]
public Vector2 TouchExtraPadding { get; set; }
[JsonProperty("q")]
public float IndentSpacing { get; set; }
[JsonProperty("r")]
public float ScrollbarSize { get; set; }
[JsonProperty("s")]
public float ScrollbarRounding { get; set; }
[JsonProperty("t")]
public float GrabMinSize { get; set; }
[JsonProperty("u")]
public float GrabRounding { get; set; }
[JsonProperty("v")]
public float LogSliderDeadzone { get; set; }
[JsonProperty("w")]
public float TabRounding { get; set; }
[JsonProperty("x")]
public float TabBorderSize { get; set; }
[JsonProperty("y")]
public Vector2 ButtonTextAlign { get; set; }
[JsonProperty("z")]
public Vector2 SelectableTextAlign { get; set; }
[JsonProperty("aa")]
public Vector2 DisplaySafeAreaPadding { get; set; }
[JsonProperty("col")]
public Dictionary<string, Vector4> Colors { get; set; }
public static void CopyTo(Stream src, Stream dest) {
byte[] bytes = new byte[4096];
int cnt;
while ((cnt = src.Read(bytes, 0, bytes.Length)) != 0) {
dest.Write(bytes, 0, cnt);
}
}
public static byte[] Zip(string str) {
var bytes = Encoding.UTF8.GetBytes(str);
using (var msi = new MemoryStream(bytes))
using (var mso = new MemoryStream()) {
using (var gs = new GZipStream(mso, CompressionMode.Compress)) {
//msi.CopyTo(gs);
CopyTo(msi, gs);
}
return mso.ToArray();
}
}
public static string Unzip(byte[] bytes) {
using (var msi = new MemoryStream(bytes))
using (var mso = new MemoryStream()) {
using (var gs = new GZipStream(msi, CompressionMode.Decompress)) {
//gs.CopyTo(mso);
CopyTo(gs, mso);
}
return Encoding.UTF8.GetString(mso.ToArray());
}
}
public string ToJsonEncoded() => "DS1" + System.Convert.ToBase64String(Zip(JsonConvert.SerializeObject(this)));
public void Apply()
{
var style = ImGui.GetStyle();
style.Alpha = this.Alpha;
style.WindowPadding = this.WindowPadding;
style.WindowRounding = this.WindowRounding;
style.WindowBorderSize = this.WindowBorderSize;
style.WindowTitleAlign = this.WindowTitleAlign;
style.WindowMenuButtonPosition = this.WindowMenuButtonPosition;
style.ChildRounding = this.ChildRounding;
style.ChildBorderSize = this.ChildBorderSize;
style.PopupRounding = this.PopupRounding;
style.FramePadding = this.FramePadding;
style.FrameRounding = this.FrameRounding;
style.FrameBorderSize = this.FrameBorderSize;
style.ItemSpacing = this.ItemSpacing;
style.ItemInnerSpacing = this.ItemInnerSpacing;
style.CellPadding = this.CellPadding;
style.TouchExtraPadding = this.TouchExtraPadding;
style.IndentSpacing = this.IndentSpacing;
style.ScrollbarSize = this.ScrollbarSize;
style.ScrollbarRounding = this.ScrollbarRounding;
style.GrabMinSize = this.GrabMinSize;
style.GrabRounding = this.GrabRounding;
style.LogSliderDeadzone = this.LogSliderDeadzone;
style.TabRounding = this.TabRounding;
style.TabBorderSize = this.TabBorderSize;
style.ButtonTextAlign = this.ButtonTextAlign;
style.SelectableTextAlign = this.SelectableTextAlign;
style.DisplaySafeAreaPadding = this.DisplaySafeAreaPadding;
}
public static StyleModel Get()
{
var model = new StyleModel();
var style = ImGui.GetStyle();
model.Alpha = style.Alpha;
model.WindowPadding = style.WindowPadding;
model.WindowRounding = style.WindowRounding;
model.WindowBorderSize = style.WindowBorderSize;
model.WindowTitleAlign = style.WindowTitleAlign;
model.WindowMenuButtonPosition = style.WindowMenuButtonPosition;
model.ChildRounding = style.ChildRounding;
model.ChildBorderSize = style.ChildBorderSize;
model.PopupRounding = style.PopupRounding;
model.FramePadding = style.FramePadding;
model.FrameRounding = style.FrameRounding;
model.FrameBorderSize = style.FrameBorderSize;
model.ItemSpacing = style.ItemSpacing;
model.ItemInnerSpacing = style.ItemInnerSpacing;
model.CellPadding = style.CellPadding;
model.TouchExtraPadding = style.TouchExtraPadding;
model.IndentSpacing = style.IndentSpacing;
model.ScrollbarSize = style.ScrollbarSize;
model.ScrollbarRounding = style.ScrollbarRounding;
model.GrabMinSize = style.GrabMinSize;
model.GrabRounding = style.GrabRounding;
model.LogSliderDeadzone = style.LogSliderDeadzone;
model.TabRounding = style.TabRounding;
model.TabBorderSize = style.TabBorderSize;
model.ButtonTextAlign = style.ButtonTextAlign;
model.SelectableTextAlign = style.SelectableTextAlign;
model.DisplaySafeAreaPadding = style.DisplaySafeAreaPadding;
model.Colors = new Dictionary<string, Vector4>();
foreach (var imGuiCol in Enum.GetValues<ImGuiCol>())
{
if (imGuiCol == ImGuiCol.COUNT)
{
continue;
}
model.Colors[imGuiCol.ToString()] = style.Colors[(int)imGuiCol];
}
return model;
}
public static StyleModel FromJsonEncoded(string data)
{
var json = Unzip(Convert.FromBase64String(data.Substring(2)));
return JsonConvert.DeserializeObject<StyleModel>(json);
}
}
}