Skip to content

Commit c10f769

Browse files
committed
Some initial drawing things for conditions.
1 parent 9e2e2d7 commit c10f769

11 files changed

Lines changed: 263 additions & 128 deletions

Penumbra/Communication/ModSettingChanged.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using Penumbra.Collections;
55
using Penumbra.Mods;
66
using Penumbra.Mods.Settings;
7+
using Penumbra.UI.ModsTab.Groups;
78
using Penumbra.UI.ModsTab.Selector;
89

910
namespace Penumbra.Communication;
@@ -23,6 +24,9 @@ public enum Priority
2324
/// <seealso cref="Mods.Manager.ModConfigUpdater.OnModSettingChanged"/>
2425
ModConfigUpdater = -10,
2526

27+
/// <seealso cref="ModSettingsCache.OnModSettingChanged"/>
28+
ModGroupCache = -5,
29+
2630
/// <seealso cref="Collections.Cache.CollectionCacheManager.OnModSettingChange"/>
2731
CollectionCacheManager = 0,
2832

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,46 @@
1+
using ImSharp;
12
using Luna;
23

34
namespace Penumbra.Mods.Groups;
45

56
public sealed class ModGroupConditionDrawer : ConditionDrawer<ModSettingContext>, IUiService
67
{
7-
protected override void DrawCustom(ICondition<ModSettingContext> condition, ModSettingContext context)
8+
private string _group = string.Empty;
9+
private string _option = string.Empty;
10+
11+
protected override bool DrawCustom(ICondition<ModSettingContext>? condition, ModSettingContext context,
12+
out ICondition<ModSettingContext>? replaced)
813
{
14+
var ret = false;
15+
replaced = null;
916
switch (condition)
1017
{
18+
case null:
19+
{
20+
if (ImEx.Icon.Button(LunaStyle.AddObjectIcon, "Add a new condition."u8, _group.Length is 0 && _option.Length is 0))
21+
{
22+
replaced = new SingleSettingCondition(_group, _option);
23+
_group = string.Empty;
24+
_option = string.Empty;
25+
ret = true;
26+
}
27+
28+
Im.Line.SameInner();
29+
Im.Item.SetNextWidth(Im.ContentRegion.Available.X * 0.4f);
30+
Im.Input.Text("##Group"u8, ref _group, "Group..."u8);
31+
Im.Line.SameInner();
32+
Im.Item.SetNextWidth(Im.ContentRegion.Available.X);
33+
Im.Input.Text("##Options"u8, ref _option, "Options..."u8);
34+
}
35+
break;
1136
case SingleSettingCondition single:
12-
{ }
37+
{
38+
Im.FrameDummy();
39+
Im.Line.SameInner();
40+
ImEx.TextFramed(single.Group, new Vector2(Im.ContentRegion.Available.X * 0.4f, 0));
41+
Im.Line.SameInner();
42+
ImEx.TextFramed(single.Option, Im.ContentRegion.Available with { Y = 0 });
43+
}
1344
break;
1445
case MultiSettingAllCondition all:
1546
{ }
@@ -18,5 +49,7 @@ protected override void DrawCustom(ICondition<ModSettingContext> condition, ModS
1849
{ }
1950
break;
2051
}
52+
53+
return ret;
2154
}
2255
}

Penumbra/Mods/Groups/ModSettingContext.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ public bool Evaluate(in ModSettingContext context)
8282
if (group.Name != Group)
8383
continue;
8484

85-
var settings = context.Settings.Settings[index];
85+
var settings = context.Settings.IsEmpty ? group.DefaultSettings : context.Settings.Settings[index];
8686
var option = group.Options.IndexOf(o => o.Name == Option);
8787
if (option < 0)
8888
continue;
@@ -150,7 +150,7 @@ public bool Evaluate(in ModSettingContext context)
150150
if (group.Type is GroupType.Single && Count > 1)
151151
continue;
152152

153-
var settings = context.Settings.Settings[index];
153+
var settings = context.Settings.IsEmpty ? group.DefaultSettings : context.Settings.Settings[index];
154154
if (EvaluateGroup(group, settings))
155155
return true;
156156
}

Penumbra/UI/ModsTab/Groups/CombiningModGroupEditDrawer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public void Draw()
2121
editor.DrawOptionName(option);
2222

2323
Im.Line.SameInner();
24-
editor.DrawOptionDescription(option);
24+
editor.DrawOptionButtons(option);
2525

2626
Im.Line.SameInner();
2727
editor.DrawOptionDelete(option);

Penumbra/UI/ModsTab/Groups/ImcModGroupEditDrawer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ private void DrawOptions()
117117
editor.DrawOptionName(option);
118118

119119
Im.Line.SameInner();
120-
editor.DrawOptionDescription(option);
120+
editor.DrawOptionButtons(option);
121121

122122
if (!option.IsDisableSubMod)
123123
{

Penumbra/UI/ModsTab/Groups/ModGroupDrawer.cs

Lines changed: 0 additions & 111 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
using ImSharp;
22
using Luna;
3-
using Penumbra.Api.Enums;
43
using Penumbra.Collections;
54
using Penumbra.Collections.Manager;
6-
using Penumbra.Communication;
75
using Penumbra.Mods;
86
using Penumbra.Mods.Groups;
97
using Penumbra.Mods.Settings;
@@ -12,115 +10,6 @@
1210

1311
namespace Penumbra.UI.ModsTab.Groups;
1412

15-
public sealed class ModSettingsCache : BasicCache
16-
{
17-
public sealed class ModGroupCache
18-
{
19-
public GroupDrawBehaviour Behaviour
20-
=> Group.Behaviour;
21-
22-
public IModGroup Group = null!;
23-
public int Index;
24-
public bool IsCombo;
25-
public StringU8 Name;
26-
public StringU8 Description;
27-
public float NameWidth;
28-
public float ComboWidth;
29-
public readonly List<(StringU8 Option, StringU8 Description, Setting Value, float Width)> Options = [];
30-
}
31-
32-
public int Count = 0;
33-
public readonly List<ModGroupCache> SingleGroups = [];
34-
public readonly List<ModGroupCache> MultiGroups = [];
35-
private readonly ModSelection _selection;
36-
private readonly Configuration _config;
37-
private readonly CommunicatorService _communicator;
38-
39-
public ModSettingsCache(ModSelection selection, Configuration config, CommunicatorService communicator)
40-
{
41-
_selection = selection;
42-
_config = config;
43-
_communicator = communicator;
44-
_selection.Subscribe(OnSelectionChanged, ModSelection.Priority.ModPanel);
45-
_communicator.ModOptionChanged.Subscribe(OnModOptionChanged, ModOptionChanged.Priority.ModCacheManager);
46-
}
47-
48-
private void OnModOptionChanged(in ModOptionChanged.Arguments arguments)
49-
{
50-
if (arguments.Mod == _selection.Mod)
51-
Dirty |= IManagedCache.DirtyFlags.Custom;
52-
}
53-
54-
private void OnSelectionChanged(in ModSelection.Arguments arguments)
55-
=> Dirty |= IManagedCache.DirtyFlags.Custom;
56-
57-
protected override void Dispose(bool disposing)
58-
{
59-
_selection.Unsubscribe(OnSelectionChanged);
60-
_communicator.ModOptionChanged.Unsubscribe(OnModOptionChanged);
61-
}
62-
63-
public override void Update()
64-
{
65-
if (!AnyDirty)
66-
return;
67-
68-
Dirty = IManagedCache.DirtyFlags.Clean;
69-
SingleGroups.Clear();
70-
MultiGroups.Clear();
71-
if (_selection.Mod is not null)
72-
{
73-
SingleGroups.EnsureCapacity(_selection.Mod.Groups.Count);
74-
MultiGroups.EnsureCapacity(_selection.Mod.Groups.Count);
75-
foreach (var (index, group) in _selection.Mod.Groups.Index())
76-
{
77-
if (Create(group, index) is not { } cache)
78-
continue;
79-
80-
if (cache.Behaviour is GroupDrawBehaviour.SingleSelection)
81-
SingleGroups.Add(cache);
82-
else
83-
MultiGroups.Add(cache);
84-
}
85-
}
86-
87-
Count = SingleGroups.Count + MultiGroups.Count;
88-
}
89-
90-
public ModGroupCache? Create(IModGroup group, int groupIndex)
91-
{
92-
if (!group.IsOption)
93-
return null;
94-
95-
var ret = new ModGroupCache
96-
{
97-
Group = group,
98-
Index = groupIndex,
99-
Name = new StringU8(group.Name),
100-
Description = new StringU8(group.Description),
101-
IsCombo = group.Behaviour is GroupDrawBehaviour.SingleSelection && group.Options.Count > _config.SingleGroupRadioMax,
102-
};
103-
ret.NameWidth = ret.Name.CalculateSize().X;
104-
if (!ret.Description.IsEmpty && ret.IsCombo)
105-
ret.NameWidth += Im.Style.ItemInnerSpacing.X + LunaStyle.HelpMarker.CalculateSize().X;
106-
107-
ret.Options.EnsureCapacity(group.Options.Count);
108-
foreach (var (index, option) in group.Options.Index())
109-
{
110-
var name = new StringU8(option.Name);
111-
var description = new StringU8(option.Description);
112-
var width = name.CalculateSize().X;
113-
if (!description.IsEmpty)
114-
width += Im.Style.ItemInnerSpacing.X + LunaStyle.HelpMarker.CalculateSize().X;
115-
ret.Options.Add((name, description, group.Type is GroupType.Single ? Setting.Single(index) : Setting.Multi(index), width));
116-
if (width > ret.ComboWidth)
117-
ret.ComboWidth = width;
118-
}
119-
120-
return ret;
121-
}
122-
}
123-
12413
public sealed class ModGroupDrawer(
12514
Configuration config,
12615
CollectionManager collectionManager,

Penumbra/UI/ModsTab/Groups/ModGroupEditDrawer.cs

Lines changed: 54 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,19 @@ public sealed class ModGroupEditDrawer(
1919
Configuration config,
2020
FilenameService filenames,
2121
DescriptionEditPopup descriptionPopup,
22-
ImcChecker imcChecker) : IUiService
22+
ImcChecker imcChecker,
23+
ModGroupConditionDrawer conditionDrawer) : IUiService
2324
{
2425
private static ReadOnlySpan<byte> AcrossGroupsLabel
2526
=> "##DragOptionAcross"u8;
2627

2728
private static ReadOnlySpan<byte> InsideGroupLabel
2829
=> "##DragOptionInside"u8;
2930

30-
internal readonly ImcChecker ImcChecker = imcChecker;
31-
internal readonly ModManager ModManager = modManager;
32-
internal readonly Queue<Action> ActionQueue = new();
31+
internal readonly ModGroupConditionDrawer ConditionDrawer = conditionDrawer;
32+
internal readonly ImcChecker ImcChecker = imcChecker;
33+
internal readonly ModManager ModManager = modManager;
34+
internal readonly Queue<Action> ActionQueue = new();
3335

3436
internal Vector2 OptionIdxSelectable;
3537
internal Vector2 AvailableWidth;
@@ -82,6 +84,10 @@ private void DrawGroupNameRow(IModGroup group, int idx)
8284
Im.Line.SameInner();
8385
DrawGroupDescription(group);
8486
Im.Line.SameInner();
87+
DrawGroupLayout(group);
88+
Im.Line.SameInner();
89+
DrawGroupConditions(group);
90+
Im.Line.SameInner();
8591
DrawGroupDelete(group);
8692
Im.Line.SameInner();
8793
DrawGroupPriority(group);
@@ -139,6 +145,21 @@ private void DrawGroupDescription(IModGroup group)
139145
descriptionPopup.Open(group);
140146
}
141147

148+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
149+
private void DrawGroupLayout(IModGroup group)
150+
{
151+
if (ImEx.Icon.Button(LunaStyle.LayoutIcon, "Edit group layout settings."u8))
152+
descriptionPopup.Open(group);
153+
}
154+
155+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
156+
private void DrawGroupConditions(IModGroup group)
157+
{
158+
if (ImEx.Icon.Button(LunaStyle.ConditionIcon, "Edit group conditions."u8,
159+
textColor: group.Condition is not null ? LunaStyle.FavoriteColor : ColorParameter.Default))
160+
descriptionPopup.Open(group);
161+
}
162+
142163
private void DrawGroupMoveButtons(IModGroup group, int idx)
143164
{
144165
var isFirst = idx is 0;
@@ -211,12 +232,37 @@ internal void DrawOptionDefaultMultiBehaviour(IModGroup group, IModOption option
211232
}
212233

213234
[MethodImpl(MethodImplOptions.AggressiveInlining)]
214-
internal void DrawOptionDescription(IModOption option)
235+
internal void DrawOptionButtons(IModOption option)
236+
{
237+
DrawOptionDescription(option);
238+
Im.Line.SameInner();
239+
DrawOptionLayout(option);
240+
Im.Line.SameInner();
241+
DrawOptionConditions(option);
242+
}
243+
244+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
245+
private void DrawOptionDescription(IModOption option)
215246
{
216247
if (ImEx.Icon.Button(LunaStyle.EditIcon, "Edit option description."u8))
217248
descriptionPopup.Open(option);
218249
}
219250

251+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
252+
private void DrawOptionLayout(IModOption option)
253+
{
254+
if (ImEx.Icon.Button(LunaStyle.LayoutIcon, "Edit option layout settings."u8))
255+
descriptionPopup.Open(option);
256+
}
257+
258+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
259+
private void DrawOptionConditions(IModOption option)
260+
{
261+
if (ImEx.Icon.Button(LunaStyle.ConditionIcon, "Edit option conditions."u8,
262+
textColor: option.Condition is not null ? LunaStyle.FavoriteColor : ColorParameter.Default))
263+
descriptionPopup.Open(option);
264+
}
265+
220266
[MethodImpl(MethodImplOptions.AggressiveInlining)]
221267
internal void DrawOptionPriority(MultiSubMod option)
222268
{
@@ -332,11 +378,11 @@ private void PrepareStyle()
332378
var totalWidth = 400f * Im.Style.GlobalScale;
333379
_buttonSize = new Vector2(Im.Style.FrameHeight);
334380
PriorityWidth = 50 * Im.Style.GlobalScale;
335-
AvailableWidth = new Vector2(totalWidth + 3 * _spacing + 2 * _buttonSize.X + PriorityWidth, 0);
336-
_groupNameWidth = totalWidth - 3 * (_buttonSize.X + _spacing);
381+
AvailableWidth = new Vector2(totalWidth + 5 * _spacing + 4 * _buttonSize.X + PriorityWidth, 0);
382+
_groupNameWidth = totalWidth - 5 * (_buttonSize.X + _spacing);
337383
_spacing = Im.Style.ItemInnerSpacing.X;
338384
OptionIdxSelectable = Im.Font.CalculateSize("Option #88."u8);
339-
_optionNameWidth = totalWidth - OptionIdxSelectable.X - _buttonSize.X - 2 * _spacing;
385+
_optionNameWidth = totalWidth - OptionIdxSelectable.X - 3 * _buttonSize.X - 4 * _spacing;
340386
_deleteEnabled = config.DeleteModModifier.IsActive();
341387
}
342388
}

0 commit comments

Comments
 (0)