Config: reduce repetition

It may look complicated, but it reduced references to each individual
entry from almost ten to just 4.
This commit is contained in:
ivan tkachenko 2025-07-19 17:28:01 +03:00
parent 601ecf8887
commit 3e751c0d8d
1 changed files with 25 additions and 37 deletions

View File

@ -1334,6 +1334,7 @@ namespace MuzikaGromche
const string section = "Timings";
var colorTransitionRange = new AcceptableValueRange<float>(0f, 1f);
// Declare and initialize early to avoid "Use of unassigned local variable"
List<(Action<Track> Load, Action Apply)> entries = [];
SyncedEntry<bool> overrideTimingsSyncedEntry = null;
SyncedEntry<float> beatsOffsetSyncedEntry = null;
SyncedEntry<float> colorTransitionInSyncedEntry = null;
@ -1379,56 +1380,43 @@ namespace MuzikaGromche
CanModifyCallback = CanModifyIfHost,
}));
CSyncHackAddSyncedEntry(beatsOffsetSyncedEntry);
CSyncHackAddSyncedEntry(colorTransitionInSyncedEntry);
CSyncHackAddSyncedEntry(colorTransitionOutSyncedEntry);
CSyncHackAddSyncedEntry(colorTransitionEasingSyncedEntry);
registerStruct(beatsOffsetSyncedEntry, t => t._BeatsOffset, x => BeatsOffsetOverride = x);
registerStruct(colorTransitionInSyncedEntry, t => t._ColorTransitionIn, x => ColorTransitionInOverride = x);
registerStruct(colorTransitionOutSyncedEntry, t => t._ColorTransitionOut, x => ColorTransitionOutOverride = x);
registerClass(colorTransitionEasingSyncedEntry, t => t._ColorTransitionEasing.Name, x => ColorTransitionEasingOverride = x);
beatsOffsetSyncedEntry.SyncHostToLocal();
colorTransitionInSyncedEntry.SyncHostToLocal();
colorTransitionOutSyncedEntry.SyncHostToLocal();
colorTransitionEasingSyncedEntry.SyncHostToLocal();
void register<T>(SyncedEntry<T> syncedEntry, Func<Track, T> getter, Action applier)
{
CSyncHackAddSyncedEntry(syncedEntry);
syncedEntry.SyncHostToLocal();
syncedEntry.Changed += (sender, args) => applier();
void loader(Track track)
{
// if track is null, set everything to defaults
syncedEntry.LocalValue = track == null ? (T)syncedEntry.Entry.DefaultValue : getter(track);
}
entries.Add((loader, applier));
}
beatsOffsetSyncedEntry.Changed += (sender, args) => apply();
colorTransitionInSyncedEntry.Changed += (sender, args) => apply();
colorTransitionOutSyncedEntry.Changed += (sender, args) => apply();
colorTransitionEasingSyncedEntry.Changed += (sender, args) => apply();
void registerStruct<T>(SyncedEntry<T> syncedEntry, Func<Track, T> getter, Action<T?> setter) where T: struct =>
register(syncedEntry, getter, () => setter.Invoke(overrideTimingsSyncedEntry.Value ? syncedEntry.Value : null));
void registerClass<T>(SyncedEntry<T> syncedEntry, Func<Track, T> getter, Action<T> setter) where T: class =>
register(syncedEntry, getter, () => setter.Invoke(overrideTimingsSyncedEntry.Value ? syncedEntry.Value : null));
void load()
{
// if track is null, set everything to defaults
var track = Plugin.CurrentTrack;
if (track == null)
foreach (var entry in entries)
{
beatsOffsetSyncedEntry.LocalValue = 0f;
colorTransitionInSyncedEntry.LocalValue = 0f;
colorTransitionOutSyncedEntry.LocalValue = 0f;
colorTransitionEasingSyncedEntry.LocalValue = Easing.Linear.Name;
}
else
{
beatsOffsetSyncedEntry.LocalValue = track._BeatsOffset;
colorTransitionInSyncedEntry.LocalValue = track._ColorTransitionIn;
colorTransitionOutSyncedEntry.LocalValue = track._ColorTransitionOut;
colorTransitionEasingSyncedEntry.LocalValue = track._ColorTransitionEasing.Name;
entry.Load(track);
}
}
void apply()
{
if (!overrideTimingsSyncedEntry.Value)
foreach (var entry in entries)
{
BeatsOffsetOverride = null;
ColorTransitionInOverride = null;
ColorTransitionOutOverride = null;
ColorTransitionEasingOverride = null;
}
else
{
BeatsOffsetOverride = beatsOffsetSyncedEntry.Value;
ColorTransitionInOverride = colorTransitionInSyncedEntry.Value;
ColorTransitionOutOverride = colorTransitionOutSyncedEntry.Value;
ColorTransitionEasingOverride = colorTransitionEasingSyncedEntry.Value;
entry.Apply();
}
}
}