Preview: promote selected layer for hit testing

Temporarily raise the selected preview item and prioritize it in the custom hit test without changing scene order. Refresh integration-test expectations for Brand logo layers and explicit thumbnail assets.

WPF references: https://learn.microsoft.com/en-us/dotnet/api/system.windows.controls.panel.zindex?view=windowsdesktop-10.0 https://learn.microsoft.com/en-us/dotnet/desktop/wpf/graphics-multimedia/hit-testing-in-the-visual-layer
This commit is contained in:
2026-10-28 13:09:15 -07:00
parent 7da287244b
commit 769c616706
13 changed files with 326 additions and 79 deletions
+27 -9
View File
@@ -15,9 +15,8 @@ using ytLive.ViewModels;
namespace ytLive.Tests;
/// <summary>
/// Scene strip tile artwork (creator ruling 2026-10-10). Each canonical scene's
/// top-strip tile is its own image, stored as an Asset row and seeded from the
/// creator's CRT-styled renders. The preview pane keeps rendering each scene's
/// Scene strip tile artwork (creator ruling 2026-10-10). A persisted scene tile
/// is stored as an Asset row; the preview pane keeps rendering each scene's
/// ORIGINAL background — the tiles never appear as preview backgrounds.
/// </summary>
[Collection("RealApp")]
@@ -28,7 +27,7 @@ public sealed class SceneThumbnailTests
public SceneThumbnailTests(RealAppHost app) => _app = app;
[Fact]
public void Strip_Shows_The_Seeded_Tile_And_The_Preview_Keeps_The_Original_Background()
public void Strip_Shows_The_Persisted_Tile_And_The_Preview_Keeps_The_Original_Background()
{
_app.Run(() =>
{
@@ -36,10 +35,19 @@ public sealed class SceneThumbnailTests
try
{
env = ArrangedDb(out var file);
env.SeedPaths[SceneCatalog.Starting] = file.TilePath;
env.SeedPaths[SceneCatalog.Live] = MissingPath();
env.Apply();
var tileAssetId = LayoutStore.Instance!.UpsertAsset(File.ReadAllBytes(file.TilePath), 320, 180);
using (var connection = new SqliteConnection($"Data Source={env.DbPath}"))
{
connection.Open();
using var cmd = connection.CreateCommand();
cmd.CommandText = "UPDATE Scene SET ThumbnailAssetId = $asset WHERE Name = $scene;";
cmd.Parameters.AddWithValue("$asset", tileAssetId);
cmd.Parameters.AddWithValue("$scene", SceneCatalog.Starting);
Assert.Equal(1, cmd.ExecuteNonQuery());
}
var vm = new MainViewModel();
var starting = SceneByName(vm, SceneCatalog.Starting);
@@ -91,7 +99,7 @@ public sealed class SceneThumbnailTests
}
[Fact]
public void Live_Staged_Mini_Shows_Its_Tile_Not_The_Capture_Placeholder()
public void Live_Staged_Mini_Shows_Its_Persisted_Tile_Not_The_Capture_Placeholder()
{
_app.Run(() =>
{
@@ -99,9 +107,19 @@ public sealed class SceneThumbnailTests
try
{
env = ArrangedDb(out var file);
env.SeedPaths[SceneCatalog.Live] = file.TilePath;
env.Apply();
var tileAssetId = LayoutStore.Instance!.UpsertAsset(File.ReadAllBytes(file.TilePath), 320, 180);
using (var connection = new SqliteConnection($"Data Source={env.DbPath}"))
{
connection.Open();
using var cmd = connection.CreateCommand();
cmd.CommandText = "UPDATE Scene SET ThumbnailAssetId = $asset WHERE Name = $scene;";
cmd.Parameters.AddWithValue("$asset", tileAssetId);
cmd.Parameters.AddWithValue("$scene", SceneCatalog.Live);
Assert.Equal(1, cmd.ExecuteNonQuery());
}
var vm = new MainViewModel();
var live = SceneByName(vm, SceneCatalog.Live);
Assert.False(string.IsNullOrWhiteSpace(live.ThumbnailAssetId));
@@ -355,4 +373,4 @@ public sealed class SceneThumbnailTests
private static string MissingPath()
=> Path.Combine(Path.GetTempPath(), $"ytLive-no-such-{Guid.NewGuid():N}.png");
}
}