From e6ce9ef5347258de9a096e510337576218135798 Mon Sep 17 00:00:00 2001 From: will wade Date: Wed, 17 Jun 2026 18:22:49 +0100 Subject: [PATCH 1/6] Migrate UI icons to Lucide.Avalonia Replace all inline PathIcon elements with LucideIcon from the Lucide.Avalonia NuGet package (v0.2.10), per RFC 0002. Replaced icons: - Toolbar: New (file-plus), Open (folder-open), Save, Play/Pause, Position (flip-horizontal-2), Keyboard, Game Mode (gamepad-2), Control Mode (mouse-pointer-click), Prefs (settings) - Status bar: show/hide chevrons, back button - Message pane: eye (toggle), volume-2 (speak), circle-stop (stop), copy, clipboard-copy, clipboard-paste, ellipsis-vertical (more) Updated styles to target LucideIcon instead of PathIcon. Play/pause icon Kind now swaps dynamically in code-behind. Uses {x:Static} binding for enum values (compiled bindings compat). --- src/Dasher.Windows/Dasher.Windows.csproj | 1 + src/Dasher.Windows/Views/MainWindow.axaml | 49 ++++++++++---------- src/Dasher.Windows/Views/MainWindow.axaml.cs | 2 + 3 files changed, 27 insertions(+), 25 deletions(-) diff --git a/src/Dasher.Windows/Dasher.Windows.csproj b/src/Dasher.Windows/Dasher.Windows.csproj index fecdfbe..06fed5e 100644 --- a/src/Dasher.Windows/Dasher.Windows.csproj +++ b/src/Dasher.Windows/Dasher.Windows.csproj @@ -29,5 +29,6 @@ + diff --git a/src/Dasher.Windows/Views/MainWindow.axaml b/src/Dasher.Windows/Views/MainWindow.axaml index 8fba64a..73e6fac 100644 --- a/src/Dasher.Windows/Views/MainWindow.axaml +++ b/src/Dasher.Windows/Views/MainWindow.axaml @@ -2,6 +2,7 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:vm="using:Dasher.Windows.ViewModels" xmlns:controls="using:Dasher.Windows.Controls" + xmlns:lucide="using:Lucide.Avalonia" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignWidth="1024" d:DesignHeight="768" @@ -40,10 +41,8 @@ - - @@ -179,21 +178,21 @@ @@ -202,7 +201,7 @@ @@ -220,7 +219,7 @@ - + @@ -232,7 +231,7 @@ @@ -241,7 +240,7 @@ @@ -250,7 +249,7 @@ @@ -259,7 +258,7 @@ @@ -288,7 +287,7 @@ @@ -296,7 +295,7 @@ - + @@ -365,19 +364,19 @@ @@ -385,19 +384,19 @@ @@ -407,7 +406,7 @@ @@ -433,4 +432,4 @@ - \ No newline at end of file + diff --git a/src/Dasher.Windows/Views/MainWindow.axaml.cs b/src/Dasher.Windows/Views/MainWindow.axaml.cs index 2e7d19d..ec37e06 100644 --- a/src/Dasher.Windows/Views/MainWindow.axaml.cs +++ b/src/Dasher.Windows/Views/MainWindow.axaml.cs @@ -18,6 +18,7 @@ using Dasher.Windows.Services; using Dasher.Windows.Speech; using Dasher.Windows.ViewModels; +using Lucide.Avalonia; namespace Dasher.Windows.Views; @@ -673,6 +674,7 @@ private void OnPlay(object? sender, RoutedEventArgs e) if (_vm == null) return; _vm.IsPlaying = !_vm.IsPlaying; TxtPlayLabel.Text = _vm.IsPlaying ? "Pause" : "Play"; + PlayIcon.Kind = _vm.IsPlaying ? LucideIconKind.Pause : LucideIconKind.Play; if (_vm.IsPlaying) BtnPlay.Classes.Add("accent"); else From ab59bb4ee6f20d26c13e807dc18ae1daa9cf4dde Mon Sep 17 00:00:00 2001 From: will wade Date: Wed, 17 Jun 2026 18:38:16 +0100 Subject: [PATCH 2/6] Dynamic mode + game button icons Mode button icon now reflects pane position: - Right: panel-right, Left: panel-left, Bottom: panel-bottom, Top: panel-top Game button swaps between Gamepad2 (inactive) and Pause (active), matching the Play/Pause button pattern. --- src/Dasher.Windows/Views/MainWindow.axaml | 4 ++-- src/Dasher.Windows/Views/MainWindow.axaml.cs | 15 +++++++++++---- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/Dasher.Windows/Views/MainWindow.axaml b/src/Dasher.Windows/Views/MainWindow.axaml index 73e6fac..2cc8040 100644 --- a/src/Dasher.Windows/Views/MainWindow.axaml +++ b/src/Dasher.Windows/Views/MainWindow.axaml @@ -219,7 +219,7 @@ - + @@ -240,7 +240,7 @@ diff --git a/src/Dasher.Windows/Views/MainWindow.axaml.cs b/src/Dasher.Windows/Views/MainWindow.axaml.cs index ec37e06..477d5f2 100644 --- a/src/Dasher.Windows/Views/MainWindow.axaml.cs +++ b/src/Dasher.Windows/Views/MainWindow.axaml.cs @@ -430,6 +430,13 @@ private void ApplyPaneLayout() PanePosition.Top => "Top", _ => "Right side", }; + ModeIcon.Kind = position switch + { + PanePosition.Left => LucideIconKind.PanelLeft, + PanePosition.Bottom => LucideIconKind.PanelBottom, + PanePosition.Top => LucideIconKind.PanelTop, + _ => LucideIconKind.PanelRight, + }; BtnMode.Classes.Remove("accent"); if (txtKeyboardLabel != null) txtKeyboardLabel.Text = "Keyboard"; BtnKeyboard.Classes.Remove("accent"); @@ -879,8 +886,8 @@ private void OnToggleGameMode(object? sender, RoutedEventArgs e) NativeBridge.dasher_leave_game_mode(_vm.Handle); _gameModeActive = false; NativeBridge.dasher_game_set_canvas_text(_vm.Handle, 1); - var txtGameLabel = this.FindControl("TxtGameLabel"); - if (txtGameLabel != null) txtGameLabel.Text = "Game"; + GameIcon.Kind = LucideIconKind.Gamepad2; + TxtGameLabel.Text = "Game"; var gameBar = this.FindControl("GameTargetBar"); if (gameBar != null) gameBar.IsVisible = false; } @@ -891,8 +898,8 @@ private void OnToggleGameMode(object? sender, RoutedEventArgs e) { _gameModeActive = true; NativeBridge.dasher_game_set_canvas_text(_vm.Handle, 0); - var txtGameLabel = this.FindControl("TxtGameLabel"); - if (txtGameLabel != null) txtGameLabel.Text = "Leave"; + GameIcon.Kind = LucideIconKind.Pause; + TxtGameLabel.Text = "Leave"; var gameBar = this.FindControl("GameTargetBar"); if (gameBar != null) gameBar.IsVisible = true; } From c7d6a0ca41edfed36e44a29519266eaa56d30fe1 Mon Sep 17 00:00:00 2001 From: will wade Date: Wed, 17 Jun 2026 18:42:42 +0100 Subject: [PATCH 3/6] Remove Play/Pause button (not wired up) --- src/Dasher.Windows/Views/MainWindow.axaml | 9 --------- src/Dasher.Windows/Views/MainWindow.axaml.cs | 12 +----------- 2 files changed, 1 insertion(+), 20 deletions(-) diff --git a/src/Dasher.Windows/Views/MainWindow.axaml b/src/Dasher.Windows/Views/MainWindow.axaml index 2cc8040..2787540 100644 --- a/src/Dasher.Windows/Views/MainWindow.axaml +++ b/src/Dasher.Windows/Views/MainWindow.axaml @@ -199,15 +199,6 @@ - - - -