Scene strip now renders in canonical F-key order regardless of persisted SortOrder. The strip loads Scenes ORDER BY SortOrder while each tab's F-key label is name-derived, so a session that persisted Chat before BRB (found on the creator's DB: SortOrder 2/3) showed tabs 'Chat F4' then 'BRB F3'. MainViewModel.LoadLayout now calls the new ReorderScenesToCanonical() - the five canonical scenes reorder to Starting, Live, BRB, Chat, Ending (F1-F5, stable among renamed non-canonical scenes), and the next auto-save re-stamps SortOrder so the heal persists. One integration test (SceneOrderTests) seeds the swapped-order DB and asserts loaded order, F1-F5 labels, and that a save persists the corrected ordering. 423 pass, 0 build warnings. (Unit: scene order)
This commit is contained in:
@@ -196,6 +196,32 @@ public partial class MainViewModel
|
||||
public IEnumerable<string> MissingScenes
|
||||
=> SceneCatalog.All.Where(canonical => Scenes.All(s => !SceneCatalog.Is(s.Name, canonical)));
|
||||
|
||||
/// <summary>
|
||||
/// The five canonical scenes render in F-key order (Starting, Live, BRB, Chat,
|
||||
/// Ending = F1-F5), whichever order the persisted SortOrder rows ended up in —
|
||||
/// an older session can leave Chat before BRB (seen on the creator's DB).
|
||||
/// Renamed (non-canonical) scenes keep their loaded order AFTER the canonical
|
||||
/// five. Stable <see cref="Enumerable.OrderBy"/>, so one pass; the next
|
||||
/// auto-save re-stamps each SortOrder to its corrected index.
|
||||
/// </summary>
|
||||
private void ReorderScenesToCanonical()
|
||||
{
|
||||
var target = Scenes.OrderBy(s => CanonicalIndex(s.Name)).ToList();
|
||||
for (var i = 0; i < target.Count; i++)
|
||||
{
|
||||
var current = Scenes.IndexOf(target[i]);
|
||||
if (current != i) Scenes.Move(current, i);
|
||||
}
|
||||
}
|
||||
|
||||
private static int CanonicalIndex(string? name)
|
||||
{
|
||||
if (name == null) return SceneCatalog.All.Length;
|
||||
for (var i = 0; i < SceneCatalog.All.Length; i++)
|
||||
if (SceneCatalog.Is(name, SceneCatalog.All[i])) return i;
|
||||
return SceneCatalog.All.Length;
|
||||
}
|
||||
|
||||
/// <summary>Only show the "+" button when one of the five canonical scenes is missing.</summary>
|
||||
public bool ShowAddScene => MissingScenes.Any();
|
||||
|
||||
|
||||
@@ -411,6 +411,7 @@ public partial class MainViewModel : ViewModelBase
|
||||
foreach (var name in SceneCatalog.All)
|
||||
AddScene(name);
|
||||
}
|
||||
ReorderScenesToCanonical();
|
||||
HealBackgrounds();
|
||||
HealZoomLayers();
|
||||
RefreshHotkeyLabels();
|
||||
|
||||
Reference in New Issue
Block a user