Skip to content

Commit 769c3b8

Browse files
authored
Update to Avalonia 12 (#59)
* Migrate to Avalonia 12 * Replace `Watermark` with `PlaceholderText` and update `SystemDecorations` to `WindowDecorations` in XAML files. * Simplify logging and remove unnecessary code in ConsoleLogSink * Update Avalonia to 12.0.1 which fixes crashes on file dialogs * Make OpenFavoritesWindow synchronous by removing unnecessary async/await. * Update AvaloniaUI.DiagnosticsSupport package * Update MessageBox.Avalonia to version 12.0.0 * Update package versions
1 parent 394d8a6 commit 769c3b8

13 files changed

Lines changed: 47 additions & 110 deletions

Directory.Packages.props

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,40 +5,38 @@
55
</PropertyGroup>
66
<ItemGroup>
77
<PackageVersion Include="Antlr4.Runtime.Standard" Version="4.13.1" />
8-
<PackageVersion Include="Avalonia" Version="11.3.13" />
9-
<PackageVersion Include="Avalonia.AvaloniaEdit" Version="11.4.1" />
10-
<PackageVersion Include="Avalonia.Controls.DataGrid" Version="11.3.13" />
11-
<PackageVersion Include="Avalonia.Controls.ItemsRepeater" Version="11.1.5" />
12-
<PackageVersion Include="Avalonia.Desktop" Version="11.3.13" />
13-
<PackageVersion Include="Avalonia.Themes.Fluent" Version="11.3.13" />
14-
<PackageVersion Include="Avalonia.Xaml.Behaviors" Version="11.3.0.6" />
15-
<PackageVersion Include="Avalonia.Xaml.Interactions" Version="11.3.0.6" />
16-
<PackageVersion Include="Avalonia.Xaml.Interactivity" Version="11.3.0.6" />
17-
<PackageVersion Include="AvaloniaUI.DiagnosticsSupport" Version="2.1.1" />
8+
<PackageVersion Include="Avalonia" Version="12.0.2" />
9+
<PackageVersion Include="Avalonia.AvaloniaEdit" Version="12.0.0" />
10+
<PackageVersion Include="Avalonia.Controls.DataGrid" Version="12.0.0" />
11+
<PackageVersion Include="Avalonia.Controls.ItemsRepeater" Version="12.0.0" />
12+
<PackageVersion Include="Avalonia.Desktop" Version="12.0.2" />
13+
<PackageVersion Include="Avalonia.Themes.Fluent" Version="12.0.2" />
14+
<PackageVersion Include="AvaloniaUI.DiagnosticsSupport" Version="2.2.1" />
1815
<PackageVersion Include="CommunityToolkit.Mvvm" Version="8.4.2" />
1916
<PackageVersion Include="coverlet.collector" Version="10.0.0" />
2017
<PackageVersion Include="FFMpegCore" Version="5.4.0" />
21-
<PackageVersion Include="Material.Icons.Avalonia" Version="3.0.0" />
18+
<PackageVersion Include="Material.Icons.Avalonia" Version="3.0.2" />
2219
<PackageVersion Include="MemoryPack" Version="1.21.4" />
23-
<PackageVersion Include="MessageBox.Avalonia" Version="3.3.1.1" />
20+
<PackageVersion Include="MessageBox.Avalonia" Version="12.0.0" />
2421
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="10.0.7" />
2522
<PackageVersion Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="10.0.7" />
2623
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="10.0.7" />
2724
<PackageVersion Include="Microsoft.Extensions.Logging" Version="10.0.7" />
2825
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.7" />
2926
<PackageVersion Include="Microsoft.Extensions.Logging.Console" Version="10.0.7" />
30-
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="18.4.0" />
27+
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="18.5.1" />
3128
<PackageVersion Include="NSubstitute" Version="5.3.0" />
3229
<PackageVersion Include="OldBit.Beep" Version="1.0.2" />
3330
<PackageVersion Include="OldBit.Joypad" Version="0.0.2-rc.3" />
3431
<PackageVersion Include="OldBit.Spectron.Files" Version="1.0.2" />
3532
<PackageVersion Include="OldBit.Z80Cpu.Spectron" Version="1.0.3" />
3633
<PackageVersion Include="Shouldly" Version="4.3.0" />
37-
<PackageVersion Include="SkiaSharp" Version="3.116.1" />
38-
<PackageVersion Include="SkiaSharp.NativeAssets.Linux" Version="3.116.1" />
34+
<PackageVersion Include="SkiaSharp" Version="3.119.4-preview.1.1" />
35+
<PackageVersion Include="SkiaSharp.NativeAssets.Linux" Version="3.119.4-preview.1.1" />
3936
<PackageVersion Include="System.CommandLine" Version="2.0.7" />
4037
<PackageVersion Include="System.Reactive" Version="6.1.0" />
4138
<PackageVersion Include="System.Text.Json" Version="10.0.0" />
39+
<PackageVersion Include="Xaml.Behaviors" Version="12.0.0" />
4240
<PackageVersion Include="xunit.runner.visualstudio" Version="3.1.5" />
4341
<PackageVersion Include="xunit.v3" Version="3.2.2" />
4442
</ItemGroup>

src/Spectron.Debugger/Controls/Immediate.axaml

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
33
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
44
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
5-
xmlns:i="clr-namespace:Avalonia.Xaml.Interactivity;assembly=Avalonia.Xaml.Interactivity"
65
xmlns:viewModels="clr-namespace:OldBit.Spectron.Debugger.ViewModels"
76
x:DataType="viewModels:ImmediateViewModel"
87
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
@@ -21,11 +20,11 @@
2120
</ResourceDictionary>
2221
</UserControl.Resources>
2322

24-
<i:Interaction.Behaviors>
23+
<Interaction.Behaviors>
2524
<EventTriggerBehavior EventName="KeyDown" SourceObject="ImmediateTextBox">
2625
<InvokeCommandAction Command="{Binding ImmediateCommand}" PassEventArgsToCommand="True" />
2726
</EventTriggerBehavior>
28-
</i:Interaction.Behaviors>
27+
</Interaction.Behaviors>
2928

3029
<Grid RowDefinitions="*, Auto" ColumnDefinitions="16,*">
3130
<TextBox Grid.Row="0"
@@ -47,7 +46,7 @@
4746
<TextBox Grid.Row="1"
4847
Grid.Column="1"
4948
Name="ImmediateTextBox"
50-
Watermark="Enter command or type HELP to see available commands"
49+
PlaceholderText="Enter command or type HELP to see available commands"
5150
Text="{Binding CommandText}"
5251
FontFamily="{StaticResource VT220}"
5352
Foreground="{DynamicResource VT220Brush}"

src/Spectron.Debugger/Spectron.Debugger.csproj

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,12 @@
1616
<PackageReference Include="Avalonia" />
1717
<PackageReference Include="Avalonia.Controls.DataGrid" />
1818
<PackageReference Include="Avalonia.Controls.ItemsRepeater" />
19-
<PackageReference Include="Avalonia.Xaml.Interactions" />
20-
<PackageReference Include="Avalonia.Xaml.Interactivity" />
2119
<PackageReference Include="CommunityToolkit.Mvvm" />
2220
<PackageReference Include="Material.Icons.Avalonia" />
2321
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" />
2422
<PackageReference Include="OldBit.Z80Cpu.Spectron" />
2523
<PackageReference Include="System.Reactive" />
24+
<PackageReference Include="Xaml.Behaviors" />
2625
</ItemGroup>
2726

2827
<ItemGroup>

src/Spectron.Debugger/Views/MemoryView.axaml

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
33
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
44
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
5-
xmlns:i="clr-namespace:Avalonia.Xaml.Interactivity;assembly=Avalonia.Xaml.Interactivity"
65
xmlns:viewModels="clr-namespace:OldBit.Spectron.Debugger.ViewModels"
76
xmlns:hex="clr-namespace:OldBit.Spectron.Debugger.Controls.Hex"
87
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
@@ -26,11 +25,11 @@
2625
</ResourceDictionary>
2726
</Window.Resources>
2827

29-
<i:Interaction.Behaviors>
28+
<Interaction.Behaviors>
3029
<EventTriggerBehavior EventName="KeyDown" SourceObject="ImmediateTextBox">
3130
<InvokeCommandAction Command="{Binding ImmediateCommand}" PassEventArgsToCommand="True" />
3231
</EventTriggerBehavior>
33-
</i:Interaction.Behaviors>
32+
</Interaction.Behaviors>
3433

3534
<Grid Margin="8" RowDefinitions="*,30">
3635
<hex:HexViewer
@@ -60,7 +59,7 @@
6059
<TextBox Grid.Row="1"
6160
Name="ImmediateTextBox"
6261
Text="{Binding CommandText}"
63-
Watermark="g addr | w addr,v | f &quot;text&quot; | f hex_1 hex_2 ... hex_n"
62+
PlaceholderText="g addr | w addr,v | f &quot;text&quot; | f hex_1 hex_2 ... hex_n"
6463
FontFamily="{StaticResource VT220}"
6564
Foreground="{DynamicResource VT220Brush}"
6665
FontSize="15"

src/Spectron/Controls/NativeMainMenu.cs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ private NativeMenuItem CreateEmulatorMenu()
257257

258258
_ulaPlusMenuItem = new NativeMenuItem("Enable ULA+")
259259
{
260-
ToggleType = NativeMenuItemToggleType.CheckBox,
260+
ToggleType = MenuItemToggleType.CheckBox,
261261
Command = _viewModel.ToggleUlaPlusCommand,
262262
IsChecked = _viewModel.IsUlaPlusEnabled,
263263
};
@@ -339,15 +339,15 @@ private NativeMenuItem CreateControlMenu()
339339

340340
_pauseMenuItem = new NativeMenuItem("Pause")
341341
{
342-
ToggleType = NativeMenuItemToggleType.CheckBox,
342+
ToggleType = MenuItemToggleType.CheckBox,
343343
Command = _viewModel.TogglePauseCommand,
344344
Gesture = new KeyGesture(Key.F2),
345345
IsChecked = _viewModel.IsPaused,
346346
};
347347

348348
_muteMenuItem = new NativeMenuItem("Mute")
349349
{
350-
ToggleType = NativeMenuItemToggleType.CheckBox,
350+
ToggleType = MenuItemToggleType.CheckBox,
351351
Command = _viewModel.ToggleMuteCommand,
352352
IsChecked = _viewModel.IsAudioMuted,
353353
};
@@ -715,7 +715,7 @@ private NativeMenuItem CreateDebugMenu()
715715

716716
_debuggerBreakpointMenuItem = new NativeMenuItem("Breakpoints Enabled")
717717
{
718-
ToggleType = NativeMenuItemToggleType.CheckBox,
718+
ToggleType = MenuItemToggleType.CheckBox,
719719
Command = _viewModel.ToggleBreakpointsCommand,
720720
IsChecked = _viewModel.BreakpointsEnabled,
721721
};
@@ -814,7 +814,7 @@ private void CreateComputerTypeMenu()
814814
{
815815
_computerTypes[computer.Type] = new NativeMenuItem(computer.DisplayName)
816816
{
817-
ToggleType = NativeMenuItemToggleType.Radio,
817+
ToggleType = MenuItemToggleType.Radio,
818818
Command = _viewModel.ChangeComputerTypeCommand,
819819
CommandParameter = computer.Type,
820820
IsChecked = _viewModel.ComputerType == computer.Type,
@@ -844,7 +844,7 @@ private void CreateRomTypeMenu()
844844
{
845845
_romTypes[rom.Type] = new NativeMenuItem(rom.DisplayName)
846846
{
847-
ToggleType = NativeMenuItemToggleType.Radio,
847+
ToggleType = MenuItemToggleType.Radio,
848848
Command = _viewModel.ChangeRomCommand,
849849
CommandParameter = rom.Type,
850850
IsChecked = _viewModel.RomType == rom.Type,
@@ -869,7 +869,7 @@ private void CreateJoystickTypeMenu()
869869
{
870870
_joystickTypes[joystick.Type] = new NativeMenuItem(joystick.DisplayName)
871871
{
872-
ToggleType = NativeMenuItemToggleType.Radio,
872+
ToggleType = MenuItemToggleType.Radio,
873873
Command = _viewModel.ChangeJoystickTypeCommand,
874874
CommandParameter = joystick.Type,
875875
IsChecked = _viewModel.JoystickType == joystick.Type,
@@ -890,7 +890,7 @@ private void CreateMouseTypeMenu()
890890
{
891891
_mouseTypes[mouse.Type] = new NativeMenuItem(mouse.DisplayName)
892892
{
893-
ToggleType = NativeMenuItemToggleType.Radio,
893+
ToggleType = MenuItemToggleType.Radio,
894894
Command = _viewModel.ChangeMouseTypeCommand,
895895
CommandParameter = mouse.Type,
896896
IsChecked = _viewModel.MouseType == mouse.Type,
@@ -921,7 +921,7 @@ private void CreateSpeedOptionMenu()
921921
{
922922
_emulationSpeeds[speed.Value] = new NativeMenuItem(speed.DisplayName)
923923
{
924-
ToggleType = NativeMenuItemToggleType.Radio,
924+
ToggleType = MenuItemToggleType.Radio,
925925
Command = _viewModel.SetEmulationSpeedCommand,
926926
CommandParameter = speed.Value,
927927
IsChecked = _viewModel.EmulationSpeed == speed.Value,
@@ -945,7 +945,7 @@ private void CreateBorderSizeMenu()
945945
{
946946
_borderSizes[border.Size] = new NativeMenuItem(border.DisplayName)
947947
{
948-
ToggleType = NativeMenuItemToggleType.Radio,
948+
ToggleType = MenuItemToggleType.Radio,
949949
Command = _viewModel.ChangeBorderSizeCommand,
950950
CommandParameter = border.Size,
951951
IsChecked = _viewModel.BorderSize == border.Size,
@@ -966,7 +966,7 @@ private void CreateScreenEffectMenu()
966966
{
967967
_screenEffects[effect.Effect] = new NativeMenuItem(effect.DisplayName)
968968
{
969-
ToggleType = NativeMenuItemToggleType.CheckBox,
969+
ToggleType = MenuItemToggleType.CheckBox,
970970
Command = _viewModel.ChangeScreenEffectCommand,
971971
CommandParameter = effect.Effect,
972972
IsChecked = _viewModel.ScreenEffect.HasFlag(effect.Effect),
@@ -988,7 +988,7 @@ private void CreateTapeLoadingSpeedMenu()
988988
{
989989
_tapeLoadingSpeeds[speed.Value] = new NativeMenuItem(speed.DisplayName)
990990
{
991-
ToggleType = NativeMenuItemToggleType.Radio,
991+
ToggleType = MenuItemToggleType.Radio,
992992
Command = _viewModel.SetTapeLoadSpeedCommand,
993993
CommandParameter = speed.Value,
994994
IsChecked = _viewModel.TapeLoadSpeed == speed.Value,
@@ -1016,7 +1016,7 @@ private NativeMenuItem CreateMicrodriveWriteProtectMenuItem(MicrodriveId driveId
10161016
{
10171017
var menuItem = new NativeMenuItem("Write Protect")
10181018
{
1019-
ToggleType = NativeMenuItemToggleType.CheckBox,
1019+
ToggleType = MenuItemToggleType.CheckBox,
10201020
Command = _viewModel.MicrodriveMenuViewModel.ToggleWriteProtectCommand,
10211021
CommandParameter = driveId,
10221022
IsEnabled = _viewModel.MicrodriveMenuViewModel.ToggleWriteProtectCommand.CanExecute(null),
@@ -1048,7 +1048,7 @@ private NativeMenuItem CreateDiskDriveWriteProtectMenuItem(DriveId driveId)
10481048
{
10491049
var menuItem = new NativeMenuItem("Write Protect")
10501050
{
1051-
ToggleType = NativeMenuItemToggleType.CheckBox,
1051+
ToggleType = MenuItemToggleType.CheckBox,
10521052
Command = _viewModel.DiskDriveMenuViewModel.ToggleWriteProtectCommand,
10531053
CommandParameter = driveId,
10541054
IsEnabled = _viewModel.DiskDriveMenuViewModel.ToggleWriteProtectCommand.CanExecute(null),
Lines changed: 1 addition & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
1-
using System;
21
using System.Collections.Generic;
3-
using System.Text;
42
using Avalonia.Logging;
5-
using Avalonia.Utilities;
63
using Microsoft.Extensions.Logging;
74

85
namespace OldBit.Spectron.Logging;
@@ -24,7 +21,7 @@ public void Log(LogEventLevel level, string area, object? source, string message
2421
return;
2522
}
2623

27-
var message = FormatMessage(area, messageTemplate, source, propertyValues);
24+
var message = $"[{area}] {messageTemplate}";
2825

2926
switch (level)
3027
{
@@ -71,56 +68,4 @@ public void Log(LogEventLevel level, string area, object? source, string message
7168
break;
7269
}
7370
}
74-
75-
private static string FormatMessage(
76-
string area,
77-
string template,
78-
object? source,
79-
object?[] v)
80-
{
81-
var result = new StringBuilder(template.Length);
82-
var r = new CharacterReader(template.AsSpan());
83-
var i = 0;
84-
85-
result.Append('[');
86-
result.Append(area);
87-
result.Append(']');
88-
89-
while (!r.End)
90-
{
91-
var c = r.Take();
92-
93-
if (c != '{')
94-
{
95-
result.Append(c);
96-
}
97-
else
98-
{
99-
if (r.Peek != '{')
100-
{
101-
result.Append('\'');
102-
result.Append(i < v.Length ? v[i++] : null);
103-
result.Append('\'');
104-
r.TakeUntil('}');
105-
r.Take();
106-
}
107-
else
108-
{
109-
result.Append('{');
110-
r.Take();
111-
}
112-
}
113-
}
114-
115-
if (source != null)
116-
{
117-
result.Append('(');
118-
result.Append(source.GetType().Name);
119-
result.Append(" #");
120-
result.Append(source.GetHashCode());
121-
result.Append(')');
122-
}
123-
124-
return result.ToString();
125-
}
12671
}

src/Spectron/Program.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using Avalonia;
33
using Avalonia.Controls;
44
using Avalonia.Controls.ApplicationLifetimes;
5+
using Avalonia.Logging;
56
using Microsoft.Extensions.DependencyInjection;
67
using Microsoft.Extensions.Hosting;
78
using Microsoft.Extensions.Logging;

src/Spectron/Spectron.csproj

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,6 @@
2828
<PackageReference Include="Avalonia.Desktop" />
2929
<!--Condition below is needed to remove Avalonia.Diagnostics package from build output in Release configuration.-->
3030
<PackageReference Include="Avalonia.Themes.Fluent" />
31-
<PackageReference Include="Avalonia.Xaml.Behaviors" />
32-
<PackageReference Include="Avalonia.Xaml.Interactions" />
33-
<PackageReference Include="Avalonia.Xaml.Interactivity" />
3431
<PackageReference Condition="'$(Configuration)' == 'Debug'" Include="AvaloniaUI.DiagnosticsSupport" />
3532
<PackageReference Include="CommunityToolkit.Mvvm" />
3633
<PackageReference Include="Material.Icons.Avalonia" />
@@ -42,6 +39,7 @@
4239
<PackageReference Include="OldBit.Z80Cpu.Spectron" />
4340
<PackageReference Include="SkiaSharp.NativeAssets.Linux" />
4441
<PackageReference Include="System.CommandLine" />
42+
<PackageReference Include="Xaml.Behaviors" />
4543
</ItemGroup>
4644

4745
<ItemGroup>

src/Spectron/ViewModels/MainWindowViewModel.Dialogs.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,9 +141,9 @@ private void OpenTrainersWindow() =>
141141
private void OpenPrintOutputViewer() =>
142142
WeakReferenceMessenger.Default.Send(new ShowPrintOutputViewMessage(Emulator!.Printer));
143143

144-
private async Task OpenFavoritesWindow()
144+
private void OpenFavoritesWindow()
145145
{
146146
FavoritesViewModel.Favorites = _favorites;
147-
await WeakReferenceMessenger.Default.Send(new ShowFavoritesViewMessage(FavoritesViewModel));
147+
WeakReferenceMessenger.Default.Send(new ShowFavoritesViewMessage(FavoritesViewModel));
148148
}
149149
}

src/Spectron/Views/KeyboardView.axaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
Height="400"
1212
Focusable="True"
1313
WindowStartupLocation="CenterOwner"
14-
SystemDecorations="BorderOnly"
14+
WindowDecorations="BorderOnly"
1515
Title="ZX Spectrum Keyboard"
1616
Name="Window">
1717

0 commit comments

Comments
 (0)