WKLib 0.2.3
A modding library for White Knuckle
Loading...
Searching...
No Matches
ModListWindow.cs
Go to the documentation of this file.
1using System;
2using System.Linq;
3using System.Text;
4using System.Text.RegularExpressions;
5using BepInEx;
6using BepInEx.Configuration;
7using Imui.Controls;
8using Imui.Core;
9using UnityEngine;
10using WKLib.API.UI;
12
13namespace WKLib.Core.UI.Windows;
14
15internal static class ModListWindow
16{
17 public static bool isOpen = true;
18
19 private static PluginContainer[] pluginContainers = [];
20
21 private static string searchString = "";
22
23 public static void Initialize()
24 {
25 var pContainers = PluginConfigSearcher.GetPluginSettings();
26
27 foreach (var pluginContainer in pContainers)
28 {
29 pluginContainer.PluginName =
30 PrettifyName(pluginContainer.PluginInfo.Metadata.Name);
31 }
32
33 // Sort by name
34 pluginContainers = pContainers
35 .OrderBy(x => x.PluginName, StringComparer.OrdinalIgnoreCase)
36 .ToArray();
37
38 // https://github.com/Ikeiwa/WKModMenu/blob/main/ModMenu.cs#L262
39 string PrettifyName(string input)
40 {
41 input = Regex.Replace(input, "([a-z])([A-Z])", "$1 $2");
42 input = Regex.Replace(input, "([A-Z])([A-Z][a-z])", "$1 $2");
43 input = Regex.Replace(input, @"\s+", " ");
44 input = Regex.Replace(input, @"([A-Z]\.)\s([A-Z]\.)", "$1$2");
45
46 return input.Trim();
47 }
48 }
49
50 public static void Draw(ImGui gui, bool open)
51 {
52 if (!open)
53 return;
54
55 if (!gui.BeginWindow("Mod list", ref isOpen, new ImSize(250, 500), ImWindowFlag.None))
56 return;
57
58 gui.BeginVertical();
59 gui.Separator("Mods");
60 gui.TextEdit(ref searchString, hint: "Search for mod");
61
62 gui.AddSpacing();
63
64 for (int i = 0; i < pluginContainers.Length; i++)
65 {
66 ref var pluginContainer = ref pluginContainers[i];
67 if (pluginContainer == null || pluginContainer.PluginInfo == null)
68 continue;
69
70 var API = pluginContainer.APIReference;
71 if (API == null || (API != null && API.ModTab == null))
72 {
73 var pluginName = pluginContainer.PluginInfo.Metadata.Name;
74 if (pluginName.IsNullOrWhiteSpace())
75 continue;
76
77 if (searchString.Trim() != string.Empty)
78 {
79 if (!pluginName.Contains(searchString, StringComparison.OrdinalIgnoreCase))
80 continue;
81 }
82
83 gui.PushId(pluginContainer.PluginInfo.Metadata.GUID);
84
85 if (gui.Button(pluginName))
86 {
87 pluginContainer.IsWindowOpen = !pluginContainer.IsWindowOpen;
88 }
89
90 gui.PopId();
91 }
92 else
93 {
94 if (API.ModTab == null)
95 continue;
96
97 if (searchString.Trim() != string.Empty)
98 {
99 if (!API.ModTab.DisplayName.Contains(searchString, StringComparison.OrdinalIgnoreCase))
100 continue;
101 }
102
103 if (gui.BeginTreeNode(API.ModTab.DisplayName))
104 {
105 API.ModTab.DrawSubMenu(gui);
106 gui.EndTreeNode();
107 }
108 }
109
110 }
111
112 gui.EndVertical();
113 gui.EndWindow();
114
115 DrawConfigWindows(gui);
116 }
117
118 public static void CloseConfigWindows()
119 {
120 for (int i = 0; i < pluginContainers.Length; i++)
121 {
122 ref var pluginContainer = ref pluginContainers[i];
123 if (pluginContainer == null)
124 continue;
125
126 pluginContainer.IsWindowOpen = false;
127 }
128 }
129
130 private static void DrawConfigWindows(ImGui gui)
131 {
132 for (int i = 0; i < pluginContainers.Length; i++)
133 {
134 ref var pluginContainer = ref pluginContainers[i];
135 if (pluginContainer == null || pluginContainer.PluginInfo == null)
136 continue;
137
138 if (!pluginContainer.IsWindowOpen)
139 continue;
140
141 var pluginName = pluginContainer.PluginInfo.Metadata.Name;
142 if (pluginName.IsNullOrWhiteSpace())
143 continue;
144
145 if (!gui.BeginWindow(pluginName + " " + pluginContainer.PluginInfo.Metadata.Version, ref pluginContainer.IsWindowOpen, new ImSize(500, 500), ImWindowFlag.None))
146 continue;
147
148 foreach (var configSection in pluginContainer.ConfigSection)
149 {
150 if (!configSection.Section.IsNullOrWhiteSpace())
151 {
152 gui.AddSpacing();
153 gui.Separator(configSection.Section);
154 }
155
156 foreach (var configEntry in configSection.ConfigEntries)
157 {
158 UIUtility.DrawConfigEntry(gui, configEntry);
159 }
160 }
161
162 gui.EndWindow();
163 }
164 }
165
166 public static void HandleInput(ImGui gui, bool open) { }
167}
static void DrawConfigEntry(ImGui gui, ConfigEntryBase configEntry)
Definition UIUtility.cs:100