I just published 0.9.3-SNAPSHOT. Please try it out...
# doodle
n
I just published 0.9.3-SNAPSHOT. Please try it out (and provide feedback) by pointing to `maven { url = uri("`https://oss.sonatype.org/content/repositories/snapshots`") }`. Here's what's included so far... New Carousel Control The new
Carousel
control is a
View
that contains a lazy list of items generated from a
ListModel
. It delegates all decisions about what items to show to a
Presenter
obtained from its
CarouselBehavior
. The
Carousel
only displays items the
Presenter
requests as it moves through frames. This means it can scale to very large datasets as long as the
Presenter
only shows items that are visible. `Carousel`s can have a very wide range of layouts and behaviors. This flexibility is achieved by giving `Presenter`s full control over which items (including supplemental ones not based on the data model) are shown at any point, how opaque they are, their positioning, size, transform, clipping, etc.. With this, you can create almost any kind of carousel experience you'd like.
Carousel
transitioning is a key part of their behavior. The control is therefore fully dynamic and interactive. You can move between frames in two ways. Either by skipping ahead or backward or by manually moving the Carousel to an x/y offset and then letting it transition to the best frame when manual movement is complete. `Carousel`s rely on a
Transitioner
to manage the way they animate for all these movements. This allows a great deal of flexibility and customization. `Presenter`s are responsible for updating frame state whenever the
Carousel
adjusts anything. This allows for holistic animations. There are several built-in
Presenters
that show how to create various effects as well.
Copy code
val carousel = Carousel(
    SimpleListModel(listOf(image1, image2, image3)),
    itemVisualizer { item, previous, _ ->
        when (previous) {
            is DynamicImage -> previous.also { it.update(item) }
            else            -> DynamicImage(item)
        }
    }
).apply {
    wrapAtEnds    = true
    acceptsThemes = false
    behavior      = object: CarouselBehavior<Deferred<Image>> {
  
      override val presenter = LinearPresenter<Image>(spacing = 10.0) {
          val aspectRatio = it.width.readOnly / it.height.readOnly

          it.width  eq parent.width
          it.center eq parent.center
          it.height eq it.width / aspectRatio
      }

      override val transitioner = dampedTransitioner<Image>(timer, animationScheduler) { _,_,_, update ->
          animate(0f to 1f, using = tweenFloat(easeInOutCubic, duration = 1 * seconds)) {
                update(it)
          }
      }
    }
}
Animations Can Now Be Paused/Resumed The `Animation`s implement the new
Pausable
interface, which allows them to be paused and resumed at any time.
Copy code
val animation = animate.invoke(0f to 1f, using = tweenFloat(easeInOutCubic, duration = 1 * seconds)) {
  // ...
}

animation.pause()

// ..

animation.resume()
view
|
container
Improvements
These DSLs now expose more of the protected properties of
View
and
Container
respectively.
Copy code
view {
    + view {}                 // adds a child to the View
    
    chidren            += view         {} // children now accessible
    layout              = simpleLayout {} // access layout
  
    addedToDisplay      = {             } // called when view added to display
    removedFromDisplay  = {             } // called when view removed from display
    contains            = { _ -> false  } // called to decide if a point within the view
  
    // ..
}
APIs
Vector3D
now exposes its
magnitude
basicMenuBehavior
module function now exposes various configuration input parameters to customize the result. •
TreeItemRole
now has a
selected
property • New
lerp
function for
Rectangle
and
Size
• New ``Rectangle`` constructor that takes a
Size
BasicDropdownBehavior
now takes accessibility label for its button •
BasicMutableDropdownBehavior
now takes accessibility label for its button •
BasicSpinnerBehavior
now takes accessibility labels for its buttons •
BasicMutableSpinnerBehavior
now takes accessibility labels for its buttons •
basicDropdownBehavior()
,
basicMutableDropdownBehavior()
,
basicSpinnerBehavior()
and
basicMutableSpinnerBehavior()
now support accessibility labels •
MonthPanel
class is now
open
Fixes | Improvements • General ◦ Bug where
MonthPanel
could NPE if selection queried while nothing selected ◦ Bug in
TextMetrics
size calculation when
lineSpacing
set ◦
TreeRow
now updates its accessibility role with the current selected state. ◦ Issue where deleted `View`s might not be cleaned up if they are removed from a parent at the same time their child is being removed and added to that same parent. ◦ Bug where
View
could loop when a child is removed and added to its parent ◦
Camera
now clips transformed
ConvexedPolygons
so their points do not go behind it. ◦ Issue where the children of a
View
that is removed are not properly re-added if they are placed into their grandparent before the next cleanup pass within
RenderManagerImpl
. ◦ Bug where
View.toAbsolute
and
View.fromAbsolute
resulted in incorrect results ◦ Optimize
View.resolvedTransform
with caching • Browser
TreeRole
now marked as aria-multiselectable ◦ Native behavior for `HyperLink`s ensure the associated html element inherits the a11y labels of their
Hyperlink
◦ Native behavior for `TextField`s ensure the associated html element inherits the a11y labels of their
TextField
◦ Fixed issue where Native
TextField
behavior stopped supporting mask value ◦ Fixed Issue with graphics surface sort order ◦ Line-height not correctly set when value != 1f ◦ Bug where
zOrder
is incorrect for containers ◦ Only apply Safari shadow hack when multiple shadows applied to an element ◦ Case where graphics surface index could go negative and create incorrect render ordering • Desktop ◦ Bug with
zIndex
for pop-ups Versions • Measured -> 0.3.3
alphabet yellow d 1