From 8e7d542574c7dc169ec6434522177235723840c3 Mon Sep 17 00:00:00 2001 From: Edgar Gonzalez Date: Tue, 16 Apr 2024 16:02:35 +0100 Subject: [PATCH 1/6] Test State and Binding --- samples/Playground/App.fs | 185 ++++++++++++++++++++-------- src/Fabulous.Avalonia/Attributes.fs | 23 ++++ 2 files changed, 160 insertions(+), 48 deletions(-) diff --git a/samples/Playground/App.fs b/samples/Playground/App.fs index 539fce9c5..dac6a3199 100644 --- a/samples/Playground/App.fs +++ b/samples/Playground/App.fs @@ -5,78 +5,166 @@ open Fabulous open Fabulous.Avalonia open Avalonia.Themes.Fluent -open type Fabulous.Avalonia.View - -module App = - type Model = { Count: int } +open System.Runtime.CompilerServices +open Avalonia.Input +open Avalonia.Layout +open Avalonia.Markup.Xaml.Converters +open Avalonia.Media - type Msg = - | Increment - | Decrement +open type Fabulous.Avalonia.View - let initModel = { Count = 0 } +open Fabulous.StackAllocatedCollections.StackList - let init () = initModel +module EmptyBorder = - let update msg model = - match msg with - | Increment -> { model with Count = model.Count + 1 } - | Decrement -> { model with Count = model.Count - 1 } + let PointerPressed = + Attributes.defineEventNoDispatch "PointerPressed" (fun target -> (target :?> InputElement).PointerPressed) - let program = Program.stateful init update +[] +module EmptyBorderBuilders = + type Fabulous.Avalonia.View with - let component1 () = - Component(program) { - let! model = Mvu.State + /// Creates an empty Border widget. + static member EmptyBorder<'msg>() = + WidgetBuilder(Border.WidgetKey, AttributesBundle(StackList.empty(), ValueNone, ValueNone)) - (VStack() { - TextBlock($"%d{model.Count}").centerText() + /// Creates a Border widget. + /// The content of the Border. + static member Border(content: WidgetBuilder<'msg, #IFabControl>) = + WidgetBuilder( + Border.WidgetKey, + AttributesBundle(StackList.empty(), ValueSome [| Decorator.ChildWidget.WithValue(content.Compile()) |], ValueNone) + ) - Button("Increment", Increment).centerHorizontal() - Button("Decrement", Decrement).centerHorizontal() +type EmptyBorderModifiers = + /// Listens to the InputElement PointerPressed event. + /// Current widget. + /// Raised when the pointer is pressed over the control. + [] + static member inline onPointerPressed2(this: WidgetBuilder<'msg, #IFabInputElement>, fn: PointerPressedEventArgs -> unit) = + this.AddScalar(EmptyBorder.PointerPressed.WithValue(fn)) - }) - .center() +module ColorPicker = + let view (color: StateValue) = + Component() { + let brushes = [ Colors.Black; Colors.Red; Colors.Green; Colors.Blue; Colors.Yellow ] + let! color = Context.Binding(color) + + HStack(5.) { + for item in brushes do + View + .EmptyBorder() + .width(32.0) + .height(32.0) + .cornerRadius(16.0) + .background(SolidColorBrush(item)) + .borderThickness(4.0) + .borderBrush( + if item = color.Current then + SolidColorBrush(item) + else + SolidColorBrush(Colors.Transparent) + ) + .onPointerPressed2(fun _ -> color.Set(item)) + } } - let firstNameView (value: StateValue) = + +module SizePicker = + let view (size: StateValue) = Component() { - let! firstName = Context.Binding(value) - TextBox(firstName.Current, firstName.Set) + let sizes = [ 2.; 4.; 6.; 8.; 16.; 32. ] + let! size = Context.Binding(size) + + HStack(5.) { + for item in sizes do + View + .EmptyBorder() + .width(item) + .height(item) + .cornerRadius(item / 2.0) + .background( + if item = size.Current then + SolidColorBrush(Colors.Black) + else + SolidColorBrush(Colors.Gray) + ) + .onPointerPressed2(fun _ -> size.Set item) + } } - let lastNameView (value: StateValue) = +module Setting = + let view (color: StateValue, size: StateValue) = Component() { - let! lastName = Context.Binding(value) - TextBox(lastName.Current, lastName.Set) + View + .Border( + Dock(false) { + ColorPicker.view(color).dock(Dock.Left) + SizePicker.view(size).dock(Dock.Right) + } + ) + .dock(Dock.Bottom) + .margin(5.0) + .padding(5.0) + .cornerRadius(8.0) + .background("#bdc3c7") } - let component2 () = - Component() { - let! firstName = Context.State("") - let! lastName = Context.State("") +module DrawingCanvas = + let canvasRef = ViewRef() - VStack() { - Label($"Full name is {firstName.Current} {lastName.Current}") - firstNameView firstName - lastNameView lastName - } + let view (color: StateValue) (size: StateValue) = + Component() { + let! color = Context.Binding(color) + let! size = Context.Binding(size) + let! isPressed = Context.State(false) + let! lastPoint = Context.State(None) + + Canvas(canvasRef) + .verticalAlignment(VerticalAlignment.Stretch) + .horizontalAlignment(HorizontalAlignment.Stretch) + .background(SolidColorBrush(Colors.White)) + .onPointerPressed(fun _ -> isPressed.Set true) + .onPointerReleased(fun _ -> isPressed.Set false) + .onPointerMoved(fun args -> + let point = args.GetPosition(canvasRef.Value) + + if isPressed.Current then + lastPoint.Set(Some point) + else + match lastPoint.Current with + | None -> lastPoint.Set(Some point) + | Some value -> + let brush = unbox(ColorToBrushConverter.Convert(box(color.Current), typeof)) + + let line = + Shapes.Line( + StartPoint = value, + EndPoint = point, + Stroke = brush, + StrokeThickness = size.Current, + StrokeLineCap = PenLineCap.Round + ) + + if canvasRef.Value <> null then + canvasRef.Value.Children.Add(line) + + lastPoint.Set(Some point)) } +module App = + let theme = FluentTheme() + let content () = Component() { - (Dock() { - (HStack() { TextBlock("Counter").centerVertical() }) - .margin(20.) - .centerHorizontal() + let! color = Context.State(Colors.Black) + let! size = Context.State(2.) - component1().dock(Dock.Bottom) - - component2().dock(Dock.Bottom) - - }) - .center() + Dock() { + Setting.view(color, size).dock(Dock.Bottom) + (DrawingCanvas.view color size).dock(Dock.Top) + } } let view () = @@ -86,5 +174,6 @@ module App = DesktopApplication(Window(content())) #endif + let create () = FabulousAppBuilder.Configure(FluentTheme, view) diff --git a/src/Fabulous.Avalonia/Attributes.fs b/src/Fabulous.Avalonia/Attributes.fs index 38278943f..2576c38e9 100644 --- a/src/Fabulous.Avalonia/Attributes.fs +++ b/src/Fabulous.Avalonia/Attributes.fs @@ -440,3 +440,26 @@ module Attributes = | ImageSourceValue.Stream stream -> WindowIcon(ImageSource.fromStream(stream)) target.SetValue(property, value) |> ignore) + + let inline defineEventNoDispatch<'args> + name + ([] getEvent: obj -> IEvent, 'args>) + : SimpleScalarAttributeDefinition<'args -> unit> = + let key = + SimpleScalarAttributeDefinition.CreateAttributeData( + ScalarAttributeComparers.noCompare, + (fun _ (newValueOpt: ('args -> unit) voption) node -> + match node.TryGetHandler(name) with + | ValueNone -> () + | ValueSome handler -> handler.Dispose() + + match newValueOpt with + | ValueNone -> node.RemoveHandler(name) + | ValueSome(fn) -> + let event = getEvent node.Target + node.SetHandler(name, event.Subscribe(fun args -> fn args))) + ) + + |> AttributeDefinitionStore.registerScalar + + { Key = key; Name = name } From 871f46673f69e7b4a6c7d21d86862a7e6d45a77c Mon Sep 17 00:00:00 2001 From: Edgar Gonzalez Date: Fri, 19 Apr 2024 08:50:09 +0100 Subject: [PATCH 2/6] Working --- samples/Playground/App.fs | 32 +++----------------------------- 1 file changed, 3 insertions(+), 29 deletions(-) diff --git a/samples/Playground/App.fs b/samples/Playground/App.fs index dac6a3199..f1b04165b 100644 --- a/samples/Playground/App.fs +++ b/samples/Playground/App.fs @@ -4,9 +4,6 @@ open Avalonia.Controls open Fabulous open Fabulous.Avalonia open Avalonia.Themes.Fluent - -open System.Runtime.CompilerServices -open Avalonia.Input open Avalonia.Layout open Avalonia.Markup.Xaml.Converters open Avalonia.Media @@ -15,11 +12,6 @@ open type Fabulous.Avalonia.View open Fabulous.StackAllocatedCollections.StackList -module EmptyBorder = - - let PointerPressed = - Attributes.defineEventNoDispatch "PointerPressed" (fun target -> (target :?> InputElement).PointerPressed) - [] module EmptyBorderBuilders = type Fabulous.Avalonia.View with @@ -28,23 +20,6 @@ module EmptyBorderBuilders = static member EmptyBorder<'msg>() = WidgetBuilder(Border.WidgetKey, AttributesBundle(StackList.empty(), ValueNone, ValueNone)) - /// Creates a Border widget. - /// The content of the Border. - static member Border(content: WidgetBuilder<'msg, #IFabControl>) = - WidgetBuilder( - Border.WidgetKey, - AttributesBundle(StackList.empty(), ValueSome [| Decorator.ChildWidget.WithValue(content.Compile()) |], ValueNone) - ) - - -type EmptyBorderModifiers = - /// Listens to the InputElement PointerPressed event. - /// Current widget. - /// Raised when the pointer is pressed over the control. - [] - static member inline onPointerPressed2(this: WidgetBuilder<'msg, #IFabInputElement>, fn: PointerPressedEventArgs -> unit) = - this.AddScalar(EmptyBorder.PointerPressed.WithValue(fn)) - module ColorPicker = let view (color: StateValue) = Component() { @@ -66,7 +41,7 @@ module ColorPicker = else SolidColorBrush(Colors.Transparent) ) - .onPointerPressed2(fun _ -> color.Set(item)) + .onPointerPressed(fun _ -> color.Set(item)) } } @@ -90,12 +65,12 @@ module SizePicker = else SolidColorBrush(Colors.Gray) ) - .onPointerPressed2(fun _ -> size.Set item) + .onPointerPressed(fun _ -> size.Set item) } } module Setting = - let view (color: StateValue, size: StateValue) = + let view (color, size) = Component() { View .Border( @@ -174,6 +149,5 @@ module App = DesktopApplication(Window(content())) #endif - let create () = FabulousAppBuilder.Configure(FluentTheme, view) From 9515a4041df8546be94b32d82c7c2a8795863e6e Mon Sep 17 00:00:00 2001 From: Edgar Gonzalez Date: Fri, 19 Apr 2024 14:03:15 +0100 Subject: [PATCH 3/6] Use Fabulous pre4 --- Directory.Packages.props | 2 +- src/Fabulous.Avalonia/Attributes.fs | 22 ------------------- .../Fabulous.Avalonia.fsproj | 2 +- 3 files changed, 2 insertions(+), 24 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index f46c1fe51..caf97f003 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -3,7 +3,7 @@ true - + diff --git a/src/Fabulous.Avalonia/Attributes.fs b/src/Fabulous.Avalonia/Attributes.fs index 2576c38e9..7636fc206 100644 --- a/src/Fabulous.Avalonia/Attributes.fs +++ b/src/Fabulous.Avalonia/Attributes.fs @@ -441,25 +441,3 @@ module Attributes = target.SetValue(property, value) |> ignore) - let inline defineEventNoDispatch<'args> - name - ([] getEvent: obj -> IEvent, 'args>) - : SimpleScalarAttributeDefinition<'args -> unit> = - let key = - SimpleScalarAttributeDefinition.CreateAttributeData( - ScalarAttributeComparers.noCompare, - (fun _ (newValueOpt: ('args -> unit) voption) node -> - match node.TryGetHandler(name) with - | ValueNone -> () - | ValueSome handler -> handler.Dispose() - - match newValueOpt with - | ValueNone -> node.RemoveHandler(name) - | ValueSome(fn) -> - let event = getEvent node.Target - node.SetHandler(name, event.Subscribe(fun args -> fn args))) - ) - - |> AttributeDefinitionStore.registerScalar - - { Key = key; Name = name } diff --git a/src/Fabulous.Avalonia/Fabulous.Avalonia.fsproj b/src/Fabulous.Avalonia/Fabulous.Avalonia.fsproj index 3a7fbc9ab..7217520c8 100644 --- a/src/Fabulous.Avalonia/Fabulous.Avalonia.fsproj +++ b/src/Fabulous.Avalonia/Fabulous.Avalonia.fsproj @@ -224,7 +224,7 @@ 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 --> - + From 9c4d40101fc21e716f2b755f949adacd24c9a67a Mon Sep 17 00:00:00 2001 From: Edgar Gonzalez Date: Fri, 19 Apr 2024 14:08:49 +0100 Subject: [PATCH 4/6] update playground --- samples/Playground/App.fs | 169 +++++++++------------------- src/Fabulous.Avalonia/Attributes.fs | 1 - 2 files changed, 53 insertions(+), 117 deletions(-) diff --git a/samples/Playground/App.fs b/samples/Playground/App.fs index f1b04165b..539fce9c5 100644 --- a/samples/Playground/App.fs +++ b/samples/Playground/App.fs @@ -4,142 +4,79 @@ open Avalonia.Controls open Fabulous open Fabulous.Avalonia open Avalonia.Themes.Fluent -open Avalonia.Layout -open Avalonia.Markup.Xaml.Converters -open Avalonia.Media open type Fabulous.Avalonia.View -open Fabulous.StackAllocatedCollections.StackList +module App = + type Model = { Count: int } -[] -module EmptyBorderBuilders = - type Fabulous.Avalonia.View with + type Msg = + | Increment + | Decrement - /// Creates an empty Border widget. - static member EmptyBorder<'msg>() = - WidgetBuilder(Border.WidgetKey, AttributesBundle(StackList.empty(), ValueNone, ValueNone)) + let initModel = { Count = 0 } -module ColorPicker = - let view (color: StateValue) = - Component() { - let brushes = [ Colors.Black; Colors.Red; Colors.Green; Colors.Blue; Colors.Yellow ] - let! color = Context.Binding(color) - - HStack(5.) { - for item in brushes do - View - .EmptyBorder() - .width(32.0) - .height(32.0) - .cornerRadius(16.0) - .background(SolidColorBrush(item)) - .borderThickness(4.0) - .borderBrush( - if item = color.Current then - SolidColorBrush(item) - else - SolidColorBrush(Colors.Transparent) - ) - .onPointerPressed(fun _ -> color.Set(item)) - } - } + let init () = initModel + let update msg model = + match msg with + | Increment -> { model with Count = model.Count + 1 } + | Decrement -> { model with Count = model.Count - 1 } -module SizePicker = - let view (size: StateValue) = - Component() { - let sizes = [ 2.; 4.; 6.; 8.; 16.; 32. ] - let! size = Context.Binding(size) - - HStack(5.) { - for item in sizes do - View - .EmptyBorder() - .width(item) - .height(item) - .cornerRadius(item / 2.0) - .background( - if item = size.Current then - SolidColorBrush(Colors.Black) - else - SolidColorBrush(Colors.Gray) - ) - .onPointerPressed(fun _ -> size.Set item) - } + let program = Program.stateful init update + + let component1 () = + Component(program) { + let! model = Mvu.State + + (VStack() { + TextBlock($"%d{model.Count}").centerText() + + Button("Increment", Increment).centerHorizontal() + + Button("Decrement", Decrement).centerHorizontal() + + }) + .center() } -module Setting = - let view (color, size) = + let firstNameView (value: StateValue) = Component() { - View - .Border( - Dock(false) { - ColorPicker.view(color).dock(Dock.Left) - SizePicker.view(size).dock(Dock.Right) - } - ) - .dock(Dock.Bottom) - .margin(5.0) - .padding(5.0) - .cornerRadius(8.0) - .background("#bdc3c7") + let! firstName = Context.Binding(value) + TextBox(firstName.Current, firstName.Set) } -module DrawingCanvas = - let canvasRef = ViewRef() - - let view (color: StateValue) (size: StateValue) = + let lastNameView (value: StateValue) = Component() { - let! color = Context.Binding(color) - let! size = Context.Binding(size) - let! isPressed = Context.State(false) - let! lastPoint = Context.State(None) - - Canvas(canvasRef) - .verticalAlignment(VerticalAlignment.Stretch) - .horizontalAlignment(HorizontalAlignment.Stretch) - .background(SolidColorBrush(Colors.White)) - .onPointerPressed(fun _ -> isPressed.Set true) - .onPointerReleased(fun _ -> isPressed.Set false) - .onPointerMoved(fun args -> - let point = args.GetPosition(canvasRef.Value) - - if isPressed.Current then - lastPoint.Set(Some point) - else - match lastPoint.Current with - | None -> lastPoint.Set(Some point) - | Some value -> - let brush = unbox(ColorToBrushConverter.Convert(box(color.Current), typeof)) - - let line = - Shapes.Line( - StartPoint = value, - EndPoint = point, - Stroke = brush, - StrokeThickness = size.Current, - StrokeLineCap = PenLineCap.Round - ) - - if canvasRef.Value <> null then - canvasRef.Value.Children.Add(line) - - lastPoint.Set(Some point)) + let! lastName = Context.Binding(value) + TextBox(lastName.Current, lastName.Set) } -module App = - let theme = FluentTheme() + let component2 () = + Component() { + let! firstName = Context.State("") + let! lastName = Context.State("") + + VStack() { + Label($"Full name is {firstName.Current} {lastName.Current}") + firstNameView firstName + lastNameView lastName + } + } let content () = Component() { - let! color = Context.State(Colors.Black) - let! size = Context.State(2.) + (Dock() { + (HStack() { TextBlock("Counter").centerVertical() }) + .margin(20.) + .centerHorizontal() - Dock() { - Setting.view(color, size).dock(Dock.Bottom) - (DrawingCanvas.view color size).dock(Dock.Top) - } + component1().dock(Dock.Bottom) + + component2().dock(Dock.Bottom) + + }) + .center() } let view () = diff --git a/src/Fabulous.Avalonia/Attributes.fs b/src/Fabulous.Avalonia/Attributes.fs index 7636fc206..38278943f 100644 --- a/src/Fabulous.Avalonia/Attributes.fs +++ b/src/Fabulous.Avalonia/Attributes.fs @@ -440,4 +440,3 @@ module Attributes = | ImageSourceValue.Stream stream -> WindowIcon(ImageSource.fromStream(stream)) target.SetValue(property, value) |> ignore) - From c17f99e44b2b8e56160d46227b82e29895325185 Mon Sep 17 00:00:00 2001 From: Edgar Gonzalez Date: Fri, 19 Apr 2024 14:10:23 +0100 Subject: [PATCH 5/6] update templates --- templates/content/blank/.template.config/template.json | 2 +- templates/content/multi/.template.config/template.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/content/blank/.template.config/template.json b/templates/content/blank/.template.config/template.json index a7c65a3d6..8c8baf60a 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-pre3" + "defaultValue": "3.0.0-pre4" }, "FabulousAvaloniaPkgVersion": { "type": "parameter", diff --git a/templates/content/multi/.template.config/template.json b/templates/content/multi/.template.config/template.json index b9d52ae9b..c9d112470 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-pre3" + "defaultValue": "3.0.0-pre4" }, "FabulousAvaloniaPkgVersion": { "type": "parameter", From d16f9266f990dae647137894d67b6a5d1948cb5e Mon Sep 17 00:00:00 2001 From: Edgar Gonzalez Date: Fri, 19 Apr 2024 14:21:20 +0100 Subject: [PATCH 6/6] release notes --- extensions/Fabulous.Avalonia.ColorPicker/CHANGELOG.md | 7 ++++++- extensions/Fabulous.Avalonia.DataGrid/CHANGELOG.md | 7 ++++++- extensions/Fabulous.Avalonia.ItemsRepeater/CHANGELOG.md | 7 ++++++- extensions/Fabulous.Avalonia.TreeDataGrid/CHANGELOG.md | 7 ++++++- src/Fabulous.Avalonia/CHANGELOG.md | 7 ++++++- templates/CHANGELOG.md | 7 ++++++- 6 files changed, 36 insertions(+), 6 deletions(-) diff --git a/extensions/Fabulous.Avalonia.ColorPicker/CHANGELOG.md b/extensions/Fabulous.Avalonia.ColorPicker/CHANGELOG.md index da9ddd9c4..245a20321 100644 --- a/extensions/Fabulous.Avalonia.ColorPicker/CHANGELOG.md +++ b/extensions/Fabulous.Avalonia.ColorPicker/CHANGELOG.md @@ -8,6 +8,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] _No unreleased changes_ +## [3.0.0-pre4] - 2024-04-19 +### Added +- No changes + ## [3.0.0-pre3] - 2024-04-13 ### Added - No changes @@ -52,7 +56,8 @@ _No unreleased changes_ ### Added - Initial release -[unreleased]: https://github.com/fabulous-dev/Fabulous.Avalonia.ColorPicker/compare/3.0.0-pre3...HEAD +[unreleased]: https://github.com/fabulous-dev/Fabulous.Avalonia.ColorPicker/compare/3.0.0-pre4...HEAD +[3.0.0-pre4]: https://github.com/fabulous-dev/Fabulous.Avalonia.ColorPicker/releases/tag/3.0.0-pre4 [3.0.0-pre3]: https://github.com/fabulous-dev/Fabulous.Avalonia.ColorPicker/releases/tag/3.0.0-pre3 [3.0.0-pre2]: https://github.com/fabulous-dev/Fabulous.Avalonia.ColorPicker/releases/tag/3.0.0-pre2 [3.0.0-pre1]: https://github.com/fabulous-dev/Fabulous.Avalonia.ColorPicker/releases/tag/3.0.0-pre1 diff --git a/extensions/Fabulous.Avalonia.DataGrid/CHANGELOG.md b/extensions/Fabulous.Avalonia.DataGrid/CHANGELOG.md index 6d42c665c..d5b1535a5 100644 --- a/extensions/Fabulous.Avalonia.DataGrid/CHANGELOG.md +++ b/extensions/Fabulous.Avalonia.DataGrid/CHANGELOG.md @@ -8,6 +8,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] _No unreleased changes_ +## [3.0.0-pre4] - 2024-04-19 +### Added +- No changes + ## [3.0.0-pre3] - 2024-04-13 ### Added - No changes @@ -52,7 +56,8 @@ _No unreleased changes_ ### Added - Initial release -[unreleased]: https://github.com/fabulous-dev/Fabulous.Avalonia.DataGrid/compare/3.0.0-pre3...HEAD +[unreleased]: https://github.com/fabulous-dev/Fabulous.Avalonia.DataGrid/compare/3.0.0-pre4...HEAD +[3.0.0-pre4]: https://github.com/fabulous-dev/Fabulous.Avalonia.DataGrid/releases/tag/3.0.0-pre4 [3.0.0-pre3]: https://github.com/fabulous-dev/Fabulous.Avalonia.DataGrid/releases/tag/3.0.0-pre3 [3.0.0-pre2]: https://github.com/fabulous-dev/Fabulous.Avalonia.DataGrid/releases/tag/3.0.0-pre2 [3.0.0-pre1]: https://github.com/fabulous-dev/Fabulous.Avalonia.DataGrid/releases/tag/3.0.0-pre1 diff --git a/extensions/Fabulous.Avalonia.ItemsRepeater/CHANGELOG.md b/extensions/Fabulous.Avalonia.ItemsRepeater/CHANGELOG.md index ecff10747..e6caea730 100644 --- a/extensions/Fabulous.Avalonia.ItemsRepeater/CHANGELOG.md +++ b/extensions/Fabulous.Avalonia.ItemsRepeater/CHANGELOG.md @@ -8,6 +8,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] _No unreleased changes_ +## [3.0.0-pre4] - 2024-04-19 +### Added +- No changes + ## [3.0.0-pre3] - 2024-04-13 ### Added - No changes @@ -48,7 +52,8 @@ _No unreleased changes_ ### Added - Initial release -[unreleased]: https://github.com/fabulous-dev/Fabulous.Avalonia.ItemsRepeater/compare/3.0.0-pre3...HEAD +[unreleased]: https://github.com/fabulous-dev/Fabulous.Avalonia.ItemsRepeater/compare/3.0.0-pre4...HEAD +[3.0.0-pre4]: https://github.com/fabulous-dev/Fabulous.Avalonia.ItemsRepeater/releases/tag/3.0.0-pre4 [3.0.0-pre3]: https://github.com/fabulous-dev/Fabulous.Avalonia.ItemsRepeater/releases/tag/3.0.0-pre3 [3.0.0-pre2]: https://github.com/fabulous-dev/Fabulous.Avalonia.ItemsRepeater/releases/tag/3.0.0-pre2 [3.0.0-pre1]: https://github.com/fabulous-dev/Fabulous.Avalonia.ItemsRepeater/releases/tag/3.0.0-pre1 diff --git a/extensions/Fabulous.Avalonia.TreeDataGrid/CHANGELOG.md b/extensions/Fabulous.Avalonia.TreeDataGrid/CHANGELOG.md index ab644c852..f58ba4fa3 100644 --- a/extensions/Fabulous.Avalonia.TreeDataGrid/CHANGELOG.md +++ b/extensions/Fabulous.Avalonia.TreeDataGrid/CHANGELOG.md @@ -8,6 +8,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] _No unreleased changes_ +## [3.0.0-pre4] - 2024-04-19 +### Added +- No changes + ## [3.0.0-pre3] - 2024-04-13 ### Added - No changes @@ -48,7 +52,8 @@ _No unreleased changes_ ### Added - Initial release -[unreleased]: https://github.com/fabulous-dev/Fabulous.Avalonia.TreeDataGrid/compare/3.0.0-pre3...HEAD +[unreleased]: https://github.com/fabulous-dev/Fabulous.Avalonia.TreeDataGrid/compare/3.0.0-pre4...HEAD +[3.0.0-pre4]: https://github.com/fabulous-dev/Fabulous.Avalonia.TreeDataGrid/releases/tag/3.0.0-pre4 [3.0.0-pre3]: https://github.com/fabulous-dev/Fabulous.Avalonia.TreeDataGrid/releases/tag/3.0.0-pre3 [3.0.0-pre2]: https://github.com/fabulous-dev/Fabulous.Avalonia.TreeDataGrid/releases/tag/3.0.0-pre2 [3.0.0-pre1]: https://github.com/fabulous-dev/Fabulous.Avalonia.TreeDataGrid/releases/tag/3.0.0-pre1 diff --git a/src/Fabulous.Avalonia/CHANGELOG.md b/src/Fabulous.Avalonia/CHANGELOG.md index a8c55ff9f..3f5f1e356 100644 --- a/src/Fabulous.Avalonia/CHANGELOG.md +++ b/src/Fabulous.Avalonia/CHANGELOG.md @@ -8,6 +8,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] _No unreleased changes_ +## [3.0.0-pre4] - 2024-04-19 +### Changed +- Update to Fabulous 3.0.0-pre4 by @edgarfgp in https://github.com/fabulous-dev/Fabulous.Avalonia/pull/238 + ## [3.0.0-pre3] - 2024-04-13 ### Changed - Update to Fabulous 3.0.0-pre3 by @edgarfgp in https://github.com/fabulous-dev/Fabulous.Avalonia/pull/236 @@ -218,7 +222,8 @@ _No unreleased changes_ ### Added - Initial release -[unreleased]: https://github.com/fabulous-dev/Fabulous.Avalonia/compare/3.0.0-pre3...HEAD +[unreleased]: https://github.com/fabulous-dev/Fabulous.Avalonia/compare/3.0.0-pre4...HEAD +[3.0.0-pre4]: https://github.com/fabulous-dev/Fabulous.Avalonia/releases/tag/3.0.0-pre4 [3.0.0-pre3]: https://github.com/fabulous-dev/Fabulous.Avalonia/releases/tag/3.0.0-pre3 [3.0.0-pre2]: https://github.com/fabulous-dev/Fabulous.Avalonia/releases/tag/3.0.0-pre2 [3.0.0-pre1]: https://github.com/fabulous-dev/Fabulous.Avalonia/releases/tag/3.0.0-pre1 diff --git a/templates/CHANGELOG.md b/templates/CHANGELOG.md index 1f7404cbf..ccd0ee959 100644 --- a/templates/CHANGELOG.md +++ b/templates/CHANGELOG.md @@ -8,6 +8,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] _No unreleased changes_ +## [3.0.0-pre4] - 2024-04-19 +### Added +- Update to Fabulous 3.0.0-pre4 by @edgarfgp in https://github.com/fabulous-dev/Fabulous.Avalonia/pull/238 + ## [3.0.0-pre3] - 2024-04-13 ### Changed - Update to Fabulous 3.0.0-pre3 by @edgarfgp in https://github.com/fabulous-dev/Fabulous.Avalonia/pull/236 @@ -55,7 +59,8 @@ _No unreleased changes_ - Add a new template for a multi-project Fabulous.Avalonia app. - Fix black screen in multi-project template when targeting Browser -[unreleased]: https://github.com/fabulous-dev/Fabulous.Avalonia.Templates/compare/3.0.0-pre3...HEAD +[unreleased]: https://github.com/fabulous-dev/Fabulous.Avalonia.Templates/compare/3.0.0-pre4...HEAD +[3.0.0-pre4]: https://github.com/fabulous-dev/Fabulous.Avalonia.Templates/releases/tag/3.0.0-pre4 [3.0.0-pre3]: https://github.com/fabulous-dev/Fabulous.Avalonia.Templates/releases/tag/3.0.0-pre3 [3.0.0-pre2]: https://github.com/fabulous-dev/Fabulous.Avalonia.Templates/releases/tag/3.0.0-pre2 [3.0.0-pre1]: https://github.com/fabulous-dev/Fabulous.Avalonia.Templates/releases/tag/3.0.0-pre1