Skip to content

Commit 63b3b2d

Browse files
committed
Improve the settings
1 parent f72bebb commit 63b3b2d

File tree

4 files changed

+126
-109
lines changed

4 files changed

+126
-109
lines changed

MonkeyLoader.Resonite.Integration/Configuration/SettingsDataFeedInjector.cs

Lines changed: 117 additions & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
using System.Collections.Generic;
1010
using System.Linq;
1111
using System.Reflection;
12-
using System.Security.Principal;
1312
using System.Text;
1413
using System.Threading.Tasks;
1514

@@ -39,6 +38,17 @@ internal sealed class SettingsDataFeedInjector : ResoniteAsyncEventHandlerMonkey
3938

4039
protected override Task Handle(FallbackLocaleGenerationEvent eventData)
4140
{
41+
foreach (var configSection in Mod.Loader.Config.Sections)
42+
{
43+
eventData.AddMessage($"{configSection.FullId}.Name", configSection.Name);
44+
45+
foreach (var configKey in configSection.Keys)
46+
{
47+
eventData.AddMessage($"{configKey.FullId}.Name", configKey.Id);
48+
eventData.AddMessage($"{configKey.FullId}.Description", configKey.Description ?? "No Description");
49+
}
50+
}
51+
4252
foreach (var mod in Mod.Loader.Mods)
4353
{
4454
var modNameKey = $"{mod.Id}.Name";
@@ -83,6 +93,19 @@ protected override bool OnEngineReady()
8393
return base.OnEngineReady();
8494
}
8595

96+
private static async IAsyncEnumerable<DataFeedItem> EnumerateConfigAsync(IReadOnlyList<string> path, Config config)
97+
{
98+
foreach (var configSection in config.Sections.Where(section => !section.InternalAccessOnly))
99+
{
100+
var sectionGroup = new DataFeedGroup();
101+
sectionGroup.InitBase(configSection.Id, path, null, $"{configSection.FullId}.Name".AsLocaleKey());
102+
yield return sectionGroup;
103+
104+
await foreach (var sectionItem in EnumerateConfigSectionAsync(path, configSection))
105+
yield return sectionItem;
106+
}
107+
}
108+
86109
private static async IAsyncEnumerable<DataFeedItem> EnumerateConfigSectionAsync(IReadOnlyList<string> path, ConfigSection configSection)
87110
{
88111
foreach (var configKey in configSection.Keys.Where(key => !key.InternalAccessOnly))
@@ -123,8 +146,21 @@ private static async IAsyncEnumerable<DataFeedItem> EnumerateConfigSectionAsync(
123146
}
124147
}
125148

149+
private static async IAsyncEnumerable<DataFeedItem> EnumerateModMonkeysAsync(IReadOnlyList<string> path, Mod mod)
150+
{
151+
await foreach (var feedItem in EnumerateMonkeysAsync(path, mod, Monkeys))
152+
yield return feedItem;
153+
154+
await foreach (var feedItem in EnumerateMonkeysAsync(path, mod, EarlyMonkeys))
155+
yield return feedItem;
156+
}
157+
126158
private static async IAsyncEnumerable<DataFeedItem> EnumerateModsAsync(IReadOnlyList<string> path)
127159
{
160+
var monkeyLoaderCategory = new DataFeedCategory();
161+
monkeyLoaderCategory.InitBase("MonkeyLoader", path, null, $"{Mod.Id}.OpenMonkeyLoader.Name".AsLocaleKey(), $"{Mod.Id}.OpenMonkeyLoader.Description".AsLocaleKey());
162+
yield return monkeyLoaderCategory;
163+
128164
foreach (var mod in Mod.Loader.Mods)
129165
{
130166
var modGroup = new DataFeedGroup();
@@ -133,123 +169,51 @@ private static async IAsyncEnumerable<DataFeedItem> EnumerateModsAsync(IReadOnly
133169

134170
var grouping = new[] { mod.Id };
135171

136-
var monkeysCategory = new DataFeedCategory();
137-
monkeysCategory.InitBase($"{mod.Id}.{MonkeyToggles}", path, grouping, $"{Mod.Id}.Mod.Open{MonkeyToggles}".AsLocaleKey());
138-
monkeysCategory.SetOverrideSubpath(mod.Id, MonkeyToggles);
139-
yield return monkeysCategory;
140-
141172
var configSectionsCategory = new DataFeedCategory();
142173
configSectionsCategory.InitBase($"{mod.Id}.{ConfigSections}", path, grouping, $"{Mod.Id}.Mod.Open{ConfigSections}".AsLocaleKey());
143174
configSectionsCategory.SetOverrideSubpath(mod.Id, ConfigSections);
144175
yield return configSectionsCategory;
176+
177+
var monkeysCategory = new DataFeedCategory();
178+
monkeysCategory.InitBase($"{mod.Id}.{MonkeyToggles}", path, grouping, $"{Mod.Id}.Mod.Open{MonkeyToggles}".AsLocaleKey());
179+
monkeysCategory.SetOverrideSubpath(mod.Id, MonkeyToggles);
180+
yield return monkeysCategory;
145181
}
146182
}
147183

148184
private static async IAsyncEnumerable<DataFeedItem> EnumerateModSettingsAsync(IReadOnlyList<string> path)
149185
{
150-
// path.Count >= 3 because otherwise other methods are called
151-
// Format: MonkeyLoader / modId / {page}
186+
// path.Count >= 2 because otherwise other methods are called
187+
// Format: MonkeyLoader / modId / [page]
152188
if (Mod.Loader.Mods.FirstOrDefault(mod => mod.Id == path[1]) is not Mod mod)
153189
{
154190
Logger.Error(() => $"Tried to access non-existant mod's settings: {path[1]}");
155191
yield break;
156192
}
157193

158-
switch (path[2])
194+
if (path.Count == 2)
159195
{
160-
case MonkeyToggles:
161-
var monkeysGroup = new DataFeedGroup();
162-
monkeysGroup.InitBase(Monkeys, path, null, $"{Mod.Id}.{Monkeys}.Name".AsLocaleKey(), $"{Mod.Id}.{Monkeys}.Description".AsLocaleKey());
163-
yield return monkeysGroup;
164-
165-
var monkeysGrouping = new[] { Monkeys };
166-
167-
var monkeyCount = new DataFeedIndicator<string>();
168-
monkeyCount.InitBase($"{Monkeys}.Count", path, monkeysGrouping, $"{Mod.Id}.{Monkeys}.Count.Name".AsLocaleKey(), $"{Mod.Id}.{Monkeys}.Count.Description".AsLocaleKey());
169-
monkeyCount.InitSetupValue(field => field.Value = mod.Monkeys.Count().ToString());
170-
yield return monkeyCount;
171-
172-
foreach (var monkey in mod.Monkeys)
173-
{
174-
var monkeyGroup = new DataFeedGroup();
175-
monkeyGroup.InitBase($"{monkey.Id}", path, monkeysGrouping, $"{mod.Id}.{monkey.Id}.Name".AsLocaleKey(), $"{mod.Id}.{monkey.Id}.Description".AsLocaleKey());
176-
yield return monkeyGroup;
177-
178-
var monkeyGrouping = new[] { Monkeys, monkey.Id };
179-
180-
if (monkey.CanBeDisabled)
181-
{
182-
var toggle = new DataFeedToggle();
183-
toggle.InitBase($"{monkey.Id}.Enabled", path, monkeyGrouping, $"{Mod.Id}.{Monkeys}.Enabled.Name".AsLocaleKey(), $"{Mod.Id}.{Monkeys}.Enabled.Description".AsLocaleKey());
184-
toggle.InitSetupValue(field => field.SyncWithConfigKey(mod.MonkeyToggles.GetToggle(monkey)));
185-
yield return toggle;
186-
}
187-
else
188-
{
189-
var enabledIndicator = new DataFeedIndicator<string>();
190-
enabledIndicator.InitBase($"{monkey.Id}.Enabled", path, monkeyGrouping, $"{Mod.Id}.{Monkeys}.Enabled.Name".AsLocaleKey(), $"{Mod.Id}.{Monkeys}.Enabled.Description".AsLocaleKey());
191-
enabledIndicator.InitSetupValue(field => field.Value = "Always Enabled");
192-
yield return enabledIndicator;
193-
}
194-
195-
var typeIndicator = new DataFeedIndicator<string>();
196-
typeIndicator.InitBase($"{monkey.Id}.Type", path, monkeyGrouping, $"{Mod.Id}.{Monkeys}.Type.Name".AsLocaleKey(), $"{Mod.Id}.{Monkeys}.Type.Description".AsLocaleKey());
197-
typeIndicator.InitSetupValue(field => field.Value = monkey.Type.BaseType.Name);
198-
yield return typeIndicator;
199-
}
200-
201-
var earlyMonkeysGroup = new DataFeedGroup();
202-
earlyMonkeysGroup.InitBase(EarlyMonkeys, path, null, $"{Mod.Id}.{EarlyMonkeys}.Name".AsLocaleKey(), $"{Mod.Id}.{EarlyMonkeys}.Description".AsLocaleKey());
203-
yield return earlyMonkeysGroup;
196+
await foreach (var feedItem in EnumerateConfigAsync(path, mod.Config))
197+
yield return feedItem;
204198

205-
var earlyMonkeysGrouping = new[] { EarlyMonkeys };
199+
await foreach (var feedItem in EnumerateModMonkeysAsync(path, Mod))
200+
yield return feedItem;
206201

207-
var earlyMonkeyCount = new DataFeedIndicator<string>();
208-
earlyMonkeyCount.InitBase($"{EarlyMonkeys}.Count", path, earlyMonkeysGrouping, $"{Mod.Id}.{EarlyMonkeys}.Count.Name".AsLocaleKey(), $"{Mod.Id}.{EarlyMonkeys}.Count.Description".AsLocaleKey());
209-
earlyMonkeyCount.InitSetupValue(field => field.Value = mod.EarlyMonkeys.Count().ToString());
210-
yield return earlyMonkeyCount;
202+
yield break;
203+
}
211204

212-
foreach (var earlyMonkey in mod.EarlyMonkeys)
213-
{
214-
var earlyMonkeyGroup = new DataFeedGroup();
215-
earlyMonkeyGroup.InitBase(earlyMonkey.Id, path, earlyMonkeysGrouping, $"{mod.Id}.{earlyMonkey.Id}.Name".AsLocaleKey(), $"{mod.Id}.{earlyMonkey.Id}.Description".AsLocaleKey());
216-
yield return earlyMonkeyGroup;
217-
218-
var earlyMonkeyGrouping = new[] { EarlyMonkeys, earlyMonkey.Id };
219-
220-
if (earlyMonkey.CanBeDisabled)
221-
{
222-
var toggle = new DataFeedToggle();
223-
toggle.InitBase($"{earlyMonkey.Id}.Enabled", path, earlyMonkeyGrouping, $"{Mod.Id}.{EarlyMonkeys}.Enabled.Name".AsLocaleKey(), $"{Mod.Id}.{EarlyMonkeys}.Enabled.Description".AsLocaleKey());
224-
toggle.InitSetupValue(field => field.SyncWithConfigKey(mod.MonkeyToggles.GetToggle(earlyMonkey)));
225-
yield return toggle;
226-
}
227-
else
228-
{
229-
var enabledIndicator = new DataFeedIndicator<string>();
230-
enabledIndicator.InitBase($"{earlyMonkey.Id}.Enabled", path, earlyMonkeyGrouping, $"{Mod.Id}.{Monkeys}.Enabled.Name".AsLocaleKey(), $"{Mod.Id}.{Monkeys}.Enabled.Description".AsLocaleKey());
231-
enabledIndicator.InitSetupValue(field => field.Value = "Always Enabled");
232-
yield return enabledIndicator;
233-
}
234-
235-
var typeIndicator = new DataFeedIndicator<string>();
236-
typeIndicator.InitBase($"{earlyMonkey.Id}.Type", path, earlyMonkeyGrouping, $"{Mod.Id}.{Monkeys}.Type.Name".AsLocaleKey(), $"{Mod.Id}.{Monkeys}.Type.Description".AsLocaleKey());
237-
typeIndicator.InitSetupValue(field => field.Value = earlyMonkey.Type.BaseType.Name);
238-
yield return typeIndicator;
239-
}
205+
switch (path[2])
206+
{
207+
case ConfigSections:
208+
await foreach (var feedItem in EnumerateConfigAsync(path, mod.Config))
209+
yield return feedItem;
240210

241211
break;
242212

243-
case ConfigSections:
244-
foreach (var configSection in mod.Config.Sections.Where(section => !section.InternalAccessOnly))
245-
{
246-
var sectionGroup = new DataFeedGroup();
247-
sectionGroup.InitBase(configSection.Id, path, null, $"{configSection.FullId}.Name".AsLocaleKey());
248-
yield return sectionGroup;
213+
case MonkeyToggles:
214+
await foreach (var feedItem in EnumerateModMonkeysAsync(path, Mod))
215+
yield return feedItem;
249216

250-
await foreach (var sectionItem in EnumerateConfigSectionAsync(path, configSection))
251-
yield return sectionItem;
252-
}
253217
break;
254218

255219
default:
@@ -260,7 +224,58 @@ private static async IAsyncEnumerable<DataFeedItem> EnumerateModSettingsAsync(IR
260224

261225
private static async IAsyncEnumerable<DataFeedItem> EnumerateMonkeyLoaderSettingsAsync(IReadOnlyList<string> path)
262226
{
263-
yield break;
227+
await foreach (var feedItem in EnumerateConfigAsync(path, Mod.Loader.Config))
228+
yield return feedItem;
229+
}
230+
231+
private static async IAsyncEnumerable<DataFeedItem> EnumerateMonkeysAsync(IReadOnlyList<string> path, Mod mod, string monkeyType)
232+
{
233+
var monkeys = monkeyType switch
234+
{
235+
Monkeys => mod.Monkeys.ToArray(),
236+
EarlyMonkeys => mod.EarlyMonkeys.ToArray(),
237+
_ => Array.Empty<IMonkey>()
238+
};
239+
240+
var group = new DataFeedGroup();
241+
group.InitBase(monkeyType, path, null, $"{Mod.Id}.{monkeyType}.Name".AsLocaleKey(), $"{Mod.Id}.{monkeyType}.Description".AsLocaleKey());
242+
yield return group;
243+
244+
var monkeysGrouping = new[] { monkeyType };
245+
246+
var monkeyCount = new DataFeedIndicator<string>();
247+
monkeyCount.InitBase($"{monkeyType}.Count", path, monkeysGrouping, $"{Mod.Id}.{monkeyType}.Count.Name".AsLocaleKey(), $"{Mod.Id}.{monkeyType}.Count.Description".AsLocaleKey());
248+
monkeyCount.InitSetupValue(field => field.Value = monkeys.Length.ToString());
249+
yield return monkeyCount;
250+
251+
foreach (var monkey in monkeys)
252+
{
253+
var monkeyGroup = new DataFeedGroup();
254+
monkeyGroup.InitBase($"{monkey.Id}", path, monkeysGrouping, $"{monkey.FullId}.Name".AsLocaleKey(), $"{monkey.FullId}.Description".AsLocaleKey());
255+
yield return monkeyGroup;
256+
257+
var monkeyGrouping = new[] { monkeyType, monkey.Id };
258+
259+
if (monkey.CanBeDisabled)
260+
{
261+
var toggle = new DataFeedToggle();
262+
toggle.InitBase($"{monkey.Id}.Enabled", path, monkeyGrouping, $"{Mod.Id}.{monkeyType}.Enabled.Name".AsLocaleKey(), $"{Mod.Id}.{monkeyType}.Enabled.Description".AsLocaleKey());
263+
toggle.InitSetupValue(field => field.SyncWithConfigKey(mod.MonkeyToggles.GetToggle(monkey)));
264+
yield return toggle;
265+
}
266+
else
267+
{
268+
var enabledIndicator = new DataFeedIndicator<string>();
269+
enabledIndicator.InitBase($"{monkey.Id}.Enabled", path, monkeyGrouping, $"{Mod.Id}.{monkeyType}.Enabled.Name".AsLocaleKey(), $"{Mod.Id}.{monkeyType}.Enabled.Description".AsLocaleKey());
270+
enabledIndicator.InitSetupValue(field => field.Value = "Always Enabled");
271+
yield return enabledIndicator;
272+
}
273+
274+
var typeIndicator = new DataFeedIndicator<string>();
275+
typeIndicator.InitBase($"{monkey.Id}.Type", path, monkeyGrouping, $"{Mod.Id}.{monkeyType}.Type.Name".AsLocaleKey(), $"{Mod.Id}.{monkeyType}.Type.Description".AsLocaleKey());
276+
typeIndicator.InitSetupValue(field => field.Value = monkey.Type.BaseType.Name);
277+
yield return typeIndicator;
278+
}
264279
}
265280

266281
[HarmonyPrefix]
@@ -270,12 +285,12 @@ private static bool EnumeratePrefix(IReadOnlyList<string> path, ref IAsyncEnumer
270285
if (path.Count == 0 || path[0] != "MonkeyLoader")
271286
return true;
272287

273-
if (path.Count == 1)
274-
__result = EnumerateModsAsync(path);
275-
else if (path.Count == 2)
276-
__result = EnumerateMonkeyLoaderSettingsAsync(path);
277-
else if (path.Count >= 3)
278-
__result = EnumerateModSettingsAsync(path);
288+
__result = path.Count switch
289+
{
290+
1 => EnumerateModsAsync(path),
291+
2 => path[1] == "MonkeyLoader" ? EnumerateMonkeyLoaderSettingsAsync(path) : EnumerateModSettingsAsync(path),
292+
_ => EnumerateModSettingsAsync(path),
293+
};
279294

280295
return false;
281296
}

MonkeyLoader.Resonite.Integration/Locale/FallbackLocaleGenerator.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
using Elements.Assets;
2-
using MonkeyLoader.Configuration;
3-
using MonkeyLoader.Events;
1+
using MonkeyLoader.Events;
42
using MonkeyLoader.Meta;
53
using MonkeyLoader.Patching;
64
using System;
@@ -41,7 +39,7 @@ protected override async Task Handle(LocaleLoadingEvent eventData)
4139
{
4240
var generatorEventData = new FallbackLocaleGenerationEvent(eventData.LocaleResource._formatMessages);
4341

44-
await (_generateFallbackMessages?.TryInvokeAllAsync(generatorEventData) ?? Task.CompletedTask);
42+
await _generateFallbackMessages.TryInvokeAllAsync(generatorEventData);
4543
}
4644
catch (AggregateException ex)
4745
{

MonkeyLoader.Resonite.Integration/Locale/LocaleDataInjector.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ private static async Task LoadTargetVariantPostfixAsync(Task __result, LocaleRes
6363
{
6464
var eventData = new LocaleLoadingEvent(__instance.Data, localeCodes[i], i == localeCodes.Count - 1);
6565

66-
await (_localeLoading?.TryInvokeAllAsync(eventData) ?? Task.CompletedTask);
66+
await _localeLoading.TryInvokeAllAsync(eventData);
6767
}
6868
catch (AggregateException ex)
6969
{

MonkeyLoader.Resonite.Integration/Locale/en.json

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@
22
"localeCode": "en",
33
"authors": [ "Banane9" ],
44
"messages": {
5-
"Settings.Category.MonkeyLoader": "Monkey Loader",
5+
"Settings.Category.MonkeyLoader": "MonkeyLoader",
6+
"Settings.MonkeyLoader.Breadcrumb": "Settings",
7+
8+
"MonkeyLoader.GamePacks.Resonite.OpenMonkeyLoader.Name": "Open MonkeyLoader Settings",
9+
"MonkeyLoader.GamePacks.Resonite.OpenMonkeyLoader.Description": "Opens the settings for the mod loader itself.",
610

711
"MonkeyLoader.GamePacks.Resonite.Mod.Description": "Use the buttons to open the different settings for this mod.",
812

@@ -26,6 +30,6 @@
2630
"MonkeyLoader.GamePacks.Resonite.EarlyMonkeys.Count.Name": "Count",
2731
"MonkeyLoader.GamePacks.Resonite.EarlyMonkeys.Count.Description": "The number of Early Monkeys of this Mod.",
2832
"MonkeyLoader.GamePacks.Resonite.EarlyMonkeys.Enabled.Name": "Enabled",
29-
"MonkeyLoader.GamePacks.Resonite.EarlyMonkeys.Enabled.Description": "Toggles whether this Early Monkey is active."
33+
"MonkeyLoader.GamePacks.Resonite.EarlyMonkeys.Enabled.Description": "Toggles whether this Early Monkey is active.\n\nBeware, that changes will only take effect on restart."
3034
}
3135
}

0 commit comments

Comments
 (0)