feat(ui): Mission-Control-Kacheln behalten Position und Identitaetsfarbe ueber Handoffs

Ein Handoff schloss die alte Pane und haengte die neue hinten an -- die Kachel
sprang ans Ende und das ganze Grid ordnete sich neu. Die neue Pane wird jetzt am
Index der alten eingesetzt.

Dazu bekommt jede Kachel eine aus IdentityKey (Default: TaskId) abgeleitete Farbe:
3px-Streifen links am Tile, Punkt im Focus-Mode-Tab. Kein State, keine Persistenz --
derselbe Task faerbt nach App-Neustart gleich, und ein Handoff erbt die Farbe, weil
er dieselbe TaskId behaelt. Nur kuehle Hues, damit nichts als Status gelesen wird.
This commit is contained in:
mika kuns
2026-09-28 08:56:50 +02:00
parent c9dd885fe0
commit e0a1448f44
6 changed files with 72 additions and 4 deletions
@@ -747,6 +747,30 @@ public class MissionControlViewModelTests : IDisposable
Assert.Equal(0, SubscriberCount(outgoingPane, "SubmitForReviewRequested"));
}
// The handoff replaces a tile in place -- appending it would push it to the end of the grid and
// reshuffle every other tile on every phase change.
[Fact]
public async Task OpenMergeHelperHandoffConPtySessionAsync_KeepsPanePosition()
{
var worker = new FakeWorker();
using var vm = BuildVm(worker);
var dir = Path.Combine("C:", "Some", "Path");
await vm.OpenAdHocConPtySessionAsync(dir);
await vm.OpenMergeHelperConPtySessionAsync("L1", new[] { "t1" });
await vm.OpenAdHocConPtySessionAsync(dir);
var taskId = vm.ConPtySessions[1].TaskId!;
var color = vm.ConPtySessions[1].IdentityColorKey;
await vm.OpenMergeHelperHandoffConPtySessionAsync(taskId, new[] { "t1" }, "wait");
Assert.Equal(3, vm.ConPtySessions.Count);
Assert.Equal(taskId, vm.ConPtySessions[1].TaskId);
Assert.Equal(taskId, vm.Panes[1].TaskId);
// Same task, new pane -- the identity colour has to survive the handoff, or the tile the
// user was tracking changes colour mid-run.
Assert.Equal(color, vm.ConPtySessions[1].IdentityColorKey);
}
[Fact]
public async Task OpenMergeHelperHandoffConPtySessionAsync_SubmitForReview_ResolvesToSurvivingPane()
{