feat: restore legacy drag events and Tornado launch integration

This commit is contained in:
2026-07-15 15:35:25 +09:00
parent 6e0c275fdd
commit 06a16e5741
32 changed files with 3096 additions and 101 deletions

View File

@@ -213,6 +213,30 @@ public sealed class LegacyOperatorControllerTests
Assert.Single(swapped.Tabs, tab => tab.IsActive).Id);
}
[Fact]
public async Task TabHoverSwapUsesExpectedPositionsSoDuplicateDeliveryCannotSwapBack()
{
var controller = new LegacyOperatorController(Lookup());
var first = await controller.SwapTabsAtExpectedPositionsAsync(
LegacyOperatorTabId.Theme,
LegacyOperatorTabId.Exchange,
expectedSourceIndex: 6,
expectedTargetIndex: 1);
Assert.Equal(LegacyOperatorTabId.Theme, first.Tabs![1].Id);
Assert.Equal(LegacyOperatorTabId.Exchange, first.Tabs[6].Id);
var revision = first.Revision;
var duplicate = await controller.SwapTabsAtExpectedPositionsAsync(
LegacyOperatorTabId.Theme,
LegacyOperatorTabId.Exchange,
expectedSourceIndex: 6,
expectedTargetIndex: 1);
Assert.Equal(revision, duplicate.Revision);
Assert.Equal(LegacyOperatorTabId.Theme, duplicate.Tabs![1].Id);
Assert.Equal(LegacyOperatorTabId.Exchange, duplicate.Tabs[6].Id);
}
[Fact]
public async Task PlaylistKeyboardCommandsUseActiveRowAndBoundaries()
{
@@ -626,6 +650,65 @@ public sealed class LegacyOperatorControllerTests
after.Playlist.Select(row => row.RowId));
}
[Fact]
public async Task PlaylistDragMovesNoncontiguousSelectionAsOneOrderedBlockAndIsIdempotent()
{
var controller = await ControllerWithPlaylistAsync(0, 1, 2, 4, 5, 6);
var initial = controller.Current.Playlist.ToArray();
controller.SelectPlaylistRow(initial[1].RowId, control: false, shift: false);
controller.SelectPlaylistRow(initial[3].RowId, control: true, shift: false);
var moved = controller.ReorderPlaylistRows(
initial[3].RowId,
initial[5].RowId,
LegacyDragDropPosition.Before);
Assert.Equal(
[
initial[0].RowId,
initial[2].RowId,
initial[4].RowId,
initial[1].RowId,
initial[3].RowId,
initial[5].RowId
],
moved.Playlist.Select(row => row.RowId));
Assert.Equal(
[initial[1].RowId, initial[3].RowId],
moved.Playlist.Where(row => row.IsSelected).Select(row => row.RowId));
var revision = moved.Revision;
var duplicate = controller.ReorderPlaylistRows(
initial[3].RowId,
initial[5].RowId,
LegacyDragDropPosition.Before);
Assert.Equal(revision, duplicate.Revision);
Assert.Equal(
moved.Playlist.Select(row => row.RowId),
duplicate.Playlist.Select(row => row.RowId));
}
[Fact]
public async Task PlaylistDragFromUnselectedRowMovesOnlyThatRowAndSelectsIt()
{
var controller = await ControllerWithPlaylistAsync(0, 1, 2, 4);
var initial = controller.Current.Playlist.ToArray();
controller.SelectPlaylistRow(initial[0].RowId, control: false, shift: false);
controller.SelectPlaylistRow(initial[1].RowId, control: true, shift: false);
var moved = controller.ReorderPlaylistRows(
initial[3].RowId,
initial[0].RowId,
LegacyDragDropPosition.Before);
Assert.Equal(
[initial[3].RowId, initial[0].RowId, initial[1].RowId, initial[2].RowId],
moved.Playlist.Select(row => row.RowId));
Assert.Equal(
initial[3].RowId,
Assert.Single(moved.Playlist, row => row.IsSelected).RowId);
}
private static async Task<LegacyOperatorController> ControllerWithPlaylistAsync(
params int[] physicalCutRows)
{