Skip to content

Commit

Permalink
Merge pull request #1087 from fabulous-dev/reworked-components
Browse files Browse the repository at this point in the history
Reworked components
  • Loading branch information
TimLariviere authored Nov 7, 2024
2 parents 35c4ab4 + cd6f517 commit 4dd4d31
Show file tree
Hide file tree
Showing 22 changed files with 832 additions and 719 deletions.
11 changes: 10 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

_No unreleased changes_

## [3.0.0-pre8] - 2024-11-07

### Changed
- Replaced custom MvuComponentBuilder with a Mvu binding by @TimLariviere

### Fixed
- Fixed an invalid cast exception when using a null or unit model with MVU in Component by @TimLariviere

## [3.0.0-pre7] - 2024-09-28

### Fixed
Expand Down Expand Up @@ -149,7 +157,8 @@ _No unreleased changes_
### Changed
- Fabulous.XamarinForms & Fabulous.MauiControls have been moved been out of the Fabulous repository. Find them in their own repositories: [https://github.com/fabulous-dev/Fabulous.XamarinForms](https://github.com/fabulous-dev/Fabulous.XamarinForms) / [https://github.com/fabulous-dev/Fabulous.MauiControls](https://github.com/fabulous-dev/Fabulous.MauiControls)

[unreleased]: https://github.com/fabulous-dev/Fabulous/compare/3.0.0-pre7...HEAD
[unreleased]: https://github.com/fabulous-dev/Fabulous/compare/3.0.0-pre8...HEAD
[3.0.0-pre8]: https://github.com/fabulous-dev/Fabulous/releases/tag/3.0.0-pre8
[3.0.0-pre7]: https://github.com/fabulous-dev/Fabulous/releases/tag/3.0.0-pre7
[3.0.0-pre6]: https://github.com/fabulous-dev/Fabulous/releases/tag/3.0.0-pre6
[3.0.0-pre5]: https://github.com/fabulous-dev/Fabulous/releases/tag/3.0.0-pre5
Expand Down
17 changes: 10 additions & 7 deletions src/Fabulous.Tests/APISketchTests/TestUI.Widgets.fs
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ module TestUI_Widgets =
Name = typeof<'T>.Name
TargetType = typeof<'T>
CreateView =
fun (widget, context, parentNode) ->
fun (widget, envContext, treeContext, parentNode) ->
// let name = typeof<'T>.Name
// printfn $"Creating view for {name}"

Expand All @@ -41,15 +41,15 @@ module TestUI_Widgets =
| ValueNone -> None
| ValueSome parent -> Some parent

let viewNode = new ViewNode(parentNode, context, weakReference)
let viewNode = new ViewNode(parentNode, envContext, treeContext, weakReference)

view.PropertyBag.Add(ViewNode.ViewNodeProperty, viewNode)

let oldWidget: Widget voption = ValueNone

Reconciler.update context.CanReuseView oldWidget widget viewNode
Reconciler.update treeContext.CanReuseView oldWidget widget viewNode
struct (viewNode :> IViewNode, box view)
AttachView = fun (_widget, _context, _parentNode, _view) -> failwith "not implemented" }
AttachView = fun (_widget, _envContext, _treeContext, _parentNode, _view) -> failwith "not implemented" }

WidgetDefinitionStore.set key definition
key
Expand Down Expand Up @@ -194,7 +194,9 @@ module TestUI_Widgets =
type Instance<'arg, 'model, 'msg, 'marker when 'msg: equality>(program: StatefulView<'arg, 'model, 'msg, 'marker>) =
let mutable state: ('model * obj * Widget) option = None

member private x.viewContext: ViewTreeContext =
member private x.envContext = new EnvironmentContext()

member private x.treeContext: ViewTreeContext =
{ CanReuseView = ViewHelpers.canReuseView
GetViewNode = ViewNode.getViewNode
Logger =
Expand Down Expand Up @@ -225,15 +227,16 @@ module TestUI_Widgets =

state <- Some(newModel, target, newWidget)

Reconciler.update x.viewContext.CanReuseView (ValueSome oldWidget) newWidget viewNode
Reconciler.update x.treeContext.CanReuseView (ValueSome oldWidget) newWidget viewNode
()

member x.Start(arg: 'arg) =
let model = program.Init(arg)
let widget = program.View(model).Compile()
let widgetDef = WidgetDefinitionStore.get widget.Key

let struct (_node, view) = widgetDef.CreateView(widget, x.viewContext, ValueNone)
let struct (_node, view) =
widgetDef.CreateView(widget, x.envContext, x.treeContext, ValueNone)

state <- Some(model, view, widget)

Expand Down
2 changes: 1 addition & 1 deletion src/Fabulous/Attributes.fs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ module Helpers =
let inline createViewForWidget (parent: IViewNode) (widget: Widget) =
let widgetDefinition = WidgetDefinitionStore.get widget.Key

widgetDefinition.CreateView(widget, parent.TreeContext, ValueSome parent)
widgetDefinition.CreateView(widget, parent.EnvironmentContext, parent.TreeContext, ValueSome parent)

module ScalarAttributeComparers =
let inline noCompare _ _ = ScalarAttributeComparison.Different
Expand Down
Loading

0 comments on commit 4dd4d31

Please sign in to comment.