diff --git a/src/ClaudeDo.Ui/Design/IslandStyles.axaml b/src/ClaudeDo.Ui/Design/IslandStyles.axaml index 6fc6c2f..20e7db1 100644 --- a/src/ClaudeDo.Ui/Design/IslandStyles.axaml +++ b/src/ClaudeDo.Ui/Design/IslandStyles.axaml @@ -414,7 +414,7 @@ diff --git a/src/ClaudeDo.Ui/Views/Islands/TasksIslandView.axaml.cs b/src/ClaudeDo.Ui/Views/Islands/TasksIslandView.axaml.cs index a0f30aa..962450d 100644 --- a/src/ClaudeDo.Ui/Views/Islands/TasksIslandView.axaml.cs +++ b/src/ClaudeDo.Ui/Views/Islands/TasksIslandView.axaml.cs @@ -1,9 +1,11 @@ +using System.Linq; using Avalonia; using Avalonia.Controls; using Avalonia.Input; using Avalonia.Interactivity; using Avalonia.Layout; using Avalonia.Media; +using Avalonia.Threading; using Avalonia.VisualTree; using ClaudeDo.Ui.ViewModels.Islands; using ClaudeDo.Ui.ViewModels.Modals; @@ -36,10 +38,26 @@ public partial class TasksIslandView : UserControl // ShowDialog completes once the window is closed (CloseAction or OS close). }; vm.ConfirmAsync = ShowConfirmAsync; + vm.SelectionChanged += (_, _) => ScrollSelectedIntoView(); } }; } + // Bring the selected row into view — the task list is a plain ItemsControl with no + // built-in selection scrolling, so a programmatic select (e.g. Mission Control's + // "Open in app") would otherwise highlight a row that stays off-screen. + private void ScrollSelectedIntoView() + { + if (DataContext is not TasksIslandViewModel vm || vm.SelectedTask is not { } target) return; + Dispatcher.UIThread.Post(() => + { + var match = this.GetVisualDescendants() + .OfType