WKLib 0.2.3
A modding library for White Knuckle
Loading...
Searching...
No Matches
ThemeController.cs
Go to the documentation of this file.
1using Imui.Controls;
2using Imui.Core;
3using Imui.IO.UGUI;
4using Imui.Style;
5using UnityEngine;
7using static WKLib.API.UI.UIUtility;
8using static WKLib.Core.Config.ConfigManager;
9
10namespace WKLib.Core.UI;
11
12internal class ThemeController : MonoBehaviour
13{
14 public ImTheme BaseTheme = SetBaseTheme(ImThemeBuiltin.Dark());
15
16 private bool changesDetected = false;
17
18 public static ImTheme SetBaseTheme(ImTheme theme)
19 {
20 // Colors
21 theme.Background = new Color(0f, 0f, 0f, 1f);
22 theme.Foreground = new Color(1f, 1f, 1f, 1f);
23 theme.Accent = AccentColor.Value;
24 theme.Control = new Color(0.15f, 0.15f, 0.15f, 1f);
25
26 theme.Contrast = HighContrast.Value ? 1f : 0f;
27 theme.BorderContrast = 1f;
28
29 // Values
30 theme.TextSize = 16f;
31 theme.BorderRadius = 1f;
32 theme.ReadOnlyColorMultiplier = 0.25f;
33
34 return theme;
35 }
36
37 public void RegisterChanges()
38 {
39 changesDetected = true;
40
41 BaseTheme.Contrast = HighContrast.Value ? 1f : 0f;
42 BaseTheme.Accent = AccentColor.Value;
43 }
44
45 public void DetectChanges(ImGui gui)
46 {
47 if (changesDetected)
48 {
49 changesDetected = false;
50 SetTheme(gui);
51 }
52 }
53
54 public void DrawAppearanceEditor(ImGui gui)
55 {
56 var tempValue = HighContrast.Value;
57 if (gui.Checkbox(ref tempValue, "High contrast"))
58 {
59 HighContrast.Value = tempValue;
60 BaseTheme.Contrast = HighContrast.Value ? 1f : 0f;
61 SetTheme(gui);
62 }
63
64 var tempValue1 = AccentColor.Value;
65 if (gui.ColorEdit(ref tempValue1))
66 {
67 AccentColor.Value = tempValue1;
68 BaseTheme.Accent = AccentColor.Value;
69 SetTheme(gui);
70 }
71 }
72
73 public static bool DrawThemeEditor(ImGui gui, ref ImTheme theme)
74 {
75 var changed = false;
76
77 gui.Separator("Colors");
78
79 using (new LabeledScope(gui, nameof(theme.Foreground))) changed |= gui.ColorEdit(ref theme.Foreground);
80 using (new LabeledScope(gui, nameof(theme.Background))) changed |= gui.ColorEdit(ref theme.Background);
81 using (new LabeledScope(gui, nameof(theme.Accent))) changed |= gui.ColorEdit(ref theme.Accent);
82 using (new LabeledScope(gui, nameof(theme.Control))) changed |= gui.ColorEdit(ref theme.Control);
83 using (new LabeledScope(gui, nameof(theme.Contrast))) changed |= gui.NumericEdit(ref theme.Contrast, min: -1.0f, max: +1.0f, flags: ImNumericEditFlag.Slider);
84 using (new LabeledScope(gui, nameof(theme.BorderContrast))) changed |= gui.NumericEdit(ref theme.BorderContrast, min: -1.0f, max: +2.0f, flags: ImNumericEditFlag.Slider);
85
86 gui.Separator("Values");
87
88 using (new LabeledScope(gui, nameof(theme.TextSize))) changed |= gui.NumericEdit(ref theme.TextSize, min: 4.0f, max: 128.0f, flags: ImNumericEditFlag.Slider);
89 using (new LabeledScope(gui, nameof(theme.Spacing))) changed |= gui.NumericEdit(ref theme.Spacing, min: 0.0f, max: 32.0f, flags: ImNumericEditFlag.Slider);
90 using (new LabeledScope(gui, nameof(theme.InnerSpacing))) changed |= gui.NumericEdit(ref theme.InnerSpacing, min: 0.0f, max: 32.0f, flags: ImNumericEditFlag.Slider);
91 using (new LabeledScope(gui, nameof(theme.Indent))) changed |= gui.NumericEdit(ref theme.Indent, min: 0.0f, max: 128.0f, flags: ImNumericEditFlag.Slider);
92 using (new LabeledScope(gui, nameof(theme.ExtraRowHeight))) changed |= gui.NumericEdit(ref theme.ExtraRowHeight, min: 0.0f, max: 128.0f, flags: ImNumericEditFlag.Slider);
93 using (new LabeledScope(gui, nameof(theme.ScrollBarSize))) changed |= gui.NumericEdit(ref theme.ScrollBarSize, min: 2.0f, max: 128.0f, flags: ImNumericEditFlag.Slider);
94 using (new LabeledScope(gui, nameof(theme.WindowBorderRadius))) changed |= gui.NumericEdit(ref theme.WindowBorderRadius, min: 0.0f, max: 32.0f, flags: ImNumericEditFlag.Slider);
95 using (new LabeledScope(gui, nameof(theme.WindowBorderThickness))) changed |= gui.NumericEdit(ref theme.WindowBorderThickness, min: 0.0f, max: 8.0f, step: 0.5f, flags: ImNumericEditFlag.Slider);
96 using (new LabeledScope(gui, nameof(theme.BorderRadius))) changed |= gui.NumericEdit(ref theme.BorderRadius, min: 0.0f, max: 16.0f, flags: ImNumericEditFlag.Slider);
97 using (new LabeledScope(gui, nameof(theme.BorderThickness))) changed |= gui.NumericEdit(ref theme.BorderThickness, min: 0.0f, max: 8.0f, step: 0.5f, flags: ImNumericEditFlag.Slider);
98 using (new LabeledScope(gui, nameof(theme.ReadOnlyColorMultiplier))) changed |= gui.NumericEdit(ref theme.ReadOnlyColorMultiplier, min: 0.0f, max: 8.0f, flags: ImNumericEditFlag.Slider);
99
100 return changed;
101 }
102
103 public void SetTheme(ImGui gui)
104 {
105 gui.SetTheme(BaseTheme);
106 }
107}