feat(ui): detach a monitor into its own window

This commit is contained in:
Mika Kuns
2026-06-25 15:30:37 +02:00
parent 4e2798b400
commit 5f6e7480f2
11 changed files with 85 additions and 0 deletions

View File

@@ -18,6 +18,8 @@
<StackPanel Orientation="Horizontal" Spacing="8">
<Button Classes="btn" Content="{loc:Tr missionControl.openInApp}"
Command="{Binding OpenInAppCommand}" />
<Button Classes="btn" Content="{loc:Tr missionControl.detach}"
Command="{Binding DetachCommand}" />
<Button Classes="btn" Content="{loc:Tr missionControl.cancel}"
Command="{Binding CancelTaskCommand}"
IsVisible="{Binding IsRunning}" />

View File

@@ -0,0 +1,12 @@
<Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:ClaudeDo.Ui.ViewModels.Islands"
xmlns:mc="using:ClaudeDo.Ui.Views.MissionControl"
x:Class="ClaudeDo.Ui.Views.MissionControl.TaskMonitorWindow"
x:DataType="vm:TaskMonitorViewModel"
Title="{Binding DisplayTitle}"
Width="560" Height="620" MinWidth="360" MinHeight="320"
Background="{DynamicResource VoidBrush}"
Icon="avares://ClaudeDo.Ui/Assets/ClaudeTask.ico">
<mc:MonitorPaneView />
</Window>

View File

@@ -0,0 +1,8 @@
using Avalonia.Controls;
namespace ClaudeDo.Ui.Views.MissionControl;
public partial class TaskMonitorWindow : Window
{
public TaskMonitorWindow() => InitializeComponent();
}

View File

@@ -1,3 +1,4 @@
using System;
using System.Threading.Tasks;
using Avalonia;
using Avalonia.Controls;
@@ -6,6 +7,7 @@ using Avalonia.Media;
using ClaudeDo.Ui.Services;
using ClaudeDo.Ui.ViewModels;
using ClaudeDo.Ui.ViewModels.Conflicts;
using ClaudeDo.Ui.ViewModels.Islands;
using ClaudeDo.Ui.ViewModels.Modals;
using ClaudeDo.Ui.Views.Conflicts;
using ClaudeDo.Ui.Views.MissionControl;
@@ -121,6 +123,13 @@ public sealed class WindowDialogService : IDialogService
_missionControl.Activate(); // bring to front / focus
}
public void ShowDetachedMonitor(TaskMonitorViewModel monitor, Action onClosed)
{
var win = new TaskMonitorWindow { DataContext = monitor };
win.Closed += (_, _) => onClosed(); // closing re-docks into the grid
win.Show(); // modeless, independent
}
public Task<bool> ConfirmAsync(string message)
{
var tcs = new TaskCompletionSource<bool>();