Commit Graph
84 Commits
Author SHA1 Message Date
chinboy 2250748602 feat(AvatarGroup): enhance folding behavior and improve child management 2026-06-22 21:11:07 +08:00
chinboy c933790094 feat(SpinIndicator): introduce customizable size type and enhance size management 2026-06-22 16:36:21 +08:00
chinboy 099f62908a feat(SpinIndicator): enhance animation management and improve template handling 2026-06-22 16:05:09 +08:00
chinboy ac2339dfe6 feat(Descriptions): improve layout state handling and add docs 2026-06-22 12:54:50 +08:00
chinboy 6ed2dcf982 feat(Collapse): enhance accordion selection management and content visibility handling 2026-06-22 11:26:58 +08:00
chinboy 6608479073 feat(Collapse): enhance padding management with effective header and content padding properties 2026-06-22 09:19:39 +08:00
chinboy ee8850d539 feat(Slider): improve tooltip management and pointer handler disposal in range mode 2026-06-22 08:31:04 +08:00
chinboy 561cc8d25f feat(Select): update size type to customizable size for improved flexibility 2026-06-22 07:49:33 +08:00
chinboy a7d3c56bad fix(ListBox,ListView): correct filtered item state handling 2026-06-21 09:30:58 +08:00
chinboy 1a92a316d8 feat(GalleryBase): extract reusable gallery toolkit 2026-06-19 20:34:52 +08:00
chinboy 48138ea0da feat(BrowserGallery): add Space showcase and enhance theme integration 2026-06-08 10:09:03 +08:00
chinboy 0ef21733e8 feat(ScrollViewer): enhance scrollbar visibility during thumb drag in lite mode 2026-06-05 21:10:56 +08:00
chinboy 5fcb6d19fb feat(InputTextPresenter): implement custom text presenter to handle selection changes 2026-06-05 19:48:05 +08:00
chinboy 1181d1d4be fix(TreeView,TreeSelect): restore tree filter rename behavior 2026-06-05 18:41:23 +08:00
chinboy 1c62e45646 feat(TreeView,TreeSelect)!: rename tree filter strategy API 2026-06-05 18:23:35 +08:00
chinboy 4c33b36c93 fix(Select,TreeSelect): show hand cursor for closed single input 2026-06-05 18:02:06 +08:00
chinboy 156a54b095 fix(Select,TreeSelect): prevent closed search caret movement 2026-06-05 17:57:05 +08:00
chinboy cb4b8167a1 fix(Select,TreeSelect): lock closed single search caret 2026-06-05 17:48:41 +08:00
chinboy 82f3177467 fix(Select,TreeSelect): reset single search caret state 2026-06-05 17:38:02 +08:00
chinboy 15c0dac4d2 fix(Select,TreeSelect): unify single search display in text box 2026-06-05 17:29:50 +08:00
chinboy 44343a4cc7 fix(Select,TreeSelect): stabilize popup search and result state 2026-06-05 16:35:42 +08:00
chinboy d543bcfbcd fix(Select): stabilize candidate visibility and grouping refresh 2026-06-05 16:33:44 +08:00
chinboy 42a52495af fix(TreeView): guard ClearFilterMode expansion state 2026-06-05 16:30:38 +08:00
chinboy 2f4c614bc0 fix(Select): align filter placeholder with caret and bump version 2026-06-05 15:17:31 +08:00
chinboy baab8f54ac gallery(SplitButton): optimize secondary button arrangement logic and add compact theme verification 2026-06-05 14:47:27 +08:00
chinboy a7348af729 gallery(Form): split showcase scenarios into lazy tabs 2026-06-02 14:19:16 +08:00
chinboy 44d226f213 perf(controls): reduce allocation and flag-check overhead 2026-06-01 16:26:36 +08:00
chinboy 7baffed45d fix(TreeNodePath): normalize slash-delimited paths 2026-05-31 17:51:22 +08:00
chinboy ec14e86744 test(Dialog): cover custom button collection sync 2026-05-31 09:34:27 +08:00
chinboy 56d95e009b perf(selection): reduce tree and transfer overhead 2026-05-31 09:34:04 +08:00
chinboy df79b65569 perf(inputs): reduce picker and input state overhead 2026-05-31 09:33:26 +08:00
chinboy 915deff4eb perf(controls): reduce allocation and state sync overhead 2026-05-29 17:40:13 +08:00
chinboy 6f4bbdc064 perf(controls): reduce transfer, tree and layout overhead 2026-05-29 10:32:40 +08:00
chinboy 9b83aa5940 perf(PopupConfirm): optimize button event lifecycle and correctness 2026-05-28 23:08:04 +08:00
chinboy 4a60c55fc2 perf(controls): optimize flyout and layout lifecycles 2026-05-28 21:48:10 +08:00
chinboy 9379c9a0c5 perf(controls): optimize ColorPicker, titlebar and adorner lifecycles 2026-05-28 11:50:30 +08:00
chinboy 3eefb30d8b perf(DataGrid): reduce data-layer and column group overhead 2026-05-28 09:13:01 +08:00
chinboy c621706a52 perf(DataGrid): add verification for item-type probe enumerator disposal 2026-05-27 15:55:41 +08:00
chinboy 393b376189 perf(DataGrid): reduce filter and data-layer overhead 2026-05-27 15:32:01 +08:00
chinboy d55bc01c52 perf(DataGrid): reduce allocation and lifecycle overhead 2026-05-26 19:38:27 +08:00
chinboy a4e07782fa perf(DataGrid): reuse row group header transforms
Cache DataGridRowGroupHeader frozen child TranslateTransform instances across repeated arrange passes, update X in place, and clear child RenderTransform values when row group headers become fully frozen, re-templated, or detached.

Qualification: DataGridShowCase declares 65 DataGrid instances; grouped grids with row headers and horizontal scrolling exercise row group header frozen child arrange paths. Operation frequency: horizontal scrolling, row group header layout, row group header frozen-state changes, re-template, and detach.

Avalonia basis: Visual.RenderTransform is a styled property and Avalonia subscribes mutable Transform.Changed to invalidate the visual (.referenceprojects/Avalonia/src/Avalonia.Base/Visual.cs:92-100,150,644-710). TranslateTransform.X/Y changes raise Transform.Changed (.referenceprojects/Avalonia/src/Avalonia.Base/Media/TranslateTransform.cs:14-22,70-75; .referenceprojects/Avalonia/src/Avalonia.Base/Media/Transform.cs:23-50).

Verification: dotnet build -c Release -f net10.0 tools/performances/AtomUI.Performance/AtomUI.Performance.csproj; dotnet run -c Release -f net10.0 --no-build --project tools/performances/AtomUI.Performance/AtomUI.Performance.csproj -- --verify-datagrid-states; dotnet run -c Release -f net10.0 --no-build --project tools/performances/AtomUI.Performance/AtomUI.Performance.csproj -- --suite datagrid --count 100; git diff --check; git diff --cached --check.
2026-05-26 10:37:47 +08:00
chinboy 2f41df5b7c perf(DataGrid): reduce row clip allocation
Reuse DataGridRow hidden clip geometry for non-recyclable hidden rows and cache DataGridRowGroupHeader child clip geometries across repeated arrange passes. Also resolve the built-in RowGroupHeader RootLayout/RowHeader template part names so row header visibility, owner wiring, and child clip lifecycle run for the shipped template.

Qualification: DataGridShowCase declares 65 DataGrid instances; row virtualization/removal paths apply to realized rows, and row group header child clipping applies to grouped grids with row headers/frozen offsets. Operation frequency: vertical scrolling, ItemsSource changes, row deletion, row clearing, horizontal scrolling, row group header layout, re-template, and detach.

Avalonia basis: Visual.Clip is a styled property registered with AffectsRender and InvalidateVisual queues dirty rendering (.referenceprojects/Avalonia/src/Avalonia.Base/Visual.cs:52-53,141-149,418-421,446-500). RectangleGeometry.RectProperty marks geometry dirty (.referenceprojects/Avalonia/src/Avalonia.Base/Media/RectangleGeometry.cs:25-33; .referenceprojects/Avalonia/src/Avalonia.Base/Media/Geometry.cs:146-172).

Verification: dotnet build -c Release -f net10.0 tools/performances/AtomUI.Performance/AtomUI.Performance.csproj; dotnet run -c Release -f net10.0 --no-build --project tools/performances/AtomUI.Performance/AtomUI.Performance.csproj -- --verify-datagrid-states; dotnet run -c Release -f net10.0 --no-build --project tools/performances/AtomUI.Performance/AtomUI.Performance.csproj -- --suite datagrid --count 100; git diff --check; git diff --cached --check.
2026-05-26 10:12:26 +08:00
chinboy 2925af953f perf(DataGrid): reduce reordering indicator clip allocation
Gallery qualification: DataGridShowCase declares 65 DataGrid instances and 210 column declarations. Column reordering is available on the column header presenters, and the optimized path applies to drag and drop-location indicators clipped by frozen column regions during standard and grouped header reordering.

Operation frequency: column reordering indicator arrange/clip updates can run during pointer move, auto-scroll, horizontal scrolling, resizing, and grid relayout while a column is being dragged. Previously each clipped indicator update allocated a new RectangleGeometry.

Avalonia source basis: Visual.Clip is a styled property registered with AffectsRender, and InvalidateVisual marks the visual dirty (.referenceprojects/Avalonia/src/Avalonia.Base/Visual.cs:52-53,141-149,418-421,446-500). RectangleGeometry.Rect participates in geometry invalidation (.referenceprojects/Avalonia/src/Avalonia.Base/Media/RectangleGeometry.cs:25-33; .referenceprojects/Avalonia/src/Avalonia.Base/Media/Geometry.cs:146-172).

Benefit: repeated clipped column reordering indicator updates now reuse cached RectangleGeometry instances after first use, reducing repeated clip geometry allocation from 1/clipped indicator update to 0 after first while preserving Clip clearing when clipping is no longer needed or an indicator is replaced.

Verification: dotnet build -c Release -f net10.0 tools/performances/AtomUI.Performance/AtomUI.Performance.csproj; dotnet run -c Release -f net10.0 --no-build --project tools/performances/AtomUI.Performance/AtomUI.Performance.csproj -- --verify-datagrid-states; dotnet run -c Release -f net10.0 --no-build --project tools/performances/AtomUI.Performance/AtomUI.Performance.csproj -- --suite datagrid --count 100; git diff --check.
2026-05-26 09:29:10 +08:00
chinboy e64267c11f perf(DataGrid): reduce group header clip allocation
Gallery qualification: DataGridShowCase declares 65 DataGrid instances and 210 column declarations. Grouped header scenarios include DataGridColumnGroupItem leaves, and frozen-column examples use LeftFrozenColumnCount and RightFrozenColumnCount. The optimized path applies to grouped leaf DataGridHeaderViewItem instances that require clipping under frozen columns.

Operation frequency: group column header presenter arrange runs during initial layout, horizontal scrolling, resizing, column width changes, and grid relayout. Previously each clipped grouped leaf header arrange allocated a new RectangleGeometry.

Avalonia source basis: Visual.Clip is a styled property registered with AffectsRender, and InvalidateVisual marks the visual dirty (.referenceprojects/Avalonia/src/Avalonia.Base/Visual.cs:52-53,141-149,418-421,446-500). RectangleGeometry.Rect participates in geometry invalidation (.referenceprojects/Avalonia/src/Avalonia.Base/Media/RectangleGeometry.cs:25-33; .referenceprojects/Avalonia/src/Avalonia.Base/Media/Geometry.cs:146-172).

Benefit: repeated clipped group column header view item arrange now reuses one RectangleGeometry after first use, reducing repeated clip geometry allocation from 1/clipped grouped leaf header arrange to 0 after first while preserving Clip clearing when clipping is no longer needed.

Verification: dotnet build -c Release -f net10.0 tools/performances/AtomUI.Performance/AtomUI.Performance.csproj; dotnet run -c Release -f net10.0 --no-build --project tools/performances/AtomUI.Performance/AtomUI.Performance.csproj -- --verify-datagrid-states; dotnet run -c Release -f net10.0 --no-build --project tools/performances/AtomUI.Performance/AtomUI.Performance.csproj -- --suite datagrid --count 100; git diff --check.
2026-05-26 08:59:59 +08:00
chinboy a58b30355d perf(DataGrid): reduce column header clip allocation
Gallery qualification: DataGridShowCase declares 65 DataGrid instances and 210 column declarations, including multiple frozen-column examples with LeftFrozenColumnCount and RightFrozenColumnCount. The optimized path applies to realized DataGridColumnHeader instances that require clipping under frozen columns or header viewport constraints.

Operation frequency: column header presenter arrange runs during initial layout, horizontal scrolling, resizing, column width changes, and grid relayout. Previously each clipped header arrange allocated a new RectangleGeometry.

Avalonia source basis: Visual.Clip is a styled property registered with AffectsRender, and InvalidateVisual marks the visual dirty (.referenceprojects/Avalonia/src/Avalonia.Base/Visual.cs:52-53,141-149,418-421,446-500). RectangleGeometry.Rect participates in geometry invalidation (.referenceprojects/Avalonia/src/Avalonia.Base/Media/RectangleGeometry.cs:25-33; .referenceprojects/Avalonia/src/Avalonia.Base/Media/Geometry.cs:146-172).

Benefit: repeated clipped column header arrange now reuses one RectangleGeometry after first use, reducing repeated clip geometry allocation from 1/clipped header arrange to 0 after first while preserving Clip clearing when clipping is no longer needed.

Verification: dotnet build -c Release -f net10.0 tools/performances/AtomUI.Performance/AtomUI.Performance.csproj; dotnet run -c Release -f net10.0 --no-build --project tools/performances/AtomUI.Performance/AtomUI.Performance.csproj -- --verify-datagrid-states; dotnet run -c Release -f net10.0 --no-build --project tools/performances/AtomUI.Performance/AtomUI.Performance.csproj -- --suite datagrid --count 100; git diff --check.
2026-05-26 08:47:23 +08:00
chinboy d827dd12f7 perf(DataGrid): reduce cell clip allocation
Gallery qualification: DataGridShowCase declares 65 DataGrid instances, including multiple frozen-column examples with LeftFrozenColumnCount and RightFrozenColumnCount. The optimized path applies to realized DataGridCell instances that require clipping under frozen columns or horizontal virtualization.

Operation frequency: cells presenter arrange runs during initial layout, horizontal scrolling, resizing, column width changes, grid relayout, and row virtualization reuse. Previously each clipped cell arrange allocated a new RectangleGeometry.

Avalonia source basis: Visual.Clip is a styled property registered with AffectsRender, and InvalidateVisual marks the visual dirty (.referenceprojects/Avalonia/src/Avalonia.Base/Visual.cs:52-53,141-149,418-421,446-500). RectangleGeometry.Rect participates in geometry invalidation (.referenceprojects/Avalonia/src/Avalonia.Base/Media/RectangleGeometry.cs:25-33; .referenceprojects/Avalonia/src/Avalonia.Base/Media/Geometry.cs:146-172).

Benefit: repeated clipped cell arrange now reuses one RectangleGeometry after first use, reducing repeated clip geometry allocation from 1/clipped cell arrange to 0 after first while preserving Clip clearing when clipping is no longer needed.

Verification: dotnet build -c Release -f net10.0 tools/performances/AtomUI.Performance/AtomUI.Performance.csproj; dotnet run -c Release -f net10.0 --no-build --project tools/performances/AtomUI.Performance/AtomUI.Performance.csproj -- --verify-datagrid-states; dotnet run -c Release -f net10.0 --no-build --project tools/performances/AtomUI.Performance/AtomUI.Performance.csproj -- --suite datagrid --count 100; git diff --check.
2026-05-26 08:15:39 +08:00
chinboy 2c47bce767 perf(DataGrid): reduce details presenter clip allocation
Gallery qualification: DataGridShowCase declares 65 DataGrid instances. Row details scenarios create DataGridDetailsPresenter per templated row, but this allocation path only applies to visible non-frozen row details during arrange.

Operation frequency: visible row details arrange during initial layout, horizontal scrolling, resizing, grid relayout, and row details visibility/frozen-state changes.

Avalonia source basis: Visual.Clip is a styled property registered with AffectsRender, and InvalidateVisual marks the visual dirty (.referenceprojects/Avalonia/src/Avalonia.Base/Visual.cs:52-53,141-149,418-421,446-500). RectangleGeometry.Rect participates in geometry invalidation (.referenceprojects/Avalonia/src/Avalonia.Base/Media/RectangleGeometry.cs:25-33; .referenceprojects/Avalonia/src/Avalonia.Base/Media/Geometry.cs:146-172).

Benefit: repeated non-frozen details arrange now reuses one RectangleGeometry after first use, reducing repeated clip geometry allocation from 1/details arrange to 0 after first while preserving frozen Clip clearing.

Verification: dotnet build -c Release -f net10.0 tools/performances/AtomUI.Performance/AtomUI.Performance.csproj; dotnet run -c Release -f net10.0 --no-build --project tools/performances/AtomUI.Performance/AtomUI.Performance.csproj -- --verify-datagrid-states; dotnet run -c Release -f net10.0 --no-build --project tools/performances/AtomUI.Performance/AtomUI.Performance.csproj -- --suite datagrid --count 100; git diff --check.
2026-05-26 07:42:44 +08:00
chinboy 5e366bb34a perf(DataGrid): reduce row gridline clip allocation
Gallery qualification: DataGridShowCase declares 65 DataGrid instances; each realized DataGrid creates multiple DataGridRow instances, and every templated row owns one PART_BottomGridLine.

Operation frequency: DataGridRow.ArrangeOverride runs during page navigation layout, resizing, horizontal scrolling, row recycling, and grid relayout; the previous code allocated one RectangleGeometry for the bottom gridline on each realized row arrange.

Avalonia basis: Visual.Clip is a StyledProperty registered with AffectsRender and InvalidateVisual queues the visual for repaint (.referenceprojects/Avalonia/src/Avalonia.Base/Visual.cs:52-53,141-149,418-421). RectangleGeometry.RectProperty is registered with AffectsGeometry, so the reused geometry updates its platform geometry while this change explicitly invalidates the bottom gridline when Rect changes (.referenceprojects/Avalonia/src/Avalonia.Base/Media/RectangleGeometry.cs:25-33; .referenceprojects/Avalonia/src/Avalonia.Base/Media/Geometry.cs:146-172).

Verification: dotnet build -c Release -f net10.0 tools/performances/AtomUI.Performance/AtomUI.Performance.csproj; dotnet run -c Release -f net10.0 --no-build --project tools/performances/AtomUI.Performance/AtomUI.Performance.csproj -- --verify-datagrid-states; dotnet run -c Release -f net10.0 --no-build --project tools/performances/AtomUI.Performance/AtomUI.Performance.csproj -- --suite datagrid --count 100.
2026-05-26 07:23:33 +08:00
chinboy cd9613d0bc perf(DataGrid): reduce rows presenter clip allocation
Gallery qualification: DataGridShowCase declares 65 DataGrid instances, and each realized DataGrid template owns one DataGridRowsPresenter.

Operation frequency: DataGridRowsPresenter.ArrangeOverride runs during page navigation layout, resizing, and scroll-triggered layout passes; the previous code allocated one RectangleGeometry per arrange.

Avalonia basis: Visual.Clip is a StyledProperty registered with AffectsRender and InvalidateVisual queues the visual for repaint (.referenceprojects/Avalonia/src/Avalonia.Base/Visual.cs:52-53,141-149,418-421). RectangleGeometry.RectProperty is registered with AffectsGeometry, so the reused geometry updates its platform geometry while this change explicitly invalidates the presenter when Rect changes (.referenceprojects/Avalonia/src/Avalonia.Base/Media/RectangleGeometry.cs:25-33; .referenceprojects/Avalonia/src/Avalonia.Base/Media/Geometry.cs:146-172).

Verification: dotnet build -c Release -f net10.0 tools/performances/AtomUI.Performance/AtomUI.Performance.csproj; dotnet run -c Release -f net10.0 --no-build --project tools/performances/AtomUI.Performance/AtomUI.Performance.csproj -- --verify-datagrid-states; dotnet run -c Release -f net10.0 --no-build --project tools/performances/AtomUI.Performance/AtomUI.Performance.csproj -- --suite datagrid --count 100.
2026-05-26 07:10:17 +08:00
chinboy db61a51160 perf(DataGrid): reduce rows presenter scroll handler overhead
Gallery qualification: DataGridShowCase declares 65 DataGrid instances, and each template creates one DataGridRowsPresenter. This removes one constructor-time local ScrollGesture routed subscription per rows presenter. Setup happens whenever a DataGrid template is realized; ScrollGesture runs when users scroll DataGrid rows with touchpad or gesture input.

Behavior: DataGridRowsPresenter now handles ScrollGesture through a class handler and still calls the existing OwningGrid.UpdateScroll(-e.Delta) path. State verification confirms no local ScrollGesture handler remains, the gesture is still marked handled when scrolling occurs, and VerticalOffset still changes.

Documentation: updates the DataGrid performance notes and roadmap, and adds the performance-skill rule that every optimization completion must proactively report benefit in a table with baseline, optimized, formula, improvement, and conclusion.

Avalonia basis: ScrollGestureEvent is a bubble routed event. Event adders call AddHandler and store local routed subscriptions in Interactive._eventHandlers, while AddClassHandler subscribes once through RoutedEvent.Raised and filters by route/type.

Sources: .referenceprojects/Avalonia/src/Avalonia.Base/Input/InputElement.Gestures.cs:65-69; .referenceprojects/Avalonia/src/Avalonia.Base/Input/InputElement.Gestures.cs:197-200; .referenceprojects/Avalonia/src/Avalonia.Base/Interactivity/Interactive.cs:30-64; .referenceprojects/Avalonia/src/Avalonia.Base/Interactivity/Interactive.cs:176-190; .referenceprojects/Avalonia/src/Avalonia.Base/Interactivity/RoutedEvent.cs:78-99.
2026-05-26 06:53:44 +08:00