fix(tapes): a session picked with no tape stays picked when the list refreshes, and an empty one says it has no black box either

This commit is contained in:
maj00r
2026-11-11 18:25:54 +01:00
parent 9b5848042a
commit b7eefcd0ed
6 changed files with 23 additions and 4 deletions

View File

@@ -66,6 +66,8 @@ public sealed class HaslerTapeWindow : Window
private readonly Action<TapeSample> _picked;
private TapeFile? _shown;
/// <summary>The session picked that has no tape, so that a refresh of the list goes back to it and not to a tape of another.</summary>
private DateTime? _tapeless;
private string? _followed;
private string _listed = "";
private bool _running;
@@ -139,7 +141,7 @@ public sealed class HaslerTapeWindow : Window
if (file is null)
{
if (session is not null)
ShowNoTape();
ShowNoTape(session);
return;
}
if (file == _shown)
@@ -340,6 +342,7 @@ public sealed class HaslerTapeWindow : Window
if (toDriven)
_followed = driven;
string? selected = toDriven && driven is not null ? driven : _shown?.Path;
DateTime? tapeless = toDriven && driven is not null ? null : _tapeless;
FollowBlackBoxes(sessions);
foreach (var node in _list.Items.OfType<TreeViewItem>())
@@ -347,10 +350,13 @@ public sealed class HaslerTapeWindow : Window
_list.Items.Clear();
(TreeViewItem Node, TreeViewItem Tape)? first = null, pick = null;
TreeViewItem? again = null;
for (int i = 0; i < sessions.Count; i++)
{
var node = SessionItem(sessions[i], _expanded.GetValueOrDefault(sessions[i].StartedUtc, i == 0));
_list.Items.Add(node);
if (sessions[i].StartedUtc == tapeless)
again = node;
foreach (var tape in node.Items.OfType<TreeViewItem>().Where(item => item.Tag is TapeFile))
{
first ??= (node, tape);
@@ -362,6 +368,12 @@ public sealed class HaslerTapeWindow : Window
_empty.Text = string.Format(App.Loc["HaslerNoTapes"], _tapes.Folder);
_empty.IsVisible = first is null;
_scroll.IsVisible = first is not null;
if (pick is null && again is not null)
{
// The session picked had no tape; picked again, it shows the tape it has now, or still none.
_list.SelectedItem = again;
return;
}
if ((pick ?? first) is not { } chosen)
{
_shown = null;
@@ -595,14 +607,15 @@ public sealed class HaslerTapeWindow : Window
_recorder.SelectedIndex = context.Recorder == RecorderKind.Electronic ? 1 : 0;
}
/// <summary>A session with a black box and no tape: no tape of another session left beside it.</summary>
private void ShowNoTape()
/// <summary>A session with no tape, a black box at most: no tape of another session left beside it.</summary>
private void ShowNoTape(TapeSession session)
{
_shown = null;
_tapeless = session.StartedUtc;
_view.Tape = null;
_view.Mark = null;
_cursor.Text = "";
_summary.Text = App.Loc["HaslerSessionNoTape"];
_summary.Text = App.Loc[session.BlackBoxes.Count > 0 ? "HaslerSessionNoTape" : "HaslerSessionEmpty"];
}
private async Task ShowAsync(TapeFile file, bool scrollToEnd)
@@ -615,6 +628,7 @@ public sealed class HaslerTapeWindow : Window
var tape = await Task.Run(() => _tapes.Load(file));
bool another = file.Path != _shown?.Path;
_shown = file;
_tapeless = null;
if (tape is null)
{
_view.Tape = null;

View File

@@ -854,6 +854,7 @@
<String key="HaslerBlackBoxTip">Celá relace na mapě: jízda oproti AI, povely, návěstidla, kabina</String>
<String key="HaslerClickBlackBox">klikněte na pásku: černá skříňka v tom okamžiku</String>
<String key="HaslerSessionNoTape">Tato relace nemá pásku, jen černou skříňku.</String>
<String key="HaslerSessionEmpty">Tato relace zatím nemá pásku ani černou skříňku.</String>
<String key="WarehouseSaved">Ve skladu: {0}</String>
<String key="WarehouseNothingToAdd">Vyberte soupravu s vozidly</String>
<String key="GfxGroupLevelTip">Úroveň jen pro tuto část grafiky</String>

View File

@@ -1083,6 +1083,7 @@
<String key="HaslerBlackBoxTip">The whole session on a map: the driving against the AI, the commands, the signals, the cab</String>
<String key="HaslerClickBlackBox">click the tape: the black box at that moment</String>
<String key="HaslerSessionNoTape">This session has no tape, only the black box.</String>
<String key="HaslerSessionEmpty">This session has no tape or black box yet.</String>
<String key="WarehouseSaved">In the warehouse: {0}</String>
<String key="WarehouseNothingToAdd">Pick a consist with vehicles</String>
<String key="GfxGroupLevelTip">Level for this part of the graphics only</String>

View File

@@ -854,6 +854,7 @@
<String key="HaslerBlackBoxTip">A teljes menet a térképen: vezetés az AI-hoz képest, parancsok, jelzők, vezetőfülke</String>
<String key="HaslerClickBlackBox">kattintson a szalagra: a fekete doboz abban a pillanatban</String>
<String key="HaslerSessionNoTape">Ebben a munkamenetben nincs szalag, csak a fekete doboz.</String>
<String key="HaslerSessionEmpty">Ebben a munkamenetben még nincs se szalag, se fekete doboz.</String>
<String key="WarehouseSaved">A raktárban: {0}</String>
<String key="WarehouseNothingToAdd">Válassz járműveket tartalmazó szerelvényt</String>
<String key="GfxGroupLevelTip">Csak a grafika ezen részének szintje</String>

View File

@@ -905,6 +905,7 @@
<String key="HaslerBlackBoxTip">Cała sesja na mapie: jazda względem AI, komendy, sygnalizatory, kabina</String>
<String key="HaslerClickBlackBox">kliknij taśmę: czarna skrzynka w tym momencie</String>
<String key="HaslerSessionNoTape">W tej sesji nie ma taśmy, jest tylko czarna skrzynka.</String>
<String key="HaslerSessionEmpty">W tej sesji nie ma jeszcze ani taśmy, ani czarnej skrzynki.</String>
<String key="WarehouseSaved">W magazynie: {0}</String>
<String key="WarehouseNothingToAdd">Wybierz skład z pojazdami</String>
<String key="GfxGroupLevelTip">Poziom tylko tej części grafiki</String>

View File

@@ -854,6 +854,7 @@
<String key="HaslerBlackBoxTip">Вся сессия на карте: езда по сравнению с ИИ, команды, светофоры, кабина</String>
<String key="HaslerClickBlackBox">щёлкните по ленте: чёрный ящик в этот момент</String>
<String key="HaslerSessionNoTape">В этом сеансе нет ленты, только чёрный ящик.</String>
<String key="HaslerSessionEmpty">В этом сеансе пока нет ни ленты, ни чёрного ящика.</String>
<String key="WarehouseSaved">На складе: {0}</String>
<String key="WarehouseNothingToAdd">Выберите состав с транспортом</String>
<String key="GfxGroupLevelTip">Уровень только для этой части графики</String>