feat(ui): add MissionControl window + grid

This commit is contained in:
Mika Kuns
2026-06-25 14:59:11 +02:00
parent 15a3e65508
commit 283310a3fd
6 changed files with 95 additions and 2 deletions

View File

@@ -235,7 +235,10 @@
}, },
"missionControl": { "missionControl": {
"openInApp": "In App öffnen", "openInApp": "In App öffnen",
"cancel": "Abbrechen" "cancel": "Abbrechen",
"windowTitle": "Mission Control",
"clearFinished": "Erledigte entfernen",
"empty": "Keine laufenden Aufgaben"
}, },
"modals": { "modals": {
"logVisualizer": { "logVisualizer": {

View File

@@ -235,7 +235,10 @@
}, },
"missionControl": { "missionControl": {
"openInApp": "Open in app", "openInApp": "Open in app",
"cancel": "Cancel" "cancel": "Cancel",
"windowTitle": "Mission Control",
"clearFinished": "Clear finished",
"empty": "No running tasks"
}, },
"modals": { "modals": {
"logVisualizer": { "logVisualizer": {

View File

@@ -0,0 +1,49 @@
<UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:ClaudeDo.Ui.ViewModels"
xmlns:vmi="using:ClaudeDo.Ui.ViewModels.Islands"
xmlns:mc="using:ClaudeDo.Ui.Views.MissionControl"
xmlns:loc="using:ClaudeDo.Ui.Localization"
x:DataType="vm:MissionControlViewModel"
x:Class="ClaudeDo.Ui.Views.MissionControl.MissionControlView">
<DockPanel LastChildFill="True" Background="{DynamicResource VoidBrush}">
<!-- Header -->
<Border DockPanel.Dock="Top"
Background="{DynamicResource DeepBrush}"
BorderBrush="{DynamicResource LineBrush}"
BorderThickness="0,0,0,1" Padding="14,8">
<Grid ColumnDefinitions="*,Auto">
<TextBlock Grid.Column="0" Classes="eyebrow"
Text="{loc:Tr missionControl.windowTitle}"
Foreground="{DynamicResource TextBrush}"
LetterSpacing="1.4" VerticalAlignment="Center" />
<Button Grid.Column="1" Classes="btn"
Content="{loc:Tr missionControl.clearFinished}"
Command="{Binding ClearFinishedCommand}" />
</Grid>
</Border>
<!-- Grid / empty state -->
<Panel Margin="6">
<ItemsControl ItemsSource="{Binding Monitors}" IsVisible="{Binding HasMonitors}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid x:CompileBindings="False" Columns="{Binding ColumnCount}" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate x:DataType="vmi:TaskMonitorViewModel">
<mc:MonitorPaneView Margin="6" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<TextBlock IsVisible="{Binding !HasMonitors}"
Text="{loc:Tr missionControl.empty}"
Foreground="{DynamicResource TextMuteBrush}"
HorizontalAlignment="Center" VerticalAlignment="Center" />
</Panel>
</DockPanel>
</UserControl>

View File

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

View File

@@ -0,0 +1,13 @@
<Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:ClaudeDo.Ui.ViewModels"
xmlns:mc="using:ClaudeDo.Ui.Views.MissionControl"
xmlns:loc="using:ClaudeDo.Ui.Localization"
x:Class="ClaudeDo.Ui.Views.MissionControl.MissionControlWindow"
x:DataType="vm:MissionControlViewModel"
Title="{loc:Tr missionControl.windowTitle}"
Width="1100" Height="760" MinWidth="640" MinHeight="420"
Background="{DynamicResource VoidBrush}"
Icon="avares://ClaudeDo.Ui/Assets/ClaudeTask.ico">
<mc:MissionControlView />
</Window>

View File

@@ -0,0 +1,17 @@
using Avalonia.Controls;
namespace ClaudeDo.Ui.Views.MissionControl;
public partial class MissionControlWindow : Window
{
public MissionControlWindow() => InitializeComponent();
protected override void OnClosing(WindowClosingEventArgs e)
{
// Hide instead of destroying — Mission Control keeps tracking tasks in the
// background and re-shows on next open.
e.Cancel = true;
Hide();
base.OnClosing(e);
}
}