From 68065b216e160947f8583d41bc559598aa811458 Mon Sep 17 00:00:00 2001 From: Dong Bin Date: Thu, 27 Feb 2025 16:03:14 +0800 Subject: [PATCH 1/6] fix: remove useless code in IPBox IME. --- .../IPv4Box/IPv4BoxInputMethodClient.cs | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/src/Ursa/Controls/IPv4Box/IPv4BoxInputMethodClient.cs b/src/Ursa/Controls/IPv4Box/IPv4BoxInputMethodClient.cs index 5bbdf21e1..7cdbcb72b 100644 --- a/src/Ursa/Controls/IPv4Box/IPv4BoxInputMethodClient.cs +++ b/src/Ursa/Controls/IPv4Box/IPv4BoxInputMethodClient.cs @@ -4,28 +4,21 @@ namespace Ursa.Controls; -public class IPv4BoxInputMethodClient:TextInputMethodClient +public class IPv4BoxInputMethodClient: TextInputMethodClient { private TextPresenter? _presenter; - public override Visual TextViewVisual => _presenter; + public override Visual TextViewVisual => _presenter!; public override bool SupportsPreedit => false; public override bool SupportsSurroundingText => true; - public override string SurroundingText - { - get; - } - public override Rect CursorRectangle { get; } + public override string SurroundingText { get; } = null!; + + public override Rect CursorRectangle { get; } = new(); public override TextSelection Selection { get; set; } - private IPv4Box? _parent; public void SetPresenter(TextPresenter? presenter) { + _presenter = presenter; this.RaiseTextViewVisualChanged(); this.RaiseCursorRectangleChanged(); } - - private void OnParentPropertyChanged(object? sender, AvaloniaPropertyChangedEventArgs e) - { - this.RaiseSelectionChanged(); - } } \ No newline at end of file From 95525fcdbbf44362df1166be21416775ad9a0c26 Mon Sep 17 00:00:00 2001 From: Dong Bin Date: Thu, 27 Feb 2025 16:09:06 +0800 Subject: [PATCH 2/6] fix: fix nullable issue and switch fallback issue in marquee. --- src/Ursa/Controls/Marquee/Marquee.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Ursa/Controls/Marquee/Marquee.cs b/src/Ursa/Controls/Marquee/Marquee.cs index 4208db09a..43c1f17c0 100644 --- a/src/Ursa/Controls/Marquee/Marquee.cs +++ b/src/Ursa/Controls/Marquee/Marquee.cs @@ -124,14 +124,14 @@ public double Speed set => SetValue(SpeedProperty, value); } - private void OnPresenterSizeChanged(object sender, SizeChangedEventArgs e) + private void OnPresenterSizeChanged(object? sender, SizeChangedEventArgs e) { InvalidatePresenterPosition(); } - private void TimerOnTick(object sender, System.EventArgs e) + private void TimerOnTick(object? sender, System.EventArgs e) { if (Presenter is null) return; var layoutValues = Dispatcher.UIThread.Invoke(GetLayoutValues); @@ -177,11 +177,13 @@ protected override Size MeasureOverride(Size availableSize) { Direction.Up or Direction.Down => GetHorizontalOffset(values.Bounds, values.PresenterSize, values.HorizontalAlignment), Direction.Left or Direction.Right => values.Left, + _ => throw new NotImplementedException(), }; var verticalOffset = values.Direction switch { Direction.Up or Direction.Down => values.Top, Direction.Left or Direction.Right => GetVerticalOffset(values.Bounds, values.PresenterSize, values.VerticalAlignment), + _ => throw new NotImplementedException(), }; if (horizontalOffset is double.NaN) horizontalOffset = 0.0; if (verticalOffset is double.NaN) verticalOffset = 0.0; From 60046f4ef15eeb38e2f130a4f9d5fd088c889470 Mon Sep 17 00:00:00 2001 From: Dong Bin Date: Thu, 27 Feb 2025 16:34:23 +0800 Subject: [PATCH 3/6] fix: simplify nullable check in pathpicker. --- src/Ursa/Controls/PathPicker/PathPicker.cs | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/Ursa/Controls/PathPicker/PathPicker.cs b/src/Ursa/Controls/PathPicker/PathPicker.cs index d21b981bd..2da25f08f 100644 --- a/src/Ursa/Controls/PathPicker/PathPicker.cs +++ b/src/Ursa/Controls/PathPicker/PathPicker.cs @@ -204,10 +204,10 @@ private static FilePickerFileType ParseFilePickerType(string str) nameof(FilePickerFileTypes.ImagePng) => FilePickerFileTypes.ImagePng, nameof(FilePickerFileTypes.ImageWebp) => FilePickerFileTypes.ImageWebp, nameof(FilePickerFileTypes.TextPlain) => FilePickerFileTypes.TextPlain, - _ => parse() + _ => Parse() }; - FilePickerFileType parse() + FilePickerFileType Parse() { var list = str.Split(','); return new FilePickerFileType(list.First()) @@ -248,7 +248,7 @@ await storageProvider.TryGetFolderFromPathAsync(SuggestedStartPath), FileTypeFilter = ParseFileTypes(FileFilter) }; var resFiles = await storageProvider.OpenFilePickerAsync(filePickerOpenOptions); - UpdateSelectedPaths(resFiles.Select(x => x.TryGetLocalPath()).ToArray()!); + UpdateSelectedPaths(resFiles.Select(x => x.TryGetLocalPath()).ToArray()); break; case UsePickerTypes.SaveFile: FilePickerSaveOptions filePickerSaveOptions = new() @@ -263,9 +263,7 @@ await storageProvider.TryGetFolderFromPathAsync(SuggestedStartPath), var path = (await storageProvider.SaveFilePickerAsync(filePickerSaveOptions)) ?.TryGetLocalPath(); - UpdateSelectedPaths(string.IsNullOrEmpty(path) - ? Array.Empty() - : [path]); + UpdateSelectedPaths([path]); break; case UsePickerTypes.OpenFolder: FolderPickerOpenOptions folderPickerOpenOptions = new() @@ -277,7 +275,7 @@ await storageProvider.TryGetFolderFromPathAsync(SuggestedStartPath), SuggestedFileName = SuggestedFileName }; var resFolder = await storageProvider.OpenFolderPickerAsync(folderPickerOpenOptions); - UpdateSelectedPaths(resFolder.Select(x => x.TryGetLocalPath()).ToArray()!); + UpdateSelectedPaths(resFolder.Select(x => x.TryGetLocalPath()).ToArray()); break; default: throw new ArgumentOutOfRangeException(); @@ -298,9 +296,10 @@ await storageProvider.TryGetFolderFromPathAsync(SuggestedStartPath), } } - private void UpdateSelectedPaths(IReadOnlyList newList) + private void UpdateSelectedPaths(IReadOnlyList newList) { - if (newList.Count != 0 || IsClearSelectionOnCancel && newList.Count == 0) - SelectedPaths = newList; + var nonNullList = newList.Where(x => x is not null).Select(x => x!).ToList(); + if (nonNullList.Count != 0 || IsClearSelectionOnCancel && nonNullList.Count == 0) + SelectedPaths = nonNullList; } } \ No newline at end of file From 50ac16ff23e1b9f432020da7e0b87a24b8c333a6 Mon Sep 17 00:00:00 2001 From: Dong Bin Date: Thu, 27 Feb 2025 16:40:15 +0800 Subject: [PATCH 4/6] fix: fix various nullable warning issues in test project. --- .../Controls/DateTimePicker/DatePickerTests.cs | 12 +++++------- .../DrawerCloseTestPopupControl.axaml.cs | 13 +++---------- .../DrawerTests/MeasureTest/DrawerMeasureTest.cs | 3 +-- 3 files changed, 9 insertions(+), 19 deletions(-) diff --git a/tests/HeadlessTest.Ursa/Controls/DateTimePicker/DatePickerTests.cs b/tests/HeadlessTest.Ursa/Controls/DateTimePicker/DatePickerTests.cs index 005e16a1c..c0387cff9 100644 --- a/tests/HeadlessTest.Ursa/Controls/DateTimePicker/DatePickerTests.cs +++ b/tests/HeadlessTest.Ursa/Controls/DateTimePicker/DatePickerTests.cs @@ -7,7 +7,6 @@ using Avalonia.Layout; using Avalonia.LogicalTree; using Avalonia.Threading; -using Avalonia.VisualTree; using HeadlessTest.Ursa.TestHelpers; using Ursa.Controls; using DatePicker = Ursa.Controls.DatePicker; @@ -176,7 +175,7 @@ public void SelectedDate_Set_TextBox_Text() window.MouseDown(new Point(10, 10), MouseButton.Left); Dispatcher.UIThread.RunJobs(); var popup = picker.GetTemplateChildOfType(DatePicker.PART_Popup); - var calendar = popup.GetLogicalDescendants().OfType().FirstOrDefault(); + var calendar = popup?.GetLogicalDescendants().OfType().FirstOrDefault(); calendar?.RaiseEvent(new CalendarDayButtonEventArgs(new DateTime(2025, 2, 17)) { RoutedEvent = CalendarView.DateSelectedEvent }); Dispatcher.UIThread.RunJobs(); @@ -203,7 +202,7 @@ public void Set_SelectedDate_To_Null_Clears_TextBox() window.MouseDown(new Point(10, 10), MouseButton.Left); Dispatcher.UIThread.RunJobs(); var popup = picker.GetTemplateChildOfType(DatePicker.PART_Popup); - var calendar = popup.GetLogicalDescendants().OfType().FirstOrDefault(); + var calendar = popup?.GetLogicalDescendants().OfType().FirstOrDefault(); calendar?.RaiseEvent(new CalendarDayButtonEventArgs(new DateTime(2025, 2, 17)) { RoutedEvent = CalendarView.DateSelectedEvent }); Dispatcher.UIThread.RunJobs(); @@ -270,13 +269,13 @@ public void Set_Invalid_TextBox_Text_Clears_SelectedDate() HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top }; - var focustextBox = new TextBox(); + var focusTextBox = new TextBox(); window.Content = new StackPanel() { Children = { picker, - focustextBox, + focusTextBox, } }; window.Show(); @@ -289,7 +288,7 @@ public void Set_Invalid_TextBox_Text_Clears_SelectedDate() Dispatcher.UIThread.RunJobs(); Assert.Equal(new DateTime(2025, 2, 18), picker.SelectedDate); textBox?.SetValue(TextBox.TextProperty, "2025-02-18-"); - focustextBox.Focus(); + focusTextBox.Focus(); Dispatcher.UIThread.RunJobs(); Assert.Null(picker.SelectedDate); } @@ -356,7 +355,6 @@ public void Click_On_Popup_Will_Not_Close_Popup() var position = nextButton.TranslatePoint(new Point(5, 5), window); Assert.NotNull(position); window.MouseDown(new Point(10, 10), MouseButton.Left); - var renderRoot = popup.GetVisualRoot(); Dispatcher.UIThread.RunJobs(); Assert.True(picker.IsDropdownOpen); diff --git a/tests/HeadlessTest.Ursa/Controls/DrawerTests/CloseEventTest/DrawerCloseTestPopupControl.axaml.cs b/tests/HeadlessTest.Ursa/Controls/DrawerTests/CloseEventTest/DrawerCloseTestPopupControl.axaml.cs index 7f9bec4d5..be24da9fe 100644 --- a/tests/HeadlessTest.Ursa/Controls/DrawerTests/CloseEventTest/DrawerCloseTestPopupControl.axaml.cs +++ b/tests/HeadlessTest.Ursa/Controls/DrawerTests/CloseEventTest/DrawerCloseTestPopupControl.axaml.cs @@ -1,11 +1,4 @@ -using System; -using System.ComponentModel; -using System.IO; -using System.Runtime.CompilerServices; -using Avalonia; -using Avalonia.Controls; -using Avalonia.Interactivity; -using Avalonia.Markup.Xaml; +using Avalonia.Controls; using Ursa.Controls; namespace HeadlessTest.Ursa.Controls; @@ -19,7 +12,7 @@ public DrawerCloseTestPopupControl() } private readonly string _hostid = Path.GetRandomFileName(); - public DrawerCloseTestPopupControl Popup { get; set; } + public DrawerCloseTestPopupControl? Popup { get; set; } public int LResult { get; set; } public int RResult { get; set; } @@ -32,7 +25,7 @@ public async void OpenPopup() public void ClosePopup() { - (Popup.DataContext as DrawerCloseTestPopupControlVM)?.Close(); + (Popup?.DataContext as DrawerCloseTestPopupControlVM)?.Close(); } diff --git a/tests/HeadlessTest.Ursa/Controls/DrawerTests/MeasureTest/DrawerMeasureTest.cs b/tests/HeadlessTest.Ursa/Controls/DrawerTests/MeasureTest/DrawerMeasureTest.cs index 1a1b409c7..44fbe4071 100644 --- a/tests/HeadlessTest.Ursa/Controls/DrawerTests/MeasureTest/DrawerMeasureTest.cs +++ b/tests/HeadlessTest.Ursa/Controls/DrawerTests/MeasureTest/DrawerMeasureTest.cs @@ -29,7 +29,7 @@ public async void Default_Drawer_Is_Constrained_When_Content_Is_Large(Position p }; window.Show(); Dispatcher.UIThread.RunJobs(); - Drawer.ShowModal(textBlock, "hello world", null, + _ = Drawer.ShowModal(textBlock, "hello world", null, new DrawerOptions { Position = position, TopLevelHashCode = window.GetHashCode() }); await Task.Delay(TimeSpan.FromSeconds(0.1)); var dialogControl = window.GetVisualDescendants().OfType().SingleOrDefault(); @@ -57,7 +57,6 @@ public async void Custom_Drawer_Is_Constrained_When_Content_Is_Large(Position po }; window.Show(); Dispatcher.UIThread.RunJobs(); - var d = window.GetVisualDescendants().ToList(); Drawer.ShowCustom(textBlock, "hello world", null, new DrawerOptions { Position = position, TopLevelHashCode = window.GetHashCode() }); await Task.Delay(TimeSpan.FromSeconds(0.1)); From c09fc6860df28a8940b2cb6731d7165a0cd95717 Mon Sep 17 00:00:00 2001 From: Dong Bin Date: Thu, 27 Feb 2025 16:43:59 +0800 Subject: [PATCH 5/6] feat: add scrollviewer to dialog demo. --- demo/Ursa.Demo/Pages/DialogDemo.axaml | 370 +++++++++++++------------- 1 file changed, 186 insertions(+), 184 deletions(-) diff --git a/demo/Ursa.Demo/Pages/DialogDemo.axaml b/demo/Ursa.Demo/Pages/DialogDemo.axaml index 7fce6989a..c51bbb4b9 100644 --- a/demo/Ursa.Demo/Pages/DialogDemo.axaml +++ b/demo/Ursa.Demo/Pages/DialogDemo.axaml @@ -12,193 +12,195 @@ x:DataType="vm:DialogDemoViewModel" mc:Ignorable="d"> - - - - - - - - - - - - - - - - - - - - - - - - - - -