From bceb150a12ff2c5ff1bb6638b7b8320fc9fe9c98 Mon Sep 17 00:00:00 2001 From: Edgar Gonzalez Date: Fri, 22 Nov 2024 19:01:59 +0000 Subject: [PATCH] Avalonia 11.2 (#262) * Update to 11.2 * Use Fabulous pre11 * WIP * Remove SceneDelegate * Use Fabulous pre12 * TimePicker page * Use pre15 * PolyBezierSegment * BoolTransition * simplify widget constructors * use Fabulous pre16 * Move RenderDemo pages to Gallery --- Directory.Packages.props | 26 +- Fabulous.Avalonia.sln | 35 -- .../ColorPicker.fs | 4 +- .../ColorPreviewer.Components.fs | 2 +- .../ColorPreviewer.Mvu.fs | 2 +- .../ColorPreviewer.fs | 2 +- .../ColorSlider.Components.fs | 2 +- .../ColorSlider.Mvu.fs | 2 +- .../ColorSlider.fs | 7 +- .../ColorSpectrum.Components.fs | 2 +- .../ColorSpectrum.Mvu.fs | 2 +- .../ColorSpectrum.fs | 7 +- .../ColorView.Components.fs | 2 +- .../ColorView.Mvu.fs | 2 +- .../ColorView.fs | 4 +- .../Fabulous.Avalonia.ColorPicker.fsproj | 3 +- .../DataGrid.Components.fs | 42 +- .../DataGrid.Mvu.fs | 42 +- .../DataGridCheckBoxColumn.fs | 2 + .../DataGridTextColumn.fs | 2 + .../Fabulous.Avalonia.DataGrid.fsproj | 3 +- .../Fabulous.Avalonia.Diagnostics.fsproj | 3 +- .../Fabulous.Avalonia.ItemsRepeater.fsproj | 3 +- .../Fabulous.Avalonia.TreeDataGrid.fsproj | 1 - .../TreeDataGrid.Components.fs | 6 +- .../TreeDataGrid.Mvu.fs | 6 +- samples/Fabulous.Avalonia.Samples.targets | 1 - samples/Gallery/{Pages => }/App.fs | 57 +++ samples/Gallery/Common.fs | 138 ------ samples/Gallery/Gallery.fsproj | 28 +- samples/Gallery/MainView.fs | 23 +- samples/Gallery/MainWindow.fs | 29 +- .../Pages}/AnimationsPage.fs | 4 +- .../Pages}/BrushesPage.fs | 4 +- .../Pages}/ClippingPage.fs | 2 +- samples/Gallery/Pages/CompositionPage.fs | 2 +- .../Pages}/CompositorAnimationsPage.fs | 2 +- .../Pages}/CustomAnimatorPage.fs | 2 +- .../Pages}/CustomSkiaPage.fs | 4 +- .../Pages}/DrawLineAnimationPage.fs | 2 +- .../Pages}/DrawingPage.fs | 2 +- .../Pages}/ExpressionAnimation.fs | 2 +- .../Pages}/FormattedTextPage.fs | 4 +- .../Pages}/GalaxyAnimation.fs | 2 +- samples/Gallery/Pages/GeometriesPage.fs | 9 + .../Pages}/GlyphRunPage.fs | 6 +- .../Pages}/ImplicitCanvasAnimationsPage.fs | 2 +- .../Pages}/LineBoundsPage.fs | 2 +- samples/Gallery/Pages/NotificationsPage.fs | 24 +- .../Pages}/PathMeasurementPage.fs | 4 +- .../Pages/Pointers/PointerCanvasTab.fs | 2 +- .../Pages/Pointers/PointerContactsTab.fs | 2 +- samples/Gallery/Pages/PopupPage.fs | 24 +- .../Pages}/RenderTargetBitmapPage.fs | 4 +- .../Pages}/RenderTransformPage.fs | 4 +- .../Pages}/SlidingAnimation.fs | 2 +- .../Pages}/SpringAnimationsPage.fs | 4 +- .../Pages}/TextFormatterPage.fs | 4 +- samples/Gallery/Pages/TimePickerPage.fs | 61 +++ samples/Gallery/Pages/ToolTipPage.fs | 118 +++-- .../Pages}/Transform3DPage.fs | 4 +- .../Pages}/TransitionsPage.fs | 4 +- .../Pages}/Vector3KeyFrameAnimation.fs | 2 +- .../Pages}/WriteableBitmapPage.fs | 4 +- samples/Gallery/Platform/iOS/AppDelegate.fs | 16 +- samples/Gallery/Platform/iOS/Info.plist | 19 +- samples/Gallery/Platform/iOS/SceneDelegate.fs | 38 -- .../Styles/Animations.xaml | 10 +- .../Styles/Transitions.xaml | 4 +- .../Common.fs => Gallery/Widgets.fs} | 83 ++-- .../Playground/Platform/iOS/AppDelegate.fs | 16 +- samples/Playground/Platform/iOS/Info.plist | 17 - .../Playground/Platform/iOS/SceneDelegate.fs | 38 -- samples/Playground/Playground.fsproj | 4 +- samples/RenderDemo.Android/MainActivity.fs | 18 - .../Properties/AndroidManifest.xml | 5 - .../RenderDemo.Android.fsproj | 29 -- .../Resources/drawable/Icon.png | Bin 14349 -> 0 bytes .../Resources/drawable/splash_screen.xml | 13 - .../Resources/values/colors.xml | 4 - .../Resources/values/styles.xml | 17 - samples/RenderDemo.Android/SplashActivity.fs | 12 - samples/RenderDemo.Browser/Program.fs | 27 -- .../Properties/launchSettings.json | 13 - .../RenderDemo.Browser.fsproj | 17 - .../runtimeconfig.template.json | 11 - samples/RenderDemo.Browser/wwwroot/Logo.svg | 5 - samples/RenderDemo.Browser/wwwroot/app.css | 58 --- .../RenderDemo.Browser/wwwroot/favicon.ico | Bin 176111 -> 0 bytes samples/RenderDemo.Browser/wwwroot/index.html | 37 -- samples/RenderDemo.Browser/wwwroot/main.js | 13 - samples/RenderDemo.Desktop/Program.fs | 17 - .../RenderDemo.Desktop.fsproj | 21 - samples/RenderDemo.iOS/AppDelegate.fs | 23 - samples/RenderDemo.iOS/Entitlements.plist | 5 - samples/RenderDemo.iOS/Info.plist | 64 --- samples/RenderDemo.iOS/RenderDemo.iOS.fsproj | 28 -- .../RenderDemo.iOS/Resources/LaunchScreen.xib | 43 -- samples/RenderDemo.iOS/SceneDelegate.fs | 38 -- samples/RenderDemo/App.fs | 76 ---- samples/RenderDemo/App.xaml | 12 - .../RenderDemo/Assets/Icons/avalonia-32.png | Bin 1322 -> 0 bytes .../RenderDemo/Assets/Icons/fabulous-icon.png | Bin 3634 -> 0 bytes .../RenderDemo/Assets/Icons/fsharp-icon.png | Bin 4042 -> 0 bytes .../RenderDemo/Assets/Icons/github-icon.png | Bin 17223 -> 0 bytes samples/RenderDemo/Assets/Icons/logo.ico | Bin 4286 -> 0 bytes samples/RenderDemo/MainView.fs | 103 ----- samples/RenderDemo/MainWindow.fs | 46 -- samples/RenderDemo/RenderDemo.fsproj | 57 --- samples/RenderDemo/Widgets.fs | 57 --- .../ViewHelperTests.fs | 18 +- src/Fabulous.Avalonia/AppBuilderExtensions.fs | 40 +- src/Fabulous.Avalonia/Attributes.fs | 425 +++++++++--------- .../Fabulous.Avalonia.fsproj | 8 +- .../Views/Application.Components.fs | 38 +- .../Views/Application.Mvu.fs | 38 +- src/Fabulous.Avalonia/Views/Application.fs | 18 +- .../Views/Collections/TreeView.Components.fs | 2 +- .../Views/Collections/TreeView.Mvu.fs | 2 +- .../Controls/AutoCompleteBox.Components.fs | 10 +- .../Views/Controls/AutoCompleteBox.Mvu.fs | 10 +- .../Views/Controls/Border.fs | 5 +- .../Controls/Buttons/Button.Components.fs | 3 +- .../Views/Controls/Buttons/Button.Mvu.fs | 3 +- .../Buttons/DropDownButton.Components.fs | 1 + .../Controls/Buttons/DropDownButton.Mvu.fs | 1 + .../Buttons/HyperlinkButton.Components.fs | 4 +- .../Controls/Buttons/HyperlinkButton.Mvu.fs | 4 +- .../Views/Controls/Buttons/HyperlinkButton.fs | 2 + .../Buttons/RadioButton.Components.fs | 2 + .../Views/Controls/Buttons/RadioButton.Mvu.fs | 2 + .../Buttons/RepeatButton.Components.fs | 1 + .../Controls/Buttons/RepeatButton.Mvu.fs | 1 + .../Buttons/SplitButton.Components.fs | 3 +- .../Views/Controls/Buttons/SplitButton.Mvu.fs | 3 +- .../Buttons/ToggleButton.Components.fs | 6 +- .../Controls/Buttons/ToggleButton.Mvu.fs | 6 +- .../Buttons/ToggleSplitButton.Components.fs | 3 +- .../Controls/Buttons/ToggleSplitButton.Mvu.fs | 3 +- .../Views/Controls/Calendar.Components.fs | 6 +- .../Views/Controls/Calendar.Mvu.fs | 6 +- .../Controls/CalendarDatePicker.Components.fs | 8 +- .../Views/Controls/CalendarDatePicker.Mvu.fs | 8 +- .../Views/Controls/CheckBox.Components.fs | 2 + .../Views/Controls/CheckBox.Mvu.fs | 2 + .../Views/Controls/DatePicker.Components.fs | 2 +- .../Views/Controls/DatePicker.Mvu.fs | 2 +- .../Controls/Documents/InlineUIContainer.fs | 5 +- .../Views/Controls/Documents/LineBreak.fs | 2 +- .../Views/Controls/Expander.Components.fs | 9 +- .../Views/Controls/Expander.Mvu.fs | 6 +- .../Views/Controls/Expander.fs | 3 + .../Controls/ExperimentalAcrylicBorder.fs | 7 +- .../ExperimentalAcrylicMaterial.Components.fs | 2 +- .../ExperimentalAcrylicMaterial.Mvu.fs | 2 +- .../Controls/ExperimentalAcrylicMaterial.fs | 5 +- .../Views/Controls/HeaderedContentControl.fs | 2 + src/Fabulous.Avalonia/Views/Controls/Label.fs | 5 +- .../Views/Controls/LayoutTransformControl.fs | 5 +- .../Controls/MaskedTextBox.Components.fs | 2 +- .../Views/Controls/MaskedTextBox.Mvu.fs | 2 +- .../NotificationCard.Components.fs | 2 +- .../Notifications/NotificationCard.Mvu.fs | 2 +- .../Notifications/NotificationCard.fs | 1 + .../WindowNotificationManager.fs | 5 +- .../Controls/NumericUpDown.Components.fs | 2 +- .../Views/Controls/NumericUpDown.Mvu.fs | 2 +- .../Controls/Primitives/Popup.Components.fs | 4 +- .../Views/Controls/Primitives/Popup.Mvu.fs | 4 +- .../Views/Controls/Primitives/Popup.fs | 12 +- .../Primitives/ScrollBar.Components.fs | 2 +- .../Controls/Primitives/ScrollBar.Mvu.fs | 2 +- .../Controls/Primitives/Thumb.Components.fs | 6 +- .../Views/Controls/Primitives/Thumb.Mvu.fs | 6 +- .../Views/Controls/Primitives/Thumb.fs | 7 +- .../Primitives/_RangeBase.Components.fs | 2 +- .../Controls/Primitives/_RangeBase.Mvu.fs | 2 +- .../Controls/RefreshContainer.Components.fs | 2 +- .../Views/Controls/RefreshContainer.Mvu.fs | 2 +- .../Views/Controls/RefreshContainer.fs | 5 +- .../Controls/RefreshVisualizer.Components.fs | 2 +- .../Views/Controls/RefreshVisualizer.Mvu.fs | 3 +- .../Views/Controls/RefreshVisualizer.fs | 5 +- .../SelectableTextBlock.Components.fs | 2 +- .../Views/Controls/SelectableTextBlock.Mvu.fs | 2 +- .../Views/Controls/Separator.fs | 2 +- .../Views/Controls/Shapes/Ellipse.fs | 2 +- .../Views/Controls/Shapes/Path.fs | 5 +- .../Views/Controls/Shapes/Rectangle.fs | 2 +- .../Views/Controls/TextBox.Components.fs | 8 +- .../Views/Controls/TextBox.Mvu.fs | 8 +- .../Controls/ThemeVariantScope.Components.fs | 2 +- .../Views/Controls/ThemeVariantScope.Mvu.fs | 2 +- .../Views/Controls/ThemeVariantScope.fs | 1 + .../Views/Controls/TimePicker.Components.fs | 2 +- .../Views/Controls/TimePicker.Mvu.fs | 2 +- .../Views/Controls/TimePicker.fs | 21 + .../Views/Controls/Tooltip.fs | 26 +- .../Controls/TransitioningContentControl.fs | 2 +- .../Views/Controls/UserControl.fs | 5 +- .../Views/Controls/Viewbox.fs | 5 +- .../Views/Controls/Window.Components.fs | 6 +- .../Views/Controls/Window.Mvu.fs | 6 +- .../Views/Controls/Window.fs | 10 +- src/Fabulous.Avalonia/Views/Imaging/Image.fs | 16 +- .../Views/Imaging/PathIcon.fs | 5 +- .../Views/Imaging/TrayIcon.Components.fs | 2 +- .../Views/Imaging/TrayIcon.Mvu.fs | 2 +- .../Views/ItemsControl.Components.fs | 6 +- .../Views/ItemsControl.Mvu.fs | 6 +- .../Views/Layouts/ScrollViewer.Components.fs | 2 +- .../Views/Layouts/ScrollViewer.Mvu.fs | 2 +- .../Views/Layouts/ScrollViewer.fs | 5 +- .../Views/Layouts/SliptView.Components.fs | 10 +- .../Views/Layouts/SliptView.Mvu.fs | 10 +- .../Views/Layouts/SliptView.fs | 3 +- .../Views/Media/Brushes/DrawingBrush.fs | 5 +- .../Views/Media/Brushes/VisualBrush.fs | 5 +- .../Media/Drawing/DrawingImage.Components.fs | 2 +- .../Views/Media/Drawing/DrawingImage.Mvu.fs | 2 +- .../Views/Media/Drawing/DrawingImage.fs | 5 +- .../Views/Media/Drawing/GeometryDrawing.fs | 4 + .../Views/Media/Drawing/GlyphRunDrawing.fs | 1 + .../Views/Media/Drawing/ImageDrawing.fs | 1 + .../Views/Media/Effects/BlurEffect.fs | 2 +- .../Effects/DropShadowDirectionEffect.fs | 2 +- .../Views/Media/Effects/DropShadowEffect.fs | 2 +- .../Media/Geometries/CombinedGeometry.fs | 1 + .../Media/PathSegments/PolyBezierSegment.fs | 34 ++ src/Fabulous.Avalonia/Views/Media/Pen.fs | 7 +- .../Views/Media/Transforms/RotateTransform.fs | 2 +- .../Views/Media/Transforms/ScaleTransform.fs | 2 +- .../Views/Media/Transforms/SkewTransform.fs | 2 +- .../Media/Transforms/TranslateTransform.fs | 2 +- .../Views/Media/_Effect.Components.fs | 2 +- .../Views/Media/_Effect.Mvu.fs | 2 +- .../Views/Media/_IGeometry.Components.fs | 2 +- .../Views/Media/_IGeometry.Mvu.fs | 2 +- .../Views/Menu/ComboBox.Components.fs | 2 +- .../Views/Menu/ComboBox.Mvu.fs | 2 +- src/Fabulous.Avalonia/Views/Menu/ComboBox.fs | 12 +- .../Views/Menu/ContextMenu.Components.fs | 4 +- .../Views/Menu/ContextMenu.Mvu.fs | 4 +- src/Fabulous.Avalonia/Views/Menu/Flyout.fs | 5 +- .../Views/Menu/NativeMenu.Components.fs | 6 +- .../Views/Menu/NativeMenu.Mvu.fs | 6 +- .../Views/Menu/NativeMenuBar.fs | 2 +- .../Views/Menu/NativeMenuItem.Components.fs | 2 +- .../Views/Menu/NativeMenuItem.Mvu.fs | 2 +- .../Views/Menu/NativeMenuSeparator.fs | 2 +- .../Views/MenuItems/ComboBoxItem.fs | 6 +- .../Views/MenuItems/ListBoxItem.fs | 6 +- .../Views/MenuItems/MenuItem.Components.fs | 11 +- .../Views/MenuItems/MenuItem.Mvu.fs | 11 +- .../Views/MenuItems/MenuItem.fs | 13 +- .../Views/MenuItems/TabItem.fs | 2 + .../Views/MenuItems/TreeViewItem.fs | 8 +- .../VirtualizingStackPanel.Components.fs | 4 +- .../Panels/VirtualizingStackPanel.Mvu.fs | 4 +- .../Views/Panels/VirtualizingStackPanel.fs | 2 +- .../Views/Panels/_StackPanel.Components.fs | 4 +- .../Views/Panels/_StackPanel.Mvu.fs | 4 +- .../Views/Styling/Transition.fs | 21 + .../Views/_Control.Components.fs | 10 +- src/Fabulous.Avalonia/Views/_Control.Mvu.fs | 10 +- .../Views/_DragDrop.Components.fs | 8 +- src/Fabulous.Avalonia/Views/_DragDrop.Mvu.fs | 8 +- .../Views/_FlyoutBase.Components.fs | 4 +- .../Views/_FlyoutBase.Mvu.fs | 4 +- .../Views/_ITransform.Components.fs | 2 +- .../Views/_ITransform.Mvu.fs | 2 +- .../Views/_InputElement.Components.fs | 32 +- .../Views/_InputElement.Mvu.fs | 32 +- .../Views/_Layoutable.Components.fs | 4 +- .../Views/_Layoutable.Mvu.fs | 4 +- .../Views/_MenuBase.Components.fs | 4 +- src/Fabulous.Avalonia/Views/_MenuBase.Mvu.fs | 4 +- .../Views/_PopupFlyoutBase.Components.fs | 4 +- .../Views/_PopupFlyoutBase.Mvu.fs | 4 +- .../_SelectingItemsControl.Components.fs | 4 +- .../Views/_SelectingItemsControl.Mvu.fs | 4 +- .../Views/_Spinner.Components.fs | 2 +- src/Fabulous.Avalonia/Views/_Spinner.Mvu.fs | 2 +- .../Views/_StyledElement.Components.fs | 6 +- .../Views/_StyledElement.Mvu.fs | 6 +- src/Fabulous.Avalonia/Views/_StyledElement.fs | 2 +- .../Views/_TemplatedControl.Components.fs | 2 +- .../Views/_TemplatedControl.Mvu.fs | 2 +- .../Views/_TopLevel.Components.fs | 10 +- src/Fabulous.Avalonia/Views/_TopLevel.Mvu.fs | 10 +- .../Views/_Visual.Components.fs | 4 +- src/Fabulous.Avalonia/Views/_Visual.Mvu.fs | 4 +- .../Views/_WindowBase.Components.fs | 8 +- .../Views/_WindowBase.Mvu.fs | 8 +- src/Fabulous.Avalonia/Widgets.fs | 2 +- .../blank/.template.config/template.json | 10 +- .../content/blank/Platform/iOS/AppDelegate.fs | 19 +- .../content/blank/Platform/iOS/Info.plist | 17 - .../blank/Platform/iOS/SceneDelegate.fs | 38 -- .../multi/.template.config/template.json | 12 +- .../content/multi/NewApp.iOS/AppDelegate.fs | 19 +- templates/content/multi/NewApp.iOS/Info.plist | 17 - .../content/multi/NewApp.iOS/SceneDelegate.fs | 38 -- 303 files changed, 1324 insertions(+), 2239 deletions(-) rename samples/Gallery/{Pages => }/App.fs (79%) rename samples/{RenderDemo/Animations => Gallery/Pages}/AnimationsPage.fs (97%) rename samples/{RenderDemo => Gallery/Pages}/BrushesPage.fs (98%) rename samples/{RenderDemo => Gallery/Pages}/ClippingPage.fs (99%) rename samples/{RenderDemo/Animations => Gallery/Pages}/CompositorAnimationsPage.fs (97%) rename samples/{RenderDemo/Animations => Gallery/Pages}/CustomAnimatorPage.fs (98%) rename samples/{RenderDemo/Animations => Gallery/Pages}/CustomSkiaPage.fs (98%) rename samples/{RenderDemo/Animations => Gallery/Pages}/DrawLineAnimationPage.fs (99%) rename samples/{RenderDemo => Gallery/Pages}/DrawingPage.fs (99%) rename samples/{RenderDemo/Animations => Gallery/Pages}/ExpressionAnimation.fs (99%) rename samples/{RenderDemo => Gallery/Pages}/FormattedTextPage.fs (96%) rename samples/{RenderDemo/Animations => Gallery/Pages}/GalaxyAnimation.fs (99%) rename samples/{RenderDemo => Gallery/Pages}/GlyphRunPage.fs (95%) rename samples/{RenderDemo/Animations => Gallery/Pages}/ImplicitCanvasAnimationsPage.fs (99%) rename samples/{RenderDemo => Gallery/Pages}/LineBoundsPage.fs (99%) rename samples/{RenderDemo => Gallery/Pages}/PathMeasurementPage.fs (96%) rename samples/{RenderDemo => Gallery/Pages}/RenderTargetBitmapPage.fs (94%) rename samples/{RenderDemo/Animations => Gallery/Pages}/RenderTransformPage.fs (97%) rename samples/{RenderDemo/Animations => Gallery/Pages}/SlidingAnimation.fs (99%) rename samples/{RenderDemo/Animations => Gallery/Pages}/SpringAnimationsPage.fs (91%) rename samples/{RenderDemo => Gallery/Pages}/TextFormatterPage.fs (96%) create mode 100644 samples/Gallery/Pages/TimePickerPage.fs rename samples/{RenderDemo => Gallery/Pages}/Transform3DPage.fs (96%) rename samples/{RenderDemo => Gallery/Pages}/TransitionsPage.fs (98%) rename samples/{RenderDemo/Animations => Gallery/Pages}/Vector3KeyFrameAnimation.fs (99%) rename samples/{RenderDemo => Gallery/Pages}/WriteableBitmapPage.fs (96%) delete mode 100644 samples/Gallery/Platform/iOS/SceneDelegate.fs rename samples/{RenderDemo => Gallery}/Styles/Animations.xaml (99%) rename samples/{RenderDemo => Gallery}/Styles/Transitions.xaml (98%) rename samples/{RenderDemo/Common.fs => Gallery/Widgets.fs} (66%) delete mode 100644 samples/Playground/Platform/iOS/SceneDelegate.fs delete mode 100644 samples/RenderDemo.Android/MainActivity.fs delete mode 100644 samples/RenderDemo.Android/Properties/AndroidManifest.xml delete mode 100644 samples/RenderDemo.Android/RenderDemo.Android.fsproj delete mode 100644 samples/RenderDemo.Android/Resources/drawable/Icon.png delete mode 100644 samples/RenderDemo.Android/Resources/drawable/splash_screen.xml delete mode 100644 samples/RenderDemo.Android/Resources/values/colors.xml delete mode 100644 samples/RenderDemo.Android/Resources/values/styles.xml delete mode 100644 samples/RenderDemo.Android/SplashActivity.fs delete mode 100644 samples/RenderDemo.Browser/Program.fs delete mode 100644 samples/RenderDemo.Browser/Properties/launchSettings.json delete mode 100644 samples/RenderDemo.Browser/RenderDemo.Browser.fsproj delete mode 100644 samples/RenderDemo.Browser/runtimeconfig.template.json delete mode 100644 samples/RenderDemo.Browser/wwwroot/Logo.svg delete mode 100644 samples/RenderDemo.Browser/wwwroot/app.css delete mode 100644 samples/RenderDemo.Browser/wwwroot/favicon.ico delete mode 100644 samples/RenderDemo.Browser/wwwroot/index.html delete mode 100644 samples/RenderDemo.Browser/wwwroot/main.js delete mode 100644 samples/RenderDemo.Desktop/Program.fs delete mode 100644 samples/RenderDemo.Desktop/RenderDemo.Desktop.fsproj delete mode 100644 samples/RenderDemo.iOS/AppDelegate.fs delete mode 100644 samples/RenderDemo.iOS/Entitlements.plist delete mode 100644 samples/RenderDemo.iOS/Info.plist delete mode 100644 samples/RenderDemo.iOS/RenderDemo.iOS.fsproj delete mode 100644 samples/RenderDemo.iOS/Resources/LaunchScreen.xib delete mode 100644 samples/RenderDemo.iOS/SceneDelegate.fs delete mode 100644 samples/RenderDemo/App.fs delete mode 100644 samples/RenderDemo/App.xaml delete mode 100644 samples/RenderDemo/Assets/Icons/avalonia-32.png delete mode 100644 samples/RenderDemo/Assets/Icons/fabulous-icon.png delete mode 100644 samples/RenderDemo/Assets/Icons/fsharp-icon.png delete mode 100644 samples/RenderDemo/Assets/Icons/github-icon.png delete mode 100644 samples/RenderDemo/Assets/Icons/logo.ico delete mode 100644 samples/RenderDemo/MainView.fs delete mode 100644 samples/RenderDemo/MainWindow.fs delete mode 100644 samples/RenderDemo/RenderDemo.fsproj delete mode 100644 samples/RenderDemo/Widgets.fs create mode 100644 src/Fabulous.Avalonia/Views/Media/PathSegments/PolyBezierSegment.fs delete mode 100644 templates/content/blank/Platform/iOS/SceneDelegate.fs delete mode 100644 templates/content/multi/NewApp.iOS/SceneDelegate.fs diff --git a/Directory.Packages.props b/Directory.Packages.props index a47d9faa9..3db613a5d 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -3,25 +3,25 @@ true - + + - - - - - - - - - - - - + + + + + + + + + + + \ No newline at end of file diff --git a/Fabulous.Avalonia.sln b/Fabulous.Avalonia.sln index 811a33c51..a217e8d65 100644 --- a/Fabulous.Avalonia.sln +++ b/Fabulous.Avalonia.sln @@ -49,16 +49,6 @@ Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Fabulous.Avalonia.ItemsRepe EndProject Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Fabulous.Avalonia.TreeDataGrid", "extensions\Fabulous.Avalonia.TreeDataGrid\Fabulous.Avalonia.TreeDataGrid.fsproj", "{88BF2500-3A9E-406C-8726-40CE837D0F36}" EndProject -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "RenderDemo", "samples\RenderDemo\RenderDemo.fsproj", "{12DDD968-AFB5-4B24-B1EE-518C997E2FCF}" -EndProject -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "RenderDemo.Android", "samples\RenderDemo.Android\RenderDemo.Android.fsproj", "{60B3D448-6CEF-4A27-B8FB-53FF2A19C4BC}" -EndProject -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "RenderDemo.Browser", "samples\RenderDemo.Browser\RenderDemo.Browser.fsproj", "{E65144B7-CDCA-4AA9-93DB-2FF0C9EE2050}" -EndProject -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "RenderDemo.Desktop", "samples\RenderDemo.Desktop\RenderDemo.Desktop.fsproj", "{3720F6BA-CD15-4D80-A7D5-5EDF762705E8}" -EndProject -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "RenderDemo.iOS", "samples\RenderDemo.iOS\RenderDemo.iOS.fsproj", "{F739E63D-0B56-4E92-B8B4-440FA95E2A27}" -EndProject Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Playground", "samples\Playground\Playground.fsproj", "{482078C3-C228-42A4-9778-1FE856A95D82}" EndProject Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Fabulous.Avalonia.Diagnostics", "extensions\Fabulous.Avalonia.Diagnostics\Fabulous.Avalonia.Diagnostics.fsproj", "{C4B5FB7F-D3A9-46A7-9EDF-317914F7172A}" @@ -107,26 +97,6 @@ Global {88BF2500-3A9E-406C-8726-40CE837D0F36}.Debug|Any CPU.Build.0 = Debug|Any CPU {88BF2500-3A9E-406C-8726-40CE837D0F36}.Release|Any CPU.ActiveCfg = Release|Any CPU {88BF2500-3A9E-406C-8726-40CE837D0F36}.Release|Any CPU.Build.0 = Release|Any CPU - {12DDD968-AFB5-4B24-B1EE-518C997E2FCF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {12DDD968-AFB5-4B24-B1EE-518C997E2FCF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {12DDD968-AFB5-4B24-B1EE-518C997E2FCF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {12DDD968-AFB5-4B24-B1EE-518C997E2FCF}.Release|Any CPU.Build.0 = Release|Any CPU - {60B3D448-6CEF-4A27-B8FB-53FF2A19C4BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {60B3D448-6CEF-4A27-B8FB-53FF2A19C4BC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {60B3D448-6CEF-4A27-B8FB-53FF2A19C4BC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {60B3D448-6CEF-4A27-B8FB-53FF2A19C4BC}.Release|Any CPU.Build.0 = Release|Any CPU - {E65144B7-CDCA-4AA9-93DB-2FF0C9EE2050}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E65144B7-CDCA-4AA9-93DB-2FF0C9EE2050}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E65144B7-CDCA-4AA9-93DB-2FF0C9EE2050}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E65144B7-CDCA-4AA9-93DB-2FF0C9EE2050}.Release|Any CPU.Build.0 = Release|Any CPU - {3720F6BA-CD15-4D80-A7D5-5EDF762705E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3720F6BA-CD15-4D80-A7D5-5EDF762705E8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3720F6BA-CD15-4D80-A7D5-5EDF762705E8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3720F6BA-CD15-4D80-A7D5-5EDF762705E8}.Release|Any CPU.Build.0 = Release|Any CPU - {F739E63D-0B56-4E92-B8B4-440FA95E2A27}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F739E63D-0B56-4E92-B8B4-440FA95E2A27}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F739E63D-0B56-4E92-B8B4-440FA95E2A27}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F739E63D-0B56-4E92-B8B4-440FA95E2A27}.Release|Any CPU.Build.0 = Release|Any CPU {482078C3-C228-42A4-9778-1FE856A95D82}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {482078C3-C228-42A4-9778-1FE856A95D82}.Debug|Any CPU.Build.0 = Debug|Any CPU {482078C3-C228-42A4-9778-1FE856A95D82}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -145,11 +115,6 @@ Global {F78C6BA2-5867-442D-AAC7-81110892AE05} = {B672FB45-6577-4721-8711-0EC28EE2E834} {AFA2343C-1250-4B81-9E6F-48001BA9A516} = {B672FB45-6577-4721-8711-0EC28EE2E834} {88BF2500-3A9E-406C-8726-40CE837D0F36} = {B672FB45-6577-4721-8711-0EC28EE2E834} - {12DDD968-AFB5-4B24-B1EE-518C997E2FCF} = {8D513303-98F9-40AA-AFA7-D92D920F96DF} - {60B3D448-6CEF-4A27-B8FB-53FF2A19C4BC} = {8D513303-98F9-40AA-AFA7-D92D920F96DF} - {E65144B7-CDCA-4AA9-93DB-2FF0C9EE2050} = {8D513303-98F9-40AA-AFA7-D92D920F96DF} - {3720F6BA-CD15-4D80-A7D5-5EDF762705E8} = {8D513303-98F9-40AA-AFA7-D92D920F96DF} - {F739E63D-0B56-4E92-B8B4-440FA95E2A27} = {8D513303-98F9-40AA-AFA7-D92D920F96DF} {482078C3-C228-42A4-9778-1FE856A95D82} = {8D513303-98F9-40AA-AFA7-D92D920F96DF} {C4B5FB7F-D3A9-46A7-9EDF-317914F7172A} = {B672FB45-6577-4721-8711-0EC28EE2E834} EndGlobalSection diff --git a/extensions/Fabulous.Avalonia.ColorPicker/ColorPicker.fs b/extensions/Fabulous.Avalonia.ColorPicker/ColorPicker.fs index dca95c1dc..5529efc8f 100644 --- a/extensions/Fabulous.Avalonia.ColorPicker/ColorPicker.fs +++ b/extensions/Fabulous.Avalonia.ColorPicker/ColorPicker.fs @@ -19,12 +19,12 @@ module ColorPickerBuilders = /// Creates a ColorPicker widget. static member ColorPicker() = - WidgetBuilder<'msg, IFabColorPicker>(ColorPicker.WidgetKey, AttributesBundle(StackList.empty(), ValueNone, ValueNone)) + WidgetBuilder<'msg, IFabColorPicker>(ColorPicker.WidgetKey) /// Creates a ColorPicker widget. /// The Color value. static member ColorPicker(color: Color) = - WidgetBuilder<'msg, IFabColorPicker>(ColorPicker.WidgetKey, AttributesBundle(StackList.one(ColorView.Color.WithValue(color)), ValueNone, ValueNone)) + WidgetBuilder<'msg, IFabColorPicker>(ColorPicker.WidgetKey, ColorView.Color.WithValue(color)) type ColorPickerModifiers = /// Link a ViewRef to access the direct ColorPicker control instance diff --git a/extensions/Fabulous.Avalonia.ColorPicker/ColorPreviewer.Components.fs b/extensions/Fabulous.Avalonia.ColorPicker/ColorPreviewer.Components.fs index 4b7160c1d..1174658ab 100644 --- a/extensions/Fabulous.Avalonia.ColorPicker/ColorPreviewer.Components.fs +++ b/extensions/Fabulous.Avalonia.ColorPicker/ColorPreviewer.Components.fs @@ -7,7 +7,7 @@ open Fabulous.Avalonia module ComponentColorPreviewer = let ColorChanged = - Attributes.defineEventNoDispatch "ColorPreviewer_ColorChanged" (fun target -> (target :?> ColorPreviewer).ColorChanged) + Attributes.Component.defineEvent "ColorPreviewer_ColorChanged" (fun target -> (target :?> ColorPreviewer).ColorChanged) [] module ComponentColorPreviewerBuilders = diff --git a/extensions/Fabulous.Avalonia.ColorPicker/ColorPreviewer.Mvu.fs b/extensions/Fabulous.Avalonia.ColorPicker/ColorPreviewer.Mvu.fs index d4912dc6f..e496f1370 100644 --- a/extensions/Fabulous.Avalonia.ColorPicker/ColorPreviewer.Mvu.fs +++ b/extensions/Fabulous.Avalonia.ColorPicker/ColorPreviewer.Mvu.fs @@ -7,7 +7,7 @@ open Fabulous.Avalonia module MvuColorPreviewer = let ColorChanged = - Attributes.defineEvent "ColorPreviewer_ColorChanged" (fun target -> (target :?> ColorPreviewer).ColorChanged) + Attributes.Mvu.defineEvent "ColorPreviewer_ColorChanged" (fun target -> (target :?> ColorPreviewer).ColorChanged) [] module MvuColorPreviewerBuilders = diff --git a/extensions/Fabulous.Avalonia.ColorPicker/ColorPreviewer.fs b/extensions/Fabulous.Avalonia.ColorPicker/ColorPreviewer.fs index f4761509f..b9db0e32a 100644 --- a/extensions/Fabulous.Avalonia.ColorPicker/ColorPreviewer.fs +++ b/extensions/Fabulous.Avalonia.ColorPicker/ColorPreviewer.fs @@ -25,7 +25,7 @@ module ColorPreviewerBuilders = /// Creates a ColorPreviewer widget. static member ColorPreviewer() = - WidgetBuilder<'msg, IFabColorPreviewer>(ColorPreviewer.WidgetKey, AttributesBundle(StackList.empty(), ValueNone, ValueNone)) + WidgetBuilder<'msg, IFabColorPreviewer>(ColorPreviewer.WidgetKey) type ColorPreviewerModifiers = diff --git a/extensions/Fabulous.Avalonia.ColorPicker/ColorSlider.Components.fs b/extensions/Fabulous.Avalonia.ColorPicker/ColorSlider.Components.fs index bc672f5d1..ce9fa4eb5 100644 --- a/extensions/Fabulous.Avalonia.ColorPicker/ColorSlider.Components.fs +++ b/extensions/Fabulous.Avalonia.ColorPicker/ColorSlider.Components.fs @@ -7,7 +7,7 @@ open Fabulous.Avalonia module ComponentColorSlider = let ColorChanged = - Attributes.defineAvaloniaPropertyWithChangedEventNoDispatch' "ColorSlider_ColorChanged" ColorSlider.ColorProperty + Attributes.Component.defineAvaloniaPropertyWithChangedEvent' "ColorSlider_ColorChanged" ColorSlider.ColorProperty [] module ComponentColorSliderBuilders = diff --git a/extensions/Fabulous.Avalonia.ColorPicker/ColorSlider.Mvu.fs b/extensions/Fabulous.Avalonia.ColorPicker/ColorSlider.Mvu.fs index ad8106c55..79fc4ded0 100644 --- a/extensions/Fabulous.Avalonia.ColorPicker/ColorSlider.Mvu.fs +++ b/extensions/Fabulous.Avalonia.ColorPicker/ColorSlider.Mvu.fs @@ -8,7 +8,7 @@ open Fabulous.StackAllocatedCollections.StackList module MvuColorSlider = let ColorChanged = - Attributes.defineAvaloniaPropertyWithChangedEvent' "ColorSlider_ColorChanged" ColorSlider.ColorProperty + Attributes.Mvu.defineAvaloniaPropertyWithChangedEvent' "ColorSlider_ColorChanged" ColorSlider.ColorProperty [] module MvuColorSliderBuilders = diff --git a/extensions/Fabulous.Avalonia.ColorPicker/ColorSlider.fs b/extensions/Fabulous.Avalonia.ColorPicker/ColorSlider.fs index e4294e098..92399c2cf 100644 --- a/extensions/Fabulous.Avalonia.ColorPicker/ColorSlider.fs +++ b/extensions/Fabulous.Avalonia.ColorPicker/ColorSlider.fs @@ -40,15 +40,12 @@ module ColorSliderBuilders = /// Creates a ColorSlider widget. static member ColorSlider() = - WidgetBuilder<'msg, IFabColorSlider>(ColorSlider.WidgetKey, AttributesBundle(StackList.empty(), ValueNone, ValueNone)) + WidgetBuilder<'msg, IFabColorSlider>(ColorSlider.WidgetKey) /// Creates a ColorSlider widget. /// The Color value. static member ColorSlider(color: Color) = - WidgetBuilder<'msg, IFabColorSlider>( - ColorSlider.WidgetKey, - AttributesBundle(StackList.one(ColorSlider.Color.WithValue(color)), ValueNone, ValueNone) - ) + WidgetBuilder<'msg, IFabColorSlider>(ColorSlider.WidgetKey, ColorSlider.Color.WithValue(color)) type ColorSliderModifiers = /// Link a ViewRef to access the direct ColorSlider control instance diff --git a/extensions/Fabulous.Avalonia.ColorPicker/ColorSpectrum.Components.fs b/extensions/Fabulous.Avalonia.ColorPicker/ColorSpectrum.Components.fs index cf82f3666..58896c277 100644 --- a/extensions/Fabulous.Avalonia.ColorPicker/ColorSpectrum.Components.fs +++ b/extensions/Fabulous.Avalonia.ColorPicker/ColorSpectrum.Components.fs @@ -7,7 +7,7 @@ open Fabulous.Avalonia module ComponentColorSpectrum = let ColorChanged = - Attributes.defineAvaloniaPropertyWithChangedEventNoDispatch' "ColorSpectrum_ColorChanged" ColorSpectrum.ColorProperty + Attributes.Component.defineAvaloniaPropertyWithChangedEvent' "ColorSpectrum_ColorChanged" ColorSpectrum.ColorProperty [] module ComponentColorSpectrumBuilders = diff --git a/extensions/Fabulous.Avalonia.ColorPicker/ColorSpectrum.Mvu.fs b/extensions/Fabulous.Avalonia.ColorPicker/ColorSpectrum.Mvu.fs index 96ee2ac3e..22708c729 100644 --- a/extensions/Fabulous.Avalonia.ColorPicker/ColorSpectrum.Mvu.fs +++ b/extensions/Fabulous.Avalonia.ColorPicker/ColorSpectrum.Mvu.fs @@ -7,7 +7,7 @@ open Fabulous.Avalonia module MvuColorSpectrum = let ColorChanged = - Attributes.defineAvaloniaPropertyWithChangedEvent' "ColorSpectrum_ColorChanged" ColorSpectrum.ColorProperty + Attributes.Mvu.defineAvaloniaPropertyWithChangedEvent' "ColorSpectrum_ColorChanged" ColorSpectrum.ColorProperty [] module MvuColorSpectrumBuilders = diff --git a/extensions/Fabulous.Avalonia.ColorPicker/ColorSpectrum.fs b/extensions/Fabulous.Avalonia.ColorPicker/ColorSpectrum.fs index 0487dc210..35b336d4c 100644 --- a/extensions/Fabulous.Avalonia.ColorPicker/ColorSpectrum.fs +++ b/extensions/Fabulous.Avalonia.ColorPicker/ColorSpectrum.fs @@ -50,15 +50,12 @@ module ColorSpectrumBuilders = /// Creates a ColorSpectrum widget. static member ColorSpectrum() = - WidgetBuilder<'msg, IFabColorSpectrum>(ColorSpectrum.WidgetKey, AttributesBundle(StackList.empty(), ValueNone, ValueNone)) + WidgetBuilder<'msg, IFabColorSpectrum>(ColorSpectrum.WidgetKey) /// Creates a ColorSpectrum widget. /// The Color value. static member ColorSpectrum(color: Color) = - WidgetBuilder<'msg, IFabColorSpectrum>( - ColorSpectrum.WidgetKey, - AttributesBundle(StackList.one(ColorSpectrum.Color.WithValue(color)), ValueNone, ValueNone) - ) + WidgetBuilder<'msg, IFabColorSpectrum>(ColorSpectrum.WidgetKey, ColorSpectrum.Color.WithValue(color)) type ColorSpectrumModifiers = /// Link a ViewRef to access the direct ColorSpectrum control instance diff --git a/extensions/Fabulous.Avalonia.ColorPicker/ColorView.Components.fs b/extensions/Fabulous.Avalonia.ColorPicker/ColorView.Components.fs index 720c49120..4384044dd 100644 --- a/extensions/Fabulous.Avalonia.ColorPicker/ColorView.Components.fs +++ b/extensions/Fabulous.Avalonia.ColorPicker/ColorView.Components.fs @@ -8,7 +8,7 @@ open Fabulous.Avalonia module ComponentColorView = let ColorChanged = - Attributes.defineAvaloniaPropertyWithChangedEventNoDispatch' "ColorView_ColorChanged" ColorView.ColorProperty + Attributes.Component.defineAvaloniaPropertyWithChangedEvent' "ColorView_ColorChanged" ColorView.ColorProperty [] module ComponentColorViewBuilders = diff --git a/extensions/Fabulous.Avalonia.ColorPicker/ColorView.Mvu.fs b/extensions/Fabulous.Avalonia.ColorPicker/ColorView.Mvu.fs index 007e02b75..53c8192e5 100644 --- a/extensions/Fabulous.Avalonia.ColorPicker/ColorView.Mvu.fs +++ b/extensions/Fabulous.Avalonia.ColorPicker/ColorView.Mvu.fs @@ -8,7 +8,7 @@ open Fabulous.Avalonia module MvuColorView = let ColorChanged = - Attributes.defineAvaloniaPropertyWithChangedEvent' "ColorView_ColorChanged" ColorView.ColorProperty + Attributes.Mvu.defineAvaloniaPropertyWithChangedEvent' "ColorView_ColorChanged" ColorView.ColorProperty [] module MvuColorViewBuilders = diff --git a/extensions/Fabulous.Avalonia.ColorPicker/ColorView.fs b/extensions/Fabulous.Avalonia.ColorPicker/ColorView.fs index afc98e976..2b7c7e4c8 100644 --- a/extensions/Fabulous.Avalonia.ColorPicker/ColorView.fs +++ b/extensions/Fabulous.Avalonia.ColorPicker/ColorView.fs @@ -97,12 +97,12 @@ module ColorViewBuilders = /// Creates a ColorView widget. static member ColorView() = - WidgetBuilder<'msg, IFabColorView>(ColorView.WidgetKey, AttributesBundle(StackList.empty(), ValueNone, ValueNone)) + WidgetBuilder<'msg, IFabColorView>(ColorView.WidgetKey) /// Creates a ColorView widget. /// The Color value. static member ColorView(color: Color) = - WidgetBuilder<'msg, IFabColorView>(ColorView.WidgetKey, AttributesBundle(StackList.one(ColorView.Color.WithValue(color)), ValueNone, ValueNone)) + WidgetBuilder<'msg, IFabColorView>(ColorView.WidgetKey, ColorView.Color.WithValue(color)) type ColorViewModifiers = /// Link a ViewRef to access the direct ColorView control instance diff --git a/extensions/Fabulous.Avalonia.ColorPicker/Fabulous.Avalonia.ColorPicker.fsproj b/extensions/Fabulous.Avalonia.ColorPicker/Fabulous.Avalonia.ColorPicker.fsproj index ea45d560f..2649bbb5f 100644 --- a/extensions/Fabulous.Avalonia.ColorPicker/Fabulous.Avalonia.ColorPicker.fsproj +++ b/extensions/Fabulous.Avalonia.ColorPicker/Fabulous.Avalonia.ColorPicker.fsproj @@ -39,8 +39,7 @@ - - + diff --git a/extensions/Fabulous.Avalonia.DataGrid/DataGrid.Components.fs b/extensions/Fabulous.Avalonia.DataGrid/DataGrid.Components.fs index c5f60ef74..99c4e16a2 100644 --- a/extensions/Fabulous.Avalonia.DataGrid/DataGrid.Components.fs +++ b/extensions/Fabulous.Avalonia.DataGrid/DataGrid.Components.fs @@ -10,67 +10,67 @@ open Fabulous.Avalonia module ComponentDataGrid = let HorizontalScroll = - Attributes.defineEventNoDispatch "DataGrid_HorizontalScroll" (fun target -> (target :?> DataGrid).HorizontalScroll) + Attributes.Component.defineEvent "DataGrid_HorizontalScroll" (fun target -> (target :?> DataGrid).HorizontalScroll) let VerticalScroll = - Attributes.defineEventNoDispatch "DataGrid_VerticalScroll" (fun target -> (target :?> DataGrid).VerticalScroll) + Attributes.Component.defineEvent "DataGrid_VerticalScroll" (fun target -> (target :?> DataGrid).VerticalScroll) let AutoGeneratingColumn = - Attributes.defineEventNoDispatch "DataGrid_AutoGeneratingColumn" (fun target -> (target :?> DataGrid).AutoGeneratingColumn) + Attributes.Component.defineEvent "DataGrid_AutoGeneratingColumn" (fun target -> (target :?> DataGrid).AutoGeneratingColumn) let BeginningEdit = - Attributes.defineEventNoDispatch "DataGrid_BeginningEdit" (fun target -> (target :?> DataGrid).BeginningEdit) + Attributes.Component.defineEvent "DataGrid_BeginningEdit" (fun target -> (target :?> DataGrid).BeginningEdit) let CellEditEnded = - Attributes.defineEventNoDispatch "DataGrid_CellEditEnded" (fun target -> (target :?> DataGrid).CellEditEnded) + Attributes.Component.defineEvent "DataGrid_CellEditEnded" (fun target -> (target :?> DataGrid).CellEditEnded) let CellEditEnding = - Attributes.defineEventNoDispatch "DataGrid_CellEditEnding" (fun target -> (target :?> DataGrid).CellEditEnding) + Attributes.Component.defineEvent "DataGrid_CellEditEnding" (fun target -> (target :?> DataGrid).CellEditEnding) let CellPointerPressed = - Attributes.defineEventNoDispatch "DataGrid_CellPointerPressed" (fun target -> (target :?> DataGrid).CellPointerPressed) + Attributes.Component.defineEvent "DataGrid_CellPointerPressed" (fun target -> (target :?> DataGrid).CellPointerPressed) let ColumnDisplayIndexChanged = - Attributes.defineEventNoDispatch "DataGrid_ColumnDisplayIndexChanged" (fun target -> (target :?> DataGrid).ColumnDisplayIndexChanged) + Attributes.Component.defineEvent "DataGrid_ColumnDisplayIndexChanged" (fun target -> (target :?> DataGrid).ColumnDisplayIndexChanged) let ColumnReordered = - Attributes.defineEventNoDispatch "DataGrid_ColumnReordered" (fun target -> (target :?> DataGrid).ColumnReordered) + Attributes.Component.defineEvent "DataGrid_ColumnReordered" (fun target -> (target :?> DataGrid).ColumnReordered) let ColumnReordering = - Attributes.defineEventNoDispatch "DataGrid_ColumnReordering" (fun target -> (target :?> DataGrid).ColumnReordering) + Attributes.Component.defineEvent "DataGrid_ColumnReordering" (fun target -> (target :?> DataGrid).ColumnReordering) let CurrentCellChanged = - Attributes.defineEventNoDispatch "DataGrid_CurrentCellChanged" (fun target -> (target :?> DataGrid).CurrentCellChanged) + Attributes.Component.defineEvent "DataGrid_CurrentCellChanged" (fun target -> (target :?> DataGrid).CurrentCellChanged) let LoadingRow = - Attributes.defineEventNoDispatch "DataGrid_LoadingRow" (fun target -> (target :?> DataGrid).LoadingRow) + Attributes.Component.defineEvent "DataGrid_LoadingRow" (fun target -> (target :?> DataGrid).LoadingRow) let PreparingCellForEdit = - Attributes.defineEventNoDispatch "DataGrid_PreparingCellForEdit" (fun target -> (target :?> DataGrid).PreparingCellForEdit) + Attributes.Component.defineEvent "DataGrid_PreparingCellForEdit" (fun target -> (target :?> DataGrid).PreparingCellForEdit) let RowEditEnded = - Attributes.defineEventNoDispatch "DataGrid_RowEditEnded" (fun target -> (target :?> DataGrid).RowEditEnded) + Attributes.Component.defineEvent "DataGrid_RowEditEnded" (fun target -> (target :?> DataGrid).RowEditEnded) let RowEditEnding = - Attributes.defineEventNoDispatch "DataGrid_RowEditEnding" (fun target -> (target :?> DataGrid).RowEditEnding) + Attributes.Component.defineEvent "DataGrid_RowEditEnding" (fun target -> (target :?> DataGrid).RowEditEnding) let SelectionChanged = - Attributes.defineEventNoDispatch "DataGrid_SelectionChanged" (fun target -> (target :?> DataGrid).SelectionChanged) + Attributes.Component.defineEvent "DataGrid_SelectionChanged" (fun target -> (target :?> DataGrid).SelectionChanged) let Sorting = - Attributes.defineEventNoDispatch "DataGrid_Sorting" (fun target -> (target :?> DataGrid).Sorting) + Attributes.Component.defineEvent "DataGrid_Sorting" (fun target -> (target :?> DataGrid).Sorting) let UnloadingRow = - Attributes.defineEventNoDispatch "DataGrid_UnloadingRow" (fun target -> (target :?> DataGrid).UnloadingRow) + Attributes.Component.defineEvent "DataGrid_UnloadingRow" (fun target -> (target :?> DataGrid).UnloadingRow) let LoadingRowDetails = - Attributes.defineEventNoDispatch "DataGrid_LoadingRowDetails" (fun target -> (target :?> DataGrid).LoadingRowDetails) + Attributes.Component.defineEvent "DataGrid_LoadingRowDetails" (fun target -> (target :?> DataGrid).LoadingRowDetails) let RowDetailsVisibilityChanged = - Attributes.defineEventNoDispatch "DataGrid_RowDetailsVisibilityChanged" (fun target -> (target :?> DataGrid).RowDetailsVisibilityChanged) + Attributes.Component.defineEvent "DataGrid_RowDetailsVisibilityChanged" (fun target -> (target :?> DataGrid).RowDetailsVisibilityChanged) let UnloadingRowDetails = - Attributes.defineEventNoDispatch "DataGrid_UnloadingRowDetails" (fun target -> (target :?> DataGrid).UnloadingRowDetails) + Attributes.Component.defineEvent "DataGrid_UnloadingRowDetails" (fun target -> (target :?> DataGrid).UnloadingRowDetails) type ComponentDataGridModifiers = /// Listens to the HorizontalScroll Scroll event. diff --git a/extensions/Fabulous.Avalonia.DataGrid/DataGrid.Mvu.fs b/extensions/Fabulous.Avalonia.DataGrid/DataGrid.Mvu.fs index 21a52e1aa..00a561272 100644 --- a/extensions/Fabulous.Avalonia.DataGrid/DataGrid.Mvu.fs +++ b/extensions/Fabulous.Avalonia.DataGrid/DataGrid.Mvu.fs @@ -11,67 +11,67 @@ open Fabulous.Avalonia module MvuDataGrid = let HorizontalScroll = - Attributes.defineEvent "DataGrid_HorizontalScroll" (fun target -> (target :?> DataGrid).HorizontalScroll) + Attributes.Mvu.defineEvent "DataGrid_HorizontalScroll" (fun target -> (target :?> DataGrid).HorizontalScroll) let VerticalScroll = - Attributes.defineEvent "DataGrid_VerticalScroll" (fun target -> (target :?> DataGrid).VerticalScroll) + Attributes.Mvu.defineEvent "DataGrid_VerticalScroll" (fun target -> (target :?> DataGrid).VerticalScroll) let AutoGeneratingColumn = - Attributes.defineEvent "DataGrid_AutoGeneratingColumn" (fun target -> (target :?> DataGrid).AutoGeneratingColumn) + Attributes.Mvu.defineEvent "DataGrid_AutoGeneratingColumn" (fun target -> (target :?> DataGrid).AutoGeneratingColumn) let BeginningEdit = - Attributes.defineEvent "DataGrid_BeginningEdit" (fun target -> (target :?> DataGrid).BeginningEdit) + Attributes.Mvu.defineEvent "DataGrid_BeginningEdit" (fun target -> (target :?> DataGrid).BeginningEdit) let CellEditEnded = - Attributes.defineEvent "DataGrid_CellEditEnded" (fun target -> (target :?> DataGrid).CellEditEnded) + Attributes.Mvu.defineEvent "DataGrid_CellEditEnded" (fun target -> (target :?> DataGrid).CellEditEnded) let CellEditEnding = - Attributes.defineEvent "DataGrid_CellEditEnding" (fun target -> (target :?> DataGrid).CellEditEnding) + Attributes.Mvu.defineEvent "DataGrid_CellEditEnding" (fun target -> (target :?> DataGrid).CellEditEnding) let CellPointerPressed = - Attributes.defineEvent "DataGrid_CellPointerPressed" (fun target -> (target :?> DataGrid).CellPointerPressed) + Attributes.Mvu.defineEvent "DataGrid_CellPointerPressed" (fun target -> (target :?> DataGrid).CellPointerPressed) let ColumnDisplayIndexChanged = - Attributes.defineEvent "DataGrid_ColumnDisplayIndexChanged" (fun target -> (target :?> DataGrid).ColumnDisplayIndexChanged) + Attributes.Mvu.defineEvent "DataGrid_ColumnDisplayIndexChanged" (fun target -> (target :?> DataGrid).ColumnDisplayIndexChanged) let ColumnReordered = - Attributes.defineEvent "DataGrid_ColumnReordered" (fun target -> (target :?> DataGrid).ColumnReordered) + Attributes.Mvu.defineEvent "DataGrid_ColumnReordered" (fun target -> (target :?> DataGrid).ColumnReordered) let ColumnReordering = - Attributes.defineEvent "DataGrid_ColumnReordering" (fun target -> (target :?> DataGrid).ColumnReordering) + Attributes.Mvu.defineEvent "DataGrid_ColumnReordering" (fun target -> (target :?> DataGrid).ColumnReordering) let CurrentCellChanged = - Attributes.defineEvent "DataGrid_CurrentCellChanged" (fun target -> (target :?> DataGrid).CurrentCellChanged) + Attributes.Mvu.defineEvent "DataGrid_CurrentCellChanged" (fun target -> (target :?> DataGrid).CurrentCellChanged) let LoadingRow = - Attributes.defineEvent "DataGrid_LoadingRow" (fun target -> (target :?> DataGrid).LoadingRow) + Attributes.Mvu.defineEvent "DataGrid_LoadingRow" (fun target -> (target :?> DataGrid).LoadingRow) let PreparingCellForEdit = - Attributes.defineEvent "DataGrid_PreparingCellForEdit" (fun target -> (target :?> DataGrid).PreparingCellForEdit) + Attributes.Mvu.defineEvent "DataGrid_PreparingCellForEdit" (fun target -> (target :?> DataGrid).PreparingCellForEdit) let RowEditEnded = - Attributes.defineEvent "DataGrid_RowEditEnded" (fun target -> (target :?> DataGrid).RowEditEnded) + Attributes.Mvu.defineEvent "DataGrid_RowEditEnded" (fun target -> (target :?> DataGrid).RowEditEnded) let RowEditEnding = - Attributes.defineEvent "DataGrid_RowEditEnding" (fun target -> (target :?> DataGrid).RowEditEnding) + Attributes.Mvu.defineEvent "DataGrid_RowEditEnding" (fun target -> (target :?> DataGrid).RowEditEnding) let SelectionChanged = - Attributes.defineEvent "DataGrid_SelectionChanged" (fun target -> (target :?> DataGrid).SelectionChanged) + Attributes.Mvu.defineEvent "DataGrid_SelectionChanged" (fun target -> (target :?> DataGrid).SelectionChanged) let Sorting = - Attributes.defineEvent "DataGrid_Sorting" (fun target -> (target :?> DataGrid).Sorting) + Attributes.Mvu.defineEvent "DataGrid_Sorting" (fun target -> (target :?> DataGrid).Sorting) let UnloadingRow = - Attributes.defineEvent "DataGrid_UnloadingRow" (fun target -> (target :?> DataGrid).UnloadingRow) + Attributes.Mvu.defineEvent "DataGrid_UnloadingRow" (fun target -> (target :?> DataGrid).UnloadingRow) let LoadingRowDetails = - Attributes.defineEvent "DataGrid_LoadingRowDetails" (fun target -> (target :?> DataGrid).LoadingRowDetails) + Attributes.Mvu.defineEvent "DataGrid_LoadingRowDetails" (fun target -> (target :?> DataGrid).LoadingRowDetails) let RowDetailsVisibilityChanged = - Attributes.defineEvent "DataGrid_RowDetailsVisibilityChanged" (fun target -> (target :?> DataGrid).RowDetailsVisibilityChanged) + Attributes.Mvu.defineEvent "DataGrid_RowDetailsVisibilityChanged" (fun target -> (target :?> DataGrid).RowDetailsVisibilityChanged) let UnloadingRowDetails = - Attributes.defineEvent "DataGrid_UnloadingRowDetails" (fun target -> (target :?> DataGrid).UnloadingRowDetails) + Attributes.Mvu.defineEvent "DataGrid_UnloadingRowDetails" (fun target -> (target :?> DataGrid).UnloadingRowDetails) type MvuDataGridModifiers = /// Listens to the HorizontalScroll Scroll event. diff --git a/extensions/Fabulous.Avalonia.DataGrid/DataGridCheckBoxColumn.fs b/extensions/Fabulous.Avalonia.DataGrid/DataGridCheckBoxColumn.fs index ad3de480f..d86427f21 100644 --- a/extensions/Fabulous.Avalonia.DataGrid/DataGridCheckBoxColumn.fs +++ b/extensions/Fabulous.Avalonia.DataGrid/DataGridCheckBoxColumn.fs @@ -49,6 +49,7 @@ module DataGridCheckBoxColumnBuilders = AttributesBundle( StackList.one(DataGridBoundColumn.Binding.WithValue(binding)), ValueSome [| DataGridColumn.HeaderWidget.WithValue(header.Compile()) |], + ValueNone, ValueNone ) ) @@ -62,6 +63,7 @@ module DataGridCheckBoxColumnBuilders = AttributesBundle( StackList.one(DataGridBoundColumn.Binding.WithValue(Binding(binding))), ValueSome [| DataGridColumn.HeaderWidget.WithValue(header.Compile()) |], + ValueNone, ValueNone ) ) diff --git a/extensions/Fabulous.Avalonia.DataGrid/DataGridTextColumn.fs b/extensions/Fabulous.Avalonia.DataGrid/DataGridTextColumn.fs index 73e068cde..2c18b4c01 100644 --- a/extensions/Fabulous.Avalonia.DataGrid/DataGridTextColumn.fs +++ b/extensions/Fabulous.Avalonia.DataGrid/DataGridTextColumn.fs @@ -68,6 +68,7 @@ module DataGridTextColumnBuilders = AttributesBundle( StackList.one(DataGridBoundColumn.Binding.WithValue(binding)), ValueSome [| DataGridColumn.HeaderWidget.WithValue(header.Compile()) |], + ValueNone, ValueNone ) ) @@ -81,6 +82,7 @@ module DataGridTextColumnBuilders = AttributesBundle( StackList.one(DataGridBoundColumn.Binding.WithValue(Binding(binding))), ValueSome [| DataGridColumn.HeaderWidget.WithValue(header.Compile()) |], + ValueNone, ValueNone ) ) diff --git a/extensions/Fabulous.Avalonia.DataGrid/Fabulous.Avalonia.DataGrid.fsproj b/extensions/Fabulous.Avalonia.DataGrid/Fabulous.Avalonia.DataGrid.fsproj index 964e876a5..073f4f66b 100644 --- a/extensions/Fabulous.Avalonia.DataGrid/Fabulous.Avalonia.DataGrid.fsproj +++ b/extensions/Fabulous.Avalonia.DataGrid/Fabulous.Avalonia.DataGrid.fsproj @@ -32,8 +32,7 @@ - - + diff --git a/extensions/Fabulous.Avalonia.Diagnostics/Fabulous.Avalonia.Diagnostics.fsproj b/extensions/Fabulous.Avalonia.Diagnostics/Fabulous.Avalonia.Diagnostics.fsproj index 0262783fd..27561a321 100644 --- a/extensions/Fabulous.Avalonia.Diagnostics/Fabulous.Avalonia.Diagnostics.fsproj +++ b/extensions/Fabulous.Avalonia.Diagnostics/Fabulous.Avalonia.Diagnostics.fsproj @@ -28,10 +28,9 @@ - + build; native; contentfiles; analyzers - diff --git a/extensions/Fabulous.Avalonia.ItemsRepeater/Fabulous.Avalonia.ItemsRepeater.fsproj b/extensions/Fabulous.Avalonia.ItemsRepeater/Fabulous.Avalonia.ItemsRepeater.fsproj index 2b689173e..dee8c5866 100644 --- a/extensions/Fabulous.Avalonia.ItemsRepeater/Fabulous.Avalonia.ItemsRepeater.fsproj +++ b/extensions/Fabulous.Avalonia.ItemsRepeater/Fabulous.Avalonia.ItemsRepeater.fsproj @@ -25,8 +25,7 @@ - - + diff --git a/extensions/Fabulous.Avalonia.TreeDataGrid/Fabulous.Avalonia.TreeDataGrid.fsproj b/extensions/Fabulous.Avalonia.TreeDataGrid/Fabulous.Avalonia.TreeDataGrid.fsproj index 653f3102e..2bac58977 100644 --- a/extensions/Fabulous.Avalonia.TreeDataGrid/Fabulous.Avalonia.TreeDataGrid.fsproj +++ b/extensions/Fabulous.Avalonia.TreeDataGrid/Fabulous.Avalonia.TreeDataGrid.fsproj @@ -28,7 +28,6 @@ - diff --git a/extensions/Fabulous.Avalonia.TreeDataGrid/TreeDataGrid.Components.fs b/extensions/Fabulous.Avalonia.TreeDataGrid/TreeDataGrid.Components.fs index 7c0898dcb..93409e826 100644 --- a/extensions/Fabulous.Avalonia.TreeDataGrid/TreeDataGrid.Components.fs +++ b/extensions/Fabulous.Avalonia.TreeDataGrid/TreeDataGrid.Components.fs @@ -7,13 +7,13 @@ open Fabulous.Avalonia module ComponentTreeDataGrid = let RowDragStarted = - Attributes.defineEventNoDispatch "TreeDataGrid_RowDragStarted" (fun target -> (target :?> TreeDataGrid).RowDragStarted) + Attributes.Mvu.defineEvent "TreeDataGrid_RowDragStarted" (fun target -> (target :?> TreeDataGrid).RowDragStarted) let RowDragOver = - Attributes.defineEventNoDispatch "TreeDataGrid_RowDragOver" (fun target -> (target :?> TreeDataGrid).RowDragOver) + Attributes.Mvu.defineEvent "TreeDataGrid_RowDragOver" (fun target -> (target :?> TreeDataGrid).RowDragOver) let RowDrop = - Attributes.defineEventNoDispatch "TreeDataGrid_RowDrop" (fun target -> (target :?> TreeDataGrid).RowDrop) + Attributes.Mvu.defineEvent "TreeDataGrid_RowDrop" (fun target -> (target :?> TreeDataGrid).RowDrop) type ComponentTreeDataGridModifiers = /// Listens to the RowDragStarted event. diff --git a/extensions/Fabulous.Avalonia.TreeDataGrid/TreeDataGrid.Mvu.fs b/extensions/Fabulous.Avalonia.TreeDataGrid/TreeDataGrid.Mvu.fs index df5403081..a8b233b73 100644 --- a/extensions/Fabulous.Avalonia.TreeDataGrid/TreeDataGrid.Mvu.fs +++ b/extensions/Fabulous.Avalonia.TreeDataGrid/TreeDataGrid.Mvu.fs @@ -7,13 +7,13 @@ open Fabulous.Avalonia module MvuTreeDataGrid = let RowDragStarted = - Attributes.defineEvent "TreeDataGrid_RowDragStarted" (fun target -> (target :?> TreeDataGrid).RowDragStarted) + Attributes.Mvu.defineEvent "TreeDataGrid_RowDragStarted" (fun target -> (target :?> TreeDataGrid).RowDragStarted) let RowDragOver = - Attributes.defineEvent "TreeDataGrid_RowDragOver" (fun target -> (target :?> TreeDataGrid).RowDragOver) + Attributes.Mvu.defineEvent "TreeDataGrid_RowDragOver" (fun target -> (target :?> TreeDataGrid).RowDragOver) let RowDrop = - Attributes.defineEvent "TreeDataGrid_RowDrop" (fun target -> (target :?> TreeDataGrid).RowDrop) + Attributes.Mvu.defineEvent "TreeDataGrid_RowDrop" (fun target -> (target :?> TreeDataGrid).RowDrop) type MvuTreeDataGridModifiers = /// Listens to the RowDragStarted event. diff --git a/samples/Fabulous.Avalonia.Samples.targets b/samples/Fabulous.Avalonia.Samples.targets index 0825b99b7..a1cf82bd8 100644 --- a/samples/Fabulous.Avalonia.Samples.targets +++ b/samples/Fabulous.Avalonia.Samples.targets @@ -16,7 +16,6 @@ - diff --git a/samples/Gallery/Pages/App.fs b/samples/Gallery/App.fs similarity index 79% rename from samples/Gallery/Pages/App.fs rename to samples/Gallery/App.fs index 953b429f4..56622f7bf 100644 --- a/samples/Gallery/Pages/App.fs +++ b/samples/Gallery/App.fs @@ -82,6 +82,25 @@ module App = | ThemeAwarePage | UniformGridPage | ViewBoxPage + | ImplicitAnimations + | DrawLineAnimation + | CompositorAnimations + | Animations + | SpringAnimations + | Transitions + | RenderTransform + | Brushes + | Clipping + | Drawing + | LineBounds + | Transform3D + | WritableBitmap + | RenderTargetBitmap + | PathMeasurement + | CustomAnimator + | GlyphRun + | FormattedText + | TextFormatter [] let (|CurrentPage|_|) page = @@ -161,6 +180,25 @@ module App = | "ThemeAware" -> ValueSome ThemeAwarePage | "UniformGrid" -> ValueSome UniformGridPage | "ViewBox" -> ValueSome ViewBoxPage + | "Implicit Animations" -> ValueSome ImplicitAnimations + | "Draw Line Animation" -> ValueSome DrawLineAnimation + | "Compositor Animations" -> ValueSome CompositorAnimations + | "Animations" -> ValueSome Animations + | "Spring Animations" -> ValueSome SpringAnimations + | "RenderTransitions" -> ValueSome Transitions + | "Render Transform" -> ValueSome RenderTransform + | "Brushes" -> ValueSome Brushes + | "Clipping" -> ValueSome Clipping + | "Drawing" -> ValueSome Drawing + | "Line Bounds" -> ValueSome LineBounds + | "Transform3D" -> ValueSome Transform3D + | "Writable Bitmap" -> ValueSome WritableBitmap + | "Render Target Bitmap" -> ValueSome RenderTargetBitmap + | "Path Measurement" -> ValueSome PathMeasurement + | "Custom Animator" -> ValueSome CustomAnimator + | "GlyphRun" -> ValueSome GlyphRun + | "FormattedText" -> ValueSome FormattedText + | "TextFormatter" -> ValueSome TextFormatter | _ -> ValueNone [] @@ -240,4 +278,23 @@ module App = | TransitioningContentControlPage -> ValueSome(AnyView(TransitioningContentControlPage.view())) | ThemeAwarePage -> ValueSome(AnyView(ThemeAwarePage.view())) | UniformGridPage -> ValueSome(AnyView(UniformGridPage.view())) + | ImplicitAnimations -> ValueSome(AnyView(ImplicitCanvasAnimationsPage.view())) + | DrawLineAnimation -> ValueSome(AnyView(DrawLineAnimationPage.view())) + | CompositorAnimations -> ValueSome(AnyView(CompositorAnimationsPage.view())) + | Animations -> ValueSome(AnyView(AnimationsPage.view())) + | SpringAnimations -> ValueSome(AnyView(SpringAnimationsPage.view())) + | Transitions -> ValueSome(AnyView(TransitionsPage.view())) + | RenderTransform -> ValueSome(AnyView(RenderTransformPage.view())) + | Brushes -> ValueSome(AnyView(BrushesPage.view())) + | Clipping -> ValueSome(AnyView(ClippingPage.view())) + | Drawing -> ValueSome(AnyView(DrawingPage.view())) + | LineBounds -> ValueSome(AnyView(LineBoundsPage.view())) + | Transform3D -> ValueSome(AnyView(Transform3DPage.view())) + | WritableBitmap -> ValueSome(AnyView(WriteableBitmapPage.view())) + | RenderTargetBitmap -> ValueSome(AnyView(RenderTargetBitmapPage.view())) + | PathMeasurement -> ValueSome(AnyView(PathMeasurementPage.view())) + | CustomAnimator -> ValueSome(AnyView(CustomAnimatorPage.view())) + | GlyphRun -> ValueSome(AnyView(GlyphRunPage.view())) + | FormattedText -> ValueSome(AnyView(FormattedTextPage.view())) + | TextFormatter -> ValueSome(AnyView(TextFormatterPage.view())) | ViewBoxPage -> ValueSome(AnyView(ViewBoxPage.view())) diff --git a/samples/Gallery/Common.fs b/samples/Gallery/Common.fs index 8fe2177f2..ceb440165 100644 --- a/samples/Gallery/Common.fs +++ b/samples/Gallery/Common.fs @@ -1,30 +1,9 @@ namespace Gallery -open System.Runtime.CompilerServices -open Avalonia.Controls -open Avalonia.Media -open Controls.HamburgerMenu -open Fabulous.Avalonia open Fabulous open type Fabulous.Avalonia.View -module Paths = - - [] - let Path1 = - "F1 M 16.6309,18.6563C 17.1309,8.15625 29.8809,14.1563 29.8809,14.1563C 30.8809,11.1563 34.1308,11.4063 34.1308,11.4063C 33.5,12 34.6309,13.1563 34.6309,13.1563C 32.1309,13.1562 31.1309,14.9062 31.1309,14.9062C 41.1309,23.9062 32.6309,27.9063 32.6309,27.9062C 24.6309,24.9063 21.1309,22.1562 16.6309,18.6563 Z M 16.6309,19.9063C 21.6309,24.1563 25.1309,26.1562 31.6309,28.6562C 31.6309,28.6562 26.3809,39.1562 18.3809,36.1563C 18.3809,36.1563 18,38 16.3809,36.9063C 15,36 16.3809,34.9063 16.3809,34.9063C 16.3809,34.9063 10.1309,30.9062 16.6309,19.9063 Z" - - [] - let Path2 = - "M 272.70141,238.71731 C 206.46141,238.71731 152.70146,292.4773 152.70146,358.71731 C 152.70146,493.47282 288.63461,528.80461 381.26391,662.02535 C 468.83815,529.62199 609.82641,489.17075 609.82641,358.71731 C 609.82641,292.47731 556.06651,238.7173 489.82641,238.71731 C 441.77851,238.71731 400.42481,267.08774 381.26391,307.90481 C 362.10311,267.08773 320.74941,238.7173 272.70141,238.71731 z" - - [] - let Path3 = - "M3 17h18a1 1 0 0 1 .117 1.993L21 19H3a1 1 0 0 1-.117-1.993L3 17h18H3Zm0-6 18-.002a1 1 0 0 1 .117 1.993l-.117.007L3 13a1 1 0 0 1-.117-1.993L3 11l18-.002L3 11Zm0-6h18a1 1 0 0 1 .117 1.993L21 7H3a1 1 0 0 1-.117-1.993L3 5h18H3Z" - - - module Cmd = let perform fn : Cmd<'msg> = [ (fun _ -> fn()) ] @@ -70,120 +49,3 @@ module Task = return output.ToArray() } - -open Fabulous.StackAllocatedCollections.StackList - -[] -module EmptyBorderBuilders = - type Fabulous.Avalonia.View with - - /// Creates a empty Border widget. - static member EmptyBorder() = - WidgetBuilder<'msg, IFabBorder>(Border.WidgetKey, AttributesBundle(StackList.empty(), ValueNone, ValueNone)) - -type IFabHamburgerMenu = - inherit IFabTabControl - -module HamburgerMenuExt = - let WidgetKey = Widgets.register() - - let PaneBackground = - Attributes.defineAvaloniaPropertyWithEquality HamburgerMenu.PaneBackgroundProperty - - let ContentBackground = - Attributes.defineAvaloniaPropertyWithEquality HamburgerMenu.ContentBackgroundProperty - - let ExpandedModeThresholdWidth = - Attributes.defineAvaloniaPropertyWithEquality HamburgerMenu.ExpandedModeThresholdWidthProperty - -[] -module HamburgerMenuExtBuilders = - - type Fabulous.Avalonia.View with - - static member HamburgerMenu() = - CollectionBuilder<'msg, IFabHamburgerMenu, IFabTabItem>(HamburgerMenuExt.WidgetKey, ItemsControl.Items) - -type HamburgerMenuModifiers = - [] - static member inline reference(this: WidgetBuilder<'msg, IFabHamburgerMenu>, value: ViewRef) = - this.AddScalar(ViewRefAttributes.ViewRef.WithValue(value.Unbox)) - - [] - static member inline paneBackground(this: WidgetBuilder<'msg, IFabHamburgerMenu>, value: IBrush) = - this.AddScalar(HamburgerMenuExt.PaneBackground.WithValue(value)) - - [] - static member inline contentBackground(this: WidgetBuilder<'msg, IFabHamburgerMenu>, value: IBrush) = - this.AddScalar(HamburgerMenuExt.ContentBackground.WithValue(value)) - - [] - static member inline expandedModeThresholdWidth(this: WidgetBuilder<'msg, IFabHamburgerMenu>, value: int) = - this.AddScalar(HamburgerMenuExt.ExpandedModeThresholdWidth.WithValue(value)) - -open Avalonia.Layout -open type Fabulous.Avalonia.View - -[] -module CommonBuilders = - type Fabulous.Avalonia.View with - - static member CustomNotification(title: string, message: string, yesCommand: 'msg, noCommand: 'msg) = - Border( - Grid(coldefs = [ Auto; Star ], rowdefs = [ Auto ]) { - (Panel() { - TextBlock("") - .foreground(SolidColorBrush(Colors.White)) - .fontWeight(FontWeight.Bold) - .fontSize(20.) - .textAlignment(TextAlignment.Center) - .verticalAlignment(VerticalAlignment.Center) - }) - .margin(0., 0., 12., 0.) - .width(25.) - .height(25.) - .verticalAlignment(VerticalAlignment.Top) - - (Dock() { - TextBlock(title) - .dock(Dock.Top) - .fontWeight(FontWeight.Medium) - - (HStack(20.) { - Button("No", noCommand) - .closeOnClick(true) - .margin(0., 0., 8., 0.) - .dock(Dock.Right) - - Button("Yes", yesCommand) - .closeOnClick(true) - .dock(Dock.Right) - }) - .dock(Dock.Bottom) - .margin(0., 8., 0., 0.) - - TextBlock(message) - .margin(0., 8., 0., 0.) - .textWrapping(TextWrapping.Wrap) - .opacity(0.8) - - }) - .gridColumn(1) - } - ) - .padding(12.) - .minHeight(20.) - .background(SolidColorBrush(Colors.DodgerBlue)) - - static member inline CardItem(text: string) = - Border( - TextBlock(text) - .centerHorizontal() - .centerVertical() - .padding(8.) - ) - .height(50.) - .cornerRadius(8.) - .margin(8.) - .borderBrush(SolidColorBrush(Colors.DarkGray)) - .borderThickness(2.) diff --git a/samples/Gallery/Gallery.fsproj b/samples/Gallery/Gallery.fsproj index 6ab247695..6516b7e0b 100644 --- a/samples/Gallery/Gallery.fsproj +++ b/samples/Gallery/Gallery.fsproj @@ -42,6 +42,7 @@ + @@ -108,6 +109,7 @@ + @@ -126,7 +128,31 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/samples/Gallery/MainView.fs b/samples/Gallery/MainView.fs index 4838bb9e8..eff48360d 100644 --- a/samples/Gallery/MainView.fs +++ b/samples/Gallery/MainView.fs @@ -106,7 +106,24 @@ module MainView = "TabStrip" "ThemeAware" "UniformGrid" - "ViewBox" ] + "ViewBox" + "Implicit Animations" + "Draw Line Animation" + "Compositor Animations" + "Animations" + "Spring Animations" + "Transitions" + "Render Transform" + "Brushes" + "Clipping" + "Drawing" + "Line Bounds" + "Transform3D" + "Writable Bitmap" + "Render Target Bitmap" + "Path Measurement" + "Custom Animator" + "SkCanvas" ] let program = Program.statefulWithCmd init update @@ -125,7 +142,7 @@ module MainView = Component("MainView") { let! model = Context.Mvu program - SingleViewApplication() { + SingleViewApplication( ScrollViewer( match model.Details with | Some(CurrentWidget page) -> @@ -147,7 +164,7 @@ module MainView = } ) ) - } + ) } let create () = diff --git a/samples/Gallery/MainWindow.fs b/samples/Gallery/MainWindow.fs index 8b049e3d2..415f49a2a 100644 --- a/samples/Gallery/MainWindow.fs +++ b/samples/Gallery/MainWindow.fs @@ -179,6 +179,7 @@ module MainWindow = TabItem("TextBoxPage", TextBoxPage.view()) TabItem("ThumbPage", ThumbPage.view()) TabItem("TickBarPage", TickBarPage.view()) + TabItem("TimePickerPage", TimePickerPage.view()) TabItem("ToggleSwitchPage", ToggleSwitchPage.view()) TabItem("ToggleButtonPage", ToggleButtonPage.view()) TabItem("ToolTipPage", ToolTipPage.view()) @@ -190,6 +191,26 @@ module MainWindow = TabItem("ThemeAwarePage", ThemeAwarePage.view()) TabItem("UniformGridPage", UniformGridPage.view()) TabItem("ViewBoxPage", ViewBoxPage.view()) + TabItem("Implicit Animations", ImplicitCanvasAnimationsPage.view()) + TabItem("Draw Line Animation", DrawLineAnimationPage.view()) + TabItem("Compositor Animations", CompositorAnimationsPage.view()) + TabItem("Animations", AnimationsPage.view()) + TabItem("Spring Animations", SpringAnimationsPage.view()) + TabItem("Transitions", TransitionsPage.view()) + TabItem("Render Transform", RenderTransformPage.view()) + TabItem("Brushes", BrushesPage.view()) + TabItem("Clipping", ClippingPage.view()) + TabItem("Drawing", DrawingPage.view()) + TabItem("Line Bounds", LineBoundsPage.view()) + TabItem("Transform3D", Transform3DPage.view()) + TabItem("Writable Bitmap", WriteableBitmapPage.view()) + TabItem("Render Target Bitmap", RenderTargetBitmapPage.view()) + TabItem("Path Measurement", PathMeasurementPage.view()) + TabItem("Custom Animator", CustomAnimatorPage.view()) + TabItem("SkCanvas", CustomSkiaPage.view()) + TabItem("GlyphRun", GlyphRunPage.view()) + TabItem("FormattedText", FormattedTextPage.view()) + TabItem("TextFormatter", TextFormatterPage.view()) }) .expandedModeThresholdWidth(760) .attachedFlyout( @@ -256,7 +277,7 @@ module MainWindow = Component("MainWindow") { let! model = Context.Mvu program - DesktopApplication() { + DesktopApplication( Window(hamburgerMenu model) .title("Fabulous Gallery") .menu(createMenu()) @@ -266,9 +287,9 @@ module MainWindow = #if DEBUG .attachDevTools() #endif - } - |> _.trayIcon(trayIcon()) - |> _.requestedThemeVariant(model.CurrentTheme) + ) + .trayIcon(trayIcon()) + .requestedThemeVariant(model.CurrentTheme) } let create () = diff --git a/samples/RenderDemo/Animations/AnimationsPage.fs b/samples/Gallery/Pages/AnimationsPage.fs similarity index 97% rename from samples/RenderDemo/Animations/AnimationsPage.fs rename to samples/Gallery/Pages/AnimationsPage.fs index 5e05e8a74..d0468b76c 100644 --- a/samples/RenderDemo/Animations/AnimationsPage.fs +++ b/samples/Gallery/Pages/AnimationsPage.fs @@ -1,4 +1,4 @@ -namespace RenderDemo +namespace Gallery open Avalonia open Avalonia.Layout @@ -117,7 +117,7 @@ module AnimationsPage = ) } ) - .styleInclude([ "avares://RenderDemo/Styles/Animations.xaml" ]) + .styleInclude([ "avares://Gallery/Styles/Animations.xaml" ]) }) .horizontalAlignment(HorizontalAlignment.Center) .verticalAlignment(VerticalAlignment.Center) diff --git a/samples/RenderDemo/BrushesPage.fs b/samples/Gallery/Pages/BrushesPage.fs similarity index 98% rename from samples/RenderDemo/BrushesPage.fs rename to samples/Gallery/Pages/BrushesPage.fs index 9c068133c..08fc78f13 100644 --- a/samples/RenderDemo/BrushesPage.fs +++ b/samples/Gallery/Pages/BrushesPage.fs @@ -1,4 +1,4 @@ -namespace RenderDemo +namespace Gallery open Avalonia open Avalonia.Media @@ -68,7 +68,7 @@ module BrushesPage = .width(440.0) .height(50.0) .fill( - ImageBrush("avares://RenderDemo/Assets/Icons/fabulous-icon.png") + ImageBrush("avares://Gallery/Assets/Icons/fabulous-icon.png") .tileMode(TileMode.Tile) .sourceRect(Point(0., 0.), Size(20., 20.), RelativeUnit.Absolute) .destinationRect(Point(0., 0.), Size(20., 20.), RelativeUnit.Absolute) diff --git a/samples/RenderDemo/ClippingPage.fs b/samples/Gallery/Pages/ClippingPage.fs similarity index 99% rename from samples/RenderDemo/ClippingPage.fs rename to samples/Gallery/Pages/ClippingPage.fs index a41f2fa92..9b874e451 100644 --- a/samples/RenderDemo/ClippingPage.fs +++ b/samples/Gallery/Pages/ClippingPage.fs @@ -1,4 +1,4 @@ -namespace RenderDemo +namespace Gallery open System open System.Diagnostics diff --git a/samples/Gallery/Pages/CompositionPage.fs b/samples/Gallery/Pages/CompositionPage.fs index 486c5464c..08749b723 100644 --- a/samples/Gallery/Pages/CompositionPage.fs +++ b/samples/Gallery/Pages/CompositionPage.fs @@ -20,7 +20,7 @@ module CompositionPageControlBuilders = type Fabulous.Avalonia.View with static member CompositionPageControl() = - WidgetBuilder<'msg, IFabMvuCompositionPage>(CompositionPageControl.WidgetKey, AttributesBundle(StackList.empty(), ValueNone, ValueNone)) + WidgetBuilder<'msg, IFabMvuCompositionPage>(CompositionPageControl.WidgetKey) module CompositionPage = let view () = View.CompositionPageControl() diff --git a/samples/RenderDemo/Animations/CompositorAnimationsPage.fs b/samples/Gallery/Pages/CompositorAnimationsPage.fs similarity index 97% rename from samples/RenderDemo/Animations/CompositorAnimationsPage.fs rename to samples/Gallery/Pages/CompositorAnimationsPage.fs index 54dd915b9..b5d553674 100644 --- a/samples/RenderDemo/Animations/CompositorAnimationsPage.fs +++ b/samples/Gallery/Pages/CompositorAnimationsPage.fs @@ -1,4 +1,4 @@ -namespace RenderDemo +namespace Gallery open Fabulous.Avalonia diff --git a/samples/RenderDemo/Animations/CustomAnimatorPage.fs b/samples/Gallery/Pages/CustomAnimatorPage.fs similarity index 98% rename from samples/RenderDemo/Animations/CustomAnimatorPage.fs rename to samples/Gallery/Pages/CustomAnimatorPage.fs index 4afe329c8..fe6da44b3 100644 --- a/samples/RenderDemo/Animations/CustomAnimatorPage.fs +++ b/samples/Gallery/Pages/CustomAnimatorPage.fs @@ -1,4 +1,4 @@ -namespace RenderDemo +namespace Gallery open System open Avalonia.Animation diff --git a/samples/RenderDemo/Animations/CustomSkiaPage.fs b/samples/Gallery/Pages/CustomSkiaPage.fs similarity index 98% rename from samples/RenderDemo/Animations/CustomSkiaPage.fs rename to samples/Gallery/Pages/CustomSkiaPage.fs index 89e0421ee..4a6480fa5 100644 --- a/samples/RenderDemo/Animations/CustomSkiaPage.fs +++ b/samples/Gallery/Pages/CustomSkiaPage.fs @@ -1,4 +1,4 @@ -namespace RenderDemo +namespace Gallery open System open System.Diagnostics @@ -142,7 +142,7 @@ module CustomSkiaBuilders = type Fabulous.Avalonia.View with static member CustomSkiaControl() = - WidgetBuilder<'msg, IFabCustomSkiaControl>(CustomSkiaControl.WidgetKey, AttributesBundle(StackList.empty(), ValueNone, ValueNone)) + WidgetBuilder<'msg, IFabCustomSkiaControl>(CustomSkiaControl.WidgetKey) module CustomSkiaPage = let view () = Grid() { View.CustomSkiaControl() } diff --git a/samples/RenderDemo/Animations/DrawLineAnimationPage.fs b/samples/Gallery/Pages/DrawLineAnimationPage.fs similarity index 99% rename from samples/RenderDemo/Animations/DrawLineAnimationPage.fs rename to samples/Gallery/Pages/DrawLineAnimationPage.fs index 89e0786ec..f5e0b52f8 100644 --- a/samples/RenderDemo/Animations/DrawLineAnimationPage.fs +++ b/samples/Gallery/Pages/DrawLineAnimationPage.fs @@ -1,4 +1,4 @@ -namespace RenderDemo +namespace Gallery open System open System.Diagnostics diff --git a/samples/RenderDemo/DrawingPage.fs b/samples/Gallery/Pages/DrawingPage.fs similarity index 99% rename from samples/RenderDemo/DrawingPage.fs rename to samples/Gallery/Pages/DrawingPage.fs index 0aead091c..ff377d1da 100644 --- a/samples/RenderDemo/DrawingPage.fs +++ b/samples/Gallery/Pages/DrawingPage.fs @@ -1,4 +1,4 @@ -namespace RenderDemo +namespace Gallery open Avalonia open Avalonia.Layout diff --git a/samples/RenderDemo/Animations/ExpressionAnimation.fs b/samples/Gallery/Pages/ExpressionAnimation.fs similarity index 99% rename from samples/RenderDemo/Animations/ExpressionAnimation.fs rename to samples/Gallery/Pages/ExpressionAnimation.fs index b6da9e792..915f95e22 100644 --- a/samples/RenderDemo/Animations/ExpressionAnimation.fs +++ b/samples/Gallery/Pages/ExpressionAnimation.fs @@ -1,4 +1,4 @@ -namespace RenderDemo +namespace Gallery open System.Diagnostics open Avalonia diff --git a/samples/RenderDemo/FormattedTextPage.fs b/samples/Gallery/Pages/FormattedTextPage.fs similarity index 96% rename from samples/RenderDemo/FormattedTextPage.fs rename to samples/Gallery/Pages/FormattedTextPage.fs index adf4250ec..3f840748c 100644 --- a/samples/RenderDemo/FormattedTextPage.fs +++ b/samples/Gallery/Pages/FormattedTextPage.fs @@ -1,4 +1,4 @@ -namespace RenderDemo +namespace Gallery open System.Globalization open Avalonia @@ -71,7 +71,7 @@ module FormattedTextBuilders = type Fabulous.Avalonia.View with static member FormattedText() = - WidgetBuilder<'msg, IFabFormattedTextControl>(FormattedText.WidgetKey, AttributesBundle(StackList.empty(), ValueNone, ValueNone)) + WidgetBuilder<'msg, IFabFormattedTextControl>(FormattedText.WidgetKey) module FormattedTextPage = let view () = Grid() { View.FormattedText() } diff --git a/samples/RenderDemo/Animations/GalaxyAnimation.fs b/samples/Gallery/Pages/GalaxyAnimation.fs similarity index 99% rename from samples/RenderDemo/Animations/GalaxyAnimation.fs rename to samples/Gallery/Pages/GalaxyAnimation.fs index a2a752b92..ad7ec9d18 100644 --- a/samples/RenderDemo/Animations/GalaxyAnimation.fs +++ b/samples/Gallery/Pages/GalaxyAnimation.fs @@ -1,4 +1,4 @@ -namespace RenderDemo +namespace Gallery open System open System.Diagnostics diff --git a/samples/Gallery/Pages/GeometriesPage.fs b/samples/Gallery/Pages/GeometriesPage.fs index 52e6c70ac..ed1459228 100644 --- a/samples/Gallery/Pages/GeometriesPage.fs +++ b/samples/Gallery/Pages/GeometriesPage.fs @@ -159,4 +159,13 @@ module GeometriesPage = .stroke(SolidColorBrush(Colors.Green)) .strokeThickness(2.) .fill(SolidColorBrush(Colors.Orange)) + + TextBlock("PolyBezierSegment, which creates a series of connected cubic Bezier curves between two or more points.") + + Path( + PathGeometry(FillRule.EvenOdd) { PathFigure(Point(10., 50.)) { PolyBezierSegment([ Point(100., 0.); Point(200., 200.); Point(300., 100.) ]) } } + ) + .fill(SolidColorBrush(Colors.Blue)) + .stroke(SolidColorBrush(Colors.Red)) + .strokeThickness(2.) } diff --git a/samples/RenderDemo/GlyphRunPage.fs b/samples/Gallery/Pages/GlyphRunPage.fs similarity index 95% rename from samples/RenderDemo/GlyphRunPage.fs rename to samples/Gallery/Pages/GlyphRunPage.fs index c9842b778..ea1eed676 100644 --- a/samples/RenderDemo/GlyphRunPage.fs +++ b/samples/Gallery/Pages/GlyphRunPage.fs @@ -1,4 +1,4 @@ -namespace RenderDemo +namespace Gallery open System open Avalonia.Controls @@ -122,7 +122,7 @@ module GlyphRunControlBuilders = type Fabulous.Avalonia.View with static member GlyphRun() = - WidgetBuilder<'msg, IFabGlyphRunControl>(GlyphRun.WidgetKey, AttributesBundle(StackList.empty(), ValueNone, ValueNone)) + WidgetBuilder<'msg, IFabGlyphRunControl>(GlyphRun.WidgetKey) type IFabGlyphRunGeometryControl = inherit IFabControl @@ -136,7 +136,7 @@ module GlyphRunGeometryControlBuilders = type Fabulous.Avalonia.View with static member GlyphRunGeometry() = - WidgetBuilder<'msg, IFabGlyphRunGeometryControl>(GlyphRunGeometry.WidgetKey, AttributesBundle(StackList.empty(), ValueNone, ValueNone)) + WidgetBuilder<'msg, IFabGlyphRunGeometryControl>(GlyphRunGeometry.WidgetKey) module GlyphRunPage = diff --git a/samples/RenderDemo/Animations/ImplicitCanvasAnimationsPage.fs b/samples/Gallery/Pages/ImplicitCanvasAnimationsPage.fs similarity index 99% rename from samples/RenderDemo/Animations/ImplicitCanvasAnimationsPage.fs rename to samples/Gallery/Pages/ImplicitCanvasAnimationsPage.fs index cca95152e..3aade523f 100644 --- a/samples/RenderDemo/Animations/ImplicitCanvasAnimationsPage.fs +++ b/samples/Gallery/Pages/ImplicitCanvasAnimationsPage.fs @@ -1,4 +1,4 @@ -namespace RenderDemo +namespace Gallery open System open System.Diagnostics diff --git a/samples/RenderDemo/LineBoundsPage.fs b/samples/Gallery/Pages/LineBoundsPage.fs similarity index 99% rename from samples/RenderDemo/LineBoundsPage.fs rename to samples/Gallery/Pages/LineBoundsPage.fs index 794b0509b..d2a8a0337 100644 --- a/samples/RenderDemo/LineBoundsPage.fs +++ b/samples/Gallery/Pages/LineBoundsPage.fs @@ -1,4 +1,4 @@ -namespace RenderDemo +namespace Gallery open System open Avalonia diff --git a/samples/Gallery/Pages/NotificationsPage.fs b/samples/Gallery/Pages/NotificationsPage.fs index 39d7939ae..914af42e5 100644 --- a/samples/Gallery/Pages/NotificationsPage.fs +++ b/samples/Gallery/Pages/NotificationsPage.fs @@ -13,16 +13,6 @@ open Fabulous.Avalonia open type Fabulous.Avalonia.View -type NotificationViewModel(title, message) = - - interface INotification with - member this.Title = title - member this.Message = message - member this.Expiration = TimeSpan.FromSeconds(5.) - member this.OnClick = Action(fun _ -> Console.WriteLine("Clicked")) - member this.OnClose = Action(fun _ -> Console.WriteLine("Closed")) - member this.Type = NotificationType.Error - module NotificationsPage = type Model = @@ -79,6 +69,16 @@ module NotificationsPage = let controlNotificationsRef = ViewRef() + let notification title message = + { new INotification with + member this.Title = title + member this.Message = message + member this.Expiration = TimeSpan.FromSeconds(5.) + member this.OnClick = Action(fun _ -> Console.WriteLine("Clicked")) + member this.OnClose = Action(fun _ -> Console.WriteLine("Closed")) + member this.Type = NotificationType.Error } + + let init () = { NotificationManager = null NotificationPosition = NotificationPosition.TopRight }, @@ -91,9 +91,7 @@ module NotificationsPage = | ShowCustomManagedNotification -> model, - showNotification - model.NotificationManager - (NotificationViewModel("Hey There!", "Did you know that Avalonia now supports Custom In-Window Notifications?")) + showNotification model.NotificationManager (notification "Hey There!" "Did you know that Avalonia now supports Custom In-Window Notifications?") | ShowNativeNotification -> model, diff --git a/samples/RenderDemo/PathMeasurementPage.fs b/samples/Gallery/Pages/PathMeasurementPage.fs similarity index 96% rename from samples/RenderDemo/PathMeasurementPage.fs rename to samples/Gallery/Pages/PathMeasurementPage.fs index e1814f032..e7b9c4fac 100644 --- a/samples/RenderDemo/PathMeasurementPage.fs +++ b/samples/Gallery/Pages/PathMeasurementPage.fs @@ -1,4 +1,4 @@ -namespace RenderDemo +namespace Gallery open Avalonia open Avalonia.Controls @@ -91,7 +91,7 @@ module PathMeasurementBuilders = type Fabulous.Avalonia.View with static member PathMeasurement() = - WidgetBuilder<'msg, IFabPathMeasurement>(PathMeasurement.WidgetKey, AttributesBundle(StackList.empty(), ValueNone, ValueNone)) + WidgetBuilder<'msg, IFabPathMeasurement>(PathMeasurement.WidgetKey) module PathMeasurementPage = let view () = Grid() { View.PathMeasurement() } diff --git a/samples/Gallery/Pages/Pointers/PointerCanvasTab.fs b/samples/Gallery/Pages/Pointers/PointerCanvasTab.fs index 56ff236f5..71df01c09 100644 --- a/samples/Gallery/Pages/Pointers/PointerCanvasTab.fs +++ b/samples/Gallery/Pages/Pointers/PointerCanvasTab.fs @@ -221,7 +221,7 @@ module PointerCanvas = Attributes.defineAvaloniaPropertyWithEquality PointerCanvas.ThreadSleepProperty let StatusChanged = - Attributes.defineEvent "PointerCanvas_StatusChanged" (fun target -> (target :?> PointerCanvas).StatusChanged) + Attributes.Mvu.defineEvent "PointerCanvas_StatusChanged" (fun target -> (target :?> PointerCanvas).StatusChanged) [] module PointerCanvasTabBuilders = diff --git a/samples/Gallery/Pages/Pointers/PointerContactsTab.fs b/samples/Gallery/Pages/Pointers/PointerContactsTab.fs index 7f9139711..d648255c4 100644 --- a/samples/Gallery/Pages/Pointers/PointerContactsTab.fs +++ b/samples/Gallery/Pages/Pointers/PointerContactsTab.fs @@ -106,4 +106,4 @@ module PointerContactsTabBuilders = type Fabulous.Avalonia.View with static member PointerContactsTab() = - WidgetBuilder<'msg, IFabPointerContacts>(PointerContacts.WidgetKey, AttributesBundle(StackList.empty(), ValueNone, ValueNone)) + WidgetBuilder<'msg, IFabPointerContacts>(PointerContacts.WidgetKey) diff --git a/samples/Gallery/Pages/PopupPage.fs b/samples/Gallery/Pages/PopupPage.fs index 30e089045..9aecc3eed 100644 --- a/samples/Gallery/Pages/PopupPage.fs +++ b/samples/Gallery/Pages/PopupPage.fs @@ -1,5 +1,6 @@ namespace Gallery +open System open System.Diagnostics open Avalonia open Avalonia.Controls @@ -38,6 +39,26 @@ module PopupPage = #endif ) + let customPlacementCallback (placement: CustomPopupPlacement) = + let r = Random().Next() + + placement.Anchor <- + match r % 4 with + | 1 -> PopupAnchor.Top + | 2 -> PopupAnchor.Bottom + | 3 -> PopupAnchor.Left + | _ -> PopupAnchor.Right + + placement.Gravity <- + match r % 4 with + | 1 -> PopupGravity.Top + | 2 -> PopupGravity.Bottom + | 3 -> PopupGravity.Left + | _ -> PopupGravity.Right + + placement.Offset <- Point(float(r % 20), float(r % 20)) + + let view () = Component("PopupPage") { let! model = Context.Mvu program @@ -61,7 +82,8 @@ module PopupPage = ) .onOpened(OnOpened) .onClosed(OnClosed) - .placement(PlacementMode.Bottom) + .placement(PlacementMode.Custom) + .customPopupPlacementCallback(customPlacementCallback) .placementGravity(PopupGravity.Bottom) .placementAnchor(PopupAnchor.Bottom) .placementConstraintAdjustment(PopupPositionerConstraintAdjustment.FlipY) diff --git a/samples/RenderDemo/RenderTargetBitmapPage.fs b/samples/Gallery/Pages/RenderTargetBitmapPage.fs similarity index 94% rename from samples/RenderDemo/RenderTargetBitmapPage.fs rename to samples/Gallery/Pages/RenderTargetBitmapPage.fs index 4680f03e3..9956cbcb9 100644 --- a/samples/RenderDemo/RenderTargetBitmapPage.fs +++ b/samples/Gallery/Pages/RenderTargetBitmapPage.fs @@ -1,4 +1,4 @@ -namespace RenderDemo +namespace Gallery open System.Diagnostics open Avalonia @@ -58,7 +58,7 @@ module RenderTargetBitmapBuilders = type Fabulous.Avalonia.View with static member RenderTargetBitmap() = - WidgetBuilder<'msg, IFabRenderTargetBitmap>(RenderTargetBitmap.WidgetKey, AttributesBundle(StackList.empty(), ValueNone, ValueNone)) + WidgetBuilder<'msg, IFabRenderTargetBitmap>(RenderTargetBitmap.WidgetKey) module RenderTargetBitmapPage = let view () = Grid() { View.RenderTargetBitmap() } diff --git a/samples/RenderDemo/Animations/RenderTransformPage.fs b/samples/Gallery/Pages/RenderTransformPage.fs similarity index 97% rename from samples/RenderDemo/Animations/RenderTransformPage.fs rename to samples/Gallery/Pages/RenderTransformPage.fs index 4f05d32ca..c079274f4 100644 --- a/samples/RenderDemo/Animations/RenderTransformPage.fs +++ b/samples/Gallery/Pages/RenderTransformPage.fs @@ -1,4 +1,4 @@ -namespace RenderDemo +namespace Gallery open System open Avalonia.Media @@ -13,7 +13,7 @@ module RenderTransformPage = let borderTestStyle (this: WidgetBuilder<'msg, IFabBorder>) = this .child( - Image("avares://RenderDemo/Assets/Icons/fabulous-icon.png", Stretch.UniformToFill) + Image("avares://Gallery/Assets/Icons/fabulous-icon.png", Stretch.UniformToFill) .margin(5) ) .size(200., 200.) diff --git a/samples/RenderDemo/Animations/SlidingAnimation.fs b/samples/Gallery/Pages/SlidingAnimation.fs similarity index 99% rename from samples/RenderDemo/Animations/SlidingAnimation.fs rename to samples/Gallery/Pages/SlidingAnimation.fs index bbb8f69ba..8edae485d 100644 --- a/samples/RenderDemo/Animations/SlidingAnimation.fs +++ b/samples/Gallery/Pages/SlidingAnimation.fs @@ -1,4 +1,4 @@ -namespace RenderDemo +namespace Gallery open System open System.Numerics diff --git a/samples/RenderDemo/Animations/SpringAnimationsPage.fs b/samples/Gallery/Pages/SpringAnimationsPage.fs similarity index 91% rename from samples/RenderDemo/Animations/SpringAnimationsPage.fs rename to samples/Gallery/Pages/SpringAnimationsPage.fs index 574e65013..fa62d88df 100644 --- a/samples/RenderDemo/Animations/SpringAnimationsPage.fs +++ b/samples/Gallery/Pages/SpringAnimationsPage.fs @@ -1,4 +1,4 @@ -namespace RenderDemo +namespace Gallery open System open Avalonia.Animation @@ -13,7 +13,7 @@ module SpringAnimationsPage = let borderTestStyle (this: WidgetBuilder<'msg, IFabBorder>) = this .child( - Image("avares://RenderDemo/Assets/Icons/fabulous-icon.png", Stretch.UniformToFill) + Image("avares://Gallery/Assets/Icons/fabulous-icon.png", Stretch.UniformToFill) .margin(5) ) .size(200., 200.) diff --git a/samples/RenderDemo/TextFormatterPage.fs b/samples/Gallery/Pages/TextFormatterPage.fs similarity index 96% rename from samples/RenderDemo/TextFormatterPage.fs rename to samples/Gallery/Pages/TextFormatterPage.fs index 549925f53..c2019087b 100644 --- a/samples/RenderDemo/TextFormatterPage.fs +++ b/samples/Gallery/Pages/TextFormatterPage.fs @@ -1,4 +1,4 @@ -namespace RenderDemo +namespace Gallery open System open Avalonia @@ -86,7 +86,7 @@ module TextFormatterBuilders = type Fabulous.Avalonia.View with static member TextFormatter() = - WidgetBuilder<'msg, IFabTextFormatterControl>(TextFormatter.WidgetKey, AttributesBundle(StackList.empty(), ValueNone, ValueNone)) + WidgetBuilder<'msg, IFabTextFormatterControl>(TextFormatter.WidgetKey) module TextFormatterPage = let view () = Grid() { View.TextFormatter() } diff --git a/samples/Gallery/Pages/TimePickerPage.fs b/samples/Gallery/Pages/TimePickerPage.fs new file mode 100644 index 000000000..35a20785b --- /dev/null +++ b/samples/Gallery/Pages/TimePickerPage.fs @@ -0,0 +1,61 @@ +namespace Gallery + +open System +open System.Diagnostics +open Fabulous +open Fabulous.Avalonia + +open type Fabulous.Avalonia.View + +module TimePickerPage = + type Model = { Time: TimeSpan } + + type Msg = TimeChanged of TimeSpan + + let init () = { Time = TimeSpan.FromHours(12.) } + + let update msg model = + match msg with + | TimeChanged time -> { model with Time = time } + + let program = + Program.stateful init update + |> Program.withTrace(fun (format, args) -> Debug.WriteLine(format, box args)) + |> Program.withExceptionHandler(fun ex -> +#if DEBUG + printfn $"Exception: %s{ex.ToString()}" + false +#else + true +#endif + ) + + let view () = + Component("TimePickerPage") { + let! model = Context.Mvu program + + VStack(16.) { + TextBlock($"Selected Time: {model.Time}") + + TimePicker(model.Time, TimeChanged) + + TextBlock("TimePicker with seconds:") + + TimePicker(model.Time, TimeChanged).useSeconds(true) + + TextBlock("TimePicker with 24-hour clock:") + + TimePicker(model.Time, TimeChanged).use24HourClock(true) + + TextBlock("TimePicker with seconds and 24-hour clock:") + + TimePicker(model.Time, TimeChanged) + .useSeconds(true) + .use24HourClock(true) + + TextBlock("TimePicker with 10-second increments:") + + TimePicker(model.Time, TimeChanged).secondIncrement(10) + } + |> _.centerHorizontal() + } diff --git a/samples/Gallery/Pages/ToolTipPage.fs b/samples/Gallery/Pages/ToolTipPage.fs index 8a225733e..33ad51372 100644 --- a/samples/Gallery/Pages/ToolTipPage.fs +++ b/samples/Gallery/Pages/ToolTipPage.fs @@ -1,37 +1,103 @@ namespace Gallery +open System +open Avalonia +open Avalonia.Controls.Primitives.PopupPositioning +open Avalonia.Interactivity open Avalonia.Media open Avalonia.Controls open Fabulous.Avalonia +open Fabulous + open type Fabulous.Avalonia.View module ToolTipPage = + type Model = { IsOpen: bool } + + type Msg = OnLoaded of RoutedEventArgs + + let init () = { IsOpen = false } + + let targetRef = ViewRef() + + let update msg model = + match msg with + | OnLoaded _ -> + ToolTip.AddToolTipOpeningHandler(targetRef.Value, (fun sender args -> printfn "Opening")) + ToolTip.AddToolTipClosingHandler(targetRef.Value, (fun sender args -> printfn "Closing")) + model + + let program = + Program.stateful init update + |> Program.withTrace(fun (format, args) -> System.Diagnostics.Debug.WriteLine(format, box args)) + |> Program.withExceptionHandler(fun ex -> +#if DEBUG + printfn $"Exception: %s{ex.ToString()}" + false +#else + true +#endif + ) + + + let customPlacementCallback (placement: CustomPopupPlacement) = + let r = Random().Next() + + placement.Anchor <- + match r % 4 with + | 1 -> PopupAnchor.Top + | 2 -> PopupAnchor.Bottom + | 3 -> PopupAnchor.Left + | _ -> PopupAnchor.Right + + placement.Gravity <- + match r % 4 with + | 1 -> PopupGravity.Top + | 2 -> PopupGravity.Bottom + | 3 -> PopupGravity.Left + | _ -> PopupGravity.Right + + placement.Offset <- Point(float(r % 20), float(r % 20)) + let view () = - VStack(spacing = 15.) { - Border(TextBlock("Hover over me!")) - .padding(10.) - .background(SolidColorBrush(Colors.LightGray)) - .tip(ToolTip("Im a tooltip!")) - - Border(TextBlock("Hover over me!")) - .padding(10.) - .background(SolidColorBrush(Colors.LightGray)) - .tip(ToolTip("Im a tooltip!").isOpen(true)) - .tooltipPlacement(PlacementMode.Top) - - - Border(TextBlock("Hover over me!")) - .padding(10.) - .background(SolidColorBrush(Colors.LightGray)) - .tip( - ToolTip( - VStack() { - TextBlock("ToolTip") - TextBlock("A control which pops up a hint when a control is hovered") - } + Component("ToolTipPage") { + let! _ = Context.Mvu program + + VStack(spacing = 15.) { + Border(TextBlock("Hover over me!")) + .padding(10.) + .background(SolidColorBrush(Colors.LightGray)) + .tip(ToolTip("Im a tooltip!")) + .reference(targetRef) + + Border(TextBlock("Hover over me!")) + .padding(10.) + .background(SolidColorBrush(Colors.LightGray)) + .tip(ToolTip("Im a tooltip!").isOpen(true)) + .tooltipPlacement(PlacementMode.Top) + + + Border(TextBlock("Hover over me!")) + .padding(10.) + .background(SolidColorBrush(Colors.LightGray)) + .tip( + ToolTip( + VStack() { + TextBlock("ToolTip") + TextBlock("A control which pops up a hint when a control is hovered") + } + ) ) - ) - .tooltipShowDelay(1000) - .tooltipHorizontalOffset(50.) - .tooltipVerticalOffset(50.) + .tooltipShowDelay(1000) + .tooltipHorizontalOffset(50.) + .tooltipVerticalOffset(50.) + + Border(TextBlock("ToolTip custom placement")) + .padding(10.) + .background(SolidColorBrush(Colors.LightGray)) + .tooltipCustomPopupPlacementCallback(customPlacementCallback) + .tooltipPlacement(PlacementMode.Custom) + .tip("Custom positioned tooltip") + } + |> _.onLoaded(OnLoaded) } diff --git a/samples/RenderDemo/Transform3DPage.fs b/samples/Gallery/Pages/Transform3DPage.fs similarity index 96% rename from samples/RenderDemo/Transform3DPage.fs rename to samples/Gallery/Pages/Transform3DPage.fs index 18b7bfdab..fe6ca1bb9 100644 --- a/samples/RenderDemo/Transform3DPage.fs +++ b/samples/Gallery/Pages/Transform3DPage.fs @@ -1,4 +1,4 @@ -namespace RenderDemo +namespace Gallery open System.Diagnostics open Avalonia @@ -48,7 +48,7 @@ module Transform3DPage = let borderTestStyle (this: WidgetBuilder<'msg, IFabBorder>) = this .child( - Image("avares://RenderDemo/Assets/Icons/fabulous-icon.png", Stretch.UniformToFill) + Image("avares://Gallery/Assets/Icons/fabulous-icon.png", Stretch.UniformToFill) .margin(5) ) .size(200., 200.) diff --git a/samples/RenderDemo/TransitionsPage.fs b/samples/Gallery/Pages/TransitionsPage.fs similarity index 98% rename from samples/RenderDemo/TransitionsPage.fs rename to samples/Gallery/Pages/TransitionsPage.fs index 0b114e490..8247fa3da 100644 --- a/samples/RenderDemo/TransitionsPage.fs +++ b/samples/Gallery/Pages/TransitionsPage.fs @@ -1,4 +1,4 @@ -namespace RenderDemo +namespace Gallery open System open Avalonia @@ -137,7 +137,7 @@ module TransitionsPage = }) .clipToBounds(false) ) - .styleInclude([ "avares://RenderDemo/Styles/Transitions.xaml" ]) + .styleInclude([ "avares://Gallery/Styles/Transitions.xaml" ]) }) .horizontalAlignment(HorizontalAlignment.Center) diff --git a/samples/RenderDemo/Animations/Vector3KeyFrameAnimation.fs b/samples/Gallery/Pages/Vector3KeyFrameAnimation.fs similarity index 99% rename from samples/RenderDemo/Animations/Vector3KeyFrameAnimation.fs rename to samples/Gallery/Pages/Vector3KeyFrameAnimation.fs index f147a61ae..798f65dda 100644 --- a/samples/RenderDemo/Animations/Vector3KeyFrameAnimation.fs +++ b/samples/Gallery/Pages/Vector3KeyFrameAnimation.fs @@ -1,4 +1,4 @@ -namespace RenderDemo +namespace Gallery open System open System.Diagnostics diff --git a/samples/RenderDemo/WriteableBitmapPage.fs b/samples/Gallery/Pages/WriteableBitmapPage.fs similarity index 96% rename from samples/RenderDemo/WriteableBitmapPage.fs rename to samples/Gallery/Pages/WriteableBitmapPage.fs index 4c1a11fcd..1412173c8 100644 --- a/samples/RenderDemo/WriteableBitmapPage.fs +++ b/samples/Gallery/Pages/WriteableBitmapPage.fs @@ -1,4 +1,4 @@ -namespace RenderDemo +namespace Gallery open System.Diagnostics open System.Runtime.InteropServices @@ -90,7 +90,7 @@ module WriteableBitmapBuilders = type Fabulous.Avalonia.View with static member WriteableBitmap() = - WidgetBuilder<'msg, IFabWriteableBitmap>(WriteableBitmap.WidgetKey, AttributesBundle(StackList.empty(), ValueNone, ValueNone)) + WidgetBuilder<'msg, IFabWriteableBitmap>(WriteableBitmap.WidgetKey) module WriteableBitmapPage = diff --git a/samples/Gallery/Platform/iOS/AppDelegate.fs b/samples/Gallery/Platform/iOS/AppDelegate.fs index c82c340e1..b0731e09a 100644 --- a/samples/Gallery/Platform/iOS/AppDelegate.fs +++ b/samples/Gallery/Platform/iOS/AppDelegate.fs @@ -1,20 +1,16 @@ namespace Gallery.iOS +open Avalonia +open Avalonia.iOS +open Fabulous.Avalonia open Foundation +open Gallery open UIKit [] type AppDelegate() = - inherit UIResponder() - - interface IUIApplicationDelegate - - [] - member this.FinishedLaunching(_: UIApplication, _: NSDictionary) : bool = true - - [] - member this.GetConfiguration(_: UIApplication, sceneSession: UISceneSession, _: UISceneConnectionOptions) = - UISceneConfiguration.Create("Default Configuration", sceneSession.Role) + inherit AvaloniaAppDelegate() + override this.CreateAppBuilder() = MainView.create().UseiOS() module Main = [] diff --git a/samples/Gallery/Platform/iOS/Info.plist b/samples/Gallery/Platform/iOS/Info.plist index 67aee7645..92cf8a8a4 100644 --- a/samples/Gallery/Platform/iOS/Info.plist +++ b/samples/Gallery/Platform/iOS/Info.plist @@ -43,24 +43,7 @@ UIViewControllerBasedStatusBarAppearance - UIApplicationSceneManifest - - UIApplicationSupportsMultipleScenes - - UISceneConfigurations - - UIWindowSceneSessionRoleApplication - - - UISceneConfigurationName - Default Configuration - UISceneDelegateClassName - SceneDelegate - - - - CFBundleExecutable - + diff --git a/samples/Gallery/Platform/iOS/SceneDelegate.fs b/samples/Gallery/Platform/iOS/SceneDelegate.fs deleted file mode 100644 index 84b527bfa..000000000 --- a/samples/Gallery/Platform/iOS/SceneDelegate.fs +++ /dev/null @@ -1,38 +0,0 @@ -namespace Gallery.iOS - -open Foundation -open Fabulous.Avalonia -open Gallery -open UIKit - -[] -type SceneDelegate() = - inherit UIWindowSceneDelegate() - - override val Window = null with get, set - - override this.WillConnect(scene: UIScene, _: UISceneSession, _: UISceneConnectionOptions) = - MainView.create().UseiOS(this, scene :?> UIWindowScene) |> ignore - - /// Called as the scene is being released by the system. - /// This occurs shortly after the scene enters the background, or when its session is discarded. - /// Release any resources associated with this scene that can be re-created the next time the scene connects. - /// The scene may re-connect later, as its session was not necessarily discarded (see UIApplicationDelegate `DidDiscardSceneSessions` instead). - override _.DidDisconnect(_: UIScene) = () - - /// Called when the scene has moved from an inactive state to an active state. - /// Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive. - override _.DidBecomeActive(_: UIScene) = () - - /// Called when the scene will move from an active state to an inactive state. - /// This may occur due to temporary interruptions (ex. an incoming phone call). - override _.WillResignActive(_: UIScene) = () - - /// Called as the scene transitions from the background to the foreground. - /// Use this method to undo the changes made on entering the background. - override _.WillEnterForeground(_: UIScene) = () - - /// Called as the scene transitions from the foreground to the background. - /// Use this method to save data, release shared resources, and store enough scene-specific state information - /// to restore the scene back to its current state. - override _.DidEnterBackground(_: UIScene) = () diff --git a/samples/RenderDemo/Styles/Animations.xaml b/samples/Gallery/Styles/Animations.xaml similarity index 99% rename from samples/RenderDemo/Styles/Animations.xaml rename to samples/Gallery/Styles/Animations.xaml index 274afa89c..a08daf649 100644 --- a/samples/RenderDemo/Styles/Animations.xaml +++ b/samples/Gallery/Styles/Animations.xaml @@ -228,7 +228,7 @@ PlaybackDirection="Normal"> - + @@ -236,7 +236,7 @@ - + @@ -244,7 +244,7 @@ - + @@ -252,7 +252,7 @@ - + @@ -260,7 +260,7 @@ - + diff --git a/samples/RenderDemo/Styles/Transitions.xaml b/samples/Gallery/Styles/Transitions.xaml similarity index 98% rename from samples/RenderDemo/Styles/Transitions.xaml rename to samples/Gallery/Styles/Transitions.xaml index 92e02a685..1151f4569 100644 --- a/samples/RenderDemo/Styles/Transitions.xaml +++ b/samples/Gallery/Styles/Transitions.xaml @@ -183,7 +183,7 @@ - + @@ -192,7 +192,7 @@ - - - - - - diff --git a/samples/RenderDemo.Android/SplashActivity.fs b/samples/RenderDemo.Android/SplashActivity.fs deleted file mode 100644 index 9ae8b0f73..000000000 --- a/samples/RenderDemo.Android/SplashActivity.fs +++ /dev/null @@ -1,12 +0,0 @@ -namespace RenderDemo.Android - -open Android.App -open Android.Content - -[] -type SplashActivity() = - inherit Activity() - - override this.OnResume() = - base.OnResume() - this.StartActivity(new Intent(Application.Context, typeof)) diff --git a/samples/RenderDemo.Browser/Program.fs b/samples/RenderDemo.Browser/Program.fs deleted file mode 100644 index 57ece54c7..000000000 --- a/samples/RenderDemo.Browser/Program.fs +++ /dev/null @@ -1,27 +0,0 @@ -namespace RenderDemo.Browser - -open System.Diagnostics -open System.Runtime.Versioning -open Avalonia -open Avalonia.Browser -open Avalonia.Logging -open RenderDemo - - -module Program = - [] - do () - - [] - let buildAvaloniaApp () = MainView.create() - - [] - let main argv = - Trace.Listeners.Add(new ConsoleTraceListener()) |> ignore - - buildAvaloniaApp() - .LogToTrace(LogEventLevel.Warning) - .StartBrowserAppAsync("out", BrowserPlatformOptions()) - |> ignore - - 0 diff --git a/samples/RenderDemo.Browser/Properties/launchSettings.json b/samples/RenderDemo.Browser/Properties/launchSettings.json deleted file mode 100644 index c98f7c2b0..000000000 --- a/samples/RenderDemo.Browser/Properties/launchSettings.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "profiles": { - "RenderDemo.Browser": { - "commandName": "Project", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "https://localhost:5001;http://localhost:5000", - "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/debug?browser={browserInspectUri}" - } - } -} \ No newline at end of file diff --git a/samples/RenderDemo.Browser/RenderDemo.Browser.fsproj b/samples/RenderDemo.Browser/RenderDemo.Browser.fsproj deleted file mode 100644 index 7c90cbd28..000000000 --- a/samples/RenderDemo.Browser/RenderDemo.Browser.fsproj +++ /dev/null @@ -1,17 +0,0 @@ - - - Exe - net8.0-browser - false - true - true - 5 - - - - - - - - - diff --git a/samples/RenderDemo.Browser/runtimeconfig.template.json b/samples/RenderDemo.Browser/runtimeconfig.template.json deleted file mode 100644 index c6990ba79..000000000 --- a/samples/RenderDemo.Browser/runtimeconfig.template.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "wasmHostProperties": { - "perHostConfig": [ - { - "name": "browser", - "html-path": "index.html", - "Host": "browser" - } - ] - } -} \ No newline at end of file diff --git a/samples/RenderDemo.Browser/wwwroot/Logo.svg b/samples/RenderDemo.Browser/wwwroot/Logo.svg deleted file mode 100644 index 9685a23af..000000000 --- a/samples/RenderDemo.Browser/wwwroot/Logo.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/samples/RenderDemo.Browser/wwwroot/app.css b/samples/RenderDemo.Browser/wwwroot/app.css deleted file mode 100644 index 4fb071b52..000000000 --- a/samples/RenderDemo.Browser/wwwroot/app.css +++ /dev/null @@ -1,58 +0,0 @@ -/* HTML styles for the splash screen */ -.avalonia-splash { - position: absolute; - height: 100%; - width: 100%; - background: white; - font-family: 'Outfit', sans-serif; - justify-content: center; - align-items: center; - display: flex; - pointer-events: none; -} - -/* Light theme styles */ -@media (prefers-color-scheme: light) { - .avalonia-splash { - background: white; - } - - .avalonia-splash h2 { - color: #1b2a4e; - } - - .avalonia-splash a { - color: #0D6EFD; - } -} - -@media (prefers-color-scheme: dark) { - .avalonia-splash { - background: #1b2a4e; - } - - .avalonia-splash h2 { - color: white; - } - - .avalonia-splash a { - color: white; - } -} - -.avalonia-splash h2 { - font-weight: 400; - font-size: 1.5rem; -} - -.avalonia-splash a { - text-decoration: none; - font-size: 2.5rem; - display: block; -} - -.avalonia-splash.splash-close { - transition: opacity 200ms, display 200ms; - display: none; - opacity: 0; -} \ No newline at end of file diff --git a/samples/RenderDemo.Browser/wwwroot/favicon.ico b/samples/RenderDemo.Browser/wwwroot/favicon.ico deleted file mode 100644 index da8d49ff9b94e52778f5324a1b87dd443a698b57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 176111 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 zds⪻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

r@R8DskCg$QY%d=x6zD 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

!LxQh!NmF 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 - - - - RenderDemo.Browser - - - - - - -
-
-

- Powered by - - - - - - - - - - - - - - -

-
-
- - - - diff --git a/samples/RenderDemo.Browser/wwwroot/main.js b/samples/RenderDemo.Browser/wwwroot/main.js deleted file mode 100644 index f4ea6ae1d..000000000 --- a/samples/RenderDemo.Browser/wwwroot/main.js +++ /dev/null @@ -1,13 +0,0 @@ -import { dotnet } from './_framework/dotnet.js' - -const is_browser = typeof window != "undefined"; -if (!is_browser) throw new Error(`Expected to be running in a browser`); - -const dotnetRuntime = await dotnet - .withDiagnosticTracing(false) - .withApplicationArgumentsFromQuery() - .create(); - -const config = dotnetRuntime.getConfig(); - -await dotnetRuntime.runMain(config.mainAssemblyName, [globalThis.location.href]); \ No newline at end of file diff --git a/samples/RenderDemo.Desktop/Program.fs b/samples/RenderDemo.Desktop/Program.fs deleted file mode 100644 index bacc84d8a..000000000 --- a/samples/RenderDemo.Desktop/Program.fs +++ /dev/null @@ -1,17 +0,0 @@ -namespace RenderDemo.Desktop - -open System -open Avalonia -open RenderDemo - -module Program = - // Initialization code. Don't use any Avalonia, third-party APIs or any - // SynchronizationContext-reliant code before AppMain is called: things aren't initialized - // yet and stuff might break. - [] - let Main (args: string array) = - MainWindow - .create() - .UsePlatformDetect() - .LogToTrace(?level = None) - .StartWithClassicDesktopLifetime(args) diff --git a/samples/RenderDemo.Desktop/RenderDemo.Desktop.fsproj b/samples/RenderDemo.Desktop/RenderDemo.Desktop.fsproj deleted file mode 100644 index b7b293146..000000000 --- a/samples/RenderDemo.Desktop/RenderDemo.Desktop.fsproj +++ /dev/null @@ -1,21 +0,0 @@ - - - WinExe - net8.0 - - copyused - true - - - - - - - - - - - - diff --git a/samples/RenderDemo.iOS/AppDelegate.fs b/samples/RenderDemo.iOS/AppDelegate.fs deleted file mode 100644 index 4bf922611..000000000 --- a/samples/RenderDemo.iOS/AppDelegate.fs +++ /dev/null @@ -1,23 +0,0 @@ -namespace RenderDemo.iOS - -open Foundation -open UIKit - -[] -type AppDelegate() = - inherit UIResponder() - - interface IUIApplicationDelegate - - [] - member this.FinishedLaunching(_: UIApplication, _: NSDictionary) : bool = true - - [] - member this.GetConfiguration(_: UIApplication, sceneSession: UISceneSession, _: UISceneConnectionOptions) = - UISceneConfiguration.Create("Default Configuration", sceneSession.Role) - -module Main = - [] - let main (args: string array) = - UIApplication.Main(args, null, typeof) - 0 diff --git a/samples/RenderDemo.iOS/Entitlements.plist b/samples/RenderDemo.iOS/Entitlements.plist deleted file mode 100644 index 0c67376eb..000000000 --- a/samples/RenderDemo.iOS/Entitlements.plist +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/samples/RenderDemo.iOS/Info.plist b/samples/RenderDemo.iOS/Info.plist deleted file mode 100644 index ae647ee8a..000000000 --- a/samples/RenderDemo.iOS/Info.plist +++ /dev/null @@ -1,64 +0,0 @@ - - - - - CFBundleDisplayName - MyApp - CFBundleIdentifier - AppIdentifier.RenderDemo - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1.0 - LSRequiresIPhoneOS - - MinimumOSVersion - 13.0 - UIDeviceFamily - - 1 - 2 - - UILaunchStoryboardName - LaunchScreen - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIStatusBarHidden - - UIViewControllerBasedStatusBarAppearance - - UIApplicationSceneManifest - - UIApplicationSupportsMultipleScenes - - UISceneConfigurations - - UIWindowSceneSessionRoleApplication - - - UISceneConfigurationName - Default Configuration - UISceneDelegateClassName - SceneDelegate - - - - - - diff --git a/samples/RenderDemo.iOS/RenderDemo.iOS.fsproj b/samples/RenderDemo.iOS/RenderDemo.iOS.fsproj deleted file mode 100644 index 3dc2c86f6..000000000 --- a/samples/RenderDemo.iOS/RenderDemo.iOS.fsproj +++ /dev/null @@ -1,28 +0,0 @@ - - - Exe - net8.0-ios - 13.0 - - - - true - true - true - - - - - - - - - iPhone Developer - - - - - - - - diff --git a/samples/RenderDemo.iOS/Resources/LaunchScreen.xib b/samples/RenderDemo.iOS/Resources/LaunchScreen.xib deleted file mode 100644 index 302c003ab..000000000 --- a/samples/RenderDemo.iOS/Resources/LaunchScreen.xib +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/samples/RenderDemo.iOS/SceneDelegate.fs b/samples/RenderDemo.iOS/SceneDelegate.fs deleted file mode 100644 index f9a8c35f7..000000000 --- a/samples/RenderDemo.iOS/SceneDelegate.fs +++ /dev/null @@ -1,38 +0,0 @@ -namespace RenderDemo.iOS - -open Foundation -open Fabulous.Avalonia -open RenderDemo -open UIKit - -[] -type SceneDelegate() = - inherit UIWindowSceneDelegate() - - override val Window = null with get, set - - override this.WillConnect(scene: UIScene, _: UISceneSession, _: UISceneConnectionOptions) = - MainView.create().UseiOS(this, scene :?> UIWindowScene) |> ignore - - /// Called as the scene is being released by the system. - /// This occurs shortly after the scene enters the background, or when its session is discarded. - /// Release any resources associated with this scene that can be re-created the next time the scene connects. - /// The scene may re-connect later, as its session was not necessarily discarded (see UIApplicationDelegate `DidDiscardSceneSessions` instead). - override _.DidDisconnect(_: UIScene) = () - - /// Called when the scene has moved from an inactive state to an active state. - /// Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive. - override _.DidBecomeActive(_: UIScene) = () - - /// Called when the scene will move from an active state to an inactive state. - /// This may occur due to temporary interruptions (ex. an incoming phone call). - override _.WillResignActive(_: UIScene) = () - - /// Called as the scene transitions from the background to the foreground. - /// Use this method to undo the changes made on entering the background. - override _.WillEnterForeground(_: UIScene) = () - - /// Called as the scene transitions from the foreground to the background. - /// Use this method to save data, release shared resources, and store enough scene-specific state information - /// to restore the scene back to its current state. - override _.DidEnterBackground(_: UIScene) = () diff --git a/samples/RenderDemo/App.fs b/samples/RenderDemo/App.fs deleted file mode 100644 index 312394fd8..000000000 --- a/samples/RenderDemo/App.fs +++ /dev/null @@ -1,76 +0,0 @@ -namespace RenderDemo - -open Fabulous.Avalonia - -open type Fabulous.Avalonia.View - -[] -module App = - [] - type DetailPage = - | ImplicitAnimations - | DrawLineAnimation - | CompositorAnimations - | Animations - | SpringAnimations - | Transitions - | RenderTransform - | Brushes - | Clipping - | Drawing - | LineBounds - | Transform3D - | WritableBitmap - | RenderTargetBitmap - | PathMeasurement - | CustomAnimator - | GlyphRun - | FormattedText - | TextFormatter - - [] - let (|CurrentPage|_|) page = - match page with - | "Implicit Animations" -> ValueSome ImplicitAnimations - | "Draw Line Animation" -> ValueSome DrawLineAnimation - | "Compositor Animations" -> ValueSome CompositorAnimations - | "Animations" -> ValueSome Animations - | "Spring Animations" -> ValueSome SpringAnimations - | "Transitions" -> ValueSome Transitions - | "Render Transform" -> ValueSome RenderTransform - | "Brushes" -> ValueSome Brushes - | "Clipping" -> ValueSome Clipping - | "Drawing" -> ValueSome Drawing - | "Line Bounds" -> ValueSome LineBounds - | "Transform3D" -> ValueSome Transform3D - | "Writable Bitmap" -> ValueSome WritableBitmap - | "Render Target Bitmap" -> ValueSome RenderTargetBitmap - | "Path Measurement" -> ValueSome PathMeasurement - | "Custom Animator" -> ValueSome CustomAnimator - | "GlyphRun" -> ValueSome GlyphRun - | "FormattedText" -> ValueSome FormattedText - | "TextFormatter" -> ValueSome TextFormatter - | _ -> ValueNone - - [] - let (|CurrentWidget|_|) page = - match page with - | ImplicitAnimations -> ValueSome(AnyView(ImplicitCanvasAnimationsPage.view())) - | DrawLineAnimation -> ValueSome(AnyView(DrawLineAnimationPage.view())) - | CompositorAnimations -> ValueSome(AnyView(CompositorAnimationsPage.view())) - | Animations -> ValueSome(AnyView(AnimationsPage.view())) - | SpringAnimations -> ValueSome(AnyView(SpringAnimationsPage.view())) - | Transitions -> ValueSome(AnyView(TransitionsPage.view())) - | RenderTransform -> ValueSome(AnyView(RenderTransformPage.view())) - | Brushes -> ValueSome(AnyView(BrushesPage.view())) - | Clipping -> ValueSome(AnyView(ClippingPage.view())) - | Drawing -> ValueSome(AnyView(DrawingPage.view())) - | LineBounds -> ValueSome(AnyView(LineBoundsPage.view())) - | Transform3D -> ValueSome(AnyView(Transform3DPage.view())) - | WritableBitmap -> ValueSome(AnyView(WriteableBitmapPage.view())) - | RenderTargetBitmap -> ValueSome(AnyView(RenderTargetBitmapPage.view())) - | PathMeasurement -> ValueSome(AnyView(PathMeasurementPage.view())) - | CustomAnimator -> ValueSome(AnyView(CustomAnimatorPage.view())) - | GlyphRun -> ValueSome(AnyView(GlyphRunPage.view())) - | FormattedText -> ValueSome(AnyView(FormattedTextPage.view())) - | TextFormatter -> ValueSome(AnyView(TextFormatterPage.view())) diff --git a/samples/RenderDemo/App.xaml b/samples/RenderDemo/App.xaml deleted file mode 100644 index 673993dd8..000000000 --- a/samples/RenderDemo/App.xaml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/samples/RenderDemo/Assets/Icons/avalonia-32.png b/samples/RenderDemo/Assets/Icons/avalonia-32.png deleted file mode 100644 index 7b443e7a250846dc898e6467cddeed8c55880766..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1322 zcmV+_1=aeAP)A zL5V<&1`?F`W{`LZcsE5cBpMzF4;mv6L;;~9STsnu#G;m4u_XwFBGRT;C>`6GUgn(T zL)$4c=S({l;{UQ|_FDV=|6Y6Tb=DCggsQrL1;9dJ29OIR^qV_@TA&g*4xAK`-bkN4 z9C5m;mZ)ljMvf*`-Kwf%?}yk>)mK&3GXmmJbg1eZ{m~l{d7`S8-Uo3gep1zxNXaLv zYSjZIAHbigniI+=A>>IwIZ!Z^$o9rgT58+rX!W5AiD_}9PaZ`|X5w)By8#r7NUKeN zsv5v|z%r+mmfzx!BR9Bs_y#St?T$}Rn>32TB~y5G>114PBbTZ98d$;Vp#KA9s55xh1snb zVql0XA`$Lr7fUu3F?C*+li3I4iAdc*oHjU-H`Lr_?|aAS_Vr+?iKSLxRCGuI{vMMb zK0ZUk2-=%=h?IY zi`~EzPRh&oS7NDYn_skkCi9*z44TU>OeecAopT4SaeU`R+nUNljsgG{8T7qa0_gPk zXlwS6nU~go-h*d9ZQcYM`MsF6BA5Jy*|vF4lb7b}cb%5ZFn}oo|JrZ=!;Uw1vwh<( zW-ZO<@uv%dM9f`1WPJjlXysJL`Q~em0&)x>8Nl1o#aATvT{Op4xk1SOI5BuQ<-fC&z>p5V$uYLPByp$*GA{ zp16$P^aoYHvq!3^ID9EAdG)bc&K+_VkT53JX<7~XdN>>AE`KbD+)@+MviN388T+;# zrTOMyiM?Id&f(9>`L^T)rsa?TLqJqD7H9y1I+mWUUfx>%DV|nu*isxDAA`$q)9W*X zY)MfmgjVRHRe3B}Z@b2pAtGJC?odl~Y!ok+tVCScA~7&_dAsp-`bPYsx)%e5ejCso zYRoU1!kTxMgP~zX432}pM*;&tL~atM8JV+eCL4CFC1G@I#3CZ87oiaV_z*bhHmSh z$FX-7ktX^Yl}~^N^O5O{ABXi&)f`p*LRC8-@RyQDRdXYjs;Wt<`dq)5v#Q$iA4n}# g?NZe;Rhb%7 diff --git a/samples/RenderDemo/Assets/Icons/fabulous-icon.png b/samples/RenderDemo/Assets/Icons/fabulous-icon.png deleted file mode 100644 index 6c7f63bb1d74710bc40478815573004ef26ec435..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3634 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 Ef5{DKL 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 Z4>z&QLAz{uxPt&_yePE-Vo4`frWyNFM+I diff --git a/samples/RenderDemo/Assets/Icons/github-icon.png b/samples/RenderDemo/Assets/Icons/github-icon.png deleted file mode 100644 index ed4f82f847472e8d6f681a05a3a6a2deb401e23f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17223 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 - args.Handled <- true - let control = args.Source :?> TextBlock - - let detailPage = - match control.Text with - | CurrentPage page -> Some page - | _ -> None - - { Details = detailPage }, Cmd.none - | GoBack -> { Details = None }, Cmd.none - - let controlNames = - [ "Implicit Animations" - "Draw Line Animation" - "Compositor Animations" - "Animations" - "Spring Animations" - "Transitions" - "Render Transform" - "Brushes" - "Clipping" - "Drawing" - "Line Bounds" - "Transform3D" - "Writable Bitmap" - "Render Target Bitmap" - "Path Measurement" - "Custom Animator" - "SkCanvas" - "GlyphRun" - "FormattedText" - "TextFormatter" ] - - let program = - Program.statefulWithCmd init update - |> Program.withTrace(fun (format, args) -> Debug.WriteLine(format, box args)) - |> Program.withExceptionHandler(fun ex -> -#if DEBUG - printfn $"Exception: %s{ex.ToString()}" - false -#else - true -#endif - ) - - let view () = - Component("MainView") { - let! model = Context.Mvu(program) - - SingleViewApplication() { - ScrollViewer( - match model.Details with - | Some(CurrentWidget page) -> - AnyView( - VStack(16.) { - Button("Go back", GoBack) - page - } - ) - | _ -> - AnyView( - Grid() { - UniformGrid(cols = 2, rows = 37) { - for i in 0 .. controlNames.Length - 1 do - CardItem(controlNames[i]) - .onTapped(SelectControl) - .gridRow(i / 2) - } - } - ) - ) - } - } - - let create () = - let theme () = - StyleInclude(baseUri = null, Source = Uri("avares://RenderDemo/App.xaml")) - - FabulousAppBuilder.Configure(theme, view) diff --git a/samples/RenderDemo/MainWindow.fs b/samples/RenderDemo/MainWindow.fs deleted file mode 100644 index 8cd28fe73..000000000 --- a/samples/RenderDemo/MainWindow.fs +++ /dev/null @@ -1,46 +0,0 @@ -namespace RenderDemo - -open Fabulous.Avalonia -open System -open Avalonia.Markup.Xaml.Styling - -open type Fabulous.Avalonia.View - -module MainWindow = - let view () = - DesktopApplication() { - Window() { - (HamburgerMenu() { - TabItem("Implicit Animations", ImplicitCanvasAnimationsPage.view()) - TabItem("Draw Line Animation", DrawLineAnimationPage.view()) - TabItem("Compositor Animations", CompositorAnimationsPage.view()) - TabItem("Animations", AnimationsPage.view()) - TabItem("Spring Animations", SpringAnimationsPage.view()) - TabItem("Transitions", TransitionsPage.view()) - TabItem("Render Transform", RenderTransformPage.view()) - TabItem("Brushes", BrushesPage.view()) - TabItem("Clipping", ClippingPage.view()) - TabItem("Drawing", DrawingPage.view()) - TabItem("Line Bounds", LineBoundsPage.view()) - TabItem("Transform3D", Transform3DPage.view()) - TabItem("Writable Bitmap", WriteableBitmapPage.view()) - TabItem("Render Target Bitmap", RenderTargetBitmapPage.view()) - TabItem("Path Measurement", PathMeasurementPage.view()) - TabItem("Custom Animator", CustomAnimatorPage.view()) - TabItem("SkCanvas", CustomSkiaPage.view()) - TabItem("GlyphRun", GlyphRunPage.view()) - TabItem("FormattedText", FormattedTextPage.view()) - TabItem("TextFormatter", TextFormatterPage.view()) - }) - .expandedModeThresholdWidth(760) - } -#if DEBUG - |> _.attachDevTools() -#endif - } - - let create () = - let theme () = - StyleInclude(baseUri = null, Source = Uri("avares://RenderDemo/App.xaml")) - - FabulousAppBuilder.Configure(theme, view) diff --git a/samples/RenderDemo/RenderDemo.fsproj b/samples/RenderDemo/RenderDemo.fsproj deleted file mode 100644 index 4fd25327d..000000000 --- a/samples/RenderDemo/RenderDemo.fsproj +++ /dev/null @@ -1,57 +0,0 @@ - - - net8.0 - false - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/samples/RenderDemo/Widgets.fs b/samples/RenderDemo/Widgets.fs deleted file mode 100644 index 514084850..000000000 --- a/samples/RenderDemo/Widgets.fs +++ /dev/null @@ -1,57 +0,0 @@ -namespace RenderDemo - -open System.Runtime.CompilerServices -open Avalonia.Media -open Controls.HamburgerMenu -open Fabulous -open Fabulous.Avalonia -open Fabulous.StackAllocatedCollections.StackList - -type IFabHamburgerMenu = - inherit IFabTabControl - -module HamburgerMenu = - let WidgetKey = Widgets.register() - - let PaneBackground = - Attributes.defineAvaloniaPropertyWithEquality HamburgerMenu.PaneBackgroundProperty - - let ContentBackground = - Attributes.defineAvaloniaPropertyWithEquality HamburgerMenu.ContentBackgroundProperty - - let ExpandedModeThresholdWidth = - Attributes.defineAvaloniaPropertyWithEquality HamburgerMenu.ExpandedModeThresholdWidthProperty - -[] -module HamburgerMenuBuilders = - - type Fabulous.Avalonia.View with - - static member HamburgerMenu() = - CollectionBuilder<'msg, IFabHamburgerMenu, IFabTabItem>(HamburgerMenu.WidgetKey, ItemsControl.Items) - - -type HamburgerMenuModifiers = - [] - static member inline reference(this: WidgetBuilder<'msg, IFabHamburgerMenu>, value: ViewRef) = - this.AddScalar(ViewRefAttributes.ViewRef.WithValue(value.Unbox)) - - [] - static member inline paneBackground(this: WidgetBuilder<'msg, #IFabHamburgerMenu>, value: IBrush) = - this.AddScalar(HamburgerMenu.PaneBackground.WithValue(value)) - - [] - static member inline contentBackground(this: WidgetBuilder<'msg, #IFabHamburgerMenu>, value: IBrush) = - this.AddScalar(HamburgerMenu.ContentBackground.WithValue(value)) - - [] - static member inline expandedModeThresholdWidth(this: WidgetBuilder<'msg, #IFabHamburgerMenu>, value: int) = - this.AddScalar(HamburgerMenu.ExpandedModeThresholdWidth.WithValue(value)) - -[] -module EmptyBorderBuilders = - type Fabulous.Avalonia.View with - - /// Creates an empty Border widget. - static member EmptyBorder() = - WidgetBuilder<'msg, IFabBorder>(Border.WidgetKey, AttributesBundle(StackList.empty(), ValueNone, ValueNone)) diff --git a/src/Fabulous.Avalonia.Tests/ViewHelperTests.fs b/src/Fabulous.Avalonia.Tests/ViewHelperTests.fs index 014746705..29702cafb 100644 --- a/src/Fabulous.Avalonia.Tests/ViewHelperTests.fs +++ b/src/Fabulous.Avalonia.Tests/ViewHelperTests.fs @@ -17,13 +17,15 @@ type ViewHelpers() = { Key = widgetKey ScalarAttributes = ValueNone WidgetAttributes = ValueNone - WidgetCollectionAttributes = ValueNone } + WidgetCollectionAttributes = ValueNone + EnvironmentAttributes = ValueNone } let curr: Widget = { Key = widgetKey ScalarAttributes = ValueNone WidgetAttributes = ValueNone - WidgetCollectionAttributes = ValueNone } + WidgetCollectionAttributes = ValueNone + EnvironmentAttributes = ValueNone } let actual = ViewHelpers.canReuseView prev curr @@ -42,7 +44,8 @@ type ViewHelpers() = Value = text NumericValue = 0uL } |] WidgetAttributes = ValueNone - WidgetCollectionAttributes = ValueNone } + WidgetCollectionAttributes = ValueNone + EnvironmentAttributes = ValueNone } let curr = { Key = TextBlock.WidgetKey @@ -51,7 +54,8 @@ type ViewHelpers() = WidgetCollectionAttributes = ValueSome [| { Key = TextBlock.Inlines.Key - Value = ArraySlice.emptyWithNull() } |] } + Value = ArraySlice.emptyWithNull() } |] + EnvironmentAttributes = ValueNone } let actual = ViewHelpers.canReuseView prev curr @@ -69,7 +73,8 @@ type ViewHelpers() = WidgetCollectionAttributes = ValueSome [| { Key = TextBlock.Inlines.Key - Value = ArraySlice.emptyWithNull() } |] } + Value = ArraySlice.emptyWithNull() } |] + EnvironmentAttributes = ValueNone } let curr = { Key = TextBlock.WidgetKey @@ -79,7 +84,8 @@ type ViewHelpers() = Value = text NumericValue = 0uL } |] WidgetAttributes = ValueNone - WidgetCollectionAttributes = ValueNone } + WidgetCollectionAttributes = ValueNone + EnvironmentAttributes = ValueNone } let actual = ViewHelpers.canReuseView prev curr diff --git a/src/Fabulous.Avalonia/AppBuilderExtensions.fs b/src/Fabulous.Avalonia/AppBuilderExtensions.fs index 616707186..e50d6d19e 100644 --- a/src/Fabulous.Avalonia/AppBuilderExtensions.fs +++ b/src/Fabulous.Avalonia/AppBuilderExtensions.fs @@ -24,7 +24,7 @@ type FabulousAppBuilder private () = Logger = logger Dispatch = ignore } - let envContext = new EnvironmentContext() + let envContext = new EnvironmentContext(logger) envContext.Set(EnvironmentKeys.Theme, app.ActualThemeVariant, false) let def = WidgetDefinitionStore.get widget.Key let node = def.AttachView(widget, envContext, treeContext, ValueNone, app) @@ -90,41 +90,3 @@ type FabulousAppBuilder private () = static member Configure(themeFn: unit -> #IStyle, program: Program>) = FabulousAppBuilder.Configure(themeFn, program, ()) - -#if IOS -open UIKit -open Avalonia.iOS - -type SingleViewLifetime() = - member val View: AvaloniaView = null with get, set - - interface Avalonia.Controls.ApplicationLifetimes.ISingleViewApplicationLifetime with - member this.MainView - with get () = this.View.Content - and set value = - if not(isNull this.View) then - this.View.Content <- value - -[] -module FabulousiOSAppBuilderExtensions = - type AppBuilder with - - member this.UseiOS(sceneDelegate: UIWindowSceneDelegate, scene: UIWindowScene) = - let lifetime = SingleViewLifetime() - - this - .UseiOS() - .AfterSetup(fun _ -> - let view = new AvaloniaView() - lifetime.View <- view - - let win = new UIWindow(WindowScene = scene) - - let controller = new DefaultAvaloniaViewController(View = view) - win.RootViewController <- controller - view.InitWithController(controller) - - sceneDelegate.Window <- win - win.MakeKeyAndVisible()) - .SetupWithLifetime(lifetime) -#endif diff --git a/src/Fabulous.Avalonia/Attributes.fs b/src/Fabulous.Avalonia/Attributes.fs index 3ff80eea7..f3ace7dcd 100644 --- a/src/Fabulous.Avalonia/Attributes.fs +++ b/src/Fabulous.Avalonia/Attributes.fs @@ -150,218 +150,6 @@ module Attributes = target.SetValue(property, value) |> ignore) - let inline defineAvaloniaPropertyWithChangedEvent<'modelType, 'valueType> - name - (property: AvaloniaProperty<'valueType>) - ([] convertToValue: 'modelType -> 'valueType) - ([] convertToModel: 'valueType -> 'modelType) - : SimpleScalarAttributeDefinition> = - - let key = - SimpleScalarAttributeDefinition.CreateAttributeData( - ScalarAttributeComparers.noCompare, - (fun oldValueOpt (newValueOpt: ValueEventData<'modelType, 'modelType> voption) node -> - let target = node.Target :?> AvaloniaObject - - // The attribute is no longer applied, so we clean up the event - match node.TryGetHandler(property.Name) with - | ValueNone -> () - | ValueSome handler -> handler.Dispose() - - match newValueOpt with - | ValueNone -> - match oldValueOpt with - | ValueNone -> () - | ValueSome _ -> target.ClearValue(property) - - | ValueSome curr -> - // Clean up the old event handler if any - match node.TryGetHandler(property.Name) with - | ValueNone -> () - | ValueSome handler -> handler.Dispose() - - // Set the new value - - match curr.Value with - | ValueNone -> () - | ValueSome v -> - let newValue = convertToValue v - target.SetValue(property, box newValue) |> ignore - - let event = property.Changed - // Set the new event handler - let disposable = - event.Subscribe(fun args -> - if args.Sender = target then - if args.NewValue.HasValue then - let args = args.NewValue.Value - let (MsgValue r) = curr.Event(convertToModel args) - Dispatcher.dispatch node r) - - node.SetHandler(property.Name, disposable)) - ) - |> AttributeDefinitionStore.registerScalar - - { Key = key; Name = name } - - let defineAvaloniaPropertyWithChangedEvent'<'T> name (property: AvaloniaProperty<'T>) : SimpleScalarAttributeDefinition> = - defineAvaloniaPropertyWithChangedEvent<'T, 'T> name property id id - - let defineAvaloniaPropertyWithChangedEventNoDispatch<'modelType, 'valueType> - name - (property: AvaloniaProperty<'valueType>) - (convertToValue: 'modelType -> 'valueType) - (convertToModel: 'valueType -> 'modelType) - : SimpleScalarAttributeDefinition> = - - let key = - SimpleScalarAttributeDefinition.CreateAttributeData( - ScalarAttributeComparers.noCompare, - (fun oldValueOpt (newValueOpt: ComponentValueEventData<'modelType, 'modelType> voption) node -> - let target = node.Target :?> AvaloniaObject - - // The attribute is no longer applied, so we clean up the event - match node.TryGetHandler(property.Name) with - | ValueNone -> () - | ValueSome handler -> handler.Dispose() - - match newValueOpt with - | ValueNone -> - match oldValueOpt with - | ValueNone -> () - | ValueSome _ -> target.ClearValue(property) - - | ValueSome curr -> - // Clean up the old event handler if any - match node.TryGetHandler(property.Name) with - | ValueNone -> () - | ValueSome handler -> handler.Dispose() - - // Set the new value - - match curr.Value with - | ValueNone -> () - | ValueSome v -> - let newValue = convertToValue v - target.SetValue(property, box newValue) |> ignore - - let event = property.Changed - // Set the new event handler - let disposable = - event.Subscribe(fun args -> - if args.Sender = target then - if args.NewValue.HasValue then - curr.Event(convertToModel args.NewValue.Value)) - - node.SetHandler(property.Name, disposable)) - ) - |> AttributeDefinitionStore.registerScalar - - { Key = key; Name = name } - - let defineAvaloniaPropertyWithChangedEventNoDispatch'<'T> - name - (property: AvaloniaProperty<'T>) - : SimpleScalarAttributeDefinition> = - defineAvaloniaPropertyWithChangedEventNoDispatch<'T, 'T> name property id id - - let defineRoutedEvent<'args when 'args :> RoutedEventArgs> name (property: RoutedEvent<'args>) : SimpleScalarAttributeDefinition<'args -> MsgValue> = - let key = - SimpleScalarAttributeDefinition.CreateAttributeData( - ScalarAttributeComparers.noCompare, - (fun _ (newValueOpt: ('args -> MsgValue) voption) (node: IViewNode) -> - match node.TryGetHandler(name) with - | ValueNone -> () - | ValueSome handler -> handler.Dispose() - - match newValueOpt with - | ValueNone -> node.Dispose() - - | ValueSome fn -> - let event = - property.AddClassHandler(fun _ args -> - let (MsgValue r) = fn args - Dispatcher.dispatch node r) - - node.SetHandler(name, event)) - ) - |> AttributeDefinitionStore.registerScalar - - { Key = key; Name = name } - - let defineRoutedEventNoDispatch<'args when 'args :> RoutedEventArgs> name (property: RoutedEvent<'args>) : SimpleScalarAttributeDefinition<'args -> unit> = - let key = - SimpleScalarAttributeDefinition.CreateAttributeData( - ScalarAttributeComparers.noCompare, - (fun _ (newValueOpt: ('args -> unit) voption) (node: IViewNode) -> - match node.TryGetHandler(name) with - | ValueNone -> () - | ValueSome handler -> handler.Dispose() - - match newValueOpt with - | ValueNone -> node.Dispose() - - | ValueSome fn -> - let event = property.AddClassHandler(fun _ args -> fn args) - - node.SetHandler(name, event)) - ) - |> AttributeDefinitionStore.registerScalar - - { Key = key; Name = name } - - let inline defineEventHandler name ([] getEvent: obj -> IEvent<'handler, 'args>) : SimpleScalarAttributeDefinition<'args -> MsgValue> = - let key = - SimpleScalarAttributeDefinition.CreateAttributeData( - ScalarAttributeComparers.noCompare, - (fun _ (newValueOpt: ('args -> MsgValue) voption) (node: IViewNode) -> - match node.TryGetHandler(name) with - | ValueNone -> () - | ValueSome handler -> handler.Dispose() - - match newValueOpt with - | ValueNone -> node.Dispose() - - | ValueSome fn -> - let event = getEvent node.Target - - let handler = - event.Subscribe(fun args -> - let (MsgValue r) = fn args - Dispatcher.dispatch node r) - - node.SetHandler(name, handler)) - ) - |> AttributeDefinitionStore.registerScalar - - { Key = key; Name = name } - - let inline defineEventHandlerNoDispatch - name - ([] getEvent: obj -> IEvent<'handler, 'args>) - : SimpleScalarAttributeDefinition<'args -> unit> = - let key = - SimpleScalarAttributeDefinition.CreateAttributeData( - ScalarAttributeComparers.noCompare, - (fun _ (newValueOpt: ('args -> unit) voption) (node: IViewNode) -> - match node.TryGetHandler(name) with - | ValueNone -> () - | ValueSome handler -> handler.Dispose() - - match newValueOpt with - | ValueNone -> node.Dispose() - - | ValueSome fn -> - let event = getEvent node.Target - - let handler = event.Subscribe(fun args -> fn args) - - node.SetHandler(name, handler)) - ) - |> AttributeDefinitionStore.registerScalar - - { Key = key; Name = name } - let inline defineAvaloniaNonGenericListWidgetCollection name ([] getCollection: obj -> System.Collections.IList) = let applyDiff _ (diffs: WidgetCollectionItemChanges) (node: IViewNode) = let targetColl = getCollection node.Target @@ -492,3 +280,216 @@ module Attributes = targetColl.Add(unbox view) Attributes.defineWidgetCollection name applyDiff updateNode + + + module Mvu = + let inline defineAvaloniaPropertyWithChangedEvent<'modelType, 'valueType> + name + (property: AvaloniaProperty<'valueType>) + ([] convertToValue: 'modelType -> 'valueType) + ([] convertToModel: 'valueType -> 'modelType) + : SimpleScalarAttributeDefinition> = + + let key = + SimpleScalarAttributeDefinition.CreateAttributeData( + ScalarAttributeComparers.noCompare, + (fun oldValueOpt (newValueOpt: ValueEventData<'modelType, 'modelType> voption) node -> + let target = node.Target :?> AvaloniaObject + + // The attribute is no longer applied, so we clean up the event + match node.TryGetHandler(property.Name) with + | ValueNone -> () + | ValueSome handler -> handler.Dispose() + + match newValueOpt with + | ValueNone -> + match oldValueOpt with + | ValueNone -> () + | ValueSome _ -> target.ClearValue(property) + + | ValueSome curr -> + // Clean up the old event handler if any + match node.TryGetHandler(property.Name) with + | ValueNone -> () + | ValueSome handler -> handler.Dispose() + + // Set the new value + + match curr.Value with + | ValueNone -> () + | ValueSome v -> + let newValue = convertToValue v + target.SetValue(property, box newValue) |> ignore + + let event = property.Changed + // Set the new event handler + let disposable = + event.Subscribe(fun args -> + if args.Sender = target then + if args.NewValue.HasValue then + let args = args.NewValue.Value + let (MsgValue r) = curr.Event(convertToModel args) + Dispatcher.dispatch node r) + + node.SetHandler(property.Name, disposable)) + ) + |> AttributeDefinitionStore.registerScalar + + { Key = key; Name = name } + + let defineAvaloniaPropertyWithChangedEvent'<'T> name (property: AvaloniaProperty<'T>) : SimpleScalarAttributeDefinition> = + defineAvaloniaPropertyWithChangedEvent<'T, 'T> name property id id + + let defineRoutedEvent<'args when 'args :> RoutedEventArgs> name (property: RoutedEvent<'args>) : SimpleScalarAttributeDefinition<'args -> MsgValue> = + let key = + SimpleScalarAttributeDefinition.CreateAttributeData( + ScalarAttributeComparers.noCompare, + (fun _ (newValueOpt: ('args -> MsgValue) voption) (node: IViewNode) -> + match node.TryGetHandler(name) with + | ValueNone -> () + | ValueSome handler -> handler.Dispose() + + match newValueOpt with + | ValueNone -> node.Dispose() + + | ValueSome fn -> + let event = + property.AddClassHandler(fun _ args -> + let (MsgValue r) = fn args + Dispatcher.dispatch node r) + + node.SetHandler(name, event)) + ) + |> AttributeDefinitionStore.registerScalar + + { Key = key; Name = name } + + let inline defineEventHandler name ([] getEvent: obj -> IEvent<'handler, 'args>) : SimpleScalarAttributeDefinition<'args -> MsgValue> = + let key = + SimpleScalarAttributeDefinition.CreateAttributeData( + ScalarAttributeComparers.noCompare, + (fun _ (newValueOpt: ('args -> MsgValue) voption) (node: IViewNode) -> + match node.TryGetHandler(name) with + | ValueNone -> () + | ValueSome handler -> handler.Dispose() + + match newValueOpt with + | ValueNone -> node.Dispose() + + | ValueSome fn -> + let event = getEvent node.Target + + let handler = + event.Subscribe(fun args -> + let (MsgValue r) = fn args + Dispatcher.dispatch node r) + + node.SetHandler(name, handler)) + ) + |> AttributeDefinitionStore.registerScalar + + { Key = key; Name = name } + + module Component = + + let defineAvaloniaPropertyWithChangedEvent<'modelType, 'valueType> + name + (property: AvaloniaProperty<'valueType>) + (convertToValue: 'modelType -> 'valueType) + (convertToModel: 'valueType -> 'modelType) + : SimpleScalarAttributeDefinition> = + + let key = + SimpleScalarAttributeDefinition.CreateAttributeData( + ScalarAttributeComparers.noCompare, + (fun oldValueOpt (newValueOpt: ComponentValueEventData<'modelType, 'modelType> voption) node -> + let target = node.Target :?> AvaloniaObject + + // The attribute is no longer applied, so we clean up the event + match node.TryGetHandler(property.Name) with + | ValueNone -> () + | ValueSome handler -> handler.Dispose() + + match newValueOpt with + | ValueNone -> + match oldValueOpt with + | ValueNone -> () + | ValueSome _ -> target.ClearValue(property) + + | ValueSome curr -> + // Clean up the old event handler if any + match node.TryGetHandler(property.Name) with + | ValueNone -> () + | ValueSome handler -> handler.Dispose() + + // Set the new value + + match curr.Value with + | ValueNone -> () + | ValueSome v -> + let newValue = convertToValue v + target.SetValue(property, box newValue) |> ignore + + let event = property.Changed + // Set the new event handler + let disposable = + event.Subscribe(fun args -> + if args.Sender = target then + if args.NewValue.HasValue then + curr.Event(convertToModel args.NewValue.Value)) + + node.SetHandler(property.Name, disposable)) + ) + |> AttributeDefinitionStore.registerScalar + + { Key = key; Name = name } + + let defineAvaloniaPropertyWithChangedEvent'<'T> + name + (property: AvaloniaProperty<'T>) + : SimpleScalarAttributeDefinition> = + defineAvaloniaPropertyWithChangedEvent<'T, 'T> name property id id + + let defineRoutedEvent<'args when 'args :> RoutedEventArgs> name (property: RoutedEvent<'args>) : SimpleScalarAttributeDefinition<'args -> unit> = + let key = + SimpleScalarAttributeDefinition.CreateAttributeData( + ScalarAttributeComparers.noCompare, + (fun _ (newValueOpt: ('args -> unit) voption) (node: IViewNode) -> + match node.TryGetHandler(name) with + | ValueNone -> () + | ValueSome handler -> handler.Dispose() + + match newValueOpt with + | ValueNone -> node.Dispose() + + | ValueSome fn -> + let event = property.AddClassHandler(fun _ args -> fn args) + + node.SetHandler(name, event)) + ) + |> AttributeDefinitionStore.registerScalar + + { Key = key; Name = name } + + let inline defineEventHandler name ([] getEvent: obj -> IEvent<'handler, 'args>) : SimpleScalarAttributeDefinition<'args -> unit> = + let key = + SimpleScalarAttributeDefinition.CreateAttributeData( + ScalarAttributeComparers.noCompare, + (fun _ (newValueOpt: ('args -> unit) voption) (node: IViewNode) -> + match node.TryGetHandler(name) with + | ValueNone -> () + | ValueSome handler -> handler.Dispose() + + match newValueOpt with + | ValueNone -> node.Dispose() + + | ValueSome fn -> + let event = getEvent node.Target + + let handler = event.Subscribe(fun args -> fn args) + + node.SetHandler(name, handler)) + ) + |> AttributeDefinitionStore.registerScalar + + { Key = key; Name = name } diff --git a/src/Fabulous.Avalonia/Fabulous.Avalonia.fsproj b/src/Fabulous.Avalonia/Fabulous.Avalonia.fsproj index fddc61357..70460df99 100644 --- a/src/Fabulous.Avalonia/Fabulous.Avalonia.fsproj +++ b/src/Fabulous.Avalonia/Fabulous.Avalonia.fsproj @@ -131,6 +131,7 @@ + @@ -374,12 +375,11 @@ FSharp.Core is fixed to a specific version that is not necessarily the latest one. This version will be used as the lower bound in the NuGet package --> - - - + + - + diff --git a/src/Fabulous.Avalonia/Views/Application.Components.fs b/src/Fabulous.Avalonia/Views/Application.Components.fs index ddcd86fdd..91cfb4c81 100644 --- a/src/Fabulous.Avalonia/Views/Application.Components.fs +++ b/src/Fabulous.Avalonia/Views/Application.Components.fs @@ -3,28 +3,35 @@ namespace Fabulous.Avalonia open System.Runtime.CompilerServices open Avalonia open Avalonia.Controls +open Avalonia.Controls.ApplicationLifetimes open Fabulous open Fabulous.Avalonia -#nowarn "0044" // Disable obsolete warnings in Fabulous.Avalonia. Please remove after deleting obsolete code. - module ComponentApplication = let ActualThemeVariantChanged = - Attributes.defineEventNoArgNoDispatch "Application_ActualThemeVariantChanged" (fun target -> (target :?> FabApplication).ActualThemeVariantChanged) + Attributes.Component.defineEventNoArg "Application_ActualThemeVariantChanged" (fun target -> (target :?> FabApplication).ActualThemeVariantChanged) let ResourcesChanged = - Attributes.defineEventNoDispatch "Application_ResourcesChangedEvent" (fun target -> (target :?> FabApplication).ResourcesChanged) + Attributes.Component.defineEvent "Application_ResourcesChangedEvent" (fun target -> (target :?> FabApplication).ResourcesChanged) + + let Activated = + Attributes.Component.defineEvent "Application_Activated" (fun target -> + (FabApplication.Current.TryGetFeature(typeof) :?> IActivatableLifetime) + .Activated) + + let Deactivated = + Attributes.Component.defineEvent "Application_Deactivated" (fun target -> + (FabApplication.Current.TryGetFeature(typeof) :?> IActivatableLifetime) + .Deactivated) - let UrlsOpened = - Attributes.defineEventNoDispatch "Application_UrlsOpenedEvent" (fun target -> (target :?> FabApplication).UrlsOpened) let ColorValuesChanged = - Attributes.defineEventNoDispatch "PlatformSettings_ColorValuesChanged" (fun target -> + Attributes.Component.defineEvent "PlatformSettings_ColorValuesChanged" (fun target -> (target :?> FabApplication) .PlatformSettings.ColorValuesChanged) let SafeAreaChanged = - Attributes.defineEventNoDispatch "PlatformSettings_SafeAreaChanged" (fun target -> (target :?> FabApplication).InsetsManager.SafeAreaChanged) + Attributes.Component.defineEvent "PlatformSettings_SafeAreaChanged" (fun target -> (target :?> FabApplication).InsetsManager.SafeAreaChanged) type ComponentApplicationModifiers = /// Listens to the application ActualThemeVariantChanged event. @@ -41,12 +48,19 @@ type ComponentApplicationModifiers = static member inline onResourcesChanged(this: WidgetBuilder<'msg, #IFabApplication>, fn: ResourcesChangedEventArgs -> unit) = this.AddScalar(ComponentApplication.ResourcesChanged.WithValue(fn)) - /// Listens to the application urls opened event. + /// Listens to the application activated event. + /// Current widget. + /// Raised when the application is activated. + [] + static member inline onActivated(this: WidgetBuilder<'msg, #IFabApplication>, fn: ActivatedEventArgs -> unit) = + this.AddScalar(ComponentApplication.Activated.WithValue(fn)) + + /// Listens to the application deactivated event. /// Current widget. - /// Raised when the application receives urls to open. + /// Raised when the application is deactivated. [] - static member inline onUrlsOpened(this: WidgetBuilder<'msg, #IFabApplication>, fn: UrlOpenedEventArgs -> unit) = - this.AddScalar(ComponentApplication.UrlsOpened.WithValue(fn)) + static member inline onDeactivated(this: WidgetBuilder<'msg, #IFabApplication>, fn: ActivatedEventArgs -> unit) = + this.AddScalar(ComponentApplication.Deactivated.WithValue(fn)) /// Listens to the PlatformSettings color values changed event. /// Current widget. diff --git a/src/Fabulous.Avalonia/Views/Application.Mvu.fs b/src/Fabulous.Avalonia/Views/Application.Mvu.fs index d36322ec9..e3b0f3c23 100644 --- a/src/Fabulous.Avalonia/Views/Application.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/Application.Mvu.fs @@ -3,29 +3,34 @@ namespace Fabulous.Avalonia open System.Runtime.CompilerServices open Avalonia open Avalonia.Controls +open Avalonia.Controls.ApplicationLifetimes open Fabulous open Fabulous.Avalonia -#nowarn "0044" // Disable obsolete warnings in Fabulous.Avalonia. Please remove after deleting obsolete code. - - module MvuApplication = let ActualThemeVariantChanged = - Attributes.defineEventNoArg "Application_ActualThemeVariantChanged" (fun target -> (target :?> FabApplication).ActualThemeVariantChanged) + Attributes.Mvu.defineEventNoArg "Application_ActualThemeVariantChanged" (fun target -> (target :?> FabApplication).ActualThemeVariantChanged) let ResourcesChanged = - Attributes.defineEvent "Application_ResourcesChangedEvent" (fun target -> (target :?> FabApplication).ResourcesChanged) + Attributes.Mvu.defineEvent "Application_ResourcesChangedEvent" (fun target -> (target :?> FabApplication).ResourcesChanged) + + let Activated = + Attributes.Mvu.defineEvent "Application_Activated" (fun target -> + (FabApplication.Current.TryGetFeature(typeof) :?> IActivatableLifetime) + .Activated) - let UrlsOpened = - Attributes.defineEvent "Application_UrlsOpenedEvent" (fun target -> (target :?> FabApplication).UrlsOpened) + let Deactivated = + Attributes.Mvu.defineEvent "Application_Deactivated" (fun target -> + (FabApplication.Current.TryGetFeature(typeof) :?> IActivatableLifetime) + .Deactivated) let ColorValuesChanged = - Attributes.defineEvent "PlatformSettings_ColorValuesChanged" (fun target -> + Attributes.Mvu.defineEvent "PlatformSettings_ColorValuesChanged" (fun target -> (target :?> FabApplication) .PlatformSettings.ColorValuesChanged) let SafeAreaChanged = - Attributes.defineEvent "PlatformSettings_SafeAreaChanged" (fun target -> (target :?> FabApplication).InsetsManager.SafeAreaChanged) + Attributes.Mvu.defineEvent "PlatformSettings_SafeAreaChanged" (fun target -> (target :?> FabApplication).InsetsManager.SafeAreaChanged) type MvuApplicationModifiers = /// Listens to the application ActualThemeVariantChanged event. @@ -42,12 +47,19 @@ type MvuApplicationModifiers = static member inline onResourcesChanged(this: WidgetBuilder<'msg, #IFabApplication>, fn: ResourcesChangedEventArgs -> 'msg) = this.AddScalar(MvuApplication.ResourcesChanged.WithValue(fn)) - /// Listens to the application urls opened event. + /// Listens to the application activated event. + /// Current widget. + /// Raised when the application is activated. + [] + static member inline onActivated(this: WidgetBuilder<'msg, #IFabApplication>, fn: ActivatedEventArgs -> 'msg) = + this.AddScalar(MvuApplication.Activated.WithValue(fn)) + + /// Listens to the application deactivated event. /// Current widget. - /// Raised when the application receives urls to open. + /// Raised when the application is deactivated. [] - static member inline onUrlsOpened(this: WidgetBuilder<'msg, #IFabApplication>, fn: UrlOpenedEventArgs -> 'msg) = - this.AddScalar(MvuApplication.UrlsOpened.WithValue(fn)) + static member inline onDeactivated(this: WidgetBuilder<'msg, #IFabApplication>, fn: ActivatedEventArgs -> 'msg) = + this.AddScalar(MvuApplication.Deactivated.WithValue(fn)) /// Listens to the PlatformSettings color values changed event. /// Current widget. diff --git a/src/Fabulous.Avalonia/Views/Application.fs b/src/Fabulous.Avalonia/Views/Application.fs index 01c4c64b9..2f5a3818b 100644 --- a/src/Fabulous.Avalonia/Views/Application.fs +++ b/src/Fabulous.Avalonia/Views/Application.fs @@ -195,26 +195,12 @@ module ApplicationBuilders = /// Creates a DesktopApplication widget with a content widget. /// The main Window of the Application. static member DesktopApplication(window: WidgetBuilder<'msg, #IFabWindow>) = - WidgetBuilder<'msg, IFabApplication>( - Application.WidgetKey, - AttributesBundle(StackList.empty(), ValueSome [| Application.MainWindow.WithValue(window.Compile()) |], ValueNone) - ) - - /// Creates a DesktopApplication widget with a content widget. - static member inline DesktopApplication<'msg, 'childMarker when 'msg: equality>() = - SingleChildBuilder<'msg, IFabApplication, 'childMarker>(Application.WidgetKey, Application.MainWindow) + WidgetBuilder<'msg, IFabApplication>(Application.WidgetKey, Application.MainWindow.WithValue(window.Compile())) /// Creates a SingleViewApplication widget with a content widget. /// The main View of the Application. static member SingleViewApplication(view: WidgetBuilder<'msg, #IFabControl>) = - WidgetBuilder<'msg, IFabApplication>( - Application.WidgetKey, - AttributesBundle(StackList.empty(), ValueSome [| Application.MainView.WithValue(view.Compile()) |], ValueNone) - ) - - /// Creates a DesktopApplication widget with a content widget. - static member inline SingleViewApplication<'msg, 'childMarker when 'msg: equality>() = - SingleChildBuilder<'msg, IFabApplication, 'childMarker>(Application.WidgetKey, Application.MainView) + WidgetBuilder<'msg, IFabApplication>(Application.WidgetKey, Application.MainView.WithValue(view.Compile())) type ApplicationModifiers = /// Sets the application name. diff --git a/src/Fabulous.Avalonia/Views/Collections/TreeView.Components.fs b/src/Fabulous.Avalonia/Views/Collections/TreeView.Components.fs index 4cd3dc1ae..977c560d2 100644 --- a/src/Fabulous.Avalonia/Views/Collections/TreeView.Components.fs +++ b/src/Fabulous.Avalonia/Views/Collections/TreeView.Components.fs @@ -7,7 +7,7 @@ open Fabulous.Avalonia module ComponentTreeView = let SelectionChanged = - Attributes.defineEventNoDispatch "TreeView_SelectionChanged" (fun target -> (target :?> TreeView).SelectionChanged) + Attributes.Component.defineEvent "TreeView_SelectionChanged" (fun target -> (target :?> TreeView).SelectionChanged) type ComponentTreeViewModifiers = /// Listens to the TreeView SelectionChanged event. diff --git a/src/Fabulous.Avalonia/Views/Collections/TreeView.Mvu.fs b/src/Fabulous.Avalonia/Views/Collections/TreeView.Mvu.fs index 9f8649a38..bbdfe4215 100644 --- a/src/Fabulous.Avalonia/Views/Collections/TreeView.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/Collections/TreeView.Mvu.fs @@ -7,7 +7,7 @@ open Fabulous.Avalonia module MvuTreeView = let SelectionChanged = - Attributes.defineEvent "TreeView_SelectionChanged" (fun target -> (target :?> TreeView).SelectionChanged) + Attributes.Mvu.defineEvent "TreeView_SelectionChanged" (fun target -> (target :?> TreeView).SelectionChanged) type MvuTreeViewModifiers = /// Listens to the TreeView SelectionChanged event. diff --git a/src/Fabulous.Avalonia/Views/Controls/AutoCompleteBox.Components.fs b/src/Fabulous.Avalonia/Views/Controls/AutoCompleteBox.Components.fs index 7c4f80ba2..5c5504623 100644 --- a/src/Fabulous.Avalonia/Views/Controls/AutoCompleteBox.Components.fs +++ b/src/Fabulous.Avalonia/Views/Controls/AutoCompleteBox.Components.fs @@ -9,19 +9,19 @@ open Fabulous.Avalonia module ComponentAutoCompleteBox = let Text = - Attributes.defineAvaloniaPropertyWithChangedEventNoDispatch' "AutoCompleteBox_TextChanged" AutoCompleteBox.TextProperty + Attributes.Component.defineAvaloniaPropertyWithChangedEvent' "AutoCompleteBox_TextChanged" AutoCompleteBox.TextProperty let Populating = - Attributes.defineEventNoDispatch "AutoCompleteBox_Populating" (fun target -> (target :?> AutoCompleteBox).Populating) + Attributes.Component.defineEvent "AutoCompleteBox_Populating" (fun target -> (target :?> AutoCompleteBox).Populating) let Populated = - Attributes.defineEventNoDispatch "AutoCompleteBox_Populated" (fun target -> (target :?> AutoCompleteBox).Populated) + Attributes.Component.defineEvent "AutoCompleteBox_Populated" (fun target -> (target :?> AutoCompleteBox).Populated) let DropDownOpened = - Attributes.defineAvaloniaPropertyWithChangedEventNoDispatch' "AutoCompleteBox_onDropDownOpened" AutoCompleteBox.IsDropDownOpenProperty + Attributes.Component.defineAvaloniaPropertyWithChangedEvent' "AutoCompleteBox_onDropDownOpened" AutoCompleteBox.IsDropDownOpenProperty let SelectionChanged = - Attributes.defineEventNoDispatch "AutoCompleteBox_SelectionChanged" (fun target -> + Attributes.Component.defineEvent "AutoCompleteBox_SelectionChanged" (fun target -> (target :?> AutoCompleteBox).SelectionChanged) type ComponentAutoCompleteBoxModifiers = diff --git a/src/Fabulous.Avalonia/Views/Controls/AutoCompleteBox.Mvu.fs b/src/Fabulous.Avalonia/Views/Controls/AutoCompleteBox.Mvu.fs index aa2c5cf46..e3a6b9107 100644 --- a/src/Fabulous.Avalonia/Views/Controls/AutoCompleteBox.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/Controls/AutoCompleteBox.Mvu.fs @@ -9,19 +9,19 @@ open Fabulous.Avalonia module MvuAutoCompleteBox = let Text = - Attributes.defineAvaloniaPropertyWithChangedEvent' "AutoCompleteBox_TextChanged" AutoCompleteBox.TextProperty + Attributes.Mvu.defineAvaloniaPropertyWithChangedEvent' "AutoCompleteBox_TextChanged" AutoCompleteBox.TextProperty let Populating = - Attributes.defineEvent "AutoCompleteBox_Populating" (fun target -> (target :?> AutoCompleteBox).Populating) + Attributes.Mvu.defineEvent "AutoCompleteBox_Populating" (fun target -> (target :?> AutoCompleteBox).Populating) let Populated = - Attributes.defineEvent "AutoCompleteBox_Populated" (fun target -> (target :?> AutoCompleteBox).Populated) + Attributes.Mvu.defineEvent "AutoCompleteBox_Populated" (fun target -> (target :?> AutoCompleteBox).Populated) let DropDownOpened = - Attributes.defineAvaloniaPropertyWithChangedEvent' "AutoCompleteBox_onDropDownOpened" AutoCompleteBox.IsDropDownOpenProperty + Attributes.Mvu.defineAvaloniaPropertyWithChangedEvent' "AutoCompleteBox_onDropDownOpened" AutoCompleteBox.IsDropDownOpenProperty let SelectionChanged = - Attributes.defineEvent "AutoCompleteBox_SelectionChanged" (fun target -> (target :?> AutoCompleteBox).SelectionChanged) + Attributes.Mvu.defineEvent "AutoCompleteBox_SelectionChanged" (fun target -> (target :?> AutoCompleteBox).SelectionChanged) type MvuAutoCompleteBoxModifiers = /// Binds the AutoCompleteBox.TextProperty. diff --git a/src/Fabulous.Avalonia/Views/Controls/Border.fs b/src/Fabulous.Avalonia/Views/Controls/Border.fs index 20b4521e4..f4673ab30 100644 --- a/src/Fabulous.Avalonia/Views/Controls/Border.fs +++ b/src/Fabulous.Avalonia/Views/Controls/Border.fs @@ -42,10 +42,7 @@ module BorderBuilders = /// Creates a Border widget. /// The content of the Border. static member Border(content: WidgetBuilder<'msg, #IFabControl>) = - WidgetBuilder<'msg, IFabBorder>( - Border.WidgetKey, - AttributesBundle(StackList.empty(), ValueSome [| Decorator.ChildWidget.WithValue(content.Compile()) |], ValueNone) - ) + WidgetBuilder<'msg, IFabBorder>(Border.WidgetKey, Decorator.ChildWidget.WithValue(content.Compile())) type BorderModifiers = diff --git a/src/Fabulous.Avalonia/Views/Controls/Buttons/Button.Components.fs b/src/Fabulous.Avalonia/Views/Controls/Buttons/Button.Components.fs index 6d88230bc..3f690897a 100644 --- a/src/Fabulous.Avalonia/Views/Controls/Buttons/Button.Components.fs +++ b/src/Fabulous.Avalonia/Views/Controls/Buttons/Button.Components.fs @@ -8,7 +8,7 @@ open Fabulous.StackAllocatedCollections.StackList module ComponentButton = let Clicked = - Attributes.defineEventNoDispatch "Button_Clicked" (fun target -> (target :?> Button).Click) + Attributes.Component.defineEvent "Button_Clicked" (fun target -> (target :?> Button).Click) [] module ComponentButtonBuilders = @@ -29,6 +29,7 @@ module ComponentButtonBuilders = AttributesBundle( StackList.one(ComponentButton.Clicked.WithValue(fn)), ValueSome [| ContentControl.ContentWidget.WithValue(content.Compile()) |], + ValueNone, ValueNone ) ) diff --git a/src/Fabulous.Avalonia/Views/Controls/Buttons/Button.Mvu.fs b/src/Fabulous.Avalonia/Views/Controls/Buttons/Button.Mvu.fs index 61320c24e..01cb6bd77 100644 --- a/src/Fabulous.Avalonia/Views/Controls/Buttons/Button.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/Controls/Buttons/Button.Mvu.fs @@ -7,7 +7,7 @@ open Fabulous.StackAllocatedCollections.StackList module MvuButton = let Clicked = - Attributes.defineEvent "Button_Clicked" (fun target -> (target :?> Button).Click) + Attributes.Mvu.defineEvent "Button_Clicked" (fun target -> (target :?> Button).Click) [] module MvuButtonBuilders = @@ -28,6 +28,7 @@ module MvuButtonBuilders = AttributesBundle( StackList.one(MvuButton.Clicked.WithValue(fun _ -> fn)), ValueSome [| ContentControl.ContentWidget.WithValue(content.Compile()) |], + ValueNone, ValueNone ) ) diff --git a/src/Fabulous.Avalonia/Views/Controls/Buttons/DropDownButton.Components.fs b/src/Fabulous.Avalonia/Views/Controls/Buttons/DropDownButton.Components.fs index 7435e82c6..d36a2b661 100644 --- a/src/Fabulous.Avalonia/Views/Controls/Buttons/DropDownButton.Components.fs +++ b/src/Fabulous.Avalonia/Views/Controls/Buttons/DropDownButton.Components.fs @@ -28,6 +28,7 @@ module ComponentDropDownButtonBuilders = AttributesBundle( StackList.one(ComponentButton.Clicked.WithValue(msg)), ValueSome [| ContentControl.ContentWidget.WithValue(content.Compile()) |], + ValueNone, ValueNone ) ) diff --git a/src/Fabulous.Avalonia/Views/Controls/Buttons/DropDownButton.Mvu.fs b/src/Fabulous.Avalonia/Views/Controls/Buttons/DropDownButton.Mvu.fs index 4ab5f3d79..6d61c2334 100644 --- a/src/Fabulous.Avalonia/Views/Controls/Buttons/DropDownButton.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/Controls/Buttons/DropDownButton.Mvu.fs @@ -24,6 +24,7 @@ module MvuDropDownButtonBuilders = AttributesBundle( StackList.one(MvuButton.Clicked.WithValue(fn)), ValueSome [| ContentControl.ContentWidget.WithValue(content.Compile()) |], + ValueNone, ValueNone ) ) diff --git a/src/Fabulous.Avalonia/Views/Controls/Buttons/HyperlinkButton.Components.fs b/src/Fabulous.Avalonia/Views/Controls/Buttons/HyperlinkButton.Components.fs index 8d52358ae..a2a5cf947 100644 --- a/src/Fabulous.Avalonia/Views/Controls/Buttons/HyperlinkButton.Components.fs +++ b/src/Fabulous.Avalonia/Views/Controls/Buttons/HyperlinkButton.Components.fs @@ -8,7 +8,7 @@ open Fabulous.StackAllocatedCollections.StackList module ComponentHyperlinkButton = let IsVisitedChanged = - Attributes.defineAvaloniaPropertyWithChangedEventNoDispatch' "HyperlinkButton_VisitedChanged" HyperlinkButton.IsVisitedProperty + Attributes.Component.defineAvaloniaPropertyWithChangedEvent' "HyperlinkButton_VisitedChanged" HyperlinkButton.IsVisitedProperty [] module ComponentHyperlinkButtonBuilders = @@ -54,6 +54,7 @@ module ComponentHyperlinkButtonBuilders = ComponentHyperlinkButton.IsVisitedChanged.WithValue(ComponentValueEventData.create isVisited fn) ), ValueSome [| ContentControl.ContentWidget.WithValue(content.Compile()) |], + ValueNone, ValueNone ) ) @@ -72,6 +73,7 @@ module ComponentHyperlinkButtonBuilders = ComponentHyperlinkButton.IsVisitedChanged.WithValue(ComponentValueEventData.create isVisited fn) ), ValueSome [| ContentControl.ContentWidget.WithValue(content.Compile()) |], + ValueNone, ValueNone ) ) diff --git a/src/Fabulous.Avalonia/Views/Controls/Buttons/HyperlinkButton.Mvu.fs b/src/Fabulous.Avalonia/Views/Controls/Buttons/HyperlinkButton.Mvu.fs index b30e8cd73..7a4e14f87 100644 --- a/src/Fabulous.Avalonia/Views/Controls/Buttons/HyperlinkButton.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/Controls/Buttons/HyperlinkButton.Mvu.fs @@ -8,7 +8,7 @@ open Fabulous.StackAllocatedCollections.StackList module MvuHyperlinkButton = let IsVisitedChanged = - Attributes.defineAvaloniaPropertyWithChangedEvent' "HyperlinkButton_VisitedChanged" HyperlinkButton.IsVisitedProperty + Attributes.Mvu.defineAvaloniaPropertyWithChangedEvent' "HyperlinkButton_VisitedChanged" HyperlinkButton.IsVisitedProperty [] module MvuHyperlinkButtonBuilders = @@ -51,6 +51,7 @@ module MvuHyperlinkButtonBuilders = AttributesBundle( StackList.two(HyperlinkButton.NavigateUri.WithValue(uri), MvuHyperlinkButton.IsVisitedChanged.WithValue(ValueEventData.create isVisited fn)), ValueSome [| ContentControl.ContentWidget.WithValue(content.Compile()) |], + ValueNone, ValueNone ) ) @@ -69,6 +70,7 @@ module MvuHyperlinkButtonBuilders = MvuHyperlinkButton.IsVisitedChanged.WithValue(ValueEventData.create isVisited fn) ), ValueSome [| ContentControl.ContentWidget.WithValue(content.Compile()) |], + ValueNone, ValueNone ) ) diff --git a/src/Fabulous.Avalonia/Views/Controls/Buttons/HyperlinkButton.fs b/src/Fabulous.Avalonia/Views/Controls/Buttons/HyperlinkButton.fs index 45e27018c..a2724963a 100644 --- a/src/Fabulous.Avalonia/Views/Controls/Buttons/HyperlinkButton.fs +++ b/src/Fabulous.Avalonia/Views/Controls/Buttons/HyperlinkButton.fs @@ -51,6 +51,7 @@ module HyperlinkButtonBuilders = AttributesBundle( StackList.one(HyperlinkButton.NavigateUri.WithValue(uri)), ValueSome [| ContentControl.ContentWidget.WithValue(content.Compile()) |], + ValueNone, ValueNone ) ) @@ -64,6 +65,7 @@ module HyperlinkButtonBuilders = AttributesBundle( StackList.one(HyperlinkButton.NavigateUri.WithValue(Uri(uri))), ValueSome [| ContentControl.ContentWidget.WithValue(content.Compile()) |], + ValueNone, ValueNone ) ) diff --git a/src/Fabulous.Avalonia/Views/Controls/Buttons/RadioButton.Components.fs b/src/Fabulous.Avalonia/Views/Controls/Buttons/RadioButton.Components.fs index 8bdee3e01..3b2f85f36 100644 --- a/src/Fabulous.Avalonia/Views/Controls/Buttons/RadioButton.Components.fs +++ b/src/Fabulous.Avalonia/Views/Controls/Buttons/RadioButton.Components.fs @@ -43,6 +43,7 @@ module RadioButtonBuilders = AttributesBundle( StackList.one(ComponentToggleButton.CheckedChanged.WithValue(ComponentValueEventData.create isChecked fn)), ValueSome [| ContentControl.ContentWidget.WithValue(content.Compile()) |], + ValueNone, ValueNone ) ) @@ -62,6 +63,7 @@ module RadioButtonBuilders = ToggleButton.IsThreeState.WithValue(true) ), ValueSome [| ContentControl.ContentWidget.WithValue(content.Compile()) |], + ValueNone, ValueNone ) ) diff --git a/src/Fabulous.Avalonia/Views/Controls/Buttons/RadioButton.Mvu.fs b/src/Fabulous.Avalonia/Views/Controls/Buttons/RadioButton.Mvu.fs index 3856a2cde..dc9404a90 100644 --- a/src/Fabulous.Avalonia/Views/Controls/Buttons/RadioButton.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/Controls/Buttons/RadioButton.Mvu.fs @@ -41,6 +41,7 @@ module MvuRadioButtonBuilders = AttributesBundle( StackList.one(MvuToggleButton.CheckedChanged.WithValue(ValueEventData.create isChecked fn)), ValueSome [| ContentControl.ContentWidget.WithValue(content.Compile()) |], + ValueNone, ValueNone ) ) @@ -60,6 +61,7 @@ module MvuRadioButtonBuilders = ToggleButton.IsThreeState.WithValue(true) ), ValueSome [| ContentControl.ContentWidget.WithValue(content.Compile()) |], + ValueNone, ValueNone ) ) diff --git a/src/Fabulous.Avalonia/Views/Controls/Buttons/RepeatButton.Components.fs b/src/Fabulous.Avalonia/Views/Controls/Buttons/RepeatButton.Components.fs index 50c51655c..0334e321e 100644 --- a/src/Fabulous.Avalonia/Views/Controls/Buttons/RepeatButton.Components.fs +++ b/src/Fabulous.Avalonia/Views/Controls/Buttons/RepeatButton.Components.fs @@ -24,6 +24,7 @@ module ComponentRepeatButtonBuilders = AttributesBundle( StackList.one(ComponentButton.Clicked.WithValue(fn)), ValueSome [| ContentControl.ContentWidget.WithValue(content.Compile()) |], + ValueNone, ValueNone ) ) diff --git a/src/Fabulous.Avalonia/Views/Controls/Buttons/RepeatButton.Mvu.fs b/src/Fabulous.Avalonia/Views/Controls/Buttons/RepeatButton.Mvu.fs index 2355d9088..046e9c595 100644 --- a/src/Fabulous.Avalonia/Views/Controls/Buttons/RepeatButton.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/Controls/Buttons/RepeatButton.Mvu.fs @@ -24,6 +24,7 @@ module MvuRepeatButtonBuilders = AttributesBundle( StackList.one(MvuButton.Clicked.WithValue(fn)), ValueSome [| ContentControl.ContentWidget.WithValue(content.Compile()) |], + ValueNone, ValueNone ) ) diff --git a/src/Fabulous.Avalonia/Views/Controls/Buttons/SplitButton.Components.fs b/src/Fabulous.Avalonia/Views/Controls/Buttons/SplitButton.Components.fs index 9f07579d6..dab3d90ad 100644 --- a/src/Fabulous.Avalonia/Views/Controls/Buttons/SplitButton.Components.fs +++ b/src/Fabulous.Avalonia/Views/Controls/Buttons/SplitButton.Components.fs @@ -8,7 +8,7 @@ open Fabulous.StackAllocatedCollections.StackList module ComponentSplitButton = let Clicked = - Attributes.defineEventNoDispatch "SplitButton_Clicked" (fun target -> (target :?> SplitButton).Click) + Attributes.Component.defineEvent "SplitButton_Clicked" (fun target -> (target :?> SplitButton).Click) [] module ComponentSplitButtonBuilders = @@ -33,6 +33,7 @@ module ComponentSplitButtonBuilders = AttributesBundle( StackList.one(ComponentSplitButton.Clicked.WithValue(fn)), ValueSome [| ContentControl.ContentWidget.WithValue(content.Compile()) |], + ValueNone, ValueNone ) ) diff --git a/src/Fabulous.Avalonia/Views/Controls/Buttons/SplitButton.Mvu.fs b/src/Fabulous.Avalonia/Views/Controls/Buttons/SplitButton.Mvu.fs index 335169e0e..3a558dd09 100644 --- a/src/Fabulous.Avalonia/Views/Controls/Buttons/SplitButton.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/Controls/Buttons/SplitButton.Mvu.fs @@ -8,7 +8,7 @@ open Fabulous.StackAllocatedCollections.StackList module MvuSplitButton = let Clicked = - Attributes.defineEvent "SplitButton_Clicked" (fun target -> (target :?> SplitButton).Click) + Attributes.Mvu.defineEvent "SplitButton_Clicked" (fun target -> (target :?> SplitButton).Click) [] module MvuSplitButtonBuilders = @@ -29,6 +29,7 @@ module MvuSplitButtonBuilders = AttributesBundle( StackList.one(MvuSplitButton.Clicked.WithValue(fn)), ValueSome [| ContentControl.ContentWidget.WithValue(content.Compile()) |], + ValueNone, ValueNone ) ) diff --git a/src/Fabulous.Avalonia/Views/Controls/Buttons/ToggleButton.Components.fs b/src/Fabulous.Avalonia/Views/Controls/Buttons/ToggleButton.Components.fs index 8aa5d2096..9a9b06cc9 100644 --- a/src/Fabulous.Avalonia/Views/Controls/Buttons/ToggleButton.Components.fs +++ b/src/Fabulous.Avalonia/Views/Controls/Buttons/ToggleButton.Components.fs @@ -9,10 +9,10 @@ open Fabulous.StackAllocatedCollections.StackList module ComponentToggleButton = let CheckedChanged = - Attributes.defineAvaloniaPropertyWithChangedEventNoDispatch "ToggleButton_IsCheckedChanged" ToggleButton.IsCheckedProperty Nullable Nullable.op_Explicit + Attributes.Component.defineAvaloniaPropertyWithChangedEvent "ToggleButton_IsCheckedChanged" ToggleButton.IsCheckedProperty Nullable Nullable.op_Explicit let ThreeStateCheckedChanged = - Attributes.defineAvaloniaPropertyWithChangedEventNoDispatch' "ToggleButton_CheckedChanged" ToggleButton.IsCheckedProperty + Attributes.Component.defineAvaloniaPropertyWithChangedEvent' "ToggleButton_CheckedChanged" ToggleButton.IsCheckedProperty [] module ComponentToggleButtonBuilders = @@ -53,6 +53,7 @@ module ComponentToggleButtonBuilders = AttributesBundle( StackList.one(ComponentToggleButton.CheckedChanged.WithValue(ComponentValueEventData.create isChecked fn)), ValueSome [| ContentControl.ContentWidget.WithValue(content.Compile()) |], + ValueNone, ValueNone ) ) @@ -72,6 +73,7 @@ module ComponentToggleButtonBuilders = ToggleButton.IsThreeState.WithValue(true) ), ValueSome [| ContentControl.ContentWidget.WithValue(content.Compile()) |], + ValueNone, ValueNone ) ) diff --git a/src/Fabulous.Avalonia/Views/Controls/Buttons/ToggleButton.Mvu.fs b/src/Fabulous.Avalonia/Views/Controls/Buttons/ToggleButton.Mvu.fs index 6256b0666..4c27c9b9b 100644 --- a/src/Fabulous.Avalonia/Views/Controls/Buttons/ToggleButton.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/Controls/Buttons/ToggleButton.Mvu.fs @@ -9,10 +9,10 @@ open Fabulous.StackAllocatedCollections.StackList module MvuToggleButton = let CheckedChanged = - Attributes.defineAvaloniaPropertyWithChangedEvent "ToggleButton_IsCheckedChanged" ToggleButton.IsCheckedProperty Nullable Nullable.op_Explicit + Attributes.Mvu.defineAvaloniaPropertyWithChangedEvent "ToggleButton_IsCheckedChanged" ToggleButton.IsCheckedProperty Nullable Nullable.op_Explicit let ThreeStateCheckedChanged = - Attributes.defineAvaloniaPropertyWithChangedEvent' "ToggleButton_CheckedChanged" ToggleButton.IsCheckedProperty + Attributes.Mvu.defineAvaloniaPropertyWithChangedEvent' "ToggleButton_CheckedChanged" ToggleButton.IsCheckedProperty [] module MvuToggleButtonBuilders = @@ -51,6 +51,7 @@ module MvuToggleButtonBuilders = AttributesBundle( StackList.one(MvuToggleButton.CheckedChanged.WithValue(ValueEventData.create isChecked fn)), ValueSome [| ContentControl.ContentWidget.WithValue(content.Compile()) |], + ValueNone, ValueNone ) ) @@ -70,6 +71,7 @@ module MvuToggleButtonBuilders = ToggleButton.IsThreeState.WithValue(true) ), ValueSome [| ContentControl.ContentWidget.WithValue(content.Compile()) |], + ValueNone, ValueNone ) ) diff --git a/src/Fabulous.Avalonia/Views/Controls/Buttons/ToggleSplitButton.Components.fs b/src/Fabulous.Avalonia/Views/Controls/Buttons/ToggleSplitButton.Components.fs index 3bc797522..569f9be8e 100644 --- a/src/Fabulous.Avalonia/Views/Controls/Buttons/ToggleSplitButton.Components.fs +++ b/src/Fabulous.Avalonia/Views/Controls/Buttons/ToggleSplitButton.Components.fs @@ -7,7 +7,7 @@ open Fabulous.StackAllocatedCollections.StackList module ComponentToggleSplitButton = let CheckedChanged = - Attributes.defineAvaloniaPropertyWithChangedEventNoDispatch' "ToggleSplitButton_CheckedChanged" ToggleSplitButton.IsCheckedProperty + Attributes.Component.defineAvaloniaPropertyWithChangedEvent' "ToggleSplitButton_CheckedChanged" ToggleSplitButton.IsCheckedProperty [] module ComponentToggleSplitButtonBuilders = @@ -34,6 +34,7 @@ module ComponentToggleSplitButtonBuilders = AttributesBundle( StackList.one(ComponentToggleSplitButton.CheckedChanged.WithValue(ComponentValueEventData.create isChecked fn)), ValueSome [| ContentControl.ContentWidget.WithValue(content.Compile()) |], + ValueNone, ValueNone ) ) diff --git a/src/Fabulous.Avalonia/Views/Controls/Buttons/ToggleSplitButton.Mvu.fs b/src/Fabulous.Avalonia/Views/Controls/Buttons/ToggleSplitButton.Mvu.fs index 08a45f432..50167df6b 100644 --- a/src/Fabulous.Avalonia/Views/Controls/Buttons/ToggleSplitButton.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/Controls/Buttons/ToggleSplitButton.Mvu.fs @@ -7,7 +7,7 @@ open Fabulous.StackAllocatedCollections.StackList module MvuToggleSplitButton = let CheckedChanged = - Attributes.defineAvaloniaPropertyWithChangedEvent' "ToggleSplitButton_CheckedChanged" ToggleSplitButton.IsCheckedProperty + Attributes.Mvu.defineAvaloniaPropertyWithChangedEvent' "ToggleSplitButton_CheckedChanged" ToggleSplitButton.IsCheckedProperty [] module MvuToggleSplitButtonBuilders = @@ -34,6 +34,7 @@ module MvuToggleSplitButtonBuilders = AttributesBundle( StackList.one(MvuToggleSplitButton.CheckedChanged.WithValue(ValueEventData.create isChecked fn)), ValueSome [| ContentControl.ContentWidget.WithValue(content.Compile()) |], + ValueNone, ValueNone ) ) diff --git a/src/Fabulous.Avalonia/Views/Controls/Calendar.Components.fs b/src/Fabulous.Avalonia/Views/Controls/Calendar.Components.fs index 51ce30402..69ba4dd68 100644 --- a/src/Fabulous.Avalonia/Views/Controls/Calendar.Components.fs +++ b/src/Fabulous.Avalonia/Views/Controls/Calendar.Components.fs @@ -9,17 +9,17 @@ open Fabulous.Avalonia module ComponentCalendar = let SelectedDateChanged = - Attributes.defineAvaloniaPropertyWithChangedEventNoDispatch + Attributes.Component.defineAvaloniaPropertyWithChangedEvent "Calendar_SelectedDateChanged" Calendar.SelectedDateProperty Option.toNullable Option.ofNullable let DisplayDateChanged = - Attributes.defineEventNoDispatch "Calendar_DisplayDateChanged" (fun target -> (target :?> Calendar).DisplayDateChanged) + Attributes.Component.defineEvent "Calendar_DisplayDateChanged" (fun target -> (target :?> Calendar).DisplayDateChanged) let DisplayModeChanged = - Attributes.defineEventNoDispatch "Calendar_DisplayModeChanged" (fun target -> (target :?> Calendar).DisplayModeChanged) + Attributes.Component.defineEvent "Calendar_DisplayModeChanged" (fun target -> (target :?> Calendar).DisplayModeChanged) [] module ComponentCalendarBuilders = diff --git a/src/Fabulous.Avalonia/Views/Controls/Calendar.Mvu.fs b/src/Fabulous.Avalonia/Views/Controls/Calendar.Mvu.fs index ca7479dae..e98fc4d80 100644 --- a/src/Fabulous.Avalonia/Views/Controls/Calendar.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/Controls/Calendar.Mvu.fs @@ -8,13 +8,13 @@ open Fabulous.Avalonia module MvuCalendar = let SelectedDateChanged = - Attributes.defineAvaloniaPropertyWithChangedEvent "Calendar_SelectedDateChanged" Calendar.SelectedDateProperty Option.toNullable Option.ofNullable + Attributes.Mvu.defineAvaloniaPropertyWithChangedEvent "Calendar_SelectedDateChanged" Calendar.SelectedDateProperty Option.toNullable Option.ofNullable let DisplayDateChanged = - Attributes.defineEvent "Calendar_DisplayDateChanged" (fun target -> (target :?> Calendar).DisplayDateChanged) + Attributes.Mvu.defineEvent "Calendar_DisplayDateChanged" (fun target -> (target :?> Calendar).DisplayDateChanged) let DisplayModeChanged = - Attributes.defineEvent "Calendar_DisplayModeChanged" (fun target -> (target :?> Calendar).DisplayModeChanged) + Attributes.Mvu.defineEvent "Calendar_DisplayModeChanged" (fun target -> (target :?> Calendar).DisplayModeChanged) [] module MvuCalendarBuilders = diff --git a/src/Fabulous.Avalonia/Views/Controls/CalendarDatePicker.Components.fs b/src/Fabulous.Avalonia/Views/Controls/CalendarDatePicker.Components.fs index b8b5032dc..15e431e39 100644 --- a/src/Fabulous.Avalonia/Views/Controls/CalendarDatePicker.Components.fs +++ b/src/Fabulous.Avalonia/Views/Controls/CalendarDatePicker.Components.fs @@ -8,20 +8,20 @@ open Fabulous.Avalonia module ComponentCalendarDatePicker = let SelectedDateChanged = - Attributes.defineAvaloniaPropertyWithChangedEventNoDispatch + Attributes.Component.defineAvaloniaPropertyWithChangedEvent "CalendarDatePicker_SelectedDateChanged" CalendarDatePicker.SelectedDateProperty Option.toNullable Option.ofNullable let DateValidationError = - Attributes.defineEventNoDispatch "CalendarDatePicker_DateValidationError" (fun target -> (target :?> CalendarDatePicker).DateValidationError) + Attributes.Component.defineEvent "CalendarDatePicker_DateValidationError" (fun target -> (target :?> CalendarDatePicker).DateValidationError) let CalendarClosed = - Attributes.defineEventNoArgNoDispatch "CalendarDatePicker_CalendarClosed" (fun target -> (target :?> CalendarDatePicker).CalendarClosed) + Attributes.Component.defineEventNoArg "CalendarDatePicker_CalendarClosed" (fun target -> (target :?> CalendarDatePicker).CalendarClosed) let CalendarOpened = - Attributes.defineEventNoArgNoDispatch "CalendarDatePicker_CalendarOpened" (fun target -> (target :?> CalendarDatePicker).CalendarOpened) + Attributes.Component.defineEventNoArg "CalendarDatePicker_CalendarOpened" (fun target -> (target :?> CalendarDatePicker).CalendarOpened) [] module ComponentCalendarDatePickerBuilders = diff --git a/src/Fabulous.Avalonia/Views/Controls/CalendarDatePicker.Mvu.fs b/src/Fabulous.Avalonia/Views/Controls/CalendarDatePicker.Mvu.fs index 00bed6ee1..21d0f41e5 100644 --- a/src/Fabulous.Avalonia/Views/Controls/CalendarDatePicker.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/Controls/CalendarDatePicker.Mvu.fs @@ -8,20 +8,20 @@ open Fabulous.Avalonia module MvuCalendarDatePicker = let SelectedDateChanged = - Attributes.defineAvaloniaPropertyWithChangedEvent + Attributes.Mvu.defineAvaloniaPropertyWithChangedEvent "CalendarDatePicker_SelectedDateChanged" CalendarDatePicker.SelectedDateProperty Option.toNullable Option.ofNullable let DateValidationError = - Attributes.defineEvent "CalendarDatePicker_DateValidationError" (fun target -> (target :?> CalendarDatePicker).DateValidationError) + Attributes.Mvu.defineEvent "CalendarDatePicker_DateValidationError" (fun target -> (target :?> CalendarDatePicker).DateValidationError) let CalendarClosed = - Attributes.defineEventNoArg "CalendarDatePicker_CalendarClosed" (fun target -> (target :?> CalendarDatePicker).CalendarClosed) + Attributes.Mvu.defineEventNoArg "CalendarDatePicker_CalendarClosed" (fun target -> (target :?> CalendarDatePicker).CalendarClosed) let CalendarOpened = - Attributes.defineEventNoArg "CalendarDatePicker_CalendarOpened" (fun target -> (target :?> CalendarDatePicker).CalendarOpened) + Attributes.Mvu.defineEventNoArg "CalendarDatePicker_CalendarOpened" (fun target -> (target :?> CalendarDatePicker).CalendarOpened) [] module MvuCalendarDatePickerBuilders = diff --git a/src/Fabulous.Avalonia/Views/Controls/CheckBox.Components.fs b/src/Fabulous.Avalonia/Views/Controls/CheckBox.Components.fs index cf4379830..5e9248404 100644 --- a/src/Fabulous.Avalonia/Views/Controls/CheckBox.Components.fs +++ b/src/Fabulous.Avalonia/Views/Controls/CheckBox.Components.fs @@ -35,6 +35,7 @@ module ComponentCheckBoxBuilders = AttributesBundle( StackList.one(ComponentToggleButton.CheckedChanged.WithValue(ComponentValueEventData.create isChecked fn)), ValueSome [| ContentControl.ContentWidget.WithValue(content.Compile()) |], + ValueNone, ValueNone ) ) @@ -80,6 +81,7 @@ module ComponentCheckBoxBuilders = ToggleButton.IsThreeState.WithValue(true) ), ValueSome [| ContentControl.ContentWidget.WithValue(content.Compile()) |], + ValueNone, ValueNone ) ) diff --git a/src/Fabulous.Avalonia/Views/Controls/CheckBox.Mvu.fs b/src/Fabulous.Avalonia/Views/Controls/CheckBox.Mvu.fs index 2d40b809d..e2990dc8b 100644 --- a/src/Fabulous.Avalonia/Views/Controls/CheckBox.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/Controls/CheckBox.Mvu.fs @@ -35,6 +35,7 @@ module MvuCheckBoxBuilders = AttributesBundle( StackList.one(MvuToggleButton.CheckedChanged.WithValue(ValueEventData.create isChecked fn)), ValueSome [| ContentControl.ContentWidget.WithValue(content.Compile()) |], + ValueNone, ValueNone ) ) @@ -76,6 +77,7 @@ module MvuCheckBoxBuilders = ToggleButton.IsThreeState.WithValue(true) ), ValueSome [| ContentControl.ContentWidget.WithValue(content.Compile()) |], + ValueNone, ValueNone ) ) diff --git a/src/Fabulous.Avalonia/Views/Controls/DatePicker.Components.fs b/src/Fabulous.Avalonia/Views/Controls/DatePicker.Components.fs index e4902dfa6..c0ccd0452 100644 --- a/src/Fabulous.Avalonia/Views/Controls/DatePicker.Components.fs +++ b/src/Fabulous.Avalonia/Views/Controls/DatePicker.Components.fs @@ -7,7 +7,7 @@ open Fabulous.Avalonia module ComponentDatePicker = let SelectedDateChanged = - Attributes.defineAvaloniaPropertyWithChangedEventNoDispatch + Attributes.Component.defineAvaloniaPropertyWithChangedEvent "DatePicker_SelectedDateChanged" DatePicker.SelectedDateProperty Nullable diff --git a/src/Fabulous.Avalonia/Views/Controls/DatePicker.Mvu.fs b/src/Fabulous.Avalonia/Views/Controls/DatePicker.Mvu.fs index ba5b79235..857aff2b0 100644 --- a/src/Fabulous.Avalonia/Views/Controls/DatePicker.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/Controls/DatePicker.Mvu.fs @@ -7,7 +7,7 @@ open Fabulous.Avalonia module MvuDatePicker = let SelectedDateChanged = - Attributes.defineAvaloniaPropertyWithChangedEvent "DatePicker_SelectedDateChanged" DatePicker.SelectedDateProperty Nullable Nullable.op_Explicit + Attributes.Mvu.defineAvaloniaPropertyWithChangedEvent "DatePicker_SelectedDateChanged" DatePicker.SelectedDateProperty Nullable Nullable.op_Explicit [] module MvuDatePickerBuilders = diff --git a/src/Fabulous.Avalonia/Views/Controls/Documents/InlineUIContainer.fs b/src/Fabulous.Avalonia/Views/Controls/Documents/InlineUIContainer.fs index 75a9b8775..625a39808 100644 --- a/src/Fabulous.Avalonia/Views/Controls/Documents/InlineUIContainer.fs +++ b/src/Fabulous.Avalonia/Views/Controls/Documents/InlineUIContainer.fs @@ -21,10 +21,7 @@ module InlineUIContainerBuilders = /// Creates a InlineUIContainer widget. /// The content of the InlineUIContainer. static member InlineUIContainer(content: WidgetBuilder<'msg, #IFabControl>) = - WidgetBuilder<'msg, IFabInlineUIContainer>( - InlineUIContainer.WidgetKey, - AttributesBundle(StackList.empty(), ValueSome [| InlineUIContainer.Children.WithValue(content.Compile()) |], ValueNone) - ) + WidgetBuilder<'msg, IFabInlineUIContainer>(InlineUIContainer.WidgetKey, InlineUIContainer.Children.WithValue(content.Compile())) type InlineUIContainerModifiers = diff --git a/src/Fabulous.Avalonia/Views/Controls/Documents/LineBreak.fs b/src/Fabulous.Avalonia/Views/Controls/Documents/LineBreak.fs index 7f9c59af1..0a324f1a5 100644 --- a/src/Fabulous.Avalonia/Views/Controls/Documents/LineBreak.fs +++ b/src/Fabulous.Avalonia/Views/Controls/Documents/LineBreak.fs @@ -17,7 +17,7 @@ module LineBreakBuilders = /// Creates a LineBreak widget. static member LineBreak() = - WidgetBuilder<'msg, IFabLineBreak>(LineBreak.WidgetKey, AttributesBundle(StackList.empty(), ValueNone, ValueNone)) + WidgetBuilder<'msg, IFabLineBreak>(LineBreak.WidgetKey) type LineBreakModifiers = /// Link a ViewRef to access the direct LineBreak control instance. diff --git a/src/Fabulous.Avalonia/Views/Controls/Expander.Components.fs b/src/Fabulous.Avalonia/Views/Controls/Expander.Components.fs index 16b11f8aa..b3ddacae9 100644 --- a/src/Fabulous.Avalonia/Views/Controls/Expander.Components.fs +++ b/src/Fabulous.Avalonia/Views/Controls/Expander.Components.fs @@ -9,13 +9,13 @@ open Fabulous.StackAllocatedCollections.StackList module ComponentExpander = let ExpandedChanged = - Attributes.defineAvaloniaPropertyWithChangedEventNoDispatch' "Expander_IsExpandedChanged" Expander.IsExpandedProperty + Attributes.Component.defineAvaloniaPropertyWithChangedEvent' "Expander_IsExpandedChanged" Expander.IsExpandedProperty let Collapsing = - Attributes.defineEventNoDispatch "Expander_Collapsing" (fun target -> (target :?> Expander).Collapsing) + Attributes.Component.defineEvent "Expander_Collapsing" (fun target -> (target :?> Expander).Collapsing) let Expanding = - Attributes.defineEventNoDispatch "Expander_Expanding" (fun target -> (target :?> Expander).Expanding) + Attributes.Component.defineEvent "Expander_Expanding" (fun target -> (target :?> Expander).Expanding) [] module ComponentExpanderBuilders = @@ -40,6 +40,7 @@ module ComponentExpanderBuilders = AttributesBundle( StackList.one(ContentControl.ContentString.WithValue(content)), ValueSome [| HeaderedContentControl.HeaderWidget.WithValue(header.Compile()) |], + ValueNone, ValueNone ) ) @@ -53,6 +54,7 @@ module ComponentExpanderBuilders = AttributesBundle( StackList.one(HeaderedContentControl.HeaderString.WithValue(header)), ValueSome [| ContentControl.ContentWidget.WithValue(content.Compile()) |], + ValueNone, ValueNone ) ) @@ -68,6 +70,7 @@ module ComponentExpanderBuilders = ValueSome [| HeaderedContentControl.HeaderWidget.WithValue(header.Compile()) ContentControl.ContentWidget.WithValue(content.Compile()) |], + ValueNone, ValueNone ) ) diff --git a/src/Fabulous.Avalonia/Views/Controls/Expander.Mvu.fs b/src/Fabulous.Avalonia/Views/Controls/Expander.Mvu.fs index 03566d450..656505fe1 100644 --- a/src/Fabulous.Avalonia/Views/Controls/Expander.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/Controls/Expander.Mvu.fs @@ -8,13 +8,13 @@ open Fabulous.Avalonia module MvuExpander = let ExpandedChanged = - Attributes.defineAvaloniaPropertyWithChangedEvent' "Expander_IsExpandedChanged" Expander.IsExpandedProperty + Attributes.Mvu.defineAvaloniaPropertyWithChangedEvent' "Expander_IsExpandedChanged" Expander.IsExpandedProperty let Collapsing = - Attributes.defineEvent "Expander_Collapsing" (fun target -> (target :?> Expander).Collapsing) + Attributes.Mvu.defineEvent "Expander_Collapsing" (fun target -> (target :?> Expander).Collapsing) let Expanding = - Attributes.defineEvent "Expander_Expanding" (fun target -> (target :?> Expander).Expanding) + Attributes.Mvu.defineEvent "Expander_Expanding" (fun target -> (target :?> Expander).Expanding) type MvuExpanderModifiers = /// Listens to the Expander ExpandedChanged event. diff --git a/src/Fabulous.Avalonia/Views/Controls/Expander.fs b/src/Fabulous.Avalonia/Views/Controls/Expander.fs index b4ea5f6a0..e9b3a41ed 100644 --- a/src/Fabulous.Avalonia/Views/Controls/Expander.fs +++ b/src/Fabulous.Avalonia/Views/Controls/Expander.fs @@ -44,6 +44,7 @@ module ExpanderBuilders = AttributesBundle( StackList.one(ContentControl.ContentString.WithValue(content)), ValueSome [| HeaderedContentControl.HeaderWidget.WithValue(header.Compile()) |], + ValueNone, ValueNone ) ) @@ -57,6 +58,7 @@ module ExpanderBuilders = AttributesBundle( StackList.one(HeaderedContentControl.HeaderString.WithValue(header)), ValueSome [| ContentControl.ContentWidget.WithValue(content.Compile()) |], + ValueNone, ValueNone ) ) @@ -72,6 +74,7 @@ module ExpanderBuilders = ValueSome [| HeaderedContentControl.HeaderWidget.WithValue(header.Compile()) ContentControl.ContentWidget.WithValue(content.Compile()) |], + ValueNone, ValueNone ) ) diff --git a/src/Fabulous.Avalonia/Views/Controls/ExperimentalAcrylicBorder.fs b/src/Fabulous.Avalonia/Views/Controls/ExperimentalAcrylicBorder.fs index 5e315c86a..3eb5dfc22 100644 --- a/src/Fabulous.Avalonia/Views/Controls/ExperimentalAcrylicBorder.fs +++ b/src/Fabulous.Avalonia/Views/Controls/ExperimentalAcrylicBorder.fs @@ -25,14 +25,11 @@ module ExperimentalAcrylicBorderBuilders = /// Creates a ExperimentalAcrylicBorder widget. /// The content of the ExperimentalAcrylicBorder. static member ExperimentalAcrylicBorder(content: WidgetBuilder<'msg, #IFabControl>) = - WidgetBuilder<'msg, IFabExperimentalAcrylicBorder>( - ExperimentalAcrylicBorder.WidgetKey, - AttributesBundle(StackList.empty(), ValueSome [| Decorator.ChildWidget.WithValue(content.Compile()) |], ValueNone) - ) + WidgetBuilder<'msg, IFabExperimentalAcrylicBorder>(ExperimentalAcrylicBorder.WidgetKey, Decorator.ChildWidget.WithValue(content.Compile())) /// Creates a ExperimentalAcrylicBorder widget. static member ExperimentalAcrylicBorder() = - WidgetBuilder<'msg, IFabExperimentalAcrylicBorder>(ExperimentalAcrylicBorder.WidgetKey, AttributesBundle(StackList.empty(), ValueNone, ValueNone)) + WidgetBuilder<'msg, IFabExperimentalAcrylicBorder>(ExperimentalAcrylicBorder.WidgetKey) type ExperimentalAcrylicBorderModifiers = diff --git a/src/Fabulous.Avalonia/Views/Controls/ExperimentalAcrylicMaterial.Components.fs b/src/Fabulous.Avalonia/Views/Controls/ExperimentalAcrylicMaterial.Components.fs index e47b6e380..bd527e1d1 100644 --- a/src/Fabulous.Avalonia/Views/Controls/ExperimentalAcrylicMaterial.Components.fs +++ b/src/Fabulous.Avalonia/Views/Controls/ExperimentalAcrylicMaterial.Components.fs @@ -7,7 +7,7 @@ open Fabulous.Avalonia module ComponentExperimentalAcrylicMaterial = let Invalidated = - Attributes.defineEventNoArgNoDispatch "ExperimentalAcrylicMaterial_Invalidated" (fun target -> (target :?> ExperimentalAcrylicMaterial).Invalidated) + Attributes.Component.defineEventNoArg "ExperimentalAcrylicMaterial_Invalidated" (fun target -> (target :?> ExperimentalAcrylicMaterial).Invalidated) type ComponentExperimentalAcrylicMaterialModifiers = /// Listens the ExperimentalAcrylicMaterial Invalidated event. diff --git a/src/Fabulous.Avalonia/Views/Controls/ExperimentalAcrylicMaterial.Mvu.fs b/src/Fabulous.Avalonia/Views/Controls/ExperimentalAcrylicMaterial.Mvu.fs index ccce40e3c..436f07b18 100644 --- a/src/Fabulous.Avalonia/Views/Controls/ExperimentalAcrylicMaterial.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/Controls/ExperimentalAcrylicMaterial.Mvu.fs @@ -7,7 +7,7 @@ open Fabulous.Avalonia module MvuExperimentalAcrylicMaterial = let Invalidated = - Attributes.defineEventNoArg "ExperimentalAcrylicMaterial_Invalidated" (fun target -> (target :?> ExperimentalAcrylicMaterial).Invalidated) + Attributes.Mvu.defineEventNoArg "ExperimentalAcrylicMaterial_Invalidated" (fun target -> (target :?> ExperimentalAcrylicMaterial).Invalidated) type MvuExperimentalAcrylicMaterialModifiers = /// Listens the ExperimentalAcrylicMaterial Invalidated event. diff --git a/src/Fabulous.Avalonia/Views/Controls/ExperimentalAcrylicMaterial.fs b/src/Fabulous.Avalonia/Views/Controls/ExperimentalAcrylicMaterial.fs index ad9649281..20576d2db 100644 --- a/src/Fabulous.Avalonia/Views/Controls/ExperimentalAcrylicMaterial.fs +++ b/src/Fabulous.Avalonia/Views/Controls/ExperimentalAcrylicMaterial.fs @@ -35,10 +35,7 @@ module ExperimentalAcrylicMaterialBuilders = /// Creates a ExperimentalAcrylicMaterial widget. static member ExperimentalAcrylicMaterial() = - WidgetBuilder<'msg, IFabExperimentalAcrylicMaterial>( - ExperimentalAcrylicMaterial.WidgetKey, - AttributesBundle(StackList.empty(), ValueNone, ValueNone) - ) + WidgetBuilder<'msg, IFabExperimentalAcrylicMaterial>(ExperimentalAcrylicMaterial.WidgetKey) type ExperimentalAcrylicMaterialModifiers = diff --git a/src/Fabulous.Avalonia/Views/Controls/HeaderedContentControl.fs b/src/Fabulous.Avalonia/Views/Controls/HeaderedContentControl.fs index fa3a8a07b..92023fca7 100644 --- a/src/Fabulous.Avalonia/Views/Controls/HeaderedContentControl.fs +++ b/src/Fabulous.Avalonia/Views/Controls/HeaderedContentControl.fs @@ -30,6 +30,7 @@ module HeaderedContentControlBuilders = AttributesBundle( StackList.one(HeaderedContentControl.HeaderString.WithValue(header)), ValueSome [| ContentControl.ContentWidget.WithValue(content.Compile()) |], + ValueNone, ValueNone ) ) @@ -45,6 +46,7 @@ module HeaderedContentControlBuilders = ValueSome [| HeaderedContentControl.HeaderWidget.WithValue(header.Compile()) ContentControl.ContentWidget.WithValue(content.Compile()) |], + ValueNone, ValueNone ) ) diff --git a/src/Fabulous.Avalonia/Views/Controls/Label.fs b/src/Fabulous.Avalonia/Views/Controls/Label.fs index cb10ba7af..f0862d617 100644 --- a/src/Fabulous.Avalonia/Views/Controls/Label.fs +++ b/src/Fabulous.Avalonia/Views/Controls/Label.fs @@ -26,10 +26,7 @@ module LabelBuilders = /// Creates a Label widget. /// The content to display. static member inline Label(content: WidgetBuilder<'msg, #IFabControl>) = - WidgetBuilder<'msg, IFabLabel>( - Label.WidgetKey, - AttributesBundle(StackList.empty(), ValueSome [| ContentControl.ContentWidget.WithValue(content.Compile()) |], ValueNone) - ) + WidgetBuilder<'msg, IFabLabel>(Label.WidgetKey, ContentControl.ContentWidget.WithValue(content.Compile())) type LabelModifiers = /// Sets the Target property. diff --git a/src/Fabulous.Avalonia/Views/Controls/LayoutTransformControl.fs b/src/Fabulous.Avalonia/Views/Controls/LayoutTransformControl.fs index a9a9aa972..2318269b3 100644 --- a/src/Fabulous.Avalonia/Views/Controls/LayoutTransformControl.fs +++ b/src/Fabulous.Avalonia/Views/Controls/LayoutTransformControl.fs @@ -28,10 +28,7 @@ module LayoutTransformControlBuilders = /// Creates a LayoutTransformControl widget. /// The content of the LayoutTransformControl. static member LayoutTransformControl(content: WidgetBuilder<'msg, #IFabControl>) = - WidgetBuilder<'msg, IFabLayoutTransformControl>( - LayoutTransformControl.WidgetKey, - AttributesBundle(StackList.empty(), ValueSome [| Decorator.ChildWidget.WithValue(content.Compile()) |], ValueNone) - ) + WidgetBuilder<'msg, IFabLayoutTransformControl>(LayoutTransformControl.WidgetKey, Decorator.ChildWidget.WithValue(content.Compile())) type LayoutTransformControlModifiers = /// Sets the LayoutTransform property. diff --git a/src/Fabulous.Avalonia/Views/Controls/MaskedTextBox.Components.fs b/src/Fabulous.Avalonia/Views/Controls/MaskedTextBox.Components.fs index 5a984ea0a..a87be5aca 100644 --- a/src/Fabulous.Avalonia/Views/Controls/MaskedTextBox.Components.fs +++ b/src/Fabulous.Avalonia/Views/Controls/MaskedTextBox.Components.fs @@ -6,7 +6,7 @@ open Fabulous.Avalonia module ComponentMaskedTextBox = let TextChanged = - Attributes.defineAvaloniaPropertyWithChangedEventNoDispatch' "MaskedTextBox_TextChanged" MaskedTextBox.TextProperty + Attributes.Component.defineAvaloniaPropertyWithChangedEvent' "MaskedTextBox_TextChanged" MaskedTextBox.TextProperty [] module ComponentMaskedTextBoxBuilders = diff --git a/src/Fabulous.Avalonia/Views/Controls/MaskedTextBox.Mvu.fs b/src/Fabulous.Avalonia/Views/Controls/MaskedTextBox.Mvu.fs index f9a80237e..90714b2ea 100644 --- a/src/Fabulous.Avalonia/Views/Controls/MaskedTextBox.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/Controls/MaskedTextBox.Mvu.fs @@ -6,7 +6,7 @@ open Fabulous.Avalonia module MvuMaskedTextBox = let TextChanged = - Attributes.defineAvaloniaPropertyWithChangedEvent' "MaskedTextBox_TextChanged" MaskedTextBox.TextProperty + Attributes.Mvu.defineAvaloniaPropertyWithChangedEvent' "MaskedTextBox_TextChanged" MaskedTextBox.TextProperty [] module MvuMaskedTextBoxBuilders = diff --git a/src/Fabulous.Avalonia/Views/Controls/Notifications/NotificationCard.Components.fs b/src/Fabulous.Avalonia/Views/Controls/Notifications/NotificationCard.Components.fs index 38eb38778..d0c5475ec 100644 --- a/src/Fabulous.Avalonia/Views/Controls/Notifications/NotificationCard.Components.fs +++ b/src/Fabulous.Avalonia/Views/Controls/Notifications/NotificationCard.Components.fs @@ -8,7 +8,7 @@ open Fabulous.Avalonia module ComponentNotificationCard = let NotificationClosed = - Attributes.defineEventNoDispatch "NotificationCard_NotificationClosed" (fun target -> (target :?> NotificationCard).NotificationClosed) + Attributes.Component.defineEvent "NotificationCard_NotificationClosed" (fun target -> (target :?> NotificationCard).NotificationClosed) type ComponentNotificationCardModifiers = /// Listens to the NotificationCard NotificationClosed event. diff --git a/src/Fabulous.Avalonia/Views/Controls/Notifications/NotificationCard.Mvu.fs b/src/Fabulous.Avalonia/Views/Controls/Notifications/NotificationCard.Mvu.fs index f629c0657..b33b7bbb4 100644 --- a/src/Fabulous.Avalonia/Views/Controls/Notifications/NotificationCard.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/Controls/Notifications/NotificationCard.Mvu.fs @@ -8,7 +8,7 @@ open Fabulous.Avalonia module MvuNotificationCard = let NotificationClosed = - Attributes.defineEvent "NotificationCard_NotificationClosed" (fun target -> (target :?> NotificationCard).NotificationClosed) + Attributes.Mvu.defineEvent "NotificationCard_NotificationClosed" (fun target -> (target :?> NotificationCard).NotificationClosed) type MvuNotificationCardModifiers = /// Listens to the NotificationCard NotificationClosed event. diff --git a/src/Fabulous.Avalonia/Views/Controls/Notifications/NotificationCard.fs b/src/Fabulous.Avalonia/Views/Controls/Notifications/NotificationCard.fs index 1ab88bf0d..7db89139e 100644 --- a/src/Fabulous.Avalonia/Views/Controls/Notifications/NotificationCard.fs +++ b/src/Fabulous.Avalonia/Views/Controls/Notifications/NotificationCard.fs @@ -34,6 +34,7 @@ module NotificationCardBuilders = AttributesBundle( StackList.one(NotificationCard.IsClosed.WithValue(isClosed)), ValueSome [| ContentControl.ContentWidget.WithValue(content.Compile()) |], + ValueNone, ValueNone ) ) diff --git a/src/Fabulous.Avalonia/Views/Controls/Notifications/WindowNotificationManager.fs b/src/Fabulous.Avalonia/Views/Controls/Notifications/WindowNotificationManager.fs index 6b42f6a57..05a54ac8c 100644 --- a/src/Fabulous.Avalonia/Views/Controls/Notifications/WindowNotificationManager.fs +++ b/src/Fabulous.Avalonia/Views/Controls/Notifications/WindowNotificationManager.fs @@ -24,10 +24,7 @@ module WindowNotificationManagerBuilders = /// Creates a WindowNotificationManager widget. static member WindowNotificationManager(viewRef: ViewRef) = - WidgetBuilder<'msg, IFabWindowNotificationManager>( - WindowNotificationManager.WidgetKey, - AttributesBundle(StackList.one(ViewRefAttributes.ViewRef.WithValue(viewRef.Unbox)), ValueNone, ValueNone) - ) + WidgetBuilder<'msg, IFabWindowNotificationManager>(WindowNotificationManager.WidgetKey, ViewRefAttributes.ViewRef.WithValue(viewRef.Unbox)) type WindowNotificationManagerModifiers = diff --git a/src/Fabulous.Avalonia/Views/Controls/NumericUpDown.Components.fs b/src/Fabulous.Avalonia/Views/Controls/NumericUpDown.Components.fs index 8e9c51958..f30c2b665 100644 --- a/src/Fabulous.Avalonia/Views/Controls/NumericUpDown.Components.fs +++ b/src/Fabulous.Avalonia/Views/Controls/NumericUpDown.Components.fs @@ -6,7 +6,7 @@ open Fabulous.Avalonia module ComponentNumericUpDown = let ValueChanged = - Attributes.defineAvaloniaPropertyWithChangedEventNoDispatch "NumericUpDown_ValueChanged" NumericUpDown.ValueProperty Option.toNullable Option.ofNullable + Attributes.Component.defineAvaloniaPropertyWithChangedEvent "NumericUpDown_ValueChanged" NumericUpDown.ValueProperty Option.toNullable Option.ofNullable [] module ComponentNumericUpDownBuilders = diff --git a/src/Fabulous.Avalonia/Views/Controls/NumericUpDown.Mvu.fs b/src/Fabulous.Avalonia/Views/Controls/NumericUpDown.Mvu.fs index 49fcb574e..349eb102e 100644 --- a/src/Fabulous.Avalonia/Views/Controls/NumericUpDown.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/Controls/NumericUpDown.Mvu.fs @@ -7,7 +7,7 @@ open Fabulous.Avalonia module MvuNumericUpDown = let ValueChanged = - Attributes.defineAvaloniaPropertyWithChangedEvent "NumericUpDown_ValueChanged" NumericUpDown.ValueProperty Option.toNullable Option.ofNullable + Attributes.Mvu.defineAvaloniaPropertyWithChangedEvent "NumericUpDown_ValueChanged" NumericUpDown.ValueProperty Option.toNullable Option.ofNullable [] module MvuNumericUpDownBuilders = diff --git a/src/Fabulous.Avalonia/Views/Controls/Primitives/Popup.Components.fs b/src/Fabulous.Avalonia/Views/Controls/Primitives/Popup.Components.fs index a7299733c..b7e5779d5 100644 --- a/src/Fabulous.Avalonia/Views/Controls/Primitives/Popup.Components.fs +++ b/src/Fabulous.Avalonia/Views/Controls/Primitives/Popup.Components.fs @@ -7,10 +7,10 @@ open Fabulous.Avalonia module ComponentPopup = let Closed = - Attributes.defineEventNoDispatch "Popup_Closed" (fun target -> (target :?> Popup).Closed) + Attributes.Component.defineEvent "Popup_Closed" (fun target -> (target :?> Popup).Closed) let Opened = - Attributes.defineEventNoArgNoDispatch "Popup_Opened" (fun target -> (target :?> Popup).Opened) + Attributes.Component.defineEventNoArg "Popup_Opened" (fun target -> (target :?> Popup).Opened) type ComponentPopupModifiers = /// Listens to the Popup Closed event. diff --git a/src/Fabulous.Avalonia/Views/Controls/Primitives/Popup.Mvu.fs b/src/Fabulous.Avalonia/Views/Controls/Primitives/Popup.Mvu.fs index be16cf7fc..45ab62bc3 100644 --- a/src/Fabulous.Avalonia/Views/Controls/Primitives/Popup.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/Controls/Primitives/Popup.Mvu.fs @@ -7,10 +7,10 @@ open Fabulous.Avalonia module MvuPopup = let Closed = - Attributes.defineEvent "Popup_Closed" (fun target -> (target :?> Popup).Closed) + Attributes.Mvu.defineEvent "Popup_Closed" (fun target -> (target :?> Popup).Closed) let Opened = - Attributes.defineEventNoArg "Popup_Opened" (fun target -> (target :?> Popup).Opened) + Attributes.Mvu.defineEventNoArg "Popup_Opened" (fun target -> (target :?> Popup).Opened) type MvuPopupModifiers = /// Listens to the Popup Closed event. diff --git a/src/Fabulous.Avalonia/Views/Controls/Primitives/Popup.fs b/src/Fabulous.Avalonia/Views/Controls/Primitives/Popup.fs index acac01d14..bc9a3cfc0 100644 --- a/src/Fabulous.Avalonia/Views/Controls/Primitives/Popup.fs +++ b/src/Fabulous.Avalonia/Views/Controls/Primitives/Popup.fs @@ -60,6 +60,9 @@ module Popup = let OverlayInputPassThroughElement = Attributes.defineAvaloniaPropertyWithEquality Popup.OverlayInputPassThroughElementProperty + let CustomPopupPlacementCallback = + Attributes.defineAvaloniaPropertyWithEquality Popup.CustomPopupPlacementCallbackProperty + [] module PopupBuilders = type Fabulous.Avalonia.View with @@ -70,7 +73,7 @@ module PopupBuilders = static member Popup(isOpen: bool, content: WidgetBuilder<'msg, #IFabControl>) = WidgetBuilder<'msg, IFabPopup>( Popup.WidgetKey, - AttributesBundle(StackList.one(Popup.IsOpen.WithValue(isOpen)), ValueSome [| Popup.Child.WithValue(content.Compile()) |], ValueNone) + AttributesBundle(StackList.one(Popup.IsOpen.WithValue(isOpen)), ValueSome [| Popup.Child.WithValue(content.Compile()) |], ValueNone, ValueNone) ) type PopupModifiers = @@ -174,6 +177,13 @@ type PopupModifiers = static member inline overlayInputPassThroughElement(this: WidgetBuilder<'msg, #IFabPopup>, value: IInputElement) = this.AddScalar(Popup.OverlayInputPassThroughElement.WithValue(value)) + /// Sets the CustomPopupPlacementCallback property. + /// Current widget. + /// The CustomPopupPlacementCallback value. + [] + static member inline customPopupPlacementCallback(this: WidgetBuilder<'msg, #IFabPopup>, value: CustomPopupPlacement -> unit) = + this.AddScalar(Popup.CustomPopupPlacementCallback.WithValue(CustomPopupPlacementCallback(value))) + /// Link a ViewRef to access the direct Popup control instance. /// Current widget. /// The ViewRef instance that will receive access to the underlying control. diff --git a/src/Fabulous.Avalonia/Views/Controls/Primitives/ScrollBar.Components.fs b/src/Fabulous.Avalonia/Views/Controls/Primitives/ScrollBar.Components.fs index 12ed75bc8..56111389e 100644 --- a/src/Fabulous.Avalonia/Views/Controls/Primitives/ScrollBar.Components.fs +++ b/src/Fabulous.Avalonia/Views/Controls/Primitives/ScrollBar.Components.fs @@ -7,7 +7,7 @@ open Fabulous.Avalonia module ComponentScrollBar = let Scroll = - Attributes.defineEventNoDispatch "ScrollBar_Scroll" (fun target -> (target :?> ScrollBar).Scroll) + Attributes.Component.defineEvent "ScrollBar_Scroll" (fun target -> (target :?> ScrollBar).Scroll) [] module ComponentScrollBarBuilders = diff --git a/src/Fabulous.Avalonia/Views/Controls/Primitives/ScrollBar.Mvu.fs b/src/Fabulous.Avalonia/Views/Controls/Primitives/ScrollBar.Mvu.fs index a15fd7e21..5a8104ed4 100644 --- a/src/Fabulous.Avalonia/Views/Controls/Primitives/ScrollBar.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/Controls/Primitives/ScrollBar.Mvu.fs @@ -7,7 +7,7 @@ open Fabulous.Avalonia module MvuScrollBar = let Scroll = - Attributes.defineEvent "ScrollBar_Scroll" (fun target -> (target :?> ScrollBar).Scroll) + Attributes.Mvu.defineEvent "ScrollBar_Scroll" (fun target -> (target :?> ScrollBar).Scroll) [] module MvuScrollBarBuilders = diff --git a/src/Fabulous.Avalonia/Views/Controls/Primitives/Thumb.Components.fs b/src/Fabulous.Avalonia/Views/Controls/Primitives/Thumb.Components.fs index 521c06408..b3cd22beb 100644 --- a/src/Fabulous.Avalonia/Views/Controls/Primitives/Thumb.Components.fs +++ b/src/Fabulous.Avalonia/Views/Controls/Primitives/Thumb.Components.fs @@ -10,13 +10,13 @@ open Fabulous.StackAllocatedCollections.StackList module ComponentThumb = let DragStarted = - Attributes.defineEventNoDispatch "Thumb_DragStarted" (fun target -> (target :?> Thumb).DragStarted) + Attributes.Mvu.defineEvent "Thumb_DragStarted" (fun target -> (target :?> Thumb).DragStarted) let DragDelta = - Attributes.defineEventNoDispatch "Thumb_DragDelta" (fun target -> (target :?> Thumb).DragDelta) + Attributes.Mvu.defineEvent "Thumb_DragDelta" (fun target -> (target :?> Thumb).DragDelta) let DragCompleted = - Attributes.defineEventNoDispatch "Thumb_DragCompleted" (fun target -> (target :?> Thumb).DragCompleted) + Attributes.Mvu.defineEvent "Thumb_DragCompleted" (fun target -> (target :?> Thumb).DragCompleted) type ComponentThumbModifiers = diff --git a/src/Fabulous.Avalonia/Views/Controls/Primitives/Thumb.Mvu.fs b/src/Fabulous.Avalonia/Views/Controls/Primitives/Thumb.Mvu.fs index 8c797e322..7fa5003ed 100644 --- a/src/Fabulous.Avalonia/Views/Controls/Primitives/Thumb.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/Controls/Primitives/Thumb.Mvu.fs @@ -9,13 +9,13 @@ open Fabulous.StackAllocatedCollections.StackList module MvuThumb = let DragStarted = - Attributes.defineEvent "Thumb_DragStarted" (fun target -> (target :?> Thumb).DragStarted) + Attributes.Mvu.defineEvent "Thumb_DragStarted" (fun target -> (target :?> Thumb).DragStarted) let DragDelta = - Attributes.defineEvent "Thumb_DragDelta" (fun target -> (target :?> Thumb).DragDelta) + Attributes.Mvu.defineEvent "Thumb_DragDelta" (fun target -> (target :?> Thumb).DragDelta) let DragCompleted = - Attributes.defineEvent "Thumb_DragCompleted" (fun target -> (target :?> Thumb).DragCompleted) + Attributes.Mvu.defineEvent "Thumb_DragCompleted" (fun target -> (target :?> Thumb).DragCompleted) type MvuThumbModifiers = diff --git a/src/Fabulous.Avalonia/Views/Controls/Primitives/Thumb.fs b/src/Fabulous.Avalonia/Views/Controls/Primitives/Thumb.fs index e0e7e783f..2658769d7 100644 --- a/src/Fabulous.Avalonia/Views/Controls/Primitives/Thumb.fs +++ b/src/Fabulous.Avalonia/Views/Controls/Primitives/Thumb.fs @@ -17,15 +17,12 @@ module ThumbBuilders = /// Creates a Thumb widget. static member Thumb() = - WidgetBuilder<'msg, IFabThumb>(Thumb.WidgetKey, AttributesBundle(StackList.empty(), ValueNone, ValueNone)) + WidgetBuilder<'msg, IFabThumb>(Thumb.WidgetKey) /// Creates a Thumb widget. /// The template to use for the Thumb. static member Thumb(template: WidgetBuilder<'msg, #IFabControl>) = - WidgetBuilder<'msg, IFabThumb>( - Thumb.WidgetKey, - AttributesBundle(StackList.one(TemplatedControl.Template.WithValue(template.Compile())), ValueNone, ValueNone) - ) + WidgetBuilder<'msg, IFabThumb>(Thumb.WidgetKey, TemplatedControl.Template.WithValue(template.Compile())) type ThumbModifiers = diff --git a/src/Fabulous.Avalonia/Views/Controls/Primitives/_RangeBase.Components.fs b/src/Fabulous.Avalonia/Views/Controls/Primitives/_RangeBase.Components.fs index ece32f81e..48a9feafb 100644 --- a/src/Fabulous.Avalonia/Views/Controls/Primitives/_RangeBase.Components.fs +++ b/src/Fabulous.Avalonia/Views/Controls/Primitives/_RangeBase.Components.fs @@ -5,4 +5,4 @@ open Fabulous.Avalonia module ComponentRangeBase = let ValueChanged = - Attributes.defineAvaloniaPropertyWithChangedEventNoDispatch' "RangeBase_ValueChanged" RangeBase.ValueProperty + Attributes.Component.defineAvaloniaPropertyWithChangedEvent' "RangeBase_ValueChanged" RangeBase.ValueProperty diff --git a/src/Fabulous.Avalonia/Views/Controls/Primitives/_RangeBase.Mvu.fs b/src/Fabulous.Avalonia/Views/Controls/Primitives/_RangeBase.Mvu.fs index 58c5d767a..304c2e8cf 100644 --- a/src/Fabulous.Avalonia/Views/Controls/Primitives/_RangeBase.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/Controls/Primitives/_RangeBase.Mvu.fs @@ -5,4 +5,4 @@ open Fabulous.Avalonia module MvuRangeBase = let ValueChanged = - Attributes.defineAvaloniaPropertyWithChangedEvent' "RangeBase_ValueChanged" RangeBase.ValueProperty + Attributes.Mvu.defineAvaloniaPropertyWithChangedEvent' "RangeBase_ValueChanged" RangeBase.ValueProperty diff --git a/src/Fabulous.Avalonia/Views/Controls/RefreshContainer.Components.fs b/src/Fabulous.Avalonia/Views/Controls/RefreshContainer.Components.fs index 351f5a84b..2d22a845e 100644 --- a/src/Fabulous.Avalonia/Views/Controls/RefreshContainer.Components.fs +++ b/src/Fabulous.Avalonia/Views/Controls/RefreshContainer.Components.fs @@ -8,7 +8,7 @@ open Fabulous.Avalonia module ComponentRefreshContainer = let RefreshRequested = - Attributes.defineEventNoDispatch "RefreshContainer_RefreshRequested" (fun target -> + Attributes.Component.defineEvent "RefreshContainer_RefreshRequested" (fun target -> (target :?> RefreshContainer).RefreshRequested) type ComponentRefreshContainerModifiers = diff --git a/src/Fabulous.Avalonia/Views/Controls/RefreshContainer.Mvu.fs b/src/Fabulous.Avalonia/Views/Controls/RefreshContainer.Mvu.fs index 67c51b09f..214157d97 100644 --- a/src/Fabulous.Avalonia/Views/Controls/RefreshContainer.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/Controls/RefreshContainer.Mvu.fs @@ -7,7 +7,7 @@ open Fabulous.Avalonia module MvuRefreshContainer = let RefreshRequested = - Attributes.defineEvent "RefreshContainer_RefreshRequested" (fun target -> (target :?> RefreshContainer).RefreshRequested) + Attributes.Mvu.defineEvent "RefreshContainer_RefreshRequested" (fun target -> (target :?> RefreshContainer).RefreshRequested) type MvuRefreshContainerModifiers = /// Listens the RefreshContainer RefreshRequested event. diff --git a/src/Fabulous.Avalonia/Views/Controls/RefreshContainer.fs b/src/Fabulous.Avalonia/Views/Controls/RefreshContainer.fs index 64aeaec74..6fd103b42 100644 --- a/src/Fabulous.Avalonia/Views/Controls/RefreshContainer.fs +++ b/src/Fabulous.Avalonia/Views/Controls/RefreshContainer.fs @@ -26,10 +26,7 @@ module RefreshContainerBuilders = /// Creates a RefreshContainer widget. /// The content of the RefreshContainer. static member RefreshContainer(content: WidgetBuilder<'msg, #IFabControl>) = - WidgetBuilder<'msg, IFabRefreshContainer>( - RefreshContainer.WidgetKey, - AttributesBundle(StackList.empty(), ValueSome [| ContentControl.ContentWidget.WithValue(content.Compile()) |], ValueNone) - ) + WidgetBuilder<'msg, IFabRefreshContainer>(RefreshContainer.WidgetKey, ContentControl.ContentWidget.WithValue(content.Compile())) type RefreshContainerModifiers = diff --git a/src/Fabulous.Avalonia/Views/Controls/RefreshVisualizer.Components.fs b/src/Fabulous.Avalonia/Views/Controls/RefreshVisualizer.Components.fs index c251edf39..840362468 100644 --- a/src/Fabulous.Avalonia/Views/Controls/RefreshVisualizer.Components.fs +++ b/src/Fabulous.Avalonia/Views/Controls/RefreshVisualizer.Components.fs @@ -7,7 +7,7 @@ open Fabulous.Avalonia module ComponentRefreshVisualizer = let RefreshRequested = - Attributes.defineEventNoDispatch "RefreshVisualizer_RefreshRequested" (fun target -> + Attributes.Component.defineEvent "RefreshVisualizer_RefreshRequested" (fun target -> (target :?> RefreshVisualizer).RefreshRequested) type ComponentRefreshVisualizerModifiers = diff --git a/src/Fabulous.Avalonia/Views/Controls/RefreshVisualizer.Mvu.fs b/src/Fabulous.Avalonia/Views/Controls/RefreshVisualizer.Mvu.fs index 6e2eb2bae..8ca74b636 100644 --- a/src/Fabulous.Avalonia/Views/Controls/RefreshVisualizer.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/Controls/RefreshVisualizer.Mvu.fs @@ -8,7 +8,8 @@ open Fabulous.Avalonia module MvuRefreshVisualizer = let RefreshRequested = - Attributes.defineEvent "RefreshVisualizer_RefreshRequested" (fun target -> (target :?> RefreshVisualizer).RefreshRequested) + Attributes.Mvu.defineEvent "RefreshVisualizer_RefreshRequested" (fun target -> + (target :?> RefreshVisualizer).RefreshRequested) type MvuRefreshVisualizerModifiers = /// Listens the RefreshVisualizer RefreshRequested event. diff --git a/src/Fabulous.Avalonia/Views/Controls/RefreshVisualizer.fs b/src/Fabulous.Avalonia/Views/Controls/RefreshVisualizer.fs index 766c175d4..7f1657b05 100644 --- a/src/Fabulous.Avalonia/Views/Controls/RefreshVisualizer.fs +++ b/src/Fabulous.Avalonia/Views/Controls/RefreshVisualizer.fs @@ -22,10 +22,7 @@ module RefreshVisualizerBuilders = /// Creates a RefreshVisualizer widget. /// The content of the RefreshVisualizer. static member RefreshVisualizer(content: WidgetBuilder<'msg, #IFabControl>) = - WidgetBuilder<'msg, IFabRefreshVisualizer>( - RefreshVisualizer.WidgetKey, - AttributesBundle(StackList.empty(), ValueSome [| ContentControl.ContentWidget.WithValue(content.Compile()) |], ValueNone) - ) + WidgetBuilder<'msg, IFabRefreshVisualizer>(RefreshVisualizer.WidgetKey, ContentControl.ContentWidget.WithValue(content.Compile())) type RefreshVisualizerModifiers = /// Link a ViewRef to access the direct RefreshContainer control instance. diff --git a/src/Fabulous.Avalonia/Views/Controls/SelectableTextBlock.Components.fs b/src/Fabulous.Avalonia/Views/Controls/SelectableTextBlock.Components.fs index 71ee6d815..4077d6dda 100644 --- a/src/Fabulous.Avalonia/Views/Controls/SelectableTextBlock.Components.fs +++ b/src/Fabulous.Avalonia/Views/Controls/SelectableTextBlock.Components.fs @@ -7,7 +7,7 @@ open Fabulous.Avalonia module ComponentSelectableTextBlock = let CopyingToClipboard = - Attributes.defineEventNoDispatch "SelectableTextBlock_CopyingToClipboard" (fun target -> (target :?> SelectableTextBlock).CopyingToClipboard) + Attributes.Component.defineEvent "SelectableTextBlock_CopyingToClipboard" (fun target -> (target :?> SelectableTextBlock).CopyingToClipboard) [] module ComponentSelectableTextBlockBuilders = diff --git a/src/Fabulous.Avalonia/Views/Controls/SelectableTextBlock.Mvu.fs b/src/Fabulous.Avalonia/Views/Controls/SelectableTextBlock.Mvu.fs index 719ff2bef..48343b7e3 100644 --- a/src/Fabulous.Avalonia/Views/Controls/SelectableTextBlock.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/Controls/SelectableTextBlock.Mvu.fs @@ -7,7 +7,7 @@ open Fabulous.Avalonia module MvuSelectableTextBlock = let CopyingToClipboard = - Attributes.defineEvent "SelectableTextBlock_CopyingToClipboard" (fun target -> (target :?> SelectableTextBlock).CopyingToClipboard) + Attributes.Mvu.defineEvent "SelectableTextBlock_CopyingToClipboard" (fun target -> (target :?> SelectableTextBlock).CopyingToClipboard) [] module MvuSelectableTextBlockBuilders = diff --git a/src/Fabulous.Avalonia/Views/Controls/Separator.fs b/src/Fabulous.Avalonia/Views/Controls/Separator.fs index 90425cd74..69fd558ec 100644 --- a/src/Fabulous.Avalonia/Views/Controls/Separator.fs +++ b/src/Fabulous.Avalonia/Views/Controls/Separator.fs @@ -17,7 +17,7 @@ module SeparatorBuilders = /// Creates a Separator widget. static member Separator() = - WidgetBuilder<'msg, IFabSeparator>(Separator.WidgetKey, AttributesBundle(StackList.empty(), ValueNone, ValueNone)) + WidgetBuilder<'msg, IFabSeparator>(Separator.WidgetKey) type SeparatorModifiers = /// Link a ViewRef to access the direct Separator control instance. diff --git a/src/Fabulous.Avalonia/Views/Controls/Shapes/Ellipse.fs b/src/Fabulous.Avalonia/Views/Controls/Shapes/Ellipse.fs index d2834c092..7ef744bf5 100644 --- a/src/Fabulous.Avalonia/Views/Controls/Shapes/Ellipse.fs +++ b/src/Fabulous.Avalonia/Views/Controls/Shapes/Ellipse.fs @@ -17,7 +17,7 @@ module EllipseBuilders = /// Creates an Ellipse widget. static member Ellipse() = - WidgetBuilder<'msg, IFabEllipse>(Ellipse.WidgetKey, AttributesBundle(StackList.empty(), ValueNone, ValueNone)) + WidgetBuilder<'msg, IFabEllipse>(Ellipse.WidgetKey) type EllipseModifiers = /// Link a ViewRef to access the direct Ellipse control instance. diff --git a/src/Fabulous.Avalonia/Views/Controls/Shapes/Path.fs b/src/Fabulous.Avalonia/Views/Controls/Shapes/Path.fs index f1ed3015b..8cf71e1a0 100644 --- a/src/Fabulous.Avalonia/Views/Controls/Shapes/Path.fs +++ b/src/Fabulous.Avalonia/Views/Controls/Shapes/Path.fs @@ -24,10 +24,7 @@ module PathBuilders = /// Creates a Path widget. /// The content of the Path. static member Path(content: WidgetBuilder<'msg, #IFabGeometry>) = - WidgetBuilder<'msg, IFabPath>( - Path.WidgetKey, - AttributesBundle(StackList.empty(), ValueSome [| Path.DataWidget.WithValue(content.Compile()) |], ValueNone) - ) + WidgetBuilder<'msg, IFabPath>(Path.WidgetKey, Path.DataWidget.WithValue(content.Compile())) /// Creates a Path widget. /// The content of the Path. diff --git a/src/Fabulous.Avalonia/Views/Controls/Shapes/Rectangle.fs b/src/Fabulous.Avalonia/Views/Controls/Shapes/Rectangle.fs index a9ff9e989..62fe96562 100644 --- a/src/Fabulous.Avalonia/Views/Controls/Shapes/Rectangle.fs +++ b/src/Fabulous.Avalonia/Views/Controls/Shapes/Rectangle.fs @@ -29,7 +29,7 @@ module RectangleBuilders = /// Creates a Rectangle widget. static member Rectangle() = - WidgetBuilder<'msg, IFabRectangle>(Rectangle.WidgetKey, AttributesBundle(StackList.empty(), ValueNone, ValueNone)) + WidgetBuilder<'msg, IFabRectangle>(Rectangle.WidgetKey) type RectangleModifiers = /// Link a ViewRef to access the direct Rectangle control instance. diff --git a/src/Fabulous.Avalonia/Views/Controls/TextBox.Components.fs b/src/Fabulous.Avalonia/Views/Controls/TextBox.Components.fs index 09fdaa657..c639999e4 100644 --- a/src/Fabulous.Avalonia/Views/Controls/TextBox.Components.fs +++ b/src/Fabulous.Avalonia/Views/Controls/TextBox.Components.fs @@ -8,16 +8,16 @@ open Fabulous.Avalonia module ComponentTextBox = let TextChanged = - Attributes.defineAvaloniaPropertyWithChangedEventNoDispatch' "TextBox_TextChanged" TextBox.TextProperty + Attributes.Component.defineAvaloniaPropertyWithChangedEvent' "TextBox_TextChanged" TextBox.TextProperty let CopyingToClipboard = - Attributes.defineEventNoDispatch "TextBox_CopyingToClipboardEvent" (fun target -> (target :?> TextBox).CopyingToClipboard) + Attributes.Component.defineEvent "TextBox_CopyingToClipboardEvent" (fun target -> (target :?> TextBox).CopyingToClipboard) let CuttingToClipboard = - Attributes.defineEventNoDispatch "TextBox_CuttingToClipboard" (fun target -> (target :?> TextBox).CuttingToClipboard) + Attributes.Component.defineEvent "TextBox_CuttingToClipboard" (fun target -> (target :?> TextBox).CuttingToClipboard) let PastingFromClipboard = - Attributes.defineEventNoDispatch "TextBox_PastingFromClipboardEvent" (fun target -> (target :?> TextBox).PastingFromClipboard) + Attributes.Component.defineEvent "TextBox_PastingFromClipboardEvent" (fun target -> (target :?> TextBox).PastingFromClipboard) [] module ComponentTextBoxBuilders = diff --git a/src/Fabulous.Avalonia/Views/Controls/TextBox.Mvu.fs b/src/Fabulous.Avalonia/Views/Controls/TextBox.Mvu.fs index aa68bc8f9..181e4bc9c 100644 --- a/src/Fabulous.Avalonia/Views/Controls/TextBox.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/Controls/TextBox.Mvu.fs @@ -8,16 +8,16 @@ open Fabulous.Avalonia module MvuTextBox = let TextChanged = - Attributes.defineAvaloniaPropertyWithChangedEvent' "TextBox_TextChanged" TextBox.TextProperty + Attributes.Mvu.defineAvaloniaPropertyWithChangedEvent' "TextBox_TextChanged" TextBox.TextProperty let CopyingToClipboard = - Attributes.defineEvent "TextBox_CopyingToClipboardEvent" (fun target -> (target :?> TextBox).CopyingToClipboard) + Attributes.Mvu.defineEvent "TextBox_CopyingToClipboardEvent" (fun target -> (target :?> TextBox).CopyingToClipboard) let CuttingToClipboard = - Attributes.defineEvent "TextBox_CuttingToClipboard" (fun target -> (target :?> TextBox).CuttingToClipboard) + Attributes.Mvu.defineEvent "TextBox_CuttingToClipboard" (fun target -> (target :?> TextBox).CuttingToClipboard) let PastingFromClipboard = - Attributes.defineEvent "TextBox_PastingFromClipboardEvent" (fun target -> (target :?> TextBox).PastingFromClipboard) + Attributes.Mvu.defineEvent "TextBox_PastingFromClipboardEvent" (fun target -> (target :?> TextBox).PastingFromClipboard) [] module MvuTextBoxBuilders = diff --git a/src/Fabulous.Avalonia/Views/Controls/ThemeVariantScope.Components.fs b/src/Fabulous.Avalonia/Views/Controls/ThemeVariantScope.Components.fs index 012a2c07e..cf658f6b0 100644 --- a/src/Fabulous.Avalonia/Views/Controls/ThemeVariantScope.Components.fs +++ b/src/Fabulous.Avalonia/Views/Controls/ThemeVariantScope.Components.fs @@ -7,7 +7,7 @@ open Fabulous.Avalonia module ComponentThemeVariantScope = let ActualThemeVariantChanged = - Attributes.defineEventNoArgNoDispatch "TopLevel_ThemeVariantChanged" (fun target -> (target :?> ThemeVariantScope).ActualThemeVariantChanged) + Attributes.Component.defineEventNoArg "TopLevel_ThemeVariantChanged" (fun target -> (target :?> ThemeVariantScope).ActualThemeVariantChanged) type ComponentThemeVariantScopeModifiers = diff --git a/src/Fabulous.Avalonia/Views/Controls/ThemeVariantScope.Mvu.fs b/src/Fabulous.Avalonia/Views/Controls/ThemeVariantScope.Mvu.fs index 3c8398d56..c02278c39 100644 --- a/src/Fabulous.Avalonia/Views/Controls/ThemeVariantScope.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/Controls/ThemeVariantScope.Mvu.fs @@ -7,7 +7,7 @@ open Fabulous.Avalonia module MvuThemeVariantScope = let ActualThemeVariantChanged = - Attributes.defineEventNoArg "TopLevel_ThemeVariantChanged" (fun target -> (target :?> ThemeVariantScope).ActualThemeVariantChanged) + Attributes.Mvu.defineEventNoArg "TopLevel_ThemeVariantChanged" (fun target -> (target :?> ThemeVariantScope).ActualThemeVariantChanged) type MvuThemeVariantScopeModifiers = diff --git a/src/Fabulous.Avalonia/Views/Controls/ThemeVariantScope.fs b/src/Fabulous.Avalonia/Views/Controls/ThemeVariantScope.fs index 808e9ba12..a4f16a617 100644 --- a/src/Fabulous.Avalonia/Views/Controls/ThemeVariantScope.fs +++ b/src/Fabulous.Avalonia/Views/Controls/ThemeVariantScope.fs @@ -35,6 +35,7 @@ module ThemeVariantScopeBuilders = AttributesBundle( StackList.one(ThemeVariantScope.RequestedThemeVariant.WithValue(theme)), ValueSome [| Decorator.ChildWidget.WithValue(content.Compile()) |], + ValueNone, ValueNone ) ) diff --git a/src/Fabulous.Avalonia/Views/Controls/TimePicker.Components.fs b/src/Fabulous.Avalonia/Views/Controls/TimePicker.Components.fs index 466dbe040..16d596be0 100644 --- a/src/Fabulous.Avalonia/Views/Controls/TimePicker.Components.fs +++ b/src/Fabulous.Avalonia/Views/Controls/TimePicker.Components.fs @@ -7,7 +7,7 @@ open Fabulous.Avalonia module ComponentTimePicker = let SelectedTimeChanged = - Attributes.defineAvaloniaPropertyWithChangedEventNoDispatch + Attributes.Component.defineAvaloniaPropertyWithChangedEvent "TimePicker_SelectedTimeChanged" TimePicker.SelectedTimeProperty Nullable diff --git a/src/Fabulous.Avalonia/Views/Controls/TimePicker.Mvu.fs b/src/Fabulous.Avalonia/Views/Controls/TimePicker.Mvu.fs index 239e4c1b8..fa15912d4 100644 --- a/src/Fabulous.Avalonia/Views/Controls/TimePicker.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/Controls/TimePicker.Mvu.fs @@ -7,7 +7,7 @@ open Fabulous.Avalonia module MvuTimePicker = let SelectedTimeChanged = - Attributes.defineAvaloniaPropertyWithChangedEvent "TimePicker_SelectedTimeChanged" TimePicker.SelectedTimeProperty Nullable Nullable.op_Explicit + Attributes.Mvu.defineAvaloniaPropertyWithChangedEvent "TimePicker_SelectedTimeChanged" TimePicker.SelectedTimeProperty Nullable Nullable.op_Explicit [] module MvuTimePickerBuilders = diff --git a/src/Fabulous.Avalonia/Views/Controls/TimePicker.fs b/src/Fabulous.Avalonia/Views/Controls/TimePicker.fs index fe3f83c73..b32196b6b 100644 --- a/src/Fabulous.Avalonia/Views/Controls/TimePicker.fs +++ b/src/Fabulous.Avalonia/Views/Controls/TimePicker.fs @@ -16,6 +16,12 @@ module TimePicker = let MinuteIncrement = Attributes.defineAvaloniaPropertyWithEquality TimePicker.MinuteIncrementProperty + let SecondIncrement = + Attributes.defineAvaloniaPropertyWithEquality TimePicker.SecondIncrementProperty + + let UseSeconds = + Attributes.defineAvaloniaPropertyWithEquality TimePicker.UseSecondsProperty + type TimePickerModifiers = /// Sets the ClockIdentifier property. @@ -32,6 +38,21 @@ type TimePickerModifiers = static member inline minuteIncrement(this: WidgetBuilder<'msg, #IFabTimePicker>, value: int) = this.AddScalar(TimePicker.MinuteIncrement.WithValue(value)) + + /// Sets the SecondIncrement property. + /// Current widget. + /// The SecondIncrement value. + [] + static member inline secondIncrement(this: WidgetBuilder<'msg, #IFabTimePicker>, value: int) = + this.AddScalar(TimePicker.SecondIncrement.WithValue(value)) + + /// Sets the UseSeconds property. + /// Current widget. + /// The UseSeconds value. + [] + static member inline useSeconds(this: WidgetBuilder<'msg, #IFabTimePicker>, value: bool) = + this.AddScalar(TimePicker.UseSeconds.WithValue(value)) + /// Link a ViewRef to access the direct TimePicker control instance. /// Current widget. /// The ViewRef instance that will receive access to the underlying control. diff --git a/src/Fabulous.Avalonia/Views/Controls/Tooltip.fs b/src/Fabulous.Avalonia/Views/Controls/Tooltip.fs index 528a1cde3..affe8a5c2 100644 --- a/src/Fabulous.Avalonia/Views/Controls/Tooltip.fs +++ b/src/Fabulous.Avalonia/Views/Controls/Tooltip.fs @@ -2,6 +2,7 @@ namespace Fabulous.Avalonia open System.Runtime.CompilerServices open Avalonia.Controls +open Avalonia.Controls.Primitives.PopupPositioning open Fabulous open Fabulous.StackAllocatedCollections.StackList @@ -13,6 +14,9 @@ module ToolTip = let TipWidget = Attributes.defineAvaloniaPropertyWidget ToolTip.TipProperty + let TipString = + Attributes.defineAvaloniaProperty ToolTip.TipProperty box ScalarAttributeComparers.equalityCompare + let IsOpen = Attributes.defineAvaloniaPropertyWithEquality ToolTip.IsOpenProperty let Placement = @@ -36,6 +40,9 @@ module ToolTip = let ServiceEnabled = Attributes.defineAvaloniaPropertyWithEquality ToolTip.ServiceEnabledProperty + let CustomPopupPlacementCallback = + Attributes.defineAvaloniaPropertyWithEquality ToolTip.CustomPopupPlacementCallbackProperty + [] module ToolTipBuilders = type Fabulous.Avalonia.View with @@ -46,10 +53,7 @@ module ToolTipBuilders = /// Creates a ToolTip widget. static member ToolTip(content: WidgetBuilder<'msg, #IFabControl>) = - WidgetBuilder<'msg, IFabToolTip>( - ToolTip.WidgetKey, - AttributesBundle(StackList.empty(), ValueSome [| ContentControl.ContentWidget.WithValue(content.Compile()) |], ValueNone) - ) + WidgetBuilder<'msg, IFabToolTip>(ToolTip.WidgetKey, ContentControl.ContentWidget.WithValue(content.Compile())) type ToolTipModifiers = /// Sets the Tip property. @@ -59,6 +63,13 @@ type ToolTipModifiers = static member inline tip(this: WidgetBuilder<'msg, #IFabControl>, value: WidgetBuilder<'msg, #IFabToolTip>) = this.AddWidget(ToolTip.TipWidget.WithValue(value.Compile())) + /// Sets the Tip property. + /// Current widget. + /// The Tip value. + [] + static member inline tip(this: WidgetBuilder<'msg, #IFabControl>, value: string) = + this.AddScalar(ToolTip.TipString.WithValue(value)) + /// Sets the IsOpen property. /// Current widget. /// The IsOpen value. @@ -115,6 +126,13 @@ type ToolTipModifiers = static member inline tooltipServiceEnabled(this: WidgetBuilder<'msg, #IFabControl>, value: bool) = this.AddScalar(ToolTip.ServiceEnabled.WithValue(value)) + /// Sets the CustomPopupPlacementCallback property. + /// Current widget. + /// The CustomPopupPlacementCallback value. + [] + static member inline tooltipCustomPopupPlacementCallback(this: WidgetBuilder<'msg, #IFabControl>, value: CustomPopupPlacement -> unit) = + this.AddScalar(ToolTip.CustomPopupPlacementCallback.WithValue(CustomPopupPlacementCallback(value))) + /// Link a ViewRef to access the direct ToolTip control instance. /// Current widget. /// The ViewRef instance that will receive access to the underlying control. diff --git a/src/Fabulous.Avalonia/Views/Controls/TransitioningContentControl.fs b/src/Fabulous.Avalonia/Views/Controls/TransitioningContentControl.fs index facb5ecca..da71568ad 100644 --- a/src/Fabulous.Avalonia/Views/Controls/TransitioningContentControl.fs +++ b/src/Fabulous.Avalonia/Views/Controls/TransitioningContentControl.fs @@ -27,7 +27,7 @@ module TransitioningContentControlBuilders = static member TransitioningContentControl(content: WidgetBuilder<'msg, #IFabControl>) = WidgetBuilder<'msg, IFabTransitioningContentControl>( TransitioningContentControl.WidgetKey, - AttributesBundle(StackList.empty(), ValueSome [| ContentControl.ContentWidget.WithValue(content.Compile()) |], ValueNone) + ContentControl.ContentWidget.WithValue(content.Compile()) ) type TransitioningContentControlModifiers = diff --git a/src/Fabulous.Avalonia/Views/Controls/UserControl.fs b/src/Fabulous.Avalonia/Views/Controls/UserControl.fs index 254180318..6e6c9f51d 100644 --- a/src/Fabulous.Avalonia/Views/Controls/UserControl.fs +++ b/src/Fabulous.Avalonia/Views/Controls/UserControl.fs @@ -18,10 +18,7 @@ module UserControlBuilders = /// Creates a UserControl widget. /// The content of the UserControl. static member UserControl(content: WidgetBuilder<'msg, #IFabControl>) = - WidgetBuilder<'msg, IFabUserControl>( - UserControl.WidgetKey, - AttributesBundle(StackList.empty(), ValueSome [| ContentControl.ContentWidget.WithValue(content.Compile()) |], ValueNone) - ) + WidgetBuilder<'msg, IFabUserControl>(UserControl.WidgetKey, ContentControl.ContentWidget.WithValue(content.Compile())) type UserControlModifiers = /// Link a ViewRef to access the direct UserControl control instance. diff --git a/src/Fabulous.Avalonia/Views/Controls/Viewbox.fs b/src/Fabulous.Avalonia/Views/Controls/Viewbox.fs index c28a8da7a..5ef5827b4 100644 --- a/src/Fabulous.Avalonia/Views/Controls/Viewbox.fs +++ b/src/Fabulous.Avalonia/Views/Controls/Viewbox.fs @@ -26,10 +26,7 @@ module ViewBoxBuilders = /// Creates a ViewBox widget. /// The content of the ViewBox. static member ViewBox(content: WidgetBuilder<'msg, #IFabControl>) = - WidgetBuilder<'msg, IFabViewBox>( - ViewBox.WidgetKey, - AttributesBundle(StackList.empty(), ValueSome [| ViewBox.Child.WithValue(content.Compile()) |], ValueNone) - ) + WidgetBuilder<'msg, IFabViewBox>(ViewBox.WidgetKey, ViewBox.Child.WithValue(content.Compile())) type ViewBoxModifiers = /// Sets the Stretch property. diff --git a/src/Fabulous.Avalonia/Views/Controls/Window.Components.fs b/src/Fabulous.Avalonia/Views/Controls/Window.Components.fs index 5fcb8381b..9923491c3 100644 --- a/src/Fabulous.Avalonia/Views/Controls/Window.Components.fs +++ b/src/Fabulous.Avalonia/Views/Controls/Window.Components.fs @@ -8,13 +8,13 @@ open Fabulous.Avalonia module ComponentWindow = let WindowClosing = - Attributes.defineEventNoDispatch "Window_Closing" (fun target -> (target :?> Window).Closing) + Attributes.Component.defineEvent "Window_Closing" (fun target -> (target :?> Window).Closing) let WindowClosed = - Attributes.defineRoutedEventNoDispatch "Window_Closed" Window.WindowClosedEvent + Attributes.Component.defineRoutedEvent "Window_Closed" Window.WindowClosedEvent let WindowOpened = - Attributes.defineRoutedEventNoDispatch "Window_Opened" Window.WindowOpenedEvent + Attributes.Component.defineRoutedEvent "Window_Opened" Window.WindowOpenedEvent type ComponentWindowModifiers = /// Listens to the Window WindowClosing event. diff --git a/src/Fabulous.Avalonia/Views/Controls/Window.Mvu.fs b/src/Fabulous.Avalonia/Views/Controls/Window.Mvu.fs index ea35e1bdd..7080f6f7d 100644 --- a/src/Fabulous.Avalonia/Views/Controls/Window.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/Controls/Window.Mvu.fs @@ -8,13 +8,13 @@ open Fabulous.Avalonia module MvuWindow = let WindowClosing = - Attributes.defineEvent "Window_Closing" (fun target -> (target :?> Window).Closing) + Attributes.Mvu.defineEvent "Window_Closing" (fun target -> (target :?> Window).Closing) let WindowClosed = - Attributes.defineRoutedEvent "Window_Closed" Window.WindowClosedEvent + Attributes.Mvu.defineRoutedEvent "Window_Closed" Window.WindowClosedEvent let WindowOpened = - Attributes.defineRoutedEvent "Window_Opened" Window.WindowOpenedEvent + Attributes.Mvu.defineRoutedEvent "Window_Opened" Window.WindowOpenedEvent type MvuWindowModifiers = /// Listens to the Window WindowClosing event. diff --git a/src/Fabulous.Avalonia/Views/Controls/Window.fs b/src/Fabulous.Avalonia/Views/Controls/Window.fs index e72ef4579..0b0dea449 100644 --- a/src/Fabulous.Avalonia/Views/Controls/Window.fs +++ b/src/Fabulous.Avalonia/Views/Controls/Window.fs @@ -51,18 +51,10 @@ module Window = [] module WindowBuilders = type Fabulous.Avalonia.View with - /// Creates a Window widget. /// The content of the window. static member Window(content: WidgetBuilder<'msg, #IFabElement>) = - WidgetBuilder<'msg, IFabWindow>( - Window.WidgetKey, - AttributesBundle(StackList.empty(), ValueSome [| ContentControl.ContentWidget.WithValue(content.Compile()) |], ValueNone) - ) - - /// Creates a Window widget. - static member Window() = - SingleChildBuilder<'msg, IFabWindow, 'childMarker>(Window.WidgetKey, ContentControl.ContentWidget) + WidgetBuilder<'msg, IFabWindow>(Window.WidgetKey, ContentControl.ContentWidget.WithValue(content.Compile())) type WindowModifiers = /// Sets the SizeToContent property. diff --git a/src/Fabulous.Avalonia/Views/Imaging/Image.fs b/src/Fabulous.Avalonia/Views/Imaging/Image.fs index 4a217d38d..57227cc6e 100644 --- a/src/Fabulous.Avalonia/Views/Imaging/Image.fs +++ b/src/Fabulous.Avalonia/Views/Imaging/Image.fs @@ -80,6 +80,7 @@ module ImageBuilders = AttributesBundle( StackList.one(Image.Stretch.WithValue(Stretch.Uniform)), ValueSome [| Image.SourceWidget.WithValue(source.Compile()) |], + ValueNone, ValueNone ) ) @@ -90,7 +91,12 @@ module ImageBuilders = static member Image(stretch: Stretch, source: WidgetBuilder<'msg, #IFabDrawingImage>) = WidgetBuilder<'msg, IFabImage>( Image.WidgetKey, - AttributesBundle(StackList.one(Image.Stretch.WithValue(stretch)), ValueSome [| Image.SourceWidget.WithValue(source.Compile()) |], ValueNone) + AttributesBundle( + StackList.one(Image.Stretch.WithValue(stretch)), + ValueSome [| Image.SourceWidget.WithValue(source.Compile()) |], + ValueNone, + ValueNone + ) ) /// Creates an Image widget. @@ -101,6 +107,7 @@ module ImageBuilders = AttributesBundle( StackList.one(Image.Stretch.WithValue(Stretch.Uniform)), ValueSome [| Image.SourceWidget.WithValue(source.Compile()) |], + ValueNone, ValueNone ) ) @@ -111,7 +118,12 @@ module ImageBuilders = static member Image(stretch: Stretch, source: WidgetBuilder<'msg, IFabCroppedBitmap>) = WidgetBuilder<'msg, IFabImage>( Image.WidgetKey, - AttributesBundle(StackList.one(Image.Stretch.WithValue(stretch)), ValueSome [| Image.SourceWidget.WithValue(source.Compile()) |], ValueNone) + AttributesBundle( + StackList.one(Image.Stretch.WithValue(stretch)), + ValueSome [| Image.SourceWidget.WithValue(source.Compile()) |], + ValueNone, + ValueNone + ) ) type ImageModifiers = diff --git a/src/Fabulous.Avalonia/Views/Imaging/PathIcon.fs b/src/Fabulous.Avalonia/Views/Imaging/PathIcon.fs index f942313b4..0dc008abc 100644 --- a/src/Fabulous.Avalonia/Views/Imaging/PathIcon.fs +++ b/src/Fabulous.Avalonia/Views/Imaging/PathIcon.fs @@ -23,10 +23,7 @@ module PathIconBuilders = /// Creates a PathIcon widget. /// The content of the PathIcon. static member PathIcon(content: WidgetBuilder<'msg, #IFabGeometry>) = - WidgetBuilder<'msg, IFabPathIcon>( - PathIcon.WidgetKey, - AttributesBundle(StackList.empty(), ValueSome [| PathIcon.DataWidget.WithValue(content.Compile()) |], ValueNone) - ) + WidgetBuilder<'msg, IFabPathIcon>(PathIcon.WidgetKey, PathIcon.DataWidget.WithValue(content.Compile())) /// Creates a PathIcon widget. /// The path of the PathIcon. diff --git a/src/Fabulous.Avalonia/Views/Imaging/TrayIcon.Components.fs b/src/Fabulous.Avalonia/Views/Imaging/TrayIcon.Components.fs index e0c890768..005e24d9c 100644 --- a/src/Fabulous.Avalonia/Views/Imaging/TrayIcon.Components.fs +++ b/src/Fabulous.Avalonia/Views/Imaging/TrayIcon.Components.fs @@ -7,7 +7,7 @@ open Fabulous.Avalonia module ComponentTrayIcon = let Clicked = - Attributes.defineEventNoArgNoDispatch "TrayIcon_Clicked" (fun target -> (target :?> TrayIcon).Clicked) + Attributes.Component.defineEventNoArg "TrayIcon_Clicked" (fun target -> (target :?> TrayIcon).Clicked) type ComponentTrayIconModifiers = /// Listens to the TrayIcon Clicked event. diff --git a/src/Fabulous.Avalonia/Views/Imaging/TrayIcon.Mvu.fs b/src/Fabulous.Avalonia/Views/Imaging/TrayIcon.Mvu.fs index 0979ce70e..ffeb6b8c8 100644 --- a/src/Fabulous.Avalonia/Views/Imaging/TrayIcon.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/Imaging/TrayIcon.Mvu.fs @@ -7,7 +7,7 @@ open Fabulous.Avalonia module MvuTrayIcon = let Clicked = - Attributes.defineEventNoArg "TrayIcon_Clicked" (fun target -> (target :?> TrayIcon).Clicked) + Attributes.Mvu.defineEventNoArg "TrayIcon_Clicked" (fun target -> (target :?> TrayIcon).Clicked) type MvuTrayIconModifiers = /// Listens to the TrayIcon Clicked event. diff --git a/src/Fabulous.Avalonia/Views/ItemsControl.Components.fs b/src/Fabulous.Avalonia/Views/ItemsControl.Components.fs index ec5da78a6..e65f1fb09 100644 --- a/src/Fabulous.Avalonia/Views/ItemsControl.Components.fs +++ b/src/Fabulous.Avalonia/Views/ItemsControl.Components.fs @@ -7,13 +7,13 @@ open Fabulous.Avalonia module ComponentItemsControl = let ContainerClearing = - Attributes.defineEventNoDispatch "ItemsControl_ContainerClearing" (fun target -> (target :?> ItemsControl).ContainerClearing) + Attributes.Component.defineEvent "ItemsControl_ContainerClearing" (fun target -> (target :?> ItemsControl).ContainerClearing) let ContainerIndexChanged = - Attributes.defineEventNoDispatch "ItemsControl_ContainerIndexChanged" (fun target -> (target :?> ItemsControl).ContainerIndexChanged) + Attributes.Component.defineEvent "ItemsControl_ContainerIndexChanged" (fun target -> (target :?> ItemsControl).ContainerIndexChanged) let ContainerPrepared = - Attributes.defineEventNoDispatch "ItemsControl_ContainerPrepared" (fun target -> (target :?> ItemsControl).ContainerPrepared) + Attributes.Component.defineEvent "ItemsControl_ContainerPrepared" (fun target -> (target :?> ItemsControl).ContainerPrepared) type ComponentItemsControlModifiers = /// Listens to the ItemsControl ContainerClearing event. diff --git a/src/Fabulous.Avalonia/Views/ItemsControl.Mvu.fs b/src/Fabulous.Avalonia/Views/ItemsControl.Mvu.fs index 4299fc44d..dd08d7ef7 100644 --- a/src/Fabulous.Avalonia/Views/ItemsControl.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/ItemsControl.Mvu.fs @@ -7,13 +7,13 @@ open Fabulous.Avalonia module MvuItemsControl = let ContainerClearing = - Attributes.defineEvent "ItemsControl_ContainerClearing" (fun target -> (target :?> ItemsControl).ContainerClearing) + Attributes.Mvu.defineEvent "ItemsControl_ContainerClearing" (fun target -> (target :?> ItemsControl).ContainerClearing) let ContainerIndexChanged = - Attributes.defineEvent "ItemsControl_ContainerIndexChanged" (fun target -> (target :?> ItemsControl).ContainerIndexChanged) + Attributes.Mvu.defineEvent "ItemsControl_ContainerIndexChanged" (fun target -> (target :?> ItemsControl).ContainerIndexChanged) let ContainerPrepared = - Attributes.defineEvent "ItemsControl_ContainerPrepared" (fun target -> (target :?> ItemsControl).ContainerPrepared) + Attributes.Mvu.defineEvent "ItemsControl_ContainerPrepared" (fun target -> (target :?> ItemsControl).ContainerPrepared) type MvuItemsControlModifiers = /// Listens to the ItemsControl ContainerClearing event. diff --git a/src/Fabulous.Avalonia/Views/Layouts/ScrollViewer.Components.fs b/src/Fabulous.Avalonia/Views/Layouts/ScrollViewer.Components.fs index 30a16180d..ffd6fe05e 100644 --- a/src/Fabulous.Avalonia/Views/Layouts/ScrollViewer.Components.fs +++ b/src/Fabulous.Avalonia/Views/Layouts/ScrollViewer.Components.fs @@ -7,7 +7,7 @@ open Fabulous.Avalonia module ComponentScrollViewer = let ScrollChanged = - Attributes.defineEventNoDispatch "ScrollViewer_ScrollChangedEvent" (fun target -> (target :?> ScrollViewer).ScrollChanged) + Attributes.Component.defineEvent "ScrollViewer_ScrollChangedEvent" (fun target -> (target :?> ScrollViewer).ScrollChanged) type ComponentScrollViewerModifiers = /// Listens to the ScrollViewer ScrollChanged event. diff --git a/src/Fabulous.Avalonia/Views/Layouts/ScrollViewer.Mvu.fs b/src/Fabulous.Avalonia/Views/Layouts/ScrollViewer.Mvu.fs index a49bd35bd..3ef830905 100644 --- a/src/Fabulous.Avalonia/Views/Layouts/ScrollViewer.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/Layouts/ScrollViewer.Mvu.fs @@ -7,7 +7,7 @@ open Fabulous.Avalonia module MvuScrollViewer = let ScrollChanged = - Attributes.defineEvent "ScrollViewer_ScrollChangedEvent" (fun target -> (target :?> ScrollViewer).ScrollChanged) + Attributes.Mvu.defineEvent "ScrollViewer_ScrollChangedEvent" (fun target -> (target :?> ScrollViewer).ScrollChanged) type MvuScrollViewerModifiers = /// Listens to the ScrollViewer ScrollChanged event. diff --git a/src/Fabulous.Avalonia/Views/Layouts/ScrollViewer.fs b/src/Fabulous.Avalonia/Views/Layouts/ScrollViewer.fs index 7e1430cfc..355e1fb76 100644 --- a/src/Fabulous.Avalonia/Views/Layouts/ScrollViewer.fs +++ b/src/Fabulous.Avalonia/Views/Layouts/ScrollViewer.fs @@ -59,10 +59,7 @@ module ScrollViewerBuilders = /// Creates a ScrollViewer widget /// The content to display static member ScrollViewer(content: WidgetBuilder<'msg, #IFabControl>) = - WidgetBuilder<'msg, IFabScrollViewer>( - ScrollViewer.WidgetKey, - AttributesBundle(StackList.empty(), ValueSome [| ContentControl.ContentWidget.WithValue(content.Compile()) |], ValueNone) - ) + WidgetBuilder<'msg, IFabScrollViewer>(ScrollViewer.WidgetKey, ContentControl.ContentWidget.WithValue(content.Compile())) type ScrollViewerModifiers = /// Sets the Extent property. diff --git a/src/Fabulous.Avalonia/Views/Layouts/SliptView.Components.fs b/src/Fabulous.Avalonia/Views/Layouts/SliptView.Components.fs index 84ddb067a..75bbca486 100644 --- a/src/Fabulous.Avalonia/Views/Layouts/SliptView.Components.fs +++ b/src/Fabulous.Avalonia/Views/Layouts/SliptView.Components.fs @@ -8,19 +8,19 @@ open System.Runtime.CompilerServices module ComponentSplitView = let PanClosed = - Attributes.defineEventNoDispatch "SplitView_PanClosed" (fun target -> (target :?> SplitView).PaneClosed) + Attributes.Component.defineEvent "SplitView_PanClosed" (fun target -> (target :?> SplitView).PaneClosed) let PanClosing = - Attributes.defineEventNoDispatch "SplitView_PanClosing" (fun target -> (target :?> SplitView).PaneClosing) + Attributes.Component.defineEvent "SplitView_PanClosing" (fun target -> (target :?> SplitView).PaneClosing) let PanOpened = - Attributes.defineEventNoDispatch "SplitView_PanOpened" (fun target -> (target :?> SplitView).PaneOpened) + Attributes.Component.defineEvent "SplitView_PanOpened" (fun target -> (target :?> SplitView).PaneOpened) let PanOpening = - Attributes.defineEventNoDispatch "SplitView_PanOpening" (fun target -> (target :?> SplitView).PaneOpening) + Attributes.Component.defineEvent "SplitView_PanOpening" (fun target -> (target :?> SplitView).PaneOpening) let IsPresented = - Attributes.defineAvaloniaPropertyWithChangedEventNoDispatch' "SplitView_IsPresented" SplitView.IsPaneOpenProperty + Attributes.Component.defineAvaloniaPropertyWithChangedEvent' "SplitView_IsPresented" SplitView.IsPaneOpenProperty type ComponentSplitViewModifiers = /// Listens to the SplitView PanClosed event. diff --git a/src/Fabulous.Avalonia/Views/Layouts/SliptView.Mvu.fs b/src/Fabulous.Avalonia/Views/Layouts/SliptView.Mvu.fs index 17cee57ee..814dede98 100644 --- a/src/Fabulous.Avalonia/Views/Layouts/SliptView.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/Layouts/SliptView.Mvu.fs @@ -9,19 +9,19 @@ open System.Runtime.CompilerServices module MvuSplitView = let PanClosed = - Attributes.defineEvent "SplitView_PanClosed" (fun target -> (target :?> SplitView).PaneClosed) + Attributes.Mvu.defineEvent "SplitView_PanClosed" (fun target -> (target :?> SplitView).PaneClosed) let PanClosing = - Attributes.defineEvent "SplitView_PanClosing" (fun target -> (target :?> SplitView).PaneClosing) + Attributes.Mvu.defineEvent "SplitView_PanClosing" (fun target -> (target :?> SplitView).PaneClosing) let PanOpened = - Attributes.defineEvent "SplitView_PanOpened" (fun target -> (target :?> SplitView).PaneOpened) + Attributes.Mvu.defineEvent "SplitView_PanOpened" (fun target -> (target :?> SplitView).PaneOpened) let PanOpening = - Attributes.defineEvent "SplitView_PanOpening" (fun target -> (target :?> SplitView).PaneOpening) + Attributes.Mvu.defineEvent "SplitView_PanOpening" (fun target -> (target :?> SplitView).PaneOpening) let IsPresented = - Attributes.defineAvaloniaPropertyWithChangedEvent' "SplitView_IsPresented" SplitView.IsPaneOpenProperty + Attributes.Mvu.defineAvaloniaPropertyWithChangedEvent' "SplitView_IsPresented" SplitView.IsPaneOpenProperty type MvuSplitViewModifiers = /// Listens to the SplitView PanClosed event. diff --git a/src/Fabulous.Avalonia/Views/Layouts/SliptView.fs b/src/Fabulous.Avalonia/Views/Layouts/SliptView.fs index eca3b7fbc..f4e6f578c 100644 --- a/src/Fabulous.Avalonia/Views/Layouts/SliptView.fs +++ b/src/Fabulous.Avalonia/Views/Layouts/SliptView.fs @@ -60,7 +60,8 @@ module SplitViewBuilders = ValueSome [| SplitView.Pane.WithValue(pane.Compile()) ContentControl.ContentWidget.WithValue(content.Compile()) |], - ValueSome [||] + ValueNone, + ValueNone ) ) diff --git a/src/Fabulous.Avalonia/Views/Media/Brushes/DrawingBrush.fs b/src/Fabulous.Avalonia/Views/Media/Brushes/DrawingBrush.fs index 2a0ee05cc..631a23aab 100644 --- a/src/Fabulous.Avalonia/Views/Media/Brushes/DrawingBrush.fs +++ b/src/Fabulous.Avalonia/Views/Media/Brushes/DrawingBrush.fs @@ -20,10 +20,7 @@ module DrawingBrushBuilders = /// Creates a DrawingBrush widget. /// The source drawing. static member DrawingBrush(source: WidgetBuilder<'msg, #IFabDrawing>) = - WidgetBuilder<'msg, IFabDrawingBrush>( - DrawingBrush.WidgetKey, - AttributesBundle(StackList.empty(), ValueSome [| DrawingBrush.Drawing.WithValue(source.Compile()) |], ValueNone) - ) + WidgetBuilder<'msg, IFabDrawingBrush>(DrawingBrush.WidgetKey, DrawingBrush.Drawing.WithValue(source.Compile())) type DrawingBrushModifiers = /// Link a ViewRef to access the direct DrawingBrush control instance. diff --git a/src/Fabulous.Avalonia/Views/Media/Brushes/VisualBrush.fs b/src/Fabulous.Avalonia/Views/Media/Brushes/VisualBrush.fs index c97f62797..14df6833d 100644 --- a/src/Fabulous.Avalonia/Views/Media/Brushes/VisualBrush.fs +++ b/src/Fabulous.Avalonia/Views/Media/Brushes/VisualBrush.fs @@ -20,10 +20,7 @@ module VisualBrushBuilders = /// Creates a VisualBrush widget. /// The content of the VisualBrush. static member VisualBrush(content: WidgetBuilder<'msg, #IFabVisual>) = - WidgetBuilder<'msg, IFabVisualBrush>( - VisualBrush.WidgetKey, - AttributesBundle(StackList.empty(), ValueSome [| VisualBrush.Visual.WithValue(content.Compile()) |], ValueNone) - ) + WidgetBuilder<'msg, IFabVisualBrush>(VisualBrush.WidgetKey, VisualBrush.Visual.WithValue(content.Compile())) type VisualBrushModifiers = /// Link a ViewRef to access the direct VisualBrush control instance. diff --git a/src/Fabulous.Avalonia/Views/Media/Drawing/DrawingImage.Components.fs b/src/Fabulous.Avalonia/Views/Media/Drawing/DrawingImage.Components.fs index f6d60f6c0..bbd6def33 100644 --- a/src/Fabulous.Avalonia/Views/Media/Drawing/DrawingImage.Components.fs +++ b/src/Fabulous.Avalonia/Views/Media/Drawing/DrawingImage.Components.fs @@ -8,7 +8,7 @@ open Fabulous.StackAllocatedCollections.StackList module ComponentDrawingImage = let Invalidated = - Attributes.defineEventNoArgNoDispatch "DrawingImage_Invalidated" (fun target -> (target :?> DrawingImage).Invalidated) + Attributes.Component.defineEventNoArg "DrawingImage_Invalidated" (fun target -> (target :?> DrawingImage).Invalidated) type ComponentDrawingImageModifiers = /// Listens the DrawingImage Invalidated event. diff --git a/src/Fabulous.Avalonia/Views/Media/Drawing/DrawingImage.Mvu.fs b/src/Fabulous.Avalonia/Views/Media/Drawing/DrawingImage.Mvu.fs index c0d15198a..809204834 100644 --- a/src/Fabulous.Avalonia/Views/Media/Drawing/DrawingImage.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/Media/Drawing/DrawingImage.Mvu.fs @@ -7,7 +7,7 @@ open Fabulous.StackAllocatedCollections.StackList module MvuDrawingImage = let Invalidated = - Attributes.defineEventNoArg "DrawingImage_Invalidated" (fun target -> (target :?> DrawingImage).Invalidated) + Attributes.Mvu.defineEventNoArg "DrawingImage_Invalidated" (fun target -> (target :?> DrawingImage).Invalidated) type MvuDrawingImageModifiers = diff --git a/src/Fabulous.Avalonia/Views/Media/Drawing/DrawingImage.fs b/src/Fabulous.Avalonia/Views/Media/Drawing/DrawingImage.fs index 41aaec419..885604142 100644 --- a/src/Fabulous.Avalonia/Views/Media/Drawing/DrawingImage.fs +++ b/src/Fabulous.Avalonia/Views/Media/Drawing/DrawingImage.fs @@ -20,10 +20,7 @@ module DrawingImageBuilders = /// Creates a DrawingImage widget. /// The source of the drawing. static member DrawingImage(source: WidgetBuilder<'msg, #IFabDrawing>) = - WidgetBuilder<'msg, IFabDrawingImage>( - DrawingImage.WidgetKey, - AttributesBundle(StackList.empty(), ValueSome [| DrawingImage.Drawing.WithValue(source.Compile()) |], ValueNone) - ) + WidgetBuilder<'msg, IFabDrawingImage>(DrawingImage.WidgetKey, DrawingImage.Drawing.WithValue(source.Compile())) type DrawingImageModifiers = /// Link a ViewRef to access the direct DrawingImage control instance. diff --git a/src/Fabulous.Avalonia/Views/Media/Drawing/GeometryDrawing.fs b/src/Fabulous.Avalonia/Views/Media/Drawing/GeometryDrawing.fs index 840964ef1..4c76c4cc7 100644 --- a/src/Fabulous.Avalonia/Views/Media/Drawing/GeometryDrawing.fs +++ b/src/Fabulous.Avalonia/Views/Media/Drawing/GeometryDrawing.fs @@ -40,6 +40,7 @@ module GeometryDrawingBuilders = ValueSome [| GeometryDrawing.BrushWidget.WithValue(brush.Compile()) GeometryDrawing.GeometryWidget.WithValue(geometry.Compile()) |], + ValueNone, ValueNone ) ) @@ -53,6 +54,7 @@ module GeometryDrawingBuilders = AttributesBundle( StackList.one(GeometryDrawing.Geometry.WithValue(StreamGeometry.Parse(geometry))), ValueSome [| GeometryDrawing.BrushWidget.WithValue(brush.Compile()) |], + ValueNone, ValueNone ) ) @@ -90,6 +92,7 @@ module GeometryDrawingBuilders = AttributesBundle( StackList.one(GeometryDrawing.Brush.WithValue(brush)), ValueSome [| GeometryDrawing.GeometryWidget.WithValue(geometry.Compile()) |], + ValueNone, ValueNone ) ) @@ -103,6 +106,7 @@ module GeometryDrawingBuilders = AttributesBundle( StackList.two(GeometryDrawing.Brush.WithValue(brush), GeometryDrawing.Geometry.WithValue(StreamGeometry.Parse(geometry))), ValueNone, + ValueNone, ValueNone ) ) diff --git a/src/Fabulous.Avalonia/Views/Media/Drawing/GlyphRunDrawing.fs b/src/Fabulous.Avalonia/Views/Media/Drawing/GlyphRunDrawing.fs index 7cc3cf9aa..d0d21e6bc 100644 --- a/src/Fabulous.Avalonia/Views/Media/Drawing/GlyphRunDrawing.fs +++ b/src/Fabulous.Avalonia/Views/Media/Drawing/GlyphRunDrawing.fs @@ -33,6 +33,7 @@ module GlyphRunDrawingBuilders = AttributesBundle( StackList.one(GlyphRunDrawing.GlyphRun.WithValue(glyphRun)), ValueSome [| GlyphRunDrawing.ForegroundWidget.WithValue(brush.Compile()) |], + ValueNone, ValueNone ) ) diff --git a/src/Fabulous.Avalonia/Views/Media/Drawing/ImageDrawing.fs b/src/Fabulous.Avalonia/Views/Media/Drawing/ImageDrawing.fs index d668656fe..62da71ba9 100644 --- a/src/Fabulous.Avalonia/Views/Media/Drawing/ImageDrawing.fs +++ b/src/Fabulous.Avalonia/Views/Media/Drawing/ImageDrawing.fs @@ -76,6 +76,7 @@ module ImageDrawingBuilders = AttributesBundle( StackList.one(ImageDrawing.Rect.WithValue(rect)), ValueSome [| ImageDrawing.ImageSourceWidget.WithValue(source.Compile()) |], + ValueNone, ValueNone ) ) diff --git a/src/Fabulous.Avalonia/Views/Media/Effects/BlurEffect.fs b/src/Fabulous.Avalonia/Views/Media/Effects/BlurEffect.fs index 249751b27..0651e3941 100644 --- a/src/Fabulous.Avalonia/Views/Media/Effects/BlurEffect.fs +++ b/src/Fabulous.Avalonia/Views/Media/Effects/BlurEffect.fs @@ -19,7 +19,7 @@ module BlurEffectBuilders = /// Creates a BlurEffect widget. static member BlurEffect() = - WidgetBuilder<'msg, IFabBlurEffect>(BlurEffect.WidgetKey, AttributesBundle(StackList.empty(), ValueNone, ValueNone)) + WidgetBuilder<'msg, IFabBlurEffect>(BlurEffect.WidgetKey) /// Creates a BlurEffect widget. /// The radius of the blur effect. diff --git a/src/Fabulous.Avalonia/Views/Media/Effects/DropShadowDirectionEffect.fs b/src/Fabulous.Avalonia/Views/Media/Effects/DropShadowDirectionEffect.fs index c5fcce9a7..1b73d6f95 100644 --- a/src/Fabulous.Avalonia/Views/Media/Effects/DropShadowDirectionEffect.fs +++ b/src/Fabulous.Avalonia/Views/Media/Effects/DropShadowDirectionEffect.fs @@ -23,7 +23,7 @@ module DropShadowDirectionEffectBuilders = /// Creates a DropShadowDirectionEffect widget. static member DropShadowDirectionEffect() = - WidgetBuilder<'msg, IFabDropShadowDirectionEffect>(DropShadowDirectionEffect.WidgetKey, AttributesBundle(StackList.empty(), ValueNone, ValueNone)) + WidgetBuilder<'msg, IFabDropShadowDirectionEffect>(DropShadowDirectionEffect.WidgetKey) /// Creates a DropShadowDirectionEffect widget. /// The depth of the shadow. diff --git a/src/Fabulous.Avalonia/Views/Media/Effects/DropShadowEffect.fs b/src/Fabulous.Avalonia/Views/Media/Effects/DropShadowEffect.fs index de21e25f5..121d340ed 100644 --- a/src/Fabulous.Avalonia/Views/Media/Effects/DropShadowEffect.fs +++ b/src/Fabulous.Avalonia/Views/Media/Effects/DropShadowEffect.fs @@ -23,7 +23,7 @@ module DropShadowEffectBuilders = /// Creates a DropShadowEffect widget. static member DropShadowEffect() = - WidgetBuilder<'msg, IFabDropShadowEffect>(DropShadowEffect.WidgetKey, AttributesBundle(StackList.empty(), ValueNone, ValueNone)) + WidgetBuilder<'msg, IFabDropShadowEffect>(DropShadowEffect.WidgetKey) /// Creates a DropShadowEffect widget. /// The X offset of the shadow. diff --git a/src/Fabulous.Avalonia/Views/Media/Geometries/CombinedGeometry.fs b/src/Fabulous.Avalonia/Views/Media/Geometries/CombinedGeometry.fs index a57319d6d..8081aaeca 100644 --- a/src/Fabulous.Avalonia/Views/Media/Geometries/CombinedGeometry.fs +++ b/src/Fabulous.Avalonia/Views/Media/Geometries/CombinedGeometry.fs @@ -36,6 +36,7 @@ module CombinedGeometryBuilders = ValueSome [| CombinedGeometry.Geometry1.WithValue(geometry1.Compile()) CombinedGeometry.Geometry2.WithValue(geometry2.Compile()) |], + ValueNone, ValueNone ) ) diff --git a/src/Fabulous.Avalonia/Views/Media/PathSegments/PolyBezierSegment.fs b/src/Fabulous.Avalonia/Views/Media/PathSegments/PolyBezierSegment.fs new file mode 100644 index 000000000..280bffdcf --- /dev/null +++ b/src/Fabulous.Avalonia/Views/Media/PathSegments/PolyBezierSegment.fs @@ -0,0 +1,34 @@ +namespace Fabulous.Avalonia + +open System.Runtime.CompilerServices +open Avalonia +open Avalonia.Media +open Fabulous + +type IFabPolyBezierSegment = + inherit IFabPathSegment + +module PolyBezierSegment = + let WidgetKey = Widgets.register() + + let Points = + Attributes.defineAvaloniaPropertyWithEquality PolyBezierSegment.PointsProperty + +[] +module PolyBezierSegmentBuilders = + + type Fabulous.Avalonia.View with + + /// Creates a PolyLineSegment widget. + /// The points of the polyline. + static member PolyBezierSegment(points: Point list) = + WidgetBuilder<'msg, IFabPolyBezierSegment>(PolyBezierSegment.WidgetKey, PolyBezierSegment.Points.WithValue(Points(points))) + +type PolyBezierSegmentModifiers = + + /// Link a ViewRef to access the direct PolyBezierSegment control instance. + /// Current widget. + /// The ViewRef instance that will receive access to the underlying control. + [] + static member inline reference(this: WidgetBuilder<'msg, IFabPolyBezierSegment>, value: ViewRef) = + this.AddScalar(ViewRefAttributes.ViewRef.WithValue(value.Unbox)) diff --git a/src/Fabulous.Avalonia/Views/Media/Pen.fs b/src/Fabulous.Avalonia/Views/Media/Pen.fs index dbb123d90..1124f09d0 100644 --- a/src/Fabulous.Avalonia/Views/Media/Pen.fs +++ b/src/Fabulous.Avalonia/Views/Media/Pen.fs @@ -36,7 +36,12 @@ module PenBuilders = static member Pen(brush: WidgetBuilder<'msg, #IFabBrush>, thickness: float) = WidgetBuilder<'msg, IFabPen>( Pen.WidgetKey, - AttributesBundle(StackList.one(Pen.Thickness.WithValue(thickness)), ValueSome [| Pen.BrushWidget.WithValue(brush.Compile()) |], ValueNone) + AttributesBundle( + StackList.one(Pen.Thickness.WithValue(thickness)), + ValueSome [| Pen.BrushWidget.WithValue(brush.Compile()) |], + ValueNone, + ValueNone + ) ) /// Creates a Pen widget. diff --git a/src/Fabulous.Avalonia/Views/Media/Transforms/RotateTransform.fs b/src/Fabulous.Avalonia/Views/Media/Transforms/RotateTransform.fs index 987f25ff3..61988d3c1 100644 --- a/src/Fabulous.Avalonia/Views/Media/Transforms/RotateTransform.fs +++ b/src/Fabulous.Avalonia/Views/Media/Transforms/RotateTransform.fs @@ -44,7 +44,7 @@ module RotateTransformBuilders = /// Creates a RotateTransform widget. static member RotateTransform() = - WidgetBuilder<'msg, IFabRotateTransform>(RotateTransform.WidgetKey, AttributesBundle(StackList.empty(), ValueNone, ValueNone)) + WidgetBuilder<'msg, IFabRotateTransform>(RotateTransform.WidgetKey) type RotateTransformTransformModifiers = /// Link a ViewRef to access the direct RotateTransform control instance. diff --git a/src/Fabulous.Avalonia/Views/Media/Transforms/ScaleTransform.fs b/src/Fabulous.Avalonia/Views/Media/Transforms/ScaleTransform.fs index d9d1f6756..ba3acbed5 100644 --- a/src/Fabulous.Avalonia/Views/Media/Transforms/ScaleTransform.fs +++ b/src/Fabulous.Avalonia/Views/Media/Transforms/ScaleTransform.fs @@ -35,7 +35,7 @@ module ScaleTransformBuilders = /// Creates a ScaleTransform widget. static member ScaleTransform() = - WidgetBuilder<'msg, IFabScaleTransform>(ScaleTransform.WidgetKey, AttributesBundle(StackList.empty(), ValueNone, ValueNone)) + WidgetBuilder<'msg, IFabScaleTransform>(ScaleTransform.WidgetKey) type ScaleTransformModifiers = diff --git a/src/Fabulous.Avalonia/Views/Media/Transforms/SkewTransform.fs b/src/Fabulous.Avalonia/Views/Media/Transforms/SkewTransform.fs index b390dfc2f..4f8e98d3b 100644 --- a/src/Fabulous.Avalonia/Views/Media/Transforms/SkewTransform.fs +++ b/src/Fabulous.Avalonia/Views/Media/Transforms/SkewTransform.fs @@ -35,7 +35,7 @@ module SkewTransformBuilders = /// Creates a SkewTransform widget. static member SkewTransform() = - WidgetBuilder<'msg, IFabSkewTransform>(SkewTransform.WidgetKey, AttributesBundle(StackList.empty(), ValueNone, ValueNone)) + WidgetBuilder<'msg, IFabSkewTransform>(SkewTransform.WidgetKey) type SkewTransformTransformModifiers = /// Link a ViewRef to access the direct SkewTransform control instance. diff --git a/src/Fabulous.Avalonia/Views/Media/Transforms/TranslateTransform.fs b/src/Fabulous.Avalonia/Views/Media/Transforms/TranslateTransform.fs index 70c738fa0..253c0f32a 100644 --- a/src/Fabulous.Avalonia/Views/Media/Transforms/TranslateTransform.fs +++ b/src/Fabulous.Avalonia/Views/Media/Transforms/TranslateTransform.fs @@ -33,7 +33,7 @@ module TranslateTransformBuilders = /// Creates a TranslateTransform widget. static member TranslateTransform() = - WidgetBuilder<'msg, IFabTranslateTransform>(TranslateTransform.WidgetKey, AttributesBundle(StackList.empty(), ValueNone, ValueNone)) + WidgetBuilder<'msg, IFabTranslateTransform>(TranslateTransform.WidgetKey) type TranslateTransformModifiers = /// Link a ViewRef to access the direct TranslateTransform control instance. diff --git a/src/Fabulous.Avalonia/Views/Media/_Effect.Components.fs b/src/Fabulous.Avalonia/Views/Media/_Effect.Components.fs index 533bf4e04..62ce5231a 100644 --- a/src/Fabulous.Avalonia/Views/Media/_Effect.Components.fs +++ b/src/Fabulous.Avalonia/Views/Media/_Effect.Components.fs @@ -7,7 +7,7 @@ open Fabulous.Avalonia module ComponentEffect = let Invalidated = - Attributes.defineEventNoArgNoDispatch "Effect_Invalidated" (fun target -> (target :?> Effect).Invalidated) + Attributes.Component.defineEventNoArg "Effect_Invalidated" (fun target -> (target :?> Effect).Invalidated) type ComponentEffectModifiers = /// Listens the Effect Invalidated event. diff --git a/src/Fabulous.Avalonia/Views/Media/_Effect.Mvu.fs b/src/Fabulous.Avalonia/Views/Media/_Effect.Mvu.fs index c25a20378..532ec2e8c 100644 --- a/src/Fabulous.Avalonia/Views/Media/_Effect.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/Media/_Effect.Mvu.fs @@ -7,7 +7,7 @@ open Fabulous.Avalonia module MvuEffect = let Invalidated = - Attributes.defineEventNoArg "Effect_Invalidated" (fun target -> (target :?> Effect).Invalidated) + Attributes.Mvu.defineEventNoArg "Effect_Invalidated" (fun target -> (target :?> Effect).Invalidated) type MvuEffectModifiers = /// Listens the Effect Invalidated event. diff --git a/src/Fabulous.Avalonia/Views/Media/_IGeometry.Components.fs b/src/Fabulous.Avalonia/Views/Media/_IGeometry.Components.fs index ed9d24ac5..1a24dda8a 100644 --- a/src/Fabulous.Avalonia/Views/Media/_IGeometry.Components.fs +++ b/src/Fabulous.Avalonia/Views/Media/_IGeometry.Components.fs @@ -7,7 +7,7 @@ open Fabulous.Avalonia module ComponentGeometry = let Changed = - Attributes.defineEventNoArgNoDispatch "Geometry_Changed" (fun target -> (target :?> Geometry).Changed) + Attributes.Component.defineEventNoArg "Geometry_Changed" (fun target -> (target :?> Geometry).Changed) type ComponentGeometryModifiers = /// Listens to the Geometry Changed event. diff --git a/src/Fabulous.Avalonia/Views/Media/_IGeometry.Mvu.fs b/src/Fabulous.Avalonia/Views/Media/_IGeometry.Mvu.fs index 6146d6b3a..09d985d94 100644 --- a/src/Fabulous.Avalonia/Views/Media/_IGeometry.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/Media/_IGeometry.Mvu.fs @@ -7,7 +7,7 @@ open Fabulous.Avalonia module MvuGeometry = let Changed = - Attributes.defineEventNoArg "Geometry_Changed" (fun target -> (target :?> Geometry).Changed) + Attributes.Mvu.defineEventNoArg "Geometry_Changed" (fun target -> (target :?> Geometry).Changed) type MvuGeometryModifiers = /// Listens to the Geometry Changed event. diff --git a/src/Fabulous.Avalonia/Views/Menu/ComboBox.Components.fs b/src/Fabulous.Avalonia/Views/Menu/ComboBox.Components.fs index 9c1107bae..4771ed2ae 100644 --- a/src/Fabulous.Avalonia/Views/Menu/ComboBox.Components.fs +++ b/src/Fabulous.Avalonia/Views/Menu/ComboBox.Components.fs @@ -7,7 +7,7 @@ open Fabulous.Avalonia module ComponentComboBox = let DropDownOpened = - Attributes.defineAvaloniaPropertyWithChangedEventNoDispatch' "Opened" ComboBox.IsDropDownOpenProperty + Attributes.Component.defineAvaloniaPropertyWithChangedEvent' "Opened" ComboBox.IsDropDownOpenProperty type ComponentComboBoxModifiers = /// Listens to the ComboBox DropDownOpened event. diff --git a/src/Fabulous.Avalonia/Views/Menu/ComboBox.Mvu.fs b/src/Fabulous.Avalonia/Views/Menu/ComboBox.Mvu.fs index 09b1501c5..6a3fd4cd9 100644 --- a/src/Fabulous.Avalonia/Views/Menu/ComboBox.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/Menu/ComboBox.Mvu.fs @@ -7,7 +7,7 @@ open Fabulous.Avalonia module MvuComboBox = let DropDownOpened = - Attributes.defineAvaloniaPropertyWithChangedEvent' "Opened" ComboBox.IsDropDownOpenProperty + Attributes.Mvu.defineAvaloniaPropertyWithChangedEvent' "Opened" ComboBox.IsDropDownOpenProperty type MvuComboBoxModifiers = diff --git a/src/Fabulous.Avalonia/Views/Menu/ComboBox.fs b/src/Fabulous.Avalonia/Views/Menu/ComboBox.fs index 6c3dbb4c2..54be522f7 100644 --- a/src/Fabulous.Avalonia/Views/Menu/ComboBox.fs +++ b/src/Fabulous.Avalonia/Views/Menu/ComboBox.fs @@ -52,10 +52,7 @@ module ComboBoxBuilders = /// Creates a ComboBox widget. /// The items to display in the ComboBox. static member ComboBox(items: seq<_>) = - WidgetBuilder<'msg, IFabComboBox>( - ComboBox.WidgetKey, - AttributesBundle(StackList.one(ItemsControl.ItemsSource.WithValue(items)), ValueNone, ValueNone) - ) + WidgetBuilder<'msg, IFabComboBox>(ComboBox.WidgetKey, ItemsControl.ItemsSource.WithValue(items)) /// Creates a ComboBox widget. /// The items to display in the ComboBox. @@ -131,6 +128,13 @@ type ComboBoxModifiers = static member inline verticalContentAlignment(this: WidgetBuilder<'msg, #IFabComboBox>, value: VerticalAlignment) = this.AddScalar(ComboBox.VerticalContentAlignment.WithValue(value)) + /// Sets the ItemTemplate property. + /// Current widget. + /// The template to render the items with. + [] + static member inline itemTemplate(this: WidgetBuilder<'msg, #IFabComboBox>, template: 'item -> WidgetBuilder<'msg, #IFabControl>) = + this.AddScalar(ComboBox.ItemTemplate.WithValue(WidgetHelpers.compileTemplate template)) + /// Link a ViewRef to access the direct ComboBox control instance. /// Current widget. /// The ViewRef instance that will receive access to the underlying control. diff --git a/src/Fabulous.Avalonia/Views/Menu/ContextMenu.Components.fs b/src/Fabulous.Avalonia/Views/Menu/ContextMenu.Components.fs index 6ae0d817a..3f639a1b1 100644 --- a/src/Fabulous.Avalonia/Views/Menu/ContextMenu.Components.fs +++ b/src/Fabulous.Avalonia/Views/Menu/ContextMenu.Components.fs @@ -8,10 +8,10 @@ open Fabulous.Avalonia module ComponentContextMenu = let Opening = - Attributes.defineEventHandlerNoDispatch "ContextMenu_Opening" (fun target -> (target :?> ContextMenu).Opening) + Attributes.Component.defineEventHandler "ContextMenu_Opening" (fun target -> (target :?> ContextMenu).Opening) let Closing = - Attributes.defineEventHandlerNoDispatch "ContextMenu_Closing" (fun target -> (target :?> ContextMenu).Closing) + Attributes.Component.defineEventHandler "ContextMenu_Closing" (fun target -> (target :?> ContextMenu).Closing) type ComponentContextMenuModifiers = /// Listens to the ContextMenu Opening event. diff --git a/src/Fabulous.Avalonia/Views/Menu/ContextMenu.Mvu.fs b/src/Fabulous.Avalonia/Views/Menu/ContextMenu.Mvu.fs index 521c4bf52..52171fb9b 100644 --- a/src/Fabulous.Avalonia/Views/Menu/ContextMenu.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/Menu/ContextMenu.Mvu.fs @@ -8,10 +8,10 @@ open Fabulous.Avalonia module MvuContextMenu = let Opening = - Attributes.defineEventHandler "ContextMenu_Opening" (fun target -> (target :?> ContextMenu).Opening) + Attributes.Mvu.defineEventHandler "ContextMenu_Opening" (fun target -> (target :?> ContextMenu).Opening) let Closing = - Attributes.defineEventHandler "ContextMenu_Closing" (fun target -> (target :?> ContextMenu).Closing) + Attributes.Mvu.defineEventHandler "ContextMenu_Closing" (fun target -> (target :?> ContextMenu).Closing) type MvuContextMenuModifiers = /// Listens to the ContextMenu Opening event. diff --git a/src/Fabulous.Avalonia/Views/Menu/Flyout.fs b/src/Fabulous.Avalonia/Views/Menu/Flyout.fs index 3c6dc037f..602387134 100644 --- a/src/Fabulous.Avalonia/Views/Menu/Flyout.fs +++ b/src/Fabulous.Avalonia/Views/Menu/Flyout.fs @@ -21,10 +21,7 @@ module FlyoutBuilders = /// Creates a Flyout widget. /// The content of the Flyout. static member Flyout(content: WidgetBuilder<'msg, #IFabControl>) = - WidgetBuilder<'msg, IFabFlyout>( - Flyout.WidgetKey, - AttributesBundle(StackList.empty(), ValueSome [| Flyout.Content.WithValue(content.Compile()) |], ValueNone) - ) + WidgetBuilder<'msg, IFabFlyout>(Flyout.WidgetKey, Flyout.Content.WithValue(content.Compile())) type FlyoutModifiers = /// Link a ViewRef to access the direct Flyout control instance. diff --git a/src/Fabulous.Avalonia/Views/Menu/NativeMenu.Components.fs b/src/Fabulous.Avalonia/Views/Menu/NativeMenu.Components.fs index 59e294a8b..5363040a1 100644 --- a/src/Fabulous.Avalonia/Views/Menu/NativeMenu.Components.fs +++ b/src/Fabulous.Avalonia/Views/Menu/NativeMenu.Components.fs @@ -8,13 +8,13 @@ open Fabulous.Avalonia module ComponentNativeMenu = let Opening = - Attributes.defineEventNoDispatch "NativeMenu_Opening" (fun target -> (target :?> NativeMenu).Opening) + Attributes.Component.defineEvent "NativeMenu_Opening" (fun target -> (target :?> NativeMenu).Opening) let Closed = - Attributes.defineEventNoDispatch "NativeMenu_Opening" (fun target -> (target :?> NativeMenu).Closed) + Attributes.Component.defineEvent "NativeMenu_Opening" (fun target -> (target :?> NativeMenu).Closed) let NeedsUpdate = - Attributes.defineEventNoDispatch "NativeMenu_NeedsUpdate" (fun target -> (target :?> NativeMenu).NeedsUpdate) + Attributes.Component.defineEvent "NativeMenu_NeedsUpdate" (fun target -> (target :?> NativeMenu).NeedsUpdate) type ComponentNativeMenuModifiers = /// Listens to the NativeMenu Opening event. diff --git a/src/Fabulous.Avalonia/Views/Menu/NativeMenu.Mvu.fs b/src/Fabulous.Avalonia/Views/Menu/NativeMenu.Mvu.fs index 984dffcc8..43a5226ca 100644 --- a/src/Fabulous.Avalonia/Views/Menu/NativeMenu.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/Menu/NativeMenu.Mvu.fs @@ -8,13 +8,13 @@ open Fabulous.Avalonia module MvuNativeMenu = let Opening = - Attributes.defineEvent "NativeMenu_Opening" (fun target -> (target :?> NativeMenu).Opening) + Attributes.Mvu.defineEvent "NativeMenu_Opening" (fun target -> (target :?> NativeMenu).Opening) let Closed = - Attributes.defineEvent "NativeMenu_Opening" (fun target -> (target :?> NativeMenu).Closed) + Attributes.Mvu.defineEvent "NativeMenu_Opening" (fun target -> (target :?> NativeMenu).Closed) let NeedsUpdate = - Attributes.defineEvent "NativeMenu_NeedsUpdate" (fun target -> (target :?> NativeMenu).NeedsUpdate) + Attributes.Mvu.defineEvent "NativeMenu_NeedsUpdate" (fun target -> (target :?> NativeMenu).NeedsUpdate) type MvuNativeMenuModifiers = /// Listens to the NativeMenu Opening event. diff --git a/src/Fabulous.Avalonia/Views/Menu/NativeMenuBar.fs b/src/Fabulous.Avalonia/Views/Menu/NativeMenuBar.fs index 3165e48bc..11a7e6441 100644 --- a/src/Fabulous.Avalonia/Views/Menu/NativeMenuBar.fs +++ b/src/Fabulous.Avalonia/Views/Menu/NativeMenuBar.fs @@ -21,7 +21,7 @@ module NativeMenuBarBuilders = /// Creates a NativeMenuBar widget. static member NativeMenuBar() = - WidgetBuilder<'msg, IFabNativeMenuBar>(NativeMenuBar.WidgetKey, AttributesBundle(StackList.empty(), ValueNone, ValueNone)) + WidgetBuilder<'msg, IFabNativeMenuBar>(NativeMenuBar.WidgetKey) type NativeMenuBarAttachedModifiers = diff --git a/src/Fabulous.Avalonia/Views/Menu/NativeMenuItem.Components.fs b/src/Fabulous.Avalonia/Views/Menu/NativeMenuItem.Components.fs index c0f6ad9d8..e33d1b480 100644 --- a/src/Fabulous.Avalonia/Views/Menu/NativeMenuItem.Components.fs +++ b/src/Fabulous.Avalonia/Views/Menu/NativeMenuItem.Components.fs @@ -7,7 +7,7 @@ open Fabulous.Avalonia module ComponentNativeMenuItem = let Click = - Attributes.defineEventNoArgNoDispatch "NativeMenuItem_Click" (fun target -> (target :?> NativeMenuItem).Click) + Attributes.Component.defineEventNoArg "NativeMenuItem_Click" (fun target -> (target :?> NativeMenuItem).Click) [] module ComponentNativeMenuItemBuilders = diff --git a/src/Fabulous.Avalonia/Views/Menu/NativeMenuItem.Mvu.fs b/src/Fabulous.Avalonia/Views/Menu/NativeMenuItem.Mvu.fs index 873153690..efeba0457 100644 --- a/src/Fabulous.Avalonia/Views/Menu/NativeMenuItem.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/Menu/NativeMenuItem.Mvu.fs @@ -7,7 +7,7 @@ open Fabulous.Avalonia module MvuNativeMenuItem = let Click = - Attributes.defineEventNoArg "NativeMenuItem_Click" (fun target -> (target :?> NativeMenuItem).Click) + Attributes.Mvu.defineEventNoArg "NativeMenuItem_Click" (fun target -> (target :?> NativeMenuItem).Click) [] module MvuNativeMenuItemBuilders = diff --git a/src/Fabulous.Avalonia/Views/Menu/NativeMenuSeparator.fs b/src/Fabulous.Avalonia/Views/Menu/NativeMenuSeparator.fs index 27d711fd0..9d391932f 100644 --- a/src/Fabulous.Avalonia/Views/Menu/NativeMenuSeparator.fs +++ b/src/Fabulous.Avalonia/Views/Menu/NativeMenuSeparator.fs @@ -17,7 +17,7 @@ module NativeMenuItemSeparatorBuilders = /// Creates a NativeMenuItemSeparator widget. static member NativeMenuItemSeparator() = - WidgetBuilder<'msg, IFabNativeMenuItemSeparator>(NativeMenuItemSeparator.WidgetKey, AttributesBundle(StackList.empty(), ValueNone, ValueNone)) + WidgetBuilder<'msg, IFabNativeMenuItemSeparator>(NativeMenuItemSeparator.WidgetKey) type NativeMenuItemSeparatorModifiers = /// Link a ViewRef to access the direct NativeMenuItemSeparator control instance. diff --git a/src/Fabulous.Avalonia/Views/MenuItems/ComboBoxItem.fs b/src/Fabulous.Avalonia/Views/MenuItems/ComboBoxItem.fs index d9621d9b8..eaba487a7 100644 --- a/src/Fabulous.Avalonia/Views/MenuItems/ComboBoxItem.fs +++ b/src/Fabulous.Avalonia/Views/MenuItems/ComboBoxItem.fs @@ -34,10 +34,7 @@ module ComboBoxItemBuilders = /// Creates a ComboBoxItem widget. /// The content of the ComboBoxItem. static member ComboBoxItem(content: WidgetBuilder<'msg, #IFabControl>) = - WidgetBuilder<'msg, IFabComboBoxItem>( - ComboBoxItem.WidgetKey, - AttributesBundle(StackList.empty(), ValueSome [| ContentControl.ContentWidget.WithValue(content.Compile()) |], ValueNone) - ) + WidgetBuilder<'msg, IFabComboBoxItem>(ComboBoxItem.WidgetKey, ContentControl.ContentWidget.WithValue(content.Compile())) /// Creates a ComboBoxItem widget. /// Whether the ComboBoxItem is selected. @@ -48,6 +45,7 @@ module ComboBoxItemBuilders = AttributesBundle( StackList.one(ListBoxItem.IsSelected.WithValue(isSelected)), ValueSome [| ContentControl.ContentWidget.WithValue(content.Compile()) |], + ValueNone, ValueNone ) ) diff --git a/src/Fabulous.Avalonia/Views/MenuItems/ListBoxItem.fs b/src/Fabulous.Avalonia/Views/MenuItems/ListBoxItem.fs index 4cfb919c2..11ff226b0 100644 --- a/src/Fabulous.Avalonia/Views/MenuItems/ListBoxItem.fs +++ b/src/Fabulous.Avalonia/Views/MenuItems/ListBoxItem.fs @@ -44,6 +44,7 @@ module ListBoxItemBuilders = AttributesBundle( StackList.one(ListBoxItem.IsSelected.WithValue(isSelected)), ValueSome [| ContentControl.ContentWidget.WithValue(content.Compile()) |], + ValueNone, ValueNone ) ) @@ -51,10 +52,7 @@ module ListBoxItemBuilders = /// Creates a ListBoxItem widget. /// The content of the ListBoxItem. static member ListBoxItem(content: WidgetBuilder<'msg, #IFabControl>) = - WidgetBuilder<'msg, IFabListBoxItem>( - ListBoxItem.WidgetKey, - AttributesBundle(StackList.empty(), ValueSome [| ContentControl.ContentWidget.WithValue(content.Compile()) |], ValueNone) - ) + WidgetBuilder<'msg, IFabListBoxItem>(ListBoxItem.WidgetKey, ContentControl.ContentWidget.WithValue(content.Compile())) type ListBoxItemModifiers = /// Link a ViewRef to access the direct MenuItem control instance. diff --git a/src/Fabulous.Avalonia/Views/MenuItems/MenuItem.Components.fs b/src/Fabulous.Avalonia/Views/MenuItems/MenuItem.Components.fs index 226555986..f85264f6c 100644 --- a/src/Fabulous.Avalonia/Views/MenuItems/MenuItem.Components.fs +++ b/src/Fabulous.Avalonia/Views/MenuItems/MenuItem.Components.fs @@ -10,16 +10,16 @@ open Fabulous.StackAllocatedCollections.StackList module ComponentMenuItem = let Clicked = - Attributes.defineEventNoDispatch "MenuItem_Clicked" (fun target -> (target :?> MenuItem).Click) + Attributes.Component.defineEvent "MenuItem_Clicked" (fun target -> (target :?> MenuItem).Click) let PointerEnteredItem = - Attributes.defineEventNoDispatch "MenuItem_PointerEnteredItem" (fun target -> (target :?> MenuItem).PointerEnteredItem) + Attributes.Component.defineEvent "MenuItem_PointerEnteredItem" (fun target -> (target :?> MenuItem).PointerEnteredItem) let PointerExitedItem = - Attributes.defineEventNoDispatch "MenuItem_PointerExitedItem" (fun target -> (target :?> MenuItem).PointerExitedItem) + Attributes.Component.defineEvent "MenuItem_PointerExitedItem" (fun target -> (target :?> MenuItem).PointerExitedItem) let SubmenuOpened = - Attributes.defineEventNoDispatch "MenuItem_SubmenuOpened" (fun target -> (target :?> MenuItem).SubmenuOpened) + Attributes.Component.defineEvent "MenuItem_SubmenuOpened" (fun target -> (target :?> MenuItem).SubmenuOpened) [] module ComponentMenuItemBuilders = @@ -43,6 +43,7 @@ module ComponentMenuItemBuilders = AttributesBundle( StackList.one(ComponentMenuItem.Clicked.WithValue(onClick)), ValueSome [| HeaderedContentControl.HeaderWidget.WithValue(header.Compile()) |], + ValueNone, ValueNone ) ) @@ -60,6 +61,7 @@ module ComponentMenuItemsBuilders = AttributesBundle( StackList.one(ComponentMenuItem.Clicked.WithValue(onClick)), ValueSome [| HeaderedContentControl.HeaderWidget.WithValue(header.Compile()) |], + ValueNone, ValueNone ) ) @@ -74,6 +76,7 @@ module ComponentMenuItemsBuilders = AttributesBundle( StackList.two(ComponentMenuItem.Clicked.WithValue(onClick), HeaderedContentControl.HeaderString.WithValue(header)), ValueNone, + ValueNone, ValueNone ) ) diff --git a/src/Fabulous.Avalonia/Views/MenuItems/MenuItem.Mvu.fs b/src/Fabulous.Avalonia/Views/MenuItems/MenuItem.Mvu.fs index 140ddff1c..a00b32d3c 100644 --- a/src/Fabulous.Avalonia/Views/MenuItems/MenuItem.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/MenuItems/MenuItem.Mvu.fs @@ -10,16 +10,16 @@ open Fabulous.StackAllocatedCollections.StackList module MvuMenuItem = let Clicked = - Attributes.defineEvent "MenuItem_Clicked" (fun target -> (target :?> MenuItem).Click) + Attributes.Mvu.defineEvent "MenuItem_Clicked" (fun target -> (target :?> MenuItem).Click) let PointerEnteredItem = - Attributes.defineEvent "MenuItem_PointerEnteredItem" (fun target -> (target :?> MenuItem).PointerEnteredItem) + Attributes.Mvu.defineEvent "MenuItem_PointerEnteredItem" (fun target -> (target :?> MenuItem).PointerEnteredItem) let PointerExitedItem = - Attributes.defineEvent "MenuItem_PointerExitedItem" (fun target -> (target :?> MenuItem).PointerExitedItem) + Attributes.Mvu.defineEvent "MenuItem_PointerExitedItem" (fun target -> (target :?> MenuItem).PointerExitedItem) let SubmenuOpened = - Attributes.defineEvent "MenuItem_SubmenuOpened" (fun target -> (target :?> MenuItem).SubmenuOpened) + Attributes.Mvu.defineEvent "MenuItem_SubmenuOpened" (fun target -> (target :?> MenuItem).SubmenuOpened) [] module MvuMenuItemBuilders = @@ -39,6 +39,7 @@ module MvuMenuItemBuilders = AttributesBundle( StackList.one(MvuMenuItem.Clicked.WithValue(onClick)), ValueSome [| HeaderedContentControl.HeaderWidget.WithValue(header.Compile()) |], + ValueNone, ValueNone ) ) @@ -57,6 +58,7 @@ module MvuMenuItemsBuilders = AttributesBundle( StackList.one(MvuMenuItem.Clicked.WithValue(onClick)), ValueSome [| HeaderedContentControl.HeaderWidget.WithValue(header.Compile()) |], + ValueNone, ValueNone ) ) @@ -71,6 +73,7 @@ module MvuMenuItemsBuilders = AttributesBundle( StackList.two(MvuMenuItem.Clicked.WithValue(onClick), HeaderedContentControl.HeaderString.WithValue(header)), ValueNone, + ValueNone, ValueNone ) ) diff --git a/src/Fabulous.Avalonia/Views/MenuItems/MenuItem.fs b/src/Fabulous.Avalonia/Views/MenuItems/MenuItem.fs index 20809132d..866e6c46a 100644 --- a/src/Fabulous.Avalonia/Views/MenuItems/MenuItem.fs +++ b/src/Fabulous.Avalonia/Views/MenuItems/MenuItem.fs @@ -42,10 +42,7 @@ module MenuItemBuilders = /// Creates a MenuItem widget. /// The header of the menu item. static member MenuItem(header: WidgetBuilder<'msg, #IFabControl>) = - WidgetBuilder<'msg, IFabMenuItem>( - MenuItem.WidgetKey, - AttributesBundle(StackList.empty(), ValueSome [| HeaderedContentControl.HeaderWidget.WithValue(header.Compile()) |], ValueNone) - ) + WidgetBuilder<'msg, IFabMenuItem>(MenuItem.WidgetKey, HeaderedContentControl.HeaderWidget.WithValue(header.Compile())) [] module MenuItemsBuilders = @@ -60,17 +57,13 @@ module MenuItemsBuilders = CollectionBuilder<'msg, IFabMenuItem, IFabMenuItem>( MenuItem.WidgetKey, ItemsControl.Items, - AttributesBundle(StackList.empty(), ValueSome [| HeaderedContentControl.HeaderWidget.WithValue(header.Compile()) |], ValueNone) + AttributesBundle(StackList.empty(), ValueSome [| HeaderedContentControl.HeaderWidget.WithValue(header.Compile()) |], ValueNone, ValueNone) ) /// Creates a MenuItems widget. /// The header of the menu item. static member MenuItems(header: string) = - CollectionBuilder<'msg, IFabMenuItem, IFabMenuItem>( - MenuItem.WidgetKey, - ItemsControl.Items, - AttributesBundle(StackList.one(HeaderedContentControl.HeaderString.WithValue(header)), ValueNone, ValueNone) - ) + CollectionBuilder<'msg, IFabMenuItem, IFabMenuItem>(MenuItem.WidgetKey, ItemsControl.Items, HeaderedContentControl.HeaderString.WithValue(header)) type MenuItemModifiers = /// Sets the HotKey property. diff --git a/src/Fabulous.Avalonia/Views/MenuItems/TabItem.fs b/src/Fabulous.Avalonia/Views/MenuItems/TabItem.fs index 0f5f69933..73abaae8f 100644 --- a/src/Fabulous.Avalonia/Views/MenuItems/TabItem.fs +++ b/src/Fabulous.Avalonia/Views/MenuItems/TabItem.fs @@ -30,6 +30,7 @@ module TabItemBuilders = AttributesBundle( StackList.one(HeaderedContentControl.HeaderString.WithValue(header)), ValueSome [| ContentControl.ContentWidget.WithValue(content.Compile()) |], + ValueNone, ValueNone ) ) @@ -45,6 +46,7 @@ module TabItemBuilders = ValueSome [| HeaderedContentControl.HeaderWidget.WithValue(header.Compile()) ContentControl.ContentWidget.WithValue(content.Compile()) |], + ValueNone, ValueNone ) ) diff --git a/src/Fabulous.Avalonia/Views/MenuItems/TreeViewItem.fs b/src/Fabulous.Avalonia/Views/MenuItems/TreeViewItem.fs index 792b02424..627644f3b 100644 --- a/src/Fabulous.Avalonia/Views/MenuItems/TreeViewItem.fs +++ b/src/Fabulous.Avalonia/Views/MenuItems/TreeViewItem.fs @@ -46,6 +46,7 @@ module TreeViewItemBuilders = AttributesBundle( StackList.one(TreeViewItem.IsSelected.WithValue(isSelected)), ValueSome [| HeaderedItemsControl.HeaderWidget.WithValue(content.Compile()) |], + ValueNone, ValueNone ) ) @@ -53,10 +54,7 @@ module TreeViewItemBuilders = /// Creates a TreeViewItem widget. /// The content of the TreeViewItem. static member TreeViewItem(content: WidgetBuilder<'msg, #IFabControl>) = - WidgetBuilder<'msg, IFabTreeViewItem>( - TreeViewItem.WidgetKey, - AttributesBundle(StackList.empty(), ValueSome [| HeaderedItemsControl.HeaderWidget.WithValue(content.Compile()) |], ValueNone) - ) + WidgetBuilder<'msg, IFabTreeViewItem>(TreeViewItem.WidgetKey, HeaderedItemsControl.HeaderWidget.WithValue(content.Compile())) type TreeViewItemModifiers = /// Link a ViewRef to access the direct TreeViewItem control instance. @@ -70,5 +68,5 @@ type TreeViewItemModifiers = /// Current widget. /// Whether the TreeViewItem is expanded. [] - static member inline isExpanded(this: WidgetBuilder<'msg, IFabTreeViewItem>, value: bool) = + static member inline isExpanded(this: WidgetBuilder<'msg, #IFabTreeViewItem>, value: bool) = this.AddScalar(TreeViewItem.IsExpanded.WithValue(value)) diff --git a/src/Fabulous.Avalonia/Views/Panels/VirtualizingStackPanel.Components.fs b/src/Fabulous.Avalonia/Views/Panels/VirtualizingStackPanel.Components.fs index 36ff1246d..d2ae60a3c 100644 --- a/src/Fabulous.Avalonia/Views/Panels/VirtualizingStackPanel.Components.fs +++ b/src/Fabulous.Avalonia/Views/Panels/VirtualizingStackPanel.Components.fs @@ -8,12 +8,12 @@ open Fabulous.Avalonia module ComponentVirtualizingStackPanel = let HorizontalSnapPointsChanged = - Attributes.defineEventNoDispatch "VirtualizingStackPanel_HorizontalSnapPointsChanged" (fun target -> + Attributes.Component.defineEvent "VirtualizingStackPanel_HorizontalSnapPointsChanged" (fun target -> (target :?> VirtualizingStackPanel) .HorizontalSnapPointsChanged) let VerticalSnapPointsChanged = - Attributes.defineEventNoDispatch "VirtualizingStackPanel_VerticalSnapPointsChanged" (fun target -> + Attributes.Component.defineEvent "VirtualizingStackPanel_VerticalSnapPointsChanged" (fun target -> (target :?> VirtualizingStackPanel) .VerticalSnapPointsChanged) diff --git a/src/Fabulous.Avalonia/Views/Panels/VirtualizingStackPanel.Mvu.fs b/src/Fabulous.Avalonia/Views/Panels/VirtualizingStackPanel.Mvu.fs index 900b9714e..43ecf618a 100644 --- a/src/Fabulous.Avalonia/Views/Panels/VirtualizingStackPanel.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/Panels/VirtualizingStackPanel.Mvu.fs @@ -8,12 +8,12 @@ open Fabulous.Avalonia module MvuVirtualizingStackPanel = let HorizontalSnapPointsChanged = - Attributes.defineEvent "VirtualizingStackPanel_HorizontalSnapPointsChanged" (fun target -> + Attributes.Mvu.defineEvent "VirtualizingStackPanel_HorizontalSnapPointsChanged" (fun target -> (target :?> VirtualizingStackPanel) .HorizontalSnapPointsChanged) let VerticalSnapPointsChanged = - Attributes.defineEvent "VirtualizingStackPanel_VerticalSnapPointsChanged" (fun target -> + Attributes.Mvu.defineEvent "VirtualizingStackPanel_VerticalSnapPointsChanged" (fun target -> (target :?> VirtualizingStackPanel) .VerticalSnapPointsChanged) diff --git a/src/Fabulous.Avalonia/Views/Panels/VirtualizingStackPanel.fs b/src/Fabulous.Avalonia/Views/Panels/VirtualizingStackPanel.fs index 1451e11d3..2d464556a 100644 --- a/src/Fabulous.Avalonia/Views/Panels/VirtualizingStackPanel.fs +++ b/src/Fabulous.Avalonia/Views/Panels/VirtualizingStackPanel.fs @@ -26,7 +26,7 @@ module VirtualizingStackPanelBuilders = /// Creates a VirtualizingStackPanel widget. static member VirtualizingStackPanel() = - WidgetBuilder<'msg, IFabVirtualizingStackPanel>(VirtualizingStackPanel.WidgetKey, AttributesBundle(StackList.empty(), ValueNone, ValueNone)) + WidgetBuilder<'msg, IFabVirtualizingStackPanel>(VirtualizingStackPanel.WidgetKey) type VirtualizingStackPanelModifiers = /// Sets the AreHorizontalSnapPointsRegular property. diff --git a/src/Fabulous.Avalonia/Views/Panels/_StackPanel.Components.fs b/src/Fabulous.Avalonia/Views/Panels/_StackPanel.Components.fs index 0a1ca387b..d1367db69 100644 --- a/src/Fabulous.Avalonia/Views/Panels/_StackPanel.Components.fs +++ b/src/Fabulous.Avalonia/Views/Panels/_StackPanel.Components.fs @@ -7,10 +7,10 @@ open Fabulous module ComponentStackPanel = let HorizontalSnapPointsChanged = - Attributes.defineEventNoDispatch "StackPanel_HorizontalSnapPointsChanged" (fun target -> (target :?> StackPanel).HorizontalSnapPointsChanged) + Attributes.Component.defineEvent "StackPanel_HorizontalSnapPointsChanged" (fun target -> (target :?> StackPanel).HorizontalSnapPointsChanged) let VerticalSnapPointsChanged = - Attributes.defineEventNoDispatch "StackPanel_VerticalSnapPointsChanged" (fun target -> (target :?> StackPanel).VerticalSnapPointsChanged) + Attributes.Component.defineEvent "StackPanel_VerticalSnapPointsChanged" (fun target -> (target :?> StackPanel).VerticalSnapPointsChanged) type ComponentStackPanelModifiers = diff --git a/src/Fabulous.Avalonia/Views/Panels/_StackPanel.Mvu.fs b/src/Fabulous.Avalonia/Views/Panels/_StackPanel.Mvu.fs index 5c9afb007..3712f9ca7 100644 --- a/src/Fabulous.Avalonia/Views/Panels/_StackPanel.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/Panels/_StackPanel.Mvu.fs @@ -8,10 +8,10 @@ open Fabulous.Avalonia module MvuStackPanel = let HorizontalSnapPointsChanged = - Attributes.defineEvent "StackPanel_HorizontalSnapPointsChanged" (fun target -> (target :?> StackPanel).HorizontalSnapPointsChanged) + Attributes.Mvu.defineEvent "StackPanel_HorizontalSnapPointsChanged" (fun target -> (target :?> StackPanel).HorizontalSnapPointsChanged) let VerticalSnapPointsChanged = - Attributes.defineEvent "StackPanel_VerticalSnapPointsChanged" (fun target -> (target :?> StackPanel).VerticalSnapPointsChanged) + Attributes.Mvu.defineEvent "StackPanel_VerticalSnapPointsChanged" (fun target -> (target :?> StackPanel).VerticalSnapPointsChanged) type MvuStackPanelModifiers = diff --git a/src/Fabulous.Avalonia/Views/Styling/Transition.fs b/src/Fabulous.Avalonia/Views/Styling/Transition.fs index 0a8b5f6b6..31290965a 100644 --- a/src/Fabulous.Avalonia/Views/Styling/Transition.fs +++ b/src/Fabulous.Avalonia/Views/Styling/Transition.fs @@ -306,6 +306,27 @@ module VectorTransitionBuilders = TransitionBase.Duration.WithValue(duration) ) +type IFabBoolTransition = + inherit IFabTransition + +module BoolTransition = + let WidgetKey = Widgets.register() + +[] +module BoolTransitionBuilders = + + type Fabulous.Avalonia.View with + + /// Creates a BoolTransition widget. + /// The property to animate. + /// The duration of the animation. + static member BoolTransition(property: AvaloniaProperty, duration: TimeSpan) = + WidgetBuilder<'msg, IFabBoolTransition>( + BoolTransition.WidgetKey, + TransitionBase.Property.WithValue(property), + TransitionBase.Duration.WithValue(duration) + ) + type IFabEffectTransition = inherit IFabTransition diff --git a/src/Fabulous.Avalonia/Views/_Control.Components.fs b/src/Fabulous.Avalonia/Views/_Control.Components.fs index 3296a6689..4a65e65ee 100644 --- a/src/Fabulous.Avalonia/Views/_Control.Components.fs +++ b/src/Fabulous.Avalonia/Views/_Control.Components.fs @@ -9,19 +9,19 @@ open Fabulous.Avalonia module ComponentControl = let RequestBringIntoView = - Attributes.defineRoutedEventNoDispatch "Control_RequestBringIntoView" Control.RequestBringIntoViewEvent + Attributes.Component.defineRoutedEvent "Control_RequestBringIntoView" Control.RequestBringIntoViewEvent let ContextRequested = - Attributes.defineEventNoDispatch "Control_ContextRequested" (fun target -> (target :?> Control).ContextRequested) + Attributes.Component.defineEvent "Control_ContextRequested" (fun target -> (target :?> Control).ContextRequested) let Loaded = - Attributes.defineEventNoDispatch "Control_Loaded" (fun target -> (target :?> Control).Loaded) + Attributes.Component.defineEvent "Control_Loaded" (fun target -> (target :?> Control).Loaded) let UnLoaded = - Attributes.defineEventNoDispatch "Control_UnLoaded" (fun target -> (target :?> Control).Unloaded) + Attributes.Component.defineEvent "Control_UnLoaded" (fun target -> (target :?> Control).Unloaded) let SizeChanged = - Attributes.defineEventNoDispatch "Control_SizeChanged" (fun target -> (target :?> Control).SizeChanged) + Attributes.Component.defineEvent "Control_SizeChanged" (fun target -> (target :?> Control).SizeChanged) type ComponentControlModifiers = /// Listens to the Control ContextRequested event. diff --git a/src/Fabulous.Avalonia/Views/_Control.Mvu.fs b/src/Fabulous.Avalonia/Views/_Control.Mvu.fs index 8217db16a..ec728d187 100644 --- a/src/Fabulous.Avalonia/Views/_Control.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/_Control.Mvu.fs @@ -9,19 +9,19 @@ open Fabulous.Avalonia module MvuControl = let RequestBringIntoView = - Attributes.defineRoutedEvent "Control_RequestBringIntoView" Control.RequestBringIntoViewEvent + Attributes.Mvu.defineRoutedEvent "Control_RequestBringIntoView" Control.RequestBringIntoViewEvent let ContextRequested = - Attributes.defineEvent "Control_ContextRequested" (fun target -> (target :?> Control).ContextRequested) + Attributes.Mvu.defineEvent "Control_ContextRequested" (fun target -> (target :?> Control).ContextRequested) let Loaded = - Attributes.defineEvent "Control_Loaded" (fun target -> (target :?> Control).Loaded) + Attributes.Mvu.defineEvent "Control_Loaded" (fun target -> (target :?> Control).Loaded) let UnLoaded = - Attributes.defineEvent "Control_UnLoaded" (fun target -> (target :?> Control).Unloaded) + Attributes.Mvu.defineEvent "Control_UnLoaded" (fun target -> (target :?> Control).Unloaded) let SizeChanged = - Attributes.defineEvent "Control_SizeChanged" (fun target -> (target :?> Control).SizeChanged) + Attributes.Mvu.defineEvent "Control_SizeChanged" (fun target -> (target :?> Control).SizeChanged) type MvuControlModifiers = /// Listens to the Control ContextRequested event. diff --git a/src/Fabulous.Avalonia/Views/_DragDrop.Components.fs b/src/Fabulous.Avalonia/Views/_DragDrop.Components.fs index 5ee048b01..d579e929f 100644 --- a/src/Fabulous.Avalonia/Views/_DragDrop.Components.fs +++ b/src/Fabulous.Avalonia/Views/_DragDrop.Components.fs @@ -7,16 +7,16 @@ open Fabulous.Avalonia module ComponentDragDrop = let DragEnter = - Attributes.defineRoutedEventNoDispatch "DragDrop_DragEnter" DragDrop.DragEnterEvent + Attributes.Component.defineRoutedEvent "DragDrop_DragEnter" DragDrop.DragEnterEvent let DragLeave = - Attributes.defineRoutedEventNoDispatch "DragDrop_DragLeave" DragDrop.DragLeaveEvent + Attributes.Component.defineRoutedEvent "DragDrop_DragLeave" DragDrop.DragLeaveEvent let DragOver = - Attributes.defineRoutedEventNoDispatch "DragDrop_DragOver" DragDrop.DragOverEvent + Attributes.Component.defineRoutedEvent "DragDrop_DragOver" DragDrop.DragOverEvent let Drop = - Attributes.defineRoutedEventNoDispatch "DragDrop_Drop" DragDrop.DropEvent + Attributes.Component.defineRoutedEvent "DragDrop_Drop" DragDrop.DropEvent type ComponentDragDropModifiers = /// Listens to the DragDrop DragEnter event. diff --git a/src/Fabulous.Avalonia/Views/_DragDrop.Mvu.fs b/src/Fabulous.Avalonia/Views/_DragDrop.Mvu.fs index b24e7b967..1a86a1e91 100644 --- a/src/Fabulous.Avalonia/Views/_DragDrop.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/_DragDrop.Mvu.fs @@ -7,16 +7,16 @@ open Fabulous.Avalonia module MvuDragDrop = let DragEnter = - Attributes.defineRoutedEvent "DragDrop_DragEnter" DragDrop.DragEnterEvent + Attributes.Mvu.defineRoutedEvent "DragDrop_DragEnter" DragDrop.DragEnterEvent let DragLeave = - Attributes.defineRoutedEvent "DragDrop_DragLeave" DragDrop.DragLeaveEvent + Attributes.Mvu.defineRoutedEvent "DragDrop_DragLeave" DragDrop.DragLeaveEvent let DragOver = - Attributes.defineRoutedEvent "DragDrop_DragOver" DragDrop.DragOverEvent + Attributes.Mvu.defineRoutedEvent "DragDrop_DragOver" DragDrop.DragOverEvent let Drop = - Attributes.defineRoutedEvent "DragDrop_Drop" DragDrop.DropEvent + Attributes.Mvu.defineRoutedEvent "DragDrop_Drop" DragDrop.DropEvent type MvuDragDropModifiers = /// Listens to the DragDrop DragEnter event. diff --git a/src/Fabulous.Avalonia/Views/_FlyoutBase.Components.fs b/src/Fabulous.Avalonia/Views/_FlyoutBase.Components.fs index 29005b576..dbf23a758 100644 --- a/src/Fabulous.Avalonia/Views/_FlyoutBase.Components.fs +++ b/src/Fabulous.Avalonia/Views/_FlyoutBase.Components.fs @@ -6,10 +6,10 @@ open Fabulous module ComponentFlyoutBase = let Opened = - Attributes.defineEventNoArgNoDispatch "FlyoutBase_Opened" (fun target -> (target :?> FlyoutBase).Opened) + Attributes.Component.defineEventNoArg "FlyoutBase_Opened" (fun target -> (target :?> FlyoutBase).Opened) let Closed = - Attributes.defineEventNoArgNoDispatch "FlyoutBase_Closed" (fun target -> (target :?> FlyoutBase).Closed) + Attributes.Component.defineEventNoArg "FlyoutBase_Closed" (fun target -> (target :?> FlyoutBase).Closed) type ComponentFlyoutBaseModifiers = /// Listens to the FlyoutBase Opened event. diff --git a/src/Fabulous.Avalonia/Views/_FlyoutBase.Mvu.fs b/src/Fabulous.Avalonia/Views/_FlyoutBase.Mvu.fs index d952b4aca..1f9c18fbd 100644 --- a/src/Fabulous.Avalonia/Views/_FlyoutBase.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/_FlyoutBase.Mvu.fs @@ -7,10 +7,10 @@ open Fabulous.Avalonia module MvuFlyoutBase = let Opened = - Attributes.defineEventNoArg "FlyoutBase_Opened" (fun target -> (target :?> FlyoutBase).Opened) + Attributes.Mvu.defineEventNoArg "FlyoutBase_Opened" (fun target -> (target :?> FlyoutBase).Opened) let Closed = - Attributes.defineEventNoArg "FlyoutBase_Closed" (fun target -> (target :?> FlyoutBase).Closed) + Attributes.Mvu.defineEventNoArg "FlyoutBase_Closed" (fun target -> (target :?> FlyoutBase).Closed) type MvuFlyoutBaseModifiers = /// Listens to the FlyoutBase Opened event. diff --git a/src/Fabulous.Avalonia/Views/_ITransform.Components.fs b/src/Fabulous.Avalonia/Views/_ITransform.Components.fs index bcddff5ae..69a7f4add 100644 --- a/src/Fabulous.Avalonia/Views/_ITransform.Components.fs +++ b/src/Fabulous.Avalonia/Views/_ITransform.Components.fs @@ -8,7 +8,7 @@ open Fabulous.Avalonia module ComponentTransform = let Changed = - Attributes.defineEventNoArgNoDispatch "Transform_Changed" (fun target -> (target :?> Transform).Changed) + Attributes.Component.defineEventNoArg "Transform_Changed" (fun target -> (target :?> Transform).Changed) type ComponentTransformModifiers = /// Listens to the Transform changed event. diff --git a/src/Fabulous.Avalonia/Views/_ITransform.Mvu.fs b/src/Fabulous.Avalonia/Views/_ITransform.Mvu.fs index 87f594588..31a074051 100644 --- a/src/Fabulous.Avalonia/Views/_ITransform.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/_ITransform.Mvu.fs @@ -7,7 +7,7 @@ open Fabulous module MvuTransform = let Changed = - Attributes.defineEventNoArg "Transform_Changed" (fun target -> (target :?> Transform).Changed) + Attributes.Mvu.defineEventNoArg "Transform_Changed" (fun target -> (target :?> Transform).Changed) type MvuTransformModifiers = /// Listens to the Transform changed event. diff --git a/src/Fabulous.Avalonia/Views/_InputElement.Components.fs b/src/Fabulous.Avalonia/Views/_InputElement.Components.fs index a03941b18..b7e262e01 100644 --- a/src/Fabulous.Avalonia/Views/_InputElement.Components.fs +++ b/src/Fabulous.Avalonia/Views/_InputElement.Components.fs @@ -9,54 +9,54 @@ open Fabulous module ComponentInputElement = let GotFocus = - Attributes.defineEventNoDispatch "InputElement_GotFocus" (fun target -> (target :?> InputElement).GotFocus) + Attributes.Component.defineEvent "InputElement_GotFocus" (fun target -> (target :?> InputElement).GotFocus) let LostFocus = - Attributes.defineEventNoDispatch "InputElement_LostFocus" (fun target -> (target :?> InputElement).LostFocus) + Attributes.Component.defineEvent "InputElement_LostFocus" (fun target -> (target :?> InputElement).LostFocus) let KeyDown = - Attributes.defineEventNoDispatch "InputElement_KeyDown" (fun target -> (target :?> InputElement).KeyDown) + Attributes.Component.defineEvent "InputElement_KeyDown" (fun target -> (target :?> InputElement).KeyDown) let KeyUp = - Attributes.defineEventNoDispatch "InputElement_KeyUp" (fun target -> (target :?> InputElement).KeyUp) + Attributes.Component.defineEvent "InputElement_KeyUp" (fun target -> (target :?> InputElement).KeyUp) let TextInput = - Attributes.defineEventNoDispatch "InputElement_TextInput" (fun target -> (target :?> InputElement).TextInput) + Attributes.Component.defineEvent "InputElement_TextInput" (fun target -> (target :?> InputElement).TextInput) let TextInputMethodClientRequested = - Attributes.defineEventNoDispatch "InputElement_TextInputMethodClientRequested" (fun target -> + Attributes.Component.defineEvent "InputElement_TextInputMethodClientRequested" (fun target -> (target :?> InputElement).TextInputMethodClientRequested) let PointerEntered = - Attributes.defineEventNoDispatch "InputElement_PointerEntered" (fun target -> (target :?> InputElement).PointerEntered) + Attributes.Component.defineEvent "InputElement_PointerEntered" (fun target -> (target :?> InputElement).PointerEntered) let PointerExited = - Attributes.defineEventNoDispatch "InputElement_PointerExited" (fun target -> (target :?> InputElement).PointerExited) + Attributes.Component.defineEvent "InputElement_PointerExited" (fun target -> (target :?> InputElement).PointerExited) let PointerMoved = - Attributes.defineEventNoDispatch "InputElement_PointerMoved" (fun target -> (target :?> InputElement).PointerMoved) + Attributes.Component.defineEvent "InputElement_PointerMoved" (fun target -> (target :?> InputElement).PointerMoved) let PointerPressed = - Attributes.defineEventNoDispatch "InputElement_PointerPressed" (fun target -> (target :?> InputElement).PointerPressed) + Attributes.Component.defineEvent "InputElement_PointerPressed" (fun target -> (target :?> InputElement).PointerPressed) let PointerReleased = - Attributes.defineEventNoDispatch "InputElement_PointerReleased" (fun target -> (target :?> InputElement).PointerReleased) + Attributes.Component.defineEvent "InputElement_PointerReleased" (fun target -> (target :?> InputElement).PointerReleased) let PointerCaptureLost = - Attributes.defineEventNoDispatch "InputElement_PointerCaptureLost" (fun target -> + Attributes.Component.defineEvent "InputElement_PointerCaptureLost" (fun target -> (target :?> InputElement).PointerCaptureLost) let PointerWheelChanged = - Attributes.defineEventNoDispatch "InputElement_PointerWheelChanged" (fun target -> (target :?> InputElement).PointerWheelChanged) + Attributes.Component.defineEvent "InputElement_PointerWheelChanged" (fun target -> (target :?> InputElement).PointerWheelChanged) let Tapped = - Attributes.defineEventNoDispatch "InputElement_Tapped" (fun target -> (target :?> InputElement).Tapped) + Attributes.Component.defineEvent "InputElement_Tapped" (fun target -> (target :?> InputElement).Tapped) let Holding = - Attributes.defineEventNoDispatch "InputElement_Holding" (fun target -> (target :?> InputElement).Holding) + Attributes.Component.defineEvent "InputElement_Holding" (fun target -> (target :?> InputElement).Holding) let DoubleTapped = - Attributes.defineEventNoDispatch "InputElement_DoubleTapped" (fun target -> (target :?> InputElement).DoubleTapped) + Attributes.Component.defineEvent "InputElement_DoubleTapped" (fun target -> (target :?> InputElement).DoubleTapped) type ComponentInputElementModifiers = /// Listens to the InputElement GotFocus event. diff --git a/src/Fabulous.Avalonia/Views/_InputElement.Mvu.fs b/src/Fabulous.Avalonia/Views/_InputElement.Mvu.fs index b462141ad..99fb60ba4 100644 --- a/src/Fabulous.Avalonia/Views/_InputElement.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/_InputElement.Mvu.fs @@ -9,53 +9,53 @@ open Fabulous module MvuInputElement = let GotFocus = - Attributes.defineEvent "InputElement_GotFocus" (fun target -> (target :?> InputElement).GotFocus) + Attributes.Mvu.defineEvent "InputElement_GotFocus" (fun target -> (target :?> InputElement).GotFocus) let LostFocus = - Attributes.defineEvent "InputElement_LostFocus" (fun target -> (target :?> InputElement).LostFocus) + Attributes.Mvu.defineEvent "InputElement_LostFocus" (fun target -> (target :?> InputElement).LostFocus) let KeyDown = - Attributes.defineEvent "InputElement_KeyDown" (fun target -> (target :?> InputElement).KeyDown) + Attributes.Mvu.defineEvent "InputElement_KeyDown" (fun target -> (target :?> InputElement).KeyDown) let KeyUp = - Attributes.defineEvent "InputElement_KeyUp" (fun target -> (target :?> InputElement).KeyUp) + Attributes.Mvu.defineEvent "InputElement_KeyUp" (fun target -> (target :?> InputElement).KeyUp) let TextInput = - Attributes.defineEvent "InputElement_TextInput" (fun target -> (target :?> InputElement).TextInput) + Attributes.Mvu.defineEvent "InputElement_TextInput" (fun target -> (target :?> InputElement).TextInput) let TextInputMethodClientRequested = - Attributes.defineEvent "InputElement_TextInputMethodClientRequested" (fun target -> + Attributes.Mvu.defineEvent "InputElement_TextInputMethodClientRequested" (fun target -> (target :?> InputElement).TextInputMethodClientRequested) let PointerEntered = - Attributes.defineEvent "InputElement_PointerEntered" (fun target -> (target :?> InputElement).PointerEntered) + Attributes.Mvu.defineEvent "InputElement_PointerEntered" (fun target -> (target :?> InputElement).PointerEntered) let PointerExited = - Attributes.defineEvent "InputElement_PointerExited" (fun target -> (target :?> InputElement).PointerExited) + Attributes.Mvu.defineEvent "InputElement_PointerExited" (fun target -> (target :?> InputElement).PointerExited) let PointerMoved = - Attributes.defineEvent "InputElement_PointerMoved" (fun target -> (target :?> InputElement).PointerMoved) + Attributes.Mvu.defineEvent "InputElement_PointerMoved" (fun target -> (target :?> InputElement).PointerMoved) let PointerPressed = - Attributes.defineEvent "InputElement_PointerPressed" (fun target -> (target :?> InputElement).PointerPressed) + Attributes.Mvu.defineEvent "InputElement_PointerPressed" (fun target -> (target :?> InputElement).PointerPressed) let PointerReleased = - Attributes.defineEvent "InputElement_PointerReleased" (fun target -> (target :?> InputElement).PointerReleased) + Attributes.Mvu.defineEvent "InputElement_PointerReleased" (fun target -> (target :?> InputElement).PointerReleased) let PointerCaptureLost = - Attributes.defineEvent "InputElement_PointerCaptureLost" (fun target -> (target :?> InputElement).PointerCaptureLost) + Attributes.Mvu.defineEvent "InputElement_PointerCaptureLost" (fun target -> (target :?> InputElement).PointerCaptureLost) let PointerWheelChanged = - Attributes.defineEvent "InputElement_PointerWheelChanged" (fun target -> (target :?> InputElement).PointerWheelChanged) + Attributes.Mvu.defineEvent "InputElement_PointerWheelChanged" (fun target -> (target :?> InputElement).PointerWheelChanged) let Tapped = - Attributes.defineEvent "InputElement_Tapped" (fun target -> (target :?> InputElement).Tapped) + Attributes.Mvu.defineEvent "InputElement_Tapped" (fun target -> (target :?> InputElement).Tapped) let Holding = - Attributes.defineEvent "InputElement_Holding" (fun target -> (target :?> InputElement).Holding) + Attributes.Mvu.defineEvent "InputElement_Holding" (fun target -> (target :?> InputElement).Holding) let DoubleTapped = - Attributes.defineEvent "InputElement_DoubleTapped" (fun target -> (target :?> InputElement).DoubleTapped) + Attributes.Mvu.defineEvent "InputElement_DoubleTapped" (fun target -> (target :?> InputElement).DoubleTapped) type MvuInputElementModifiers = /// Listens to the InputElement GotFocus event. diff --git a/src/Fabulous.Avalonia/Views/_Layoutable.Components.fs b/src/Fabulous.Avalonia/Views/_Layoutable.Components.fs index 0631a46a1..11282cdfa 100644 --- a/src/Fabulous.Avalonia/Views/_Layoutable.Components.fs +++ b/src/Fabulous.Avalonia/Views/_Layoutable.Components.fs @@ -7,11 +7,11 @@ open Fabulous.Avalonia module ComponentLayoutable = let EffectiveViewportChanged = - Attributes.defineEventNoDispatch "Layoutable_EffectiveViewportChanged" (fun target -> + Attributes.Component.defineEvent "Layoutable_EffectiveViewportChanged" (fun target -> (target :?> Layoutable).EffectiveViewportChanged) let LayoutUpdated = - Attributes.defineEventNoArgNoDispatch "Layoutable_LayoutUpdated" (fun target -> (target :?> Layoutable).LayoutUpdated) + Attributes.Component.defineEventNoArg "Layoutable_LayoutUpdated" (fun target -> (target :?> Layoutable).LayoutUpdated) type ComponentLayoutableModifiers = /// Listens to the Layoutable EffectiveViewportChanged event. diff --git a/src/Fabulous.Avalonia/Views/_Layoutable.Mvu.fs b/src/Fabulous.Avalonia/Views/_Layoutable.Mvu.fs index f0de001a1..cf6a29345 100644 --- a/src/Fabulous.Avalonia/Views/_Layoutable.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/_Layoutable.Mvu.fs @@ -6,11 +6,11 @@ open Fabulous module MvuLayoutable = let EffectiveViewportChanged = - Attributes.defineEvent "Layoutable_EffectiveViewportChanged" (fun target -> + Attributes.Mvu.defineEvent "Layoutable_EffectiveViewportChanged" (fun target -> (target :?> Layoutable).EffectiveViewportChanged) let LayoutUpdated = - Attributes.defineEventNoArg "Layoutable_LayoutUpdated" (fun target -> (target :?> Layoutable).LayoutUpdated) + Attributes.Mvu.defineEventNoArg "Layoutable_LayoutUpdated" (fun target -> (target :?> Layoutable).LayoutUpdated) type MvuLayoutableModifiers = /// Listens to the Layoutable EffectiveViewportChanged event. diff --git a/src/Fabulous.Avalonia/Views/_MenuBase.Components.fs b/src/Fabulous.Avalonia/Views/_MenuBase.Components.fs index e003aee95..619d842a0 100644 --- a/src/Fabulous.Avalonia/Views/_MenuBase.Components.fs +++ b/src/Fabulous.Avalonia/Views/_MenuBase.Components.fs @@ -9,10 +9,10 @@ open Fabulous.Avalonia module ComponentMenuBase = let Opened = - Attributes.defineEventNoDispatch "MenuBase_Opened" (fun target -> (target :?> MenuBase).Opened) + Attributes.Component.defineEvent "MenuBase_Opened" (fun target -> (target :?> MenuBase).Opened) let Closed = - Attributes.defineEventNoDispatch "MenuBase_Closed" (fun target -> (target :?> MenuBase).Closed) + Attributes.Component.defineEvent "MenuBase_Closed" (fun target -> (target :?> MenuBase).Closed) type ComponentMenuBaseModifiers = /// Listens to the MenuOpened event. diff --git a/src/Fabulous.Avalonia/Views/_MenuBase.Mvu.fs b/src/Fabulous.Avalonia/Views/_MenuBase.Mvu.fs index 7eba97fb7..0069d45e9 100644 --- a/src/Fabulous.Avalonia/Views/_MenuBase.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/_MenuBase.Mvu.fs @@ -7,10 +7,10 @@ open Fabulous module MvuMenuBase = let Opened = - Attributes.defineEvent "MenuBase_Opened" (fun target -> (target :?> MenuBase).Opened) + Attributes.Mvu.defineEvent "MenuBase_Opened" (fun target -> (target :?> MenuBase).Opened) let Closed = - Attributes.defineEvent "MenuBase_Closed" (fun target -> (target :?> MenuBase).Closed) + Attributes.Mvu.defineEvent "MenuBase_Closed" (fun target -> (target :?> MenuBase).Closed) type MvuMenuBaseModifiers = /// Listens to the MenuOpened event. diff --git a/src/Fabulous.Avalonia/Views/_PopupFlyoutBase.Components.fs b/src/Fabulous.Avalonia/Views/_PopupFlyoutBase.Components.fs index 78f02b5de..715e66dee 100644 --- a/src/Fabulous.Avalonia/Views/_PopupFlyoutBase.Components.fs +++ b/src/Fabulous.Avalonia/Views/_PopupFlyoutBase.Components.fs @@ -7,10 +7,10 @@ open Fabulous module ComponentPopupFlyoutBase = let Opening = - Attributes.defineEventNoArgNoDispatch "PopupFlyoutBase_Opening" (fun target -> (target :?> PopupFlyoutBase).Opening) + Attributes.Component.defineEventNoArg "PopupFlyoutBase_Opening" (fun target -> (target :?> PopupFlyoutBase).Opening) let Closing = - Attributes.defineEventNoDispatch "PopupFlyoutBase_Closing" (fun target -> (target :?> PopupFlyoutBase).Closing) + Attributes.Component.defineEvent "PopupFlyoutBase_Closing" (fun target -> (target :?> PopupFlyoutBase).Closing) type ComponentPopupFlyoutBaseModifiers = /// Listens to the PopupFlyoutBase Opening event. diff --git a/src/Fabulous.Avalonia/Views/_PopupFlyoutBase.Mvu.fs b/src/Fabulous.Avalonia/Views/_PopupFlyoutBase.Mvu.fs index a0e032b63..e77d00bc5 100644 --- a/src/Fabulous.Avalonia/Views/_PopupFlyoutBase.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/_PopupFlyoutBase.Mvu.fs @@ -7,10 +7,10 @@ open Fabulous module MvuPopupFlyoutBase = let Opening = - Attributes.defineEventNoArg "PopupFlyoutBase_Opening" (fun target -> (target :?> PopupFlyoutBase).Opening) + Attributes.Mvu.defineEventNoArg "PopupFlyoutBase_Opening" (fun target -> (target :?> PopupFlyoutBase).Opening) let Closing = - Attributes.defineEvent "PopupFlyoutBase_Closing" (fun target -> (target :?> PopupFlyoutBase).Closing) + Attributes.Mvu.defineEvent "PopupFlyoutBase_Closing" (fun target -> (target :?> PopupFlyoutBase).Closing) type MvuPopupFlyoutBaseModifiers = /// Listens to the PopupFlyoutBase Opening event. diff --git a/src/Fabulous.Avalonia/Views/_SelectingItemsControl.Components.fs b/src/Fabulous.Avalonia/Views/_SelectingItemsControl.Components.fs index c9b4d5447..f4a20b54e 100644 --- a/src/Fabulous.Avalonia/Views/_SelectingItemsControl.Components.fs +++ b/src/Fabulous.Avalonia/Views/_SelectingItemsControl.Components.fs @@ -8,11 +8,11 @@ open Fabulous.Avalonia module ComponentSelectingItemsControl = let SelectionChanged = - Attributes.defineEventNoDispatch "SelectingItemsControl_SelectionChanged" (fun target -> + Attributes.Component.defineEvent "SelectingItemsControl_SelectionChanged" (fun target -> (target :?> SelectingItemsControl).SelectionChanged) let SelectedIndexChanged = - Attributes.defineAvaloniaPropertyWithChangedEventNoDispatch' "SelectingItemsControl_SelectedIndexChanged" SelectingItemsControl.SelectedIndexProperty + Attributes.Component.defineAvaloniaPropertyWithChangedEvent' "SelectingItemsControl_SelectedIndexChanged" SelectingItemsControl.SelectedIndexProperty type ComponentSelectingItemsControlModifiers = /// Listens to the SelectingItemsControl SelectionChanged event. diff --git a/src/Fabulous.Avalonia/Views/_SelectingItemsControl.Mvu.fs b/src/Fabulous.Avalonia/Views/_SelectingItemsControl.Mvu.fs index 636d04941..652782b6b 100644 --- a/src/Fabulous.Avalonia/Views/_SelectingItemsControl.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/_SelectingItemsControl.Mvu.fs @@ -8,11 +8,11 @@ open Fabulous.Avalonia module MvuSelectingItemsControl = let SelectionChanged = - Attributes.defineEvent "SelectingItemsControl_SelectionChanged" (fun target -> + Attributes.Mvu.defineEvent "SelectingItemsControl_SelectionChanged" (fun target -> (target :?> SelectingItemsControl).SelectionChanged) let SelectedIndexChanged = - Attributes.defineAvaloniaPropertyWithChangedEvent' "SelectingItemsControl_SelectedIndexChanged" SelectingItemsControl.SelectedIndexProperty + Attributes.Mvu.defineAvaloniaPropertyWithChangedEvent' "SelectingItemsControl_SelectedIndexChanged" SelectingItemsControl.SelectedIndexProperty type MvuSelectingItemsControlModifiers = /// Listens to the SelectingItemsControl SelectionChanged event. diff --git a/src/Fabulous.Avalonia/Views/_Spinner.Components.fs b/src/Fabulous.Avalonia/Views/_Spinner.Components.fs index bb02e5845..a9fac2aa0 100644 --- a/src/Fabulous.Avalonia/Views/_Spinner.Components.fs +++ b/src/Fabulous.Avalonia/Views/_Spinner.Components.fs @@ -5,4 +5,4 @@ open Fabulous module ComponentSpinner = let Spin = - Attributes.defineEventNoDispatch "Spinner_Spin" (fun target -> (target :?> Spinner).Spin) + Attributes.Component.defineEvent "Spinner_Spin" (fun target -> (target :?> Spinner).Spin) diff --git a/src/Fabulous.Avalonia/Views/_Spinner.Mvu.fs b/src/Fabulous.Avalonia/Views/_Spinner.Mvu.fs index e32621568..335beff04 100644 --- a/src/Fabulous.Avalonia/Views/_Spinner.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/_Spinner.Mvu.fs @@ -5,4 +5,4 @@ open Fabulous module MvuSpinner = let Spin = - Attributes.defineEvent "Spinner_Spin" (fun target -> (target :?> Spinner).Spin) + Attributes.Mvu.defineEvent "Spinner_Spin" (fun target -> (target :?> Spinner).Spin) diff --git a/src/Fabulous.Avalonia/Views/_StyledElement.Components.fs b/src/Fabulous.Avalonia/Views/_StyledElement.Components.fs index e85b16800..53564025b 100644 --- a/src/Fabulous.Avalonia/Views/_StyledElement.Components.fs +++ b/src/Fabulous.Avalonia/Views/_StyledElement.Components.fs @@ -9,15 +9,15 @@ open Fabulous.Avalonia module ComponentStyledElement = let AttachedToLogicalTree = - Attributes.defineEventNoDispatch "StyledElement_AttachedToLogicalTree" (fun target -> + Attributes.Component.defineEvent "StyledElement_AttachedToLogicalTree" (fun target -> (target :?> StyledElement).AttachedToLogicalTree) let DetachedFromLogicalTree = - Attributes.defineEventNoDispatch "StyledElement_DetachedFromLogicalTree" (fun target -> + Attributes.Component.defineEvent "StyledElement_DetachedFromLogicalTree" (fun target -> (target :?> StyledElement).DetachedFromLogicalTree) let ActualThemeVariantChanged = - Attributes.defineEventNoArgNoDispatch "StyledElement_ActualThemeVariantChanged" (fun target -> (target :?> StyledElement).ActualThemeVariantChanged) + Attributes.Component.defineEventNoArg "StyledElement_ActualThemeVariantChanged" (fun target -> (target :?> StyledElement).ActualThemeVariantChanged) type ComponentStyledElementModifiers = /// Listens to the StyledElement AttachedToLogicalTree event. diff --git a/src/Fabulous.Avalonia/Views/_StyledElement.Mvu.fs b/src/Fabulous.Avalonia/Views/_StyledElement.Mvu.fs index 5ad18c273..940f0b671 100644 --- a/src/Fabulous.Avalonia/Views/_StyledElement.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/_StyledElement.Mvu.fs @@ -8,15 +8,15 @@ open Fabulous.Avalonia module MvuStyledElement = let AttachedToLogicalTree = - Attributes.defineEvent "StyledElement_AttachedToLogicalTree" (fun target -> + Attributes.Mvu.defineEvent "StyledElement_AttachedToLogicalTree" (fun target -> (target :?> StyledElement).AttachedToLogicalTree) let DetachedFromLogicalTree = - Attributes.defineEvent "StyledElement_DetachedFromLogicalTree" (fun target -> + Attributes.Mvu.defineEvent "StyledElement_DetachedFromLogicalTree" (fun target -> (target :?> StyledElement).DetachedFromLogicalTree) let ActualThemeVariantChanged = - Attributes.defineEventNoArg "StyledElement_ActualThemeVariantChanged" (fun target -> (target :?> StyledElement).ActualThemeVariantChanged) + Attributes.Mvu.defineEventNoArg "StyledElement_ActualThemeVariantChanged" (fun target -> (target :?> StyledElement).ActualThemeVariantChanged) type MvuStyledElementModifiers = /// Listens to the StyledElement AttachedToLogicalTree event. diff --git a/src/Fabulous.Avalonia/Views/_StyledElement.fs b/src/Fabulous.Avalonia/Views/_StyledElement.fs index 156c29d72..f0a3f0f37 100644 --- a/src/Fabulous.Avalonia/Views/_StyledElement.fs +++ b/src/Fabulous.Avalonia/Views/_StyledElement.fs @@ -181,7 +181,7 @@ type StyledElementModifiers = /// Inline style to be used for the widget and its descendants. /// Note: Fabulous will recreate the Style/Styles during the view diffing as opposed to a single styled element property. [] - static member inline styles(this: WidgetBuilder<'msg, #IFabStyledElement>, value: IStyle) = + static member inline style(this: WidgetBuilder<'msg, #IFabStyledElement>, value: IStyle) = StyledElementModifiers.styles(this, [ value ]) /// Sets the ThemeKey property. The ThemeKey is used to lookup the ControlTheme from the diff --git a/src/Fabulous.Avalonia/Views/_TemplatedControl.Components.fs b/src/Fabulous.Avalonia/Views/_TemplatedControl.Components.fs index ff731a680..10c979b4a 100644 --- a/src/Fabulous.Avalonia/Views/_TemplatedControl.Components.fs +++ b/src/Fabulous.Avalonia/Views/_TemplatedControl.Components.fs @@ -8,7 +8,7 @@ open Fabulous.Avalonia module ComponentTemplatedControl = let TemplateApplied = - Attributes.defineEventNoDispatch "TemplatedControl_TemplateApplied" (fun target -> (target :?> TemplatedControl).TemplateApplied) + Attributes.Component.defineEvent "TemplatedControl_TemplateApplied" (fun target -> (target :?> TemplatedControl).TemplateApplied) type ComponentTemplatedControlModifiers = /// Listens to the TemplateApplied event. diff --git a/src/Fabulous.Avalonia/Views/_TemplatedControl.Mvu.fs b/src/Fabulous.Avalonia/Views/_TemplatedControl.Mvu.fs index 01fa1d498..e3cfa0bca 100644 --- a/src/Fabulous.Avalonia/Views/_TemplatedControl.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/_TemplatedControl.Mvu.fs @@ -8,7 +8,7 @@ open Fabulous.Avalonia module MvuTemplatedControl = let TemplateApplied = - Attributes.defineEvent "TemplatedControl_TemplateApplied" (fun target -> (target :?> TemplatedControl).TemplateApplied) + Attributes.Mvu.defineEvent "TemplatedControl_TemplateApplied" (fun target -> (target :?> TemplatedControl).TemplateApplied) type MvuTemplatedControlModifiers = /// Listens to the TemplateApplied event. diff --git a/src/Fabulous.Avalonia/Views/_TopLevel.Components.fs b/src/Fabulous.Avalonia/Views/_TopLevel.Components.fs index b32631e89..6c20322d1 100644 --- a/src/Fabulous.Avalonia/Views/_TopLevel.Components.fs +++ b/src/Fabulous.Avalonia/Views/_TopLevel.Components.fs @@ -9,19 +9,19 @@ open Fabulous.Avalonia module ComponentTopLevel = let Opened = - Attributes.defineEventNoArgNoDispatch "TopLevel_OpenedEvent" (fun target -> (target :?> TopLevel).Opened) + Attributes.Component.defineEventNoArg "TopLevel_OpenedEvent" (fun target -> (target :?> TopLevel).Opened) let Closed = - Attributes.defineEventNoArgNoDispatch "TopLevel_ClosedEvent" (fun target -> (target :?> TopLevel).Closed) + Attributes.Component.defineEventNoArg "TopLevel_ClosedEvent" (fun target -> (target :?> TopLevel).Closed) let ScalingChanged = - Attributes.defineEventNoArgNoDispatch "TopLevel_ScalingChangedEvent" (fun target -> (target :?> TopLevel).ScalingChanged) + Attributes.Component.defineEventNoArg "TopLevel_ScalingChangedEvent" (fun target -> (target :?> TopLevel).ScalingChanged) let BackRequested = - Attributes.defineEventNoDispatch "TopLevel_BackRequestedEvent" (fun target -> (target :?> TopLevel).BackRequested) + Attributes.Component.defineEvent "TopLevel_BackRequestedEvent" (fun target -> (target :?> TopLevel).BackRequested) let ActualThemeVariantChanged = - Attributes.defineEventNoArgNoDispatch "TopLevel_ThemeVariantChanged" (fun target -> (target :?> TopLevel).ActualThemeVariantChanged) + Attributes.Component.defineEventNoArg "TopLevel_ThemeVariantChanged" (fun target -> (target :?> TopLevel).ActualThemeVariantChanged) type ComponentTopLevelModifiers = /// Listens to the TopLevel ThemeVariantChanged event. diff --git a/src/Fabulous.Avalonia/Views/_TopLevel.Mvu.fs b/src/Fabulous.Avalonia/Views/_TopLevel.Mvu.fs index 5041a5287..c90d58823 100644 --- a/src/Fabulous.Avalonia/Views/_TopLevel.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/_TopLevel.Mvu.fs @@ -9,19 +9,19 @@ open Fabulous.Avalonia module MvuTopLevel = let Opened = - Attributes.defineEventNoArg "TopLevel_OpenedEvent" (fun target -> (target :?> TopLevel).Opened) + Attributes.Mvu.defineEventNoArg "TopLevel_OpenedEvent" (fun target -> (target :?> TopLevel).Opened) let Closed = - Attributes.defineEventNoArg "TopLevel_ClosedEvent" (fun target -> (target :?> TopLevel).Closed) + Attributes.Mvu.defineEventNoArg "TopLevel_ClosedEvent" (fun target -> (target :?> TopLevel).Closed) let ScalingChanged = - Attributes.defineEventNoArg "TopLevel_ScalingChangedEvent" (fun target -> (target :?> TopLevel).ScalingChanged) + Attributes.Mvu.defineEventNoArg "TopLevel_ScalingChangedEvent" (fun target -> (target :?> TopLevel).ScalingChanged) let BackRequested = - Attributes.defineEvent "TopLevel_BackRequestedEvent" (fun target -> (target :?> TopLevel).BackRequested) + Attributes.Mvu.defineEvent "TopLevel_BackRequestedEvent" (fun target -> (target :?> TopLevel).BackRequested) let ActualThemeVariantChanged = - Attributes.defineEventNoArg "TopLevel_ThemeVariantChanged" (fun target -> (target :?> TopLevel).ActualThemeVariantChanged) + Attributes.Mvu.defineEventNoArg "TopLevel_ThemeVariantChanged" (fun target -> (target :?> TopLevel).ActualThemeVariantChanged) type MvuTopLevelModifiers = /// Listens to the TopLevel ThemeVariantChanged event. diff --git a/src/Fabulous.Avalonia/Views/_Visual.Components.fs b/src/Fabulous.Avalonia/Views/_Visual.Components.fs index 5cd2968f6..cb5f949b6 100644 --- a/src/Fabulous.Avalonia/Views/_Visual.Components.fs +++ b/src/Fabulous.Avalonia/Views/_Visual.Components.fs @@ -8,10 +8,10 @@ open Fabulous.Avalonia module ComponentVisual = let AttachedToVisualTree = - Attributes.defineEventNoDispatch "VisualAttachedToVisualTree" (fun target -> (target :?> Visual).AttachedToVisualTree) + Attributes.Component.defineEvent "VisualAttachedToVisualTree" (fun target -> (target :?> Visual).AttachedToVisualTree) let DetachedFromVisualTree = - Attributes.defineEventNoDispatch "VisualAttachedToVisualTree" (fun target -> (target :?> Visual).DetachedFromVisualTree) + Attributes.Component.defineEvent "VisualAttachedToVisualTree" (fun target -> (target :?> Visual).DetachedFromVisualTree) type ComponentVisualModifiers = /// Listens to the Visual AttachedToVisualTree event. diff --git a/src/Fabulous.Avalonia/Views/_Visual.Mvu.fs b/src/Fabulous.Avalonia/Views/_Visual.Mvu.fs index 728f28956..1d8e93106 100644 --- a/src/Fabulous.Avalonia/Views/_Visual.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/_Visual.Mvu.fs @@ -8,10 +8,10 @@ open Fabulous.Avalonia module MvuVisual = let AttachedToVisualTree = - Attributes.defineEvent "VisualAttachedToVisualTree" (fun target -> (target :?> Visual).AttachedToVisualTree) + Attributes.Mvu.defineEvent "VisualAttachedToVisualTree" (fun target -> (target :?> Visual).AttachedToVisualTree) let DetachedFromVisualTree = - Attributes.defineEvent "VisualAttachedToVisualTree" (fun target -> (target :?> Visual).DetachedFromVisualTree) + Attributes.Mvu.defineEvent "VisualAttachedToVisualTree" (fun target -> (target :?> Visual).DetachedFromVisualTree) type MvuVisualModifiers = /// Listens to the Visual AttachedToVisualTree event. diff --git a/src/Fabulous.Avalonia/Views/_WindowBase.Components.fs b/src/Fabulous.Avalonia/Views/_WindowBase.Components.fs index e56e92ddf..1a29b7e38 100644 --- a/src/Fabulous.Avalonia/Views/_WindowBase.Components.fs +++ b/src/Fabulous.Avalonia/Views/_WindowBase.Components.fs @@ -6,16 +6,16 @@ open Fabulous module ComponentWindowBase = let Activated = - Attributes.defineEventNoArgNoDispatch "WindowBase_Activated" (fun target -> (target :?> WindowBase).Activated) + Attributes.Component.defineEventNoArg "WindowBase_Activated" (fun target -> (target :?> WindowBase).Activated) let Deactivated = - Attributes.defineEventNoArgNoDispatch "WindowBase_Deactivated" (fun target -> (target :?> WindowBase).Deactivated) + Attributes.Component.defineEventNoArg "WindowBase_Deactivated" (fun target -> (target :?> WindowBase).Deactivated) let PositionChanged = - Attributes.defineEventNoDispatch "WindowBase_PositionChanged" (fun target -> (target :?> WindowBase).PositionChanged) + Attributes.Component.defineEvent "WindowBase_PositionChanged" (fun target -> (target :?> WindowBase).PositionChanged) let Resized = - Attributes.defineEventNoDispatch "WindowBase_Resized" (fun target -> (target :?> WindowBase).Resized) + Attributes.Component.defineEvent "WindowBase_Resized" (fun target -> (target :?> WindowBase).Resized) type ComponentWindowBaseModifiers = /// Listens to the WindowBase Activated event. diff --git a/src/Fabulous.Avalonia/Views/_WindowBase.Mvu.fs b/src/Fabulous.Avalonia/Views/_WindowBase.Mvu.fs index a462ad2f4..196f7a52a 100644 --- a/src/Fabulous.Avalonia/Views/_WindowBase.Mvu.fs +++ b/src/Fabulous.Avalonia/Views/_WindowBase.Mvu.fs @@ -6,16 +6,16 @@ open Fabulous module MvuWindowBase = let Activated = - Attributes.defineEventNoArg "WindowBase_Activated" (fun target -> (target :?> WindowBase).Activated) + Attributes.Mvu.defineEventNoArg "WindowBase_Activated" (fun target -> (target :?> WindowBase).Activated) let Deactivated = - Attributes.defineEventNoArg "WindowBase_Deactivated" (fun target -> (target :?> WindowBase).Deactivated) + Attributes.Mvu.defineEventNoArg "WindowBase_Deactivated" (fun target -> (target :?> WindowBase).Deactivated) let PositionChanged = - Attributes.defineEvent "WindowBase_PositionChanged" (fun target -> (target :?> WindowBase).PositionChanged) + Attributes.Mvu.defineEvent "WindowBase_PositionChanged" (fun target -> (target :?> WindowBase).PositionChanged) let Resized = - Attributes.defineEvent "WindowBase_Resized" (fun target -> (target :?> WindowBase).Resized) + Attributes.Mvu.defineEvent "WindowBase_Resized" (fun target -> (target :?> WindowBase).Resized) type MvuWindowBaseModifiers = /// Listens to the WindowBase Activated event. diff --git a/src/Fabulous.Avalonia/Widgets.fs b/src/Fabulous.Avalonia/Widgets.fs index 0e373d0be..33248ad51 100644 --- a/src/Fabulous.Avalonia/Widgets.fs +++ b/src/Fabulous.Avalonia/Widgets.fs @@ -89,4 +89,4 @@ module WidgetHelpers = /// Creates a widget with the given key and attributes. let inline buildWidgets<'msg, 'marker when 'msg: equality> (key: WidgetKey) scalars (attrs: WidgetAttribute[]) = - WidgetBuilder<'msg, 'marker>(key, struct (scalars, ValueSome attrs, ValueNone)) + WidgetBuilder<'msg, 'marker>(key, struct (scalars, ValueSome attrs, ValueNone, ValueNone)) diff --git a/templates/content/blank/.template.config/template.json b/templates/content/blank/.template.config/template.json index 89cc9a655..8266556ce 100644 --- a/templates/content/blank/.template.config/template.json +++ b/templates/content/blank/.template.config/template.json @@ -44,7 +44,7 @@ "type": "parameter", "dataType": "string", "replaces": "FabulousPkgVersion", - "defaultValue": "3.0.0-pre9" + "defaultValue": "3.0.0-pre16" }, "FabulousAvaloniaPkgVersion": { "type": "parameter", @@ -62,25 +62,25 @@ "type": "parameter", "dataType": "string", "replaces": "AvaloniaAndroidPkgVersion", - "defaultValue": "11.1.0" + "defaultValue": "11.2.1" }, "AvaloniaDesktopPkgVersion": { "type": "parameter", "dataType": "string", "replaces": "AvaloniaDesktopPkgVersion", - "defaultValue": "11.1.0" + "defaultValue": "11.2.1" }, "AvaloniaiOSPkgVersion": { "type": "parameter", "dataType": "string", "replaces": "AvaloniaiOSPkgVersion", - "defaultValue": "11.1.0" + "defaultValue": "11.2.1" }, "AvaloniaThemesFluentPkgVersion": { "type": "parameter", "dataType": "string", "replaces": "AvaloniaThemesFluentPkgVersion", - "defaultValue": "11.1.0" + "defaultValue": "11.2.1" } } } \ No newline at end of file diff --git a/templates/content/blank/Platform/iOS/AppDelegate.fs b/templates/content/blank/Platform/iOS/AppDelegate.fs index 2440b982e..21101fc0e 100644 --- a/templates/content/blank/Platform/iOS/AppDelegate.fs +++ b/templates/content/blank/Platform/iOS/AppDelegate.fs @@ -3,18 +3,17 @@ namespace NewApp.iOS open Foundation open UIKit +open Avalonia +open Avalonia.iOS +open Fabulous.Avalonia +open Foundation +open NewApp +open UIKit + [] type AppDelegate() = - inherit UIResponder() - - interface IUIApplicationDelegate - - [] - member this.FinishedLaunching(_: UIApplication, _: NSDictionary) : bool = true - - [] - member this.GetConfiguration(_: UIApplication, sceneSession: UISceneSession, _: UISceneConnectionOptions) = - UISceneConfiguration.Create("Default Configuration", sceneSession.Role) + inherit AvaloniaAppDelegate() + override this.CreateAppBuilder() = App.create().UseiOS() module Main = [] diff --git a/templates/content/blank/Platform/iOS/Info.plist b/templates/content/blank/Platform/iOS/Info.plist index 1733f5ac5..6e632bfb8 100644 --- a/templates/content/blank/Platform/iOS/Info.plist +++ b/templates/content/blank/Platform/iOS/Info.plist @@ -43,22 +43,5 @@ UIViewControllerBasedStatusBarAppearance - UIApplicationSceneManifest - - UIApplicationSupportsMultipleScenes - - UISceneConfigurations - - UIWindowSceneSessionRoleApplication - - - UISceneConfigurationName - Default Configuration - UISceneDelegateClassName - SceneDelegate - - - - diff --git a/templates/content/blank/Platform/iOS/SceneDelegate.fs b/templates/content/blank/Platform/iOS/SceneDelegate.fs deleted file mode 100644 index 47276b9a6..000000000 --- a/templates/content/blank/Platform/iOS/SceneDelegate.fs +++ /dev/null @@ -1,38 +0,0 @@ -namespace NewApp.iOS - -open Foundation -open Fabulous.Avalonia -open NewApp -open UIKit - -[] -type SceneDelegate() = - inherit UIWindowSceneDelegate() - - override val Window = null with get, set - - override this.WillConnect(scene: UIScene, _: UISceneSession, _: UISceneConnectionOptions) = - App.create().UseiOS(this, scene :?> UIWindowScene) |> ignore - - /// Called as the scene is being released by the system. - /// This occurs shortly after the scene enters the background, or when its session is discarded. - /// Release any resources associated with this scene that can be re-created the next time the scene connects. - /// The scene may re-connect later, as its session was not necessarily discarded (see UIApplicationDelegate `DidDiscardSceneSessions` instead). - override _.DidDisconnect(_: UIScene) = () - - /// Called when the scene has moved from an inactive state to an active state. - /// Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive. - override _.DidBecomeActive(_: UIScene) = () - - /// Called when the scene will move from an active state to an inactive state. - /// This may occur due to temporary interruptions (ex. an incoming phone call). - override _.WillResignActive(_: UIScene) = () - - /// Called as the scene transitions from the background to the foreground. - /// Use this method to undo the changes made on entering the background. - override _.WillEnterForeground(_: UIScene) = () - - /// Called as the scene transitions from the foreground to the background. - /// Use this method to save data, release shared resources, and store enough scene-specific state information - /// to restore the scene back to its current state. - override _.DidEnterBackground(_: UIScene) = () diff --git a/templates/content/multi/.template.config/template.json b/templates/content/multi/.template.config/template.json index cb0595592..bc14ad5ff 100644 --- a/templates/content/multi/.template.config/template.json +++ b/templates/content/multi/.template.config/template.json @@ -44,7 +44,7 @@ "type": "parameter", "dataType": "string", "replaces": "FabulousPkgVersion", - "defaultValue": "3.0.0-pre9" + "defaultValue": "3.0.0-pre16" }, "FabulousAvaloniaPkgVersion": { "type": "parameter", @@ -62,31 +62,31 @@ "type": "parameter", "dataType": "string", "replaces": "AvaloniaAndroidPkgVersion", - "defaultValue": "11.1.0" + "defaultValue": "11.2.1" }, "AvaloniaBrowserPkgVersion": { "type": "parameter", "dataType": "string", "replaces": "AvaloniaBrowserPkgVersion", - "defaultValue": "11.1.0" + "defaultValue": "11.2.1" }, "AvaloniaDesktopPkgVersion": { "type": "parameter", "dataType": "string", "replaces": "AvaloniaDesktopPkgVersion", - "defaultValue": "11.1.0" + "defaultValue": "11.2.1" }, "AvaloniaiOSPkgVersion": { "type": "parameter", "dataType": "string", "replaces": "AvaloniaiOSPkgVersion", - "defaultValue": "11.1.0" + "defaultValue": "11.2.1" }, "AvaloniaThemesFluentPkgVersion": { "type": "parameter", "dataType": "string", "replaces": "AvaloniaThemesFluentPkgVersion", - "defaultValue": "11.1.0" + "defaultValue": "11.2.1" } } } \ No newline at end of file diff --git a/templates/content/multi/NewApp.iOS/AppDelegate.fs b/templates/content/multi/NewApp.iOS/AppDelegate.fs index 2440b982e..21101fc0e 100644 --- a/templates/content/multi/NewApp.iOS/AppDelegate.fs +++ b/templates/content/multi/NewApp.iOS/AppDelegate.fs @@ -3,18 +3,17 @@ namespace NewApp.iOS open Foundation open UIKit +open Avalonia +open Avalonia.iOS +open Fabulous.Avalonia +open Foundation +open NewApp +open UIKit + [] type AppDelegate() = - inherit UIResponder() - - interface IUIApplicationDelegate - - [] - member this.FinishedLaunching(_: UIApplication, _: NSDictionary) : bool = true - - [] - member this.GetConfiguration(_: UIApplication, sceneSession: UISceneSession, _: UISceneConnectionOptions) = - UISceneConfiguration.Create("Default Configuration", sceneSession.Role) + inherit AvaloniaAppDelegate() + override this.CreateAppBuilder() = App.create().UseiOS() module Main = [] diff --git a/templates/content/multi/NewApp.iOS/Info.plist b/templates/content/multi/NewApp.iOS/Info.plist index fd010fb6a..d6890b11f 100644 --- a/templates/content/multi/NewApp.iOS/Info.plist +++ b/templates/content/multi/NewApp.iOS/Info.plist @@ -43,22 +43,5 @@ UIViewControllerBasedStatusBarAppearance - UIApplicationSceneManifest - - UIApplicationSupportsMultipleScenes - - UISceneConfigurations - - UIWindowSceneSessionRoleApplication - - - UISceneConfigurationName - Default Configuration - UISceneDelegateClassName - SceneDelegate - - - - diff --git a/templates/content/multi/NewApp.iOS/SceneDelegate.fs b/templates/content/multi/NewApp.iOS/SceneDelegate.fs deleted file mode 100644 index 47276b9a6..000000000 --- a/templates/content/multi/NewApp.iOS/SceneDelegate.fs +++ /dev/null @@ -1,38 +0,0 @@ -namespace NewApp.iOS - -open Foundation -open Fabulous.Avalonia -open NewApp -open UIKit - -[] -type SceneDelegate() = - inherit UIWindowSceneDelegate() - - override val Window = null with get, set - - override this.WillConnect(scene: UIScene, _: UISceneSession, _: UISceneConnectionOptions) = - App.create().UseiOS(this, scene :?> UIWindowScene) |> ignore - - /// Called as the scene is being released by the system. - /// This occurs shortly after the scene enters the background, or when its session is discarded. - /// Release any resources associated with this scene that can be re-created the next time the scene connects. - /// The scene may re-connect later, as its session was not necessarily discarded (see UIApplicationDelegate `DidDiscardSceneSessions` instead). - override _.DidDisconnect(_: UIScene) = () - - /// Called when the scene has moved from an inactive state to an active state. - /// Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive. - override _.DidBecomeActive(_: UIScene) = () - - /// Called when the scene will move from an active state to an inactive state. - /// This may occur due to temporary interruptions (ex. an incoming phone call). - override _.WillResignActive(_: UIScene) = () - - /// Called as the scene transitions from the background to the foreground. - /// Use this method to undo the changes made on entering the background. - override _.WillEnterForeground(_: UIScene) = () - - /// Called as the scene transitions from the foreground to the background. - /// Use this method to save data, release shared resources, and store enough scene-specific state information - /// to restore the scene back to its current state. - override _.DidEnterBackground(_: UIScene) = ()