using Avalonia; using Avalonia.Controls; using Avalonia.Input; using Avalonia.Interactivity; using Avalonia.VisualTree; using ClaudeDo.Ui.ViewModels.Islands; using ClaudeDo.Ui.ViewModels.Modals; using ClaudeDo.Ui.Views.Modals; namespace ClaudeDo.Ui.Views.Islands; public partial class TasksIslandView : UserControl { private static readonly DataFormat TaskRowFormat = DataFormat.CreateStringApplicationFormat("claudedo-task-row"); public TasksIslandView() { InitializeComponent(); AddHandler(PointerPressedEvent, OnTunnelPointerPressed, RoutingStrategies.Tunnel); DataContextChanged += (_, _) => { if (DataContext is TasksIslandViewModel vm) { vm.FocusAddTaskRequested += (_, _) => AddTaskBox.Focus(); vm.ShowUnfinishedPlanningModal = async (modalVm) => { var owner = TopLevel.GetTopLevel(this) as Window; if (owner is null) { modalVm.CancelCommand.Execute(null); return; } var modal = new UnfinishedPlanningModalView { DataContext = modalVm }; // Closing via the OS title-bar (if ever enabled) also resolves the TCS. modal.Closed += (_, _) => modalVm.CancelCommand.Execute(null); await modal.ShowDialog(owner); // ShowDialog completes once the window is closed (CloseAction or OS close). }; } }; } private async void OnTunnelPointerPressed(object? sender, PointerPressedEventArgs e) { if (DataContext is not TasksIslandViewModel vm) return; if (e.Source is not Visual src) return; var button = src as Button ?? src.FindAncestorOfType