v0.3.0
Breaking Changes
-
This crate's MSRV is now
1.74.1, required by updatingwgpu. -
wgpuhas been updated to0.20. -
winithas been updated to0.30. -
All context types no longer accept a
'windowlifetime. For most end-user
code, it means removing one elided lifetime from these types:WidgetContextEventContextLayoutContextGraphicsContext
-
WidgetContext'sDereftarget is now&mut dyn PlatformWindow. This change
ensures all widgets utilize a shared interface between any host architecture. -
All
DeviceIdparameters have been changed to aDeviceIdtype provided by
Cushy. This allows for creating arbitrary input device IDs when creating an
integration with other frameworks or driving simulated input in a
VirtualWindow. -
WidgetRefis now astructinstead of an enum. This refactor changes the
mounted state to be stored in aWindowLocal, ensuringWidgetRefs work
properly when used in aWidgetInstanceshared between multiple windows. -
WidgetRef::unmount_inshould be called when the widget is being unmounted to
clean up individual window state. -
Dynamic<T>andDynamicReader<T>have had most of their functions moved
into the traitsSource<T>andDestination<T>. This unifies the APIs
between the two types, and offers a path for other specialized reactive data
types to all share a unified API. -
map_mutnow takes aMutable<'_, T>parameter instead of an&mut T
parameter. This type tracks whether the reference is accessed using
DerefMut, allowingmap_mutto skip invoking change callbacks if only
Derefis used. -
redraw_when_changed()/invalidate_when_changed()from some types have been
moved to theTrackabletrait. This was to ensure all trackable types provide
the same API. -
Labelhas been refactored to accept anyDisplaytype. As a result of this,
Label::textis now nameddisplayandLabel::new()now accepts an
IntoReadOnly<T>instead ofIntoValue<String>. -
Dynamic<WidgetList>::wrapandWidgetList::wraphave been renamed to
into_wrapfor consistency. -
Cushy now has its own
KeyEventtype, as winit's has private fields. This
prevented simulating input in aVirtualWindow. -
FlexibleDimension::ZEROhas been removed, and nowFlexibleDimension
implementsZerowhich defines an associated constant of the same name and
purpose. -
Childrenhas been renamed toWidgetList. -
ColorExt::into_source_and_lightnesshas been renamed to
ColorExt::into_hsl, and its return type is nowHslinstead of the
individual components. -
Window::font_data_to_loadhas been renamed tofonts, and now has the
FontCollectiontype. -
Several font-related functions have been moved from
GraphicsContextto
WidgetContext:GraphicsContext::set_font_family()GraphicsContext::find_available_font_family()GraphicsContext::set_available_font_family()
-
Open::opennow require exclusive references to the application. -
PlatformWindowImplementation::set_cursor_iconand
PlatformWindow::set_cursor_iconhave been renamed toset_cursorand accept
winit0.30's newCursortype. -
Button::on_clicknow takes aOption<ButtonClick>structure. When this
value is provided, information about the mouse click that caused the event is
provided. -
OverlayBuilderhas hade many of its functions moved into a new trait,
Overlayable. This is to ensure common API surfaces across all overlayable
widgets including the newMenuwidget.
Fixed
-
The root widget is now included in the search for widgets to accept focus.
-
Widgets that have been laid out with a 0px width or height no longer have
theirredrawfunctions called nor can they receive focus. -
Gridnow synchronizes removal of widgets fromGridWidgetscorrectly. -
WidgetInstances can now be shared between windows. Any unpredictable
behaviors when doing this should be reported, as some widgets may still have
state that should be moved into aWindowLocaltype. -
Gridno longer passesConstraintLimit::Fillalong to children when it
contains more than one element. Previously, if rows contained widgets that
filled the given space, this would cause the grid to calculate layouts
incorrectly. -
A potential edge case where a
DynamicReaderwould not return after being
disconnected has been removed. -
#120: Dividing a
ZeroToOnenow properly checks forNaNand0.. -
Removed a possible deadlock when using
DynamicReader::block_until_updated. -
Removed an edge case ensuring
Wakers are signaled forDynamicReaders that
are waiting for value when the lastDynamicis dropped. -
Progressnow utilizesIntoSource<Progress>instead of
IntoDynamic<Progress>. In general, this should not cause any code breakages
unless the traits were being used in generics. -
Spacenow honorsConstraintLimit::Fillin its layout. -
When handling the Ctrl/Cmd+W shortcut to close windows, repeat keys are now
ignored. -
Color::constrast_betweenwas incorrectly allowing hue shifts to weigh in on
the contrast when the color was desaturated, and the attempt to account for
that was incorrectly being applied to the lightness contrast calculation. In
short, this function should be much more accurate in perceived contrast
evaluation. -
Graphics::set_font_familynow clears the cached font family list, ensuring
that the next call to apply_current_font_settings works correctly. -
Imagenow returns the correct size fromlayout()when in aspect scaling
modes. Previously, it reported back the minimum size, since it's scale was
considered flexible. This new behavior ensures that it always requests a size
that is scaled with the aspect ratio.The rendering behavior remains unchanged, and the image will scale correctly
within whatever bounds it is given. -
Widget::unmountedis now invoked for all widgets in the hierarchy.
Previously, only the parent widget was having its unmounted event invoked. -
Resizing windows should no longer be out of sync with the resize operation.
Previously, the window background would sometimes paint in newly revealed
areas before the UI was redrawn.
Changed
WidgetCacheKeynow includes theKludgineIdof the context it was created
from. This ensures if aWidgetInstancemoves or is shared between windows,
the cache is invalidated.- All
Dynamicmapping functions now utilize weak references, and the
CallbackHandlenow contains a strong reference to the originating dynamic.
This should have no visible impact on end-user code. ForEach/MapEach's implementations for tuples are now defined using
Source<T>andDynamicRead<T>. This allows combinations ofDynamic<T>s
andDynamicReader<T>s to be used in for_each/map_each expressions.
Added
-
Cushy now supports being embedded in any wgpu application. Here are the API
highlights:CushyWindowis a type that contains the state of a standalone window. It
defines an API designed to enable full control with winit integration into
any wgpu application. This type's design is inspired by wpgu's
"Encapsulating Graphics Work" article. Each of its functions require being
passed a type that implementsPlatformWindowImplementation, which exposes
all APIs Cushy needs to be fully functional.VirtualWindowis a type that makes it easy to render a Cushy interface in
any wgpu application where no winit integration is desired. It utilizes
VirtualStateas itsPlatformWindowImplementation. This type also exposes
a design inspired by wpgu's "Encapsulating Graphics Work" article.WindowDynamicStateis a set of dynamics that can be updated through
external threads and tasks.- is a new trait that allows
customizing the behavior that Cushy widgets need to be rendered.
-
Cushy now supports easily rendering a virtual window:
VirtualRecorder. This
type utilizes aVirtualWindowand provides easy access to captured images.
This type has the ability to capture animated PNGs as well as still images. -
figuresis now directly re-exported at this crate's root. Kludgine still
also provides this export, so existing references through kludgine will
continue to work. This was added as an attempt to fix links on docs.rs (see
rust-lang/docs.rs#1588). -
Discloseis a new widget that shows a disclosure triangle and uses a
Collapsewidget to show/hide the content when the disclosure button is
clicked. This widget also supports an optional label that is shown above the
content and is also clickable. -
#99: When an unhandled spacebar event is received by the window, the
focused widget will be activated and deactived by the events. This previously
was aButton-specific behavior that has been refactored into an automatic
behavior for all widgets. -
GridWidgetsnow implementsFromIteratorfor types that implement
Into<GridSection<N>>. -
Window::titledallows setting a window's title, and can be provided a
string-type or aDynamic<String>to allow updating the title while the
window is open. -
DynamicReader::on_disconnectallows attaching a callback that is invoked
once the final sourceDynamicis dropped. -
Dynamic::instances()returns the number of clones the dynamic has in
existence. -
Dynamic::readers()returns the number ofDynamicReaders for the dynamic in
existence. -
RunningWindow::kludgine_id()returns a unique id for that window. -
WindowLocal<T>is aHashMap-based type that stores data on a per-window
basis usingRunningWindow::kludgine_id()as the key. -
Source<T>andDestination<T>are new traits that contain the reactive data
model's API interface.Dynamic<T>implements both traits, and
DynamicReader<T>implements onlySource<T>. -
DynamicRead<T>is a new trait that provides read-only access to a dynamic's
contents. -
IntoReadOnly<T>is a new trait that types can implement to convert into a
ReadOnly<T>. -
IntoReader<T>is a new trait that types can implement to convert into a
DynamicReader<T>. -
ReadOnly<T>is a type similar toValue<T>but instead of possibly being a
Dynamic<T>,ReadOnly::Readercontains aDynamicReader<T>. This type can
be used where widgets that receive a value but never mutate it. -
Owned<T>is a new type that can be used where no shared ownership is
necessary. This type uses aRefCellinternally instead of anArc+
Mutex.Owned<T>implementsSource<T>andDestination<T>. -
GenerationalValue<T>now implementsDefaultwhenTdoes. -
Value<T>now implementsFrom<Dynamic<T>>. -
Most
into_functions that create widgets now haveto_variations that
cloneselfbefore calling theinto_function. This has only been done in
situations where it is known or likely that the clone being performed is
cheap. -
CallbackHandlenow hasweak()andforget_owners(). These functions allow
aCallbackHandleto release its strong references to theDynamicthat the
callback is installed on. This enables forming weak callback graphs that clean
up independent of one another. -
Source<T>::weak_clonereturns aDynamic<T>with a clone of each value
stored in the original source. The returned dynamic holds no strong references
to the original source. -
Point,Size, andRectnow implementLinearInterpolate. -
MakeWidget::build_virtual_window()returns a builder for aVirtualWindow. -
MakeWidget::build_recorder()returns a builder for aVirtualRecorder. -
Space::dynamic()returns a space that dynamically colors itself using
component provided. This allows the spacer to use values from the theme at
runtime. -
Space::primary()returns a space that contains the primary color. -
Hslis a new color type that is composed of hue, saturation, and lightness. -
Hslais a new color type that combinesHslwith an alpha component. -
Additional color pickers are now available:
HslPickerpicksHslHslaPickerpicksHslaRgbPickerpicksColorwith 255/1.0 alpha channelRgbaPickerpicksColor
-
ComponentPickeris a picker of variousColorComponentimplementors. It has
constructors for each -
InvalidationBatchis a type that can batch invalidation requests being made
by a background task. This can be useful if the background task is updating a
variety ofDynamic<T>s, but wish to limit redrawing the interface until the
task has completed its updates.This type does not prevent redraws from being performed due to the operating
system or other threads requeseting them. -
A new feature
plottersenables integration with the excellent
plotters crate.Graphics::as_plot_area()is a new function that
returns aplotters::DrawingAreathat can be used to draw any plot that the
plotterscrate supports. -
Delimiteris a new widget that is similar to html'shrtag. -
Listis a new widget that creates lists similar to HTML'solandul
tags. -
Dynamic::try_lock()is a panic-free version ofDynamic::lock(). -
FontCollectionis a new type that can be used to load fonts at app/window
startup or at runtime. -
Cushy::fonts()returns aFontCollectionthat is loaded into all windows. -
WidgetContext::loaded_font_faces()returns a list of fonts that were loaded
for a givenLoadedFont. -
Graphics::font_system()returns a reference to the underlying Cosmic Text
FontSystem. -
Window::vsyncis a new setting that allows disabling VSync for that window. -
ModifiersExtis an extension trait for winit'sModifiersand
ModifiersStatetypes. This trait adds helpers for dealing with
platform-specific meanings for keyboard modifiers. -
OverlayLayer::dismiss_all()dismisses all overlays immediately. -
Menuis a new widget type that can be shown in anOverlayLayerto create
contextual menus or other popup menus. -
PendingApp::newis a new function that accepts anAppRuntimeimplementor.
This abstraction is how Cushy provides the optional integration fortokio. -
Features
tokioandtokio-multi-threadenable the tokio integration for
this crate and expose a new typeTokioRuntime. TheDefaultRuntime
automatically will use theTokioRuntimeif either feature is enabled.When the
tokiointegration is enabled,tokio::spawnis able to be invoked
from all Cushy code safely.