New in version 0.10.0

Released one year ago

Please remember to uno clean your projects after upgrading Fuse.

Highlights
  • Experimental MapView for Android and iOS.
  • Synchronization between UI and JavaScript has been rewritten. Glitches be gone!
  • You can now read bundled files directly from JavaScript.
  • A bunch of very nice Foreign code updates
  • ux:InnerClass introduced to make it even easier to split up code with ux:Include
  • PageControl has received some touch-ups to make it more flexible

And much much more! Read on for details...

Various bug fixes
  • We fixed a race condition that could cause random failures when starting preview on some systems
  • If you've had issues with preview processes hanging on exit, this release is for you
  • Fixed issue where WebView Url could only be set via observable strings (!)
  • Fixed bug in FuseJS Observable implementation that caused some subscribers to receive outdated update messages.
  • Fixed bug in observable propagation that would sometimes give wrong array data in the UI.
  • Resolved an issue with previewing projects located on other file system volumes than where Fuse was installed
  • Binding UX events to Uno methods is now supported in preview (Note that partial classes of ux-files in the project are still ignored by preview. If you don't know what partial classes are then you're doing it right!)
  • You now get the Window.Closed event in preview even on Windows
  • Fixed an issue with the selection cue not redrawing when it should
  • Naming your project file only ".unoproj" now works with the dashboard. (You asked for it!)
Known bugs in this release
  • On some devices, rotating the device will corrupt the UI
  • Animation may be slow on some devices
  • Tapping generic map markers in iOS MapView do not display text labels.
  • Tapping user location marker in iOS MapView is broken.
  • Zoom value on iOS MapView isn't correctly set on first load.
Introducing Experimental MapView for Android and iOS

This release introduces the new cross platform control Fuse.Controls.MapView in the Fuse.Maps package. See the handbook for more information. This is still fresh out of the oven so let us know if you run into any issues!

Foreign code

The team has been chipping away at that "coming soon"-list and for several features it turns out that "soon" has become "now"!

  • Added support for processed foreign Objective-C files
  • Added support for passing delegates to and from foreign Objective-C functions
  • Added support for passing arrays to foreign Objective-C functions
  • Added support for passing arrays to foreign Java functions
  • Added support for passing delegates to foreign Java functions

See the handbook for more details about these features.

Improved support for bundle files

Files included in your project file with the :Bundle suffix can now be read directly from JavaScript. This is done using either the read() or readSync() methods in the new module fuseJS/Bundle.

In Uno, the old Uno.BundleFile API has been replaced by the new Uno.IO.Bundle and Uno.IO.BundleFile APIs. The new APIs supports useful stuff such as listing the bundled files and observing them for changes (in the case of preview).

Improved UI/JS synchronization

In Fuse, JavaScript and UI runs on separate threads so that JS workload will never affect the smoothness of the native UI animation. However, up until this version, there has been some problems with update latency and inconsistencies due to the UI updating piecewise, giving weird "glitch frames".

This should now be fixed. We rewrote the synchronization between UI and JavaScript to make it faster, prettier and always consistent. As it should be.

Changes and improvements to PageControl
  • Page is no longer a special case for animation. Every child is equal in the eyes of PageControl!
  • You can now have nested pagecontrols.
  • New PageControl.InactiveState to control the visibility/enabled status of inactive pages. By default they will now be collapse and disabled for efficiency reasons. To get the old visible/enabled behaviour set InactiveState="Unchanged"
  • New PageControl.Transition and PageControl.Interaction to control default navigation behavior. See the PageControl docs for details.
NativeWithFallback theme has been moved

The NativeWithFallback theme is now only available if you include the Fuse.BasicTheme package (it's what implements the fallback).

Introducing AlternateRoot

AlternateRoot was added to allow adding nodes to a parent other than where they currently are in the UX tree

ux:Global support for value types

You can now create ux:Global objects of value types, such as float4. This is convenient e.g. for creating global color constants.

ux:InnerClass

Added support for ux:InnerClass, which is a class that has access to named UX objects in its scope. Specifically, the differences are:

ux:Class

    Declares a global class that can be used anywhere.
    Such classes have no access to ux:Names the scope in which they are declared.

ux:InnerClass

    Declares a class that can only be used in the scope where it is declared.
    In return, it has full access to all ux:Names in the scope it is declared.

    Inner classes can be extracted into separate .ux files, and then included
    using <ux:Include File="Foo.ux"> in the scope you want to use it.

    Inner classes can not specify namespaces, they will implicitly be in the
    name scope of their containing class.

    If root nodes are marked ux:InnerClass, they are ignored by the UX compiler
    unless ux:Included somewhere.
ux:Name must be unique per scope

It is an error to have two elements with the same ux:Name within the same scope.

Visuals
  • Primitives, Image, Shape, and TextControl, should not have any child nodes. This is being deprecated and the ability will be removed. It can only be partially enforced at the UX level (unfortunately with a not-so-clean error message for now). These nodes need to be leaf nodes for optimization reasons.

    A common previous scenario might have been to add a Rectangle to a Text node:

      <Text Alignment="Center" Padding="5">
          <Rectangle Layer="Background" Color="0,1,1,1"/>
      </Text>
    

    This should now be done using a wrapping Panel instead:

      <Panel Alignment="Center">
          <Text Alignment="Center" Padding="5"/>
          <Rectangle Layer="Background" Color="0,1,1,1"/>
      </Panel>
    
  • Shapes (Circle, Ellipse, Rectangle, Star, RegularPolygon, Path) are no longer implemented with visual children in Graphics mode. They are directly drawn in the semantic control type. This will not likely affect any user code.

  • Padding has been fixed in some shapes. This may change the positioning of shapes that have padding.
  • Node.InvalidateVisual is no longer virtual, override the OnInvalidateVisual function instead. This gives Node better control over when it is called, and how to invalidate
  • Node.IsVisualInvalid has been removed as the invalidation system is active (at time of invalidation), thus nothing should (or did) check that flag
Uno C++ changes

Changes in base libraries (uno-base)

- `Xli/Foo.h` -> `uBase/Foo.h`
- `Xli::Foo` -> `uBase::Foo`
- ...

Ask us on the community slack in the #uno channel if you run into any problems.

UXL changes

Required Xcode.Frameworks that have file extensions now do not get an additional .framework extension.