style(ui): Material Design icons for window chrome, modal shell and Mission Control

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
mika kuns
2026-10-01 16:50:22 +02:00
co-authored by Claude Sonnet 5.5
parent aef41f0594
commit 89312e0b22
6 changed files with 26 additions and 20 deletions
@@ -1,6 +1,7 @@
<ResourceDictionary xmlns="https://github.com/avaloniaui" <ResourceDictionary xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ctl="using:ClaudeDo.Ui.Views.Controls"> xmlns:ctl="using:ClaudeDo.Ui.Views.Controls"
xmlns:cconv="using:ClaudeDo.Ui.Converters">
<ControlTheme x:Key="{x:Type ctl:ModalShell}" TargetType="ctl:ModalShell"> <ControlTheme x:Key="{x:Type ctl:ModalShell}" TargetType="ctl:ModalShell">
<Setter Property="Template"> <Setter Property="Template">
<ControlTemplate> <ControlTemplate>
@@ -26,12 +27,15 @@
<Button Name="PART_MaxButton" Grid.Column="2" Classes="icon-btn" <Button Name="PART_MaxButton" Grid.Column="2" Classes="icon-btn"
IsVisible="{TemplateBinding ShowMaximizeButton}" IsVisible="{TemplateBinding ShowMaximizeButton}"
VerticalAlignment="Center"> VerticalAlignment="Center">
<PathIcon Name="PART_MaxIcon" Data="{StaticResource Icon.WinMax}" Width="10" Height="10"/> <PathIcon Name="PART_MaxIcon" Width="14" Height="14"
Data="{Binding Source='mdi:WindowMaximize', Converter={x:Static cconv:IconKeyConverter.Instance}}"/>
</Button> </Button>
<Button Grid.Column="3" Classes="icon-btn" Content="✕" <Button Grid.Column="3" Classes="icon-btn"
FontSize="{DynamicResource FontSizeBody}"
Command="{TemplateBinding CloseCommand}" Command="{TemplateBinding CloseCommand}"
VerticalAlignment="Center"/> VerticalAlignment="Center">
<PathIcon Width="14" Height="14"
Data="{Binding Source='mdi:WindowClose', Converter={x:Static cconv:IconKeyConverter.Instance}}"/>
</Button>
</Grid> </Grid>
</Border> </Border>
<Border Name="PART_Footer" DockPanel.Dock="Bottom" <Border Name="PART_Footer" DockPanel.Dock="Bottom"
@@ -1,3 +1,4 @@
using System.Globalization;
using System.Windows.Input; using System.Windows.Input;
using Avalonia; using Avalonia;
using Avalonia.Controls; using Avalonia.Controls;
@@ -5,6 +6,7 @@ using Avalonia.Controls.Primitives;
using Avalonia.Input; using Avalonia.Input;
using Avalonia.Interactivity; using Avalonia.Interactivity;
using Avalonia.Media; using Avalonia.Media;
using ClaudeDo.Ui.Converters;
namespace ClaudeDo.Ui.Views.Controls; namespace ClaudeDo.Ui.Views.Controls;
@@ -84,9 +86,8 @@ public class ModalShell : ContentControl
{ {
if (_maxIcon is null || _window is null) return; if (_maxIcon is null || _window is null) return;
var maximized = _window.WindowState == WindowState.Maximized; var maximized = _window.WindowState == WindowState.Maximized;
var key = maximized ? "Icon.WinRestore" : "Icon.WinMax"; _maxIcon.Data = (Geometry?)IconKeyConverter.Instance.Convert(
if (this.TryFindResource(key, out var geometry) && geometry is Geometry g) maximized ? "mdi:WindowRestore" : "mdi:WindowMaximize", typeof(Geometry), null, CultureInfo.InvariantCulture);
_maxIcon.Data = g;
if (_maxButton is not null) if (_maxButton is not null)
{ {
var tipKey = maximized ? "modals.diff.restore" : "modals.diff.maximize"; var tipKey = maximized ? "modals.diff.restore" : "modals.diff.maximize";
+4 -4
View File
@@ -115,16 +115,16 @@
<Button Classes="title-ctrl" <Button Classes="title-ctrl"
Command="{Binding OpenMissionControlCommand}" Command="{Binding OpenMissionControlCommand}"
ToolTip.Tip="{loc:Tr missionControl.windowTitle}"> ToolTip.Tip="{loc:Tr missionControl.windowTitle}">
<PathIcon Data="{StaticResource Icon.Grid}" Width="12" Height="12"/> <PathIcon Width="14" Height="14" Data="{Binding Source='mdi:ViewGridOutline', Converter={StaticResource IconKey}}"/>
</Button> </Button>
<Button Classes="title-ctrl" Click="OnMinimize"> <Button Classes="title-ctrl" Click="OnMinimize">
<PathIcon Data="{StaticResource Icon.WinMin}" Width="10" Height="10"/> <PathIcon Width="14" Height="14" Data="{Binding Source='mdi:WindowMinimize', Converter={StaticResource IconKey}}"/>
</Button> </Button>
<Button Classes="title-ctrl" Click="OnToggleMax"> <Button Classes="title-ctrl" Click="OnToggleMax">
<PathIcon x:Name="MaxIcon" Data="{StaticResource Icon.WinMax}" Width="10" Height="10"/> <PathIcon x:Name="MaxIcon" Width="14" Height="14" Data="{Binding Source='mdi:WindowMaximize', Converter={StaticResource IconKey}}"/>
</Button> </Button>
<Button Classes="title-ctrl close" Click="OnClose"> <Button Classes="title-ctrl close" Click="OnClose">
<PathIcon Data="{StaticResource Icon.WinClose}" Width="10" Height="10"/> <PathIcon Width="14" Height="14" Data="{Binding Source='mdi:WindowClose', Converter={StaticResource IconKey}}"/>
</Button> </Button>
</StackPanel> </StackPanel>
+4 -3
View File
@@ -1,3 +1,4 @@
using System.Globalization;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Avalonia; using Avalonia;
@@ -5,6 +6,7 @@ using Avalonia.Controls;
using Avalonia.Input; using Avalonia.Input;
using Avalonia.Layout; using Avalonia.Layout;
using Avalonia.Media; using Avalonia.Media;
using ClaudeDo.Ui.Converters;
using ClaudeDo.Ui.Localization; using ClaudeDo.Ui.Localization;
using ClaudeDo.Ui.Services; using ClaudeDo.Ui.Services;
using ClaudeDo.Ui.ViewModels; using ClaudeDo.Ui.ViewModels;
@@ -64,9 +66,8 @@ public partial class MainWindow : Window
private void UpdateMaxIcon() private void UpdateMaxIcon()
{ {
var key = WindowState == WindowState.Maximized ? "Icon.WinRestore" : "Icon.WinMax"; MaxIcon.Data = (Geometry?)IconKeyConverter.Instance.Convert(
if (this.TryFindResource(key, out var geometry) && geometry is Geometry g) WindowState == WindowState.Maximized ? "mdi:WindowRestore" : "mdi:WindowMaximize", typeof(Geometry), null, CultureInfo.InvariantCulture);
MaxIcon.Data = g;
} }
private void OnDataContextChanged(object? sender, EventArgs e) private void OnDataContextChanged(object? sender, EventArgs e)
@@ -44,7 +44,7 @@
<Button Grid.Column="3" Classes="title-ctrl" <Button Grid.Column="3" Classes="title-ctrl"
Command="{Binding CloseCommand}" Command="{Binding CloseCommand}"
ToolTip.Tip="{loc:Tr missionControl.closeSession}"> ToolTip.Tip="{loc:Tr missionControl.closeSession}">
<PathIcon Data="{StaticResource Icon.WinClose}" Width="12" Height="12"/> <PathIcon Width="14" Height="14" Data="{Binding Source='mdi:WindowClose', Converter={StaticResource IconKey}}"/>
</Button> </Button>
</Grid> </Grid>
</Border> </Border>
@@ -45,7 +45,7 @@
VerticalAlignment="Center"/> VerticalAlignment="Center"/>
<Button Classes="icon-btn" <Button Classes="icon-btn"
ToolTip.Tip="{loc:Tr missionControl.newSession}"> ToolTip.Tip="{loc:Tr missionControl.newSession}">
<PathIcon Data="{StaticResource Icon.Plus}" Width="15" Height="15"/> <PathIcon Width="16" Height="16" Data="{Binding Source='mdi:Plus', Converter={StaticResource IconKey}}"/>
<Button.Flyout> <Button.Flyout>
<MenuFlyout ItemsSource="{Binding SessionTargets}" Opening="OnSessionFlyoutOpening"> <MenuFlyout ItemsSource="{Binding SessionTargets}" Opening="OnSessionFlyoutOpening">
<MenuFlyout.ItemContainerTheme> <MenuFlyout.ItemContainerTheme>
@@ -60,7 +60,7 @@
</Button> </Button>
<Button x:Name="RecentSessionsButton" Classes="icon-btn" <Button x:Name="RecentSessionsButton" Classes="icon-btn"
ToolTip.Tip="{loc:Tr missionControl.recentSessions}"> ToolTip.Tip="{loc:Tr missionControl.recentSessions}">
<PathIcon Data="{StaticResource Icon.Clock}" Width="15" Height="15"/> <PathIcon Width="16" Height="16" Data="{Binding Source='mdi:ClockOutline', Converter={StaticResource IconKey}}"/>
<Button.Flyout> <Button.Flyout>
<Flyout Placement="BottomEdgeAlignedRight" ShowMode="Standard" Opening="OnRecentSessionsFlyoutOpening"> <Flyout Placement="BottomEdgeAlignedRight" ShowMode="Standard" Opening="OnRecentSessionsFlyoutOpening">
<StackPanel Width="380" Spacing="8" Margin="4"> <StackPanel Width="380" Spacing="8" Margin="4">
@@ -136,12 +136,12 @@
<Button Classes="icon-btn" <Button Classes="icon-btn"
Command="{Binding ToggleLayoutCommand}" Command="{Binding ToggleLayoutCommand}"
ToolTip.Tip="{Binding LayoutToggleLabel}"> ToolTip.Tip="{Binding LayoutToggleLabel}">
<PathIcon Data="{StaticResource Icon.Grid}" Width="15" Height="15"/> <PathIcon Width="16" Height="16" Data="{Binding Source='mdi:ViewGridOutline', Converter={StaticResource IconKey}}"/>
</Button> </Button>
<Button Classes="icon-btn" <Button Classes="icon-btn"
Command="{Binding OpenSettingsCommand}" Command="{Binding OpenSettingsCommand}"
ToolTip.Tip="{loc:Tr missionControl.settings}"> ToolTip.Tip="{loc:Tr missionControl.settings}">
<PathIcon Data="{StaticResource Icon.Settings}" Width="15" Height="15"/> <PathIcon Width="16" Height="16" Data="{Binding Source='mdi:Cog', Converter={StaticResource IconKey}}"/>
</Button> </Button>
</StackPanel> </StackPanel>
</Grid> </Grid>