New in version 0.31.0

Released one year ago

Please remember to uno clean your projects after upgrading Fuse.

Highlights
  • Reactive UX Expressions - achieve more awesomeness with less JS-glue-code required!
  • Several <Grid /> issues has been fixed
  • Router and Navigation improvements
  • Legacy Android and iOS Bindings removed
Data bindings no longer clear their value by default when removed
  • Data bindings used to clear (write null or 0) to their target properties when removed from the tree, so that old data would no longer linger if a node was reused later (manifesting as flashing of outdated data). However, this behavior lead to undesired consequences that were hard to work around in other cases. Now data bindings no longer clear by default.
    • This is unlikely to affect your app, but if you depended on the old behavior, you can restore the same behavior by using the new clear-bindings where needed: Change {foo} to {Clear foo}, and {Read foo} to {ReadClear foo}.
Observable bugfixes
  • Fixed bug where .twoWayMap() would not work correctly on boolean values.
Busyness and Transitions
  • Removed the public contructor and Done function of BusyTask. Only the static SetBusy function, and the JavaScript interface, should be used now.
  • Added BusyTaskActivity to note the types of busyness and added WhileBusy.Activity to match only certain busy activities
  • WhileLoading now uses the BuyTask system. The biggest difference is that it will detect loading of any descendent elements, not just where it was used. This is unlikely to cause a behavioural change in most projects, but if you need to old matching use Match="Parent".
Fixed data context bug with triggers and AlternateRoot
  • Fixed bug where nodes injected by triggers or AlternateRoot would sometimes not get the correct data context. This may break your app if you have a bug dependency. The rule is that nodes should always get the data context according to where they are declared in the UX tree, as you read it in the code (not based on where the node is ultimately injected, e.g. by AlternateRoot).
Introducing Reactive UX Expressions
  • All properties in UX markup now support reactive expressions, e.g. Width="spring({Property Size})" and Text="Hello, {username}!". For more details, see the documentation.
Text renderer
  • Improved the wrapping and truncation implementation with the text renderer that's activated by building with -DUSE_HARFBUZZ.
  • Added default font fallbacks on desktop when using the -DUSE_HARFBUZZ flag. This means that we can use emoji, many Asian languages, and Arabic in preview.
  • Fixed an issue that resulted in apps built using -DUSE_HARFBUZZ being rejected from the App Store due to referencing private symbols. This means that this flag can now be used in iOS releases.
  • Fixed a bug where TextInputActions did not trigger on desktop text inputs using -DUSE_HARFBUZZ.
Router and Navigation
  • NavigationGotoMode became a normal enum, not [Flags] and loses the ClearForwardHistory flag. Uses of that flag can be replaced with a call to ClearForwardHistory on the target navigation. Please see the documentation for more details.
  • Added the RouterModify action as a UX parallel to the JS .modify function
  • Added ModifyRouteHow.PrepareBack, PreparePush and PrepareGoto as ways to prepare for navigation combined with a swipe
  • Added the bookmark function to the router JavaScript interface
  • Added SwipeGesture.IsEnabled to allow disabling user interface
  • Added Navigator.SwipeBack that accepts a direction to enable backwards swipe navigation
  • Fixed the removal of pages with Reuse="None" in Navigator
Trigger
  • TriggerAction.Direction has been replaced with TriggerAction.When. This includes the new Stop and Start option. The value Both has been replaced with ForwardAndBackward for clarity. Old UX code will continue to work.
TextInput
  • iOS: Implement support for LineSpacing on <Text /> when used inside <NativeViewHost />
  • iOS: Implement support for LineSpacing on <TextView />
Grid
  • Numerous issues with Grid layout have been fixed. Unfortunately this changes how some existing grids might be arranged.

    • Proportional rows/columns now have no size when the grid is being shrunk to fit its contents. Previously they would have a minimum size related to their content; this value was actually incorrect, and caused other problems. This change fixes several layout issues with Grid.
    • A new metric called Default has been introduced as the default for DefaultRow and DefaultColumn. This maintains a behaviour similar, but not exactly the same as the old default. It is only usable for grids that fill a known space (or parent area), or have only 1 row or column. All other grids must set all Row/Column metrics correctly, or use DefaultRow and DefaultColumn.
    • The behavior of Grid's with cells containing RowSpan or ColumnSpan that extended beyond the intended bounds of the grid will now, more correctly, extend the grid instead of being clipped. Fixing the overflowing spans will restores the previous layout.
  • Added Grid.ChildOrder that allows changing whether children are ordered as rows or columns.

  • Removed the Column.ActualWidth and Row.ActualHeight properties. These were never meant to be publically readable as the value is not useful, nor guaranteed to be set.
  • Removed the public DefinitionBase.Implicit property. This has an ambiguous meaning and wasn't intended to be exposed publically (no valid use-cases)
  • The previously deprecated properties RowData and ColumnData have been fully removed. Use Rows and Columns instead.
Legacy Android and iOS Bindings Removed

As planned Legacy bindings are removed this release. Foreign Code is now the only official way of interfacing with native code.

Various changes
  • Building uno native, uno build native now works on Windows (will eventually replace uno build msvc)
  • Outdated Android solution for VS2015 removed