36 KiB
Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Unreleased
Breaking Changes
PendingWindows opened into aPendingAppnow have workingWindowHandles. As a result of this fix,Open::open()now returns aWindowHandleinstead of anOption<WindowHandle>.CushyWindow::set_occludedandCushyWindow::resize now require aPlatformWindowImplementation` parameter.PlatformWindowImplementation::positionhas been renamed toPlatformWindowImplementation::outer_position.Window::positionhas been renamed toWindow::outer_positionand takes an additional parameter controlling whether to position the window with the initial value of the dynamic or whether to let the operating system perform the initial positioning.- Keyboard modifiers have been added to two event structures:
ButtonClickandKeyboardEvent. Because of this change,KeyboardEventno longer implementsFrom<winit::event::KeyEvent>. Instead, a new apiKeyEvent::from_winitallows constructing from both the modifiers and key event. - The type alias
WindowAttributeshas been removed. This type is no longer used in Cushy's public API. Window::attributeshas been made private. All functionality available from this field should be available directly via functions onWindow, and when possible, the attributes are be able to be dynamically updated as well.Window::focusednow accepts anIntoValueimplementor instead ofIntoDynamic. Additionally, the initial value is now used to control whether the OS should initially activate the window when it is opened.WrapperWidget::root_behavior's provided implementation now returnsSome(RootBehavior::PassThrough)to reflect the general intention of whatWrapperWidgetimplementors are generally doing. Previously,Nonewas returned.PlatformWindowImplementation::request_inner_sizeandPlatformWindow::request_inner_sizenow both returnOption<Size<UPx>>. When the function returns a value, Cushy is expected to apply the new size to the state immediately rather than waiting for the platform to notify it of a resize event.PlatformWindow::outer_sizeis a new function that returns the window's current outer size.Graphics::draw_textureandGraphics::draw_textured_shapenow both accept an opactiy parameter controlling how opaque the texture should be rendered at.
Changed
-
Openis now implemented for most types via a blanket implementation for a new trait,MakeWindow.MakeWindowsplits the process of creating aWindow<Behavior>from the process of opening a window.The new
MakeWindowtrait adds some new functionality:open_centered/run_centered/run_centered_in. These functions present a window centered on the screen where the window initially is shown. -
IntoAnimate::on_completenow takes anFnOnceinstead of anFnMut. Since this widens the types of functions this accepts, this is not a breaking change. This matches the documented behavior. -
tracing_subscriberinitialization has been moved toPendingApp::default()fromWindow::run. This ensures logging is always initialized for all Cushy apps. -
The default logging output has been trimmed to only show errors for wgpu, winit, and naga. Thanks to @bluenote10 for the feedback!
-
WrapperWidget::activate's default implementation now activates the wrapped widget. -
Spacenow intercepts mouse events if its color has a non-zero alpha channel.
Fixed
Collapse,OverlayLayer, andProgressall honor the theme componentsEasingInandEasingOutrather than hard-coded easing functions.Collapsewidgets now apply child size changes immediately rather than animating the transition. The previous behavior caused nested collapsed widgets to grow and shrink in an accordian-like fashion rather than animating together.Switchernow unmounts child widgets in all windows it is mounted in. Fixes #139.inner_sizeandouter_sizeare now initialized after the first layout is performed. This ensures that whenresize_to_fitis used, the first observed values will be the resized values.Resizenow performs a second layout pass, if necessary, to ensure that children widgets have an opportunity to fill the resized area. Additionally, the first SizeToFit measurement will be performed with the minimum dimension.- When a keyboard-activated widget activates another widget during its callback, the key-up event now sends the deactivate event to the finally-activated widget.
- A rare deadlock occurring when multiple threads were racing to execute
Dynamic<T>change callbacks has been fixed. Stackno longer unwraps aResizechild if the resize widget is resizing in the direction opposite of the Stack's orientation.- If the layout of widgets changes during a redraw, the currently hovered widget is now properly updated immediately. Previously, the hover would only update on the next cursor event.
Scrollno longer attempts to preserve scroll amounts using a percentage when its child changes size.StackandGridnow properly recompute exact-sizedLpchildren when the display scale is changed.Button's colors are now fully reactive. The caching code to prevent color duplicate change animations has been simplified to fix this.
Added
-
ComponentProbe<T>is a new widget that allows reading aComponentDefinitionvalue from the theme at runtime through aDynamic<T::ComponentType>. For example, aComponentProbe<TextSize>will provide access to aDynamic<Dimension>. Previously this required creating a custom widget to access the runtime theme information.ContextFreeComponent::probe()andContextFreeComponent::probe_wrapping()provide an easy interface for creating probes from components. -
These
to_*variations of existinginto_*functions have been added to avoid some cases where cloning might be needed.MakeWidget::to_button()MakeWidget::to_checkbox()WidgetInstance::to_window()
-
Watcheris a new type that executes callbacks when one or more sources changes. This can simplify some data flows such as regenerating a value when many one of many UI elements are changed. -
The
resize_to_fitsetting has been added to all window types and is no longer limited toVirtualRecorders. This setting can be changed using:Window::resize_to_fitStandaloneWindowBuilder::resize_to_fit
-
Tracked<Source>is a new type that can store aDynamic<T>orValue<T>and provide easy ways to track whether the value has been updated. -
Many new functions have been added to
Windowto expose more functionality supported by winit:Window::app_nameWindow::content_protectedWindow::cursor_hittestWindow::cursor_positionWindow::cursor_visibleWindow::decoratedWindow::enabled_buttonsWindow::fullscreenWindow::iconWindow::inner_positionWindow::maximizedWindow::minimizedWindow::modifiersWindow::outer_positionWindow::outer_sizeWindow::resize_incrementsWindow::resizedWindow::transparentWindow::visibleWindow::window_level
-
run(&mut App)is a new function that can provide a more concise way of executing applications that would normally require usingPendingApp. -
PendingApp::on_startupallows executing a function once the application's event loop has begun. -
App::monitors()returns a snapshot of the currently configured monitors attached to the device. A new example demonstrating this API is available atexamples/monitors.rs. -
PlatformWindowImplementationhas several new functions with provided implementations for winit users:inner_positionouter_size
-
#[cushy::main]is a new attribute proc-macro that simplifies initializing and running multi-window applications. -
Window::on_openexecutes a callback when the window is initially opened. -
Shortcutsis a new widget that simplifies attaching logic to keyboard shortcuts. Any widget can be wrapped with keyboard shortcut handling by usingMakeWidget::with_shortcut/MakeWidget::with_repeating_shortcut. -
Windownow can have its ownShortcutMap, which can be populated usingWindow::with_shortcut/Window::with_repeating_shortcut, or provided usingWindow::with_shortcuts. -
ModifiersStateExtis a new trait that adds functionality to winit'sModifiersStatetype. Specifically, this trait adds an associatedPRIMARYconstant that resolves to the primary shortcut modifier on the target platform. -
New feature flag
serdeenables serialization support for some types. -
WindowHandle::executeexecutes a function on the window's thread providing access to anEventContext. This can be used to gain access to the window directly, including getting a reference to the underlying winit Window. -
Modalis a new layer widget that presents a single widget as a modal session. -
App::prevent_shutdown()returns a guard that prevents the application from closing automatically when the final window is closed. -
WindowBehavior::initializedis invoked once the window has been fully initialized. -
Window::on_initis a new callback that is invoked before the winit window is initialized. -
Window::on_file_dropis a new callback that is invoked when file drop events occur for the window. -
Image::opacityallows rendering the image with a given opacity. -
PendingApp::with_tracingandPendingApp::initialize_tracinginstall Cushy's tracing Subscriber. The defaultPendingApphas tracing initialized, butPendingApp::newdoes not. -
AnimateandIntoAnimateare now implemented for:impl FnMut(Duration) -> ControlFlow<Duration> + Send + Sync + 'staticSharedCallback<Duration, ControlFlow<Duration>>SharedCallback
-
Cushy::multi_click_threshold/Cushy::set_multi_click_thresholdprovide access to the setting used by Cushy widgets to detect whether two clicks are related. -
ClickCounteris a new helper that simplifies handling actions based on how many sequential clicks were observed. -
Dimension::is_unboundedis a new helper that returns true if neither the start or end is bounded. -
&StringandCow<'_, str>now implementMakeWidget. -
Cargo feature
native-dialogshas been added to enable native dialogs to be shown by Cushy applications. -
PendingApp::with_on_unrecoverable_errorallows overriding the default behavior when an unrecoverable error occurs. Previously, all unrecoverable errors resulted in a panic. The new default behavior uses thenative-dialogsfeature when enabled to display the error using a system-native message dialog. -
MessageBoxdisplays a prompt to the user in aModallayer, above aWindowHandle, or in anApp. When shown above a window or app, therfdcrate is used to use the native system dialogs. -
FilePickerdisplays a file picker to the user in aModallayer, above aWindowHandle, or in anApp. When shown above a window or app, therfdcrate is used to use the native system dialogs.The
FilePickertype supports these modes of operation:- Saving a file
- Choosing a single file
- Choosing one or more files
- Choosing a single folder/directory
- Choosing one or more folders/directories
-
DynamicGuard::unlockedexecutes a closure while the guard is temporarily unlocked. -
Scroll::preserve_max_scrollcontrols whether the scroll view automatically scrolls when currently scrolled to the maximum and its child grows. The default istrue, which was the behavior before this flag was added. -
Imagenow supportsImageCornerRadius. Thanks to @danbulant for helping with this change!
v0.4.0 (2024-08-20)
Breaking Changes
- Dependency
kludginehas been updated tov0.10.0, which updates Cushy towgpu v22.0.0andcosmic-text v0.12.0. - At some point, a dependency of the
imagecrate has been updated with a minimum supported Rust version (MSRV) of1.80.0. This is Cushy's new MSRV to reflect this requirement. Source::for_each_*now invoke the callback with the current contents of of the source before attaching the callback. New functions beginning withfor_each_subsequent_have been added with the original behavior.CushyWindowBuilderhas been renamed toStandaloneWindowBuilderandMakeWidget::build_virtual_windowhas been renamed tobuild_standalone_window.- All animation easing related functionality has been reactored into a separate
crate:
easing-function. Most code will remain unaffected due to re-exports, but theEasingtrait no longer accepts aZeroToOneparameter, instead accepting anf32value.
Fixed
-
Fixed a panic that could occur when removing certain nested hierarchies from a window.
-
CallbackHandlenow has amust_usehint that might help users discover the persist function. -
Fixed a deadlock that could occur when multiple threads were attempting to execute change callbacks for the same dynamic at the same time.
-
The initial
inner_sizeof aWindowis now used if it is non-zero andWindowAttributes::inner_sizeisNone. -
Container's layout and drawing functions now properly round up/down the measurements to ensure accurate rendering. Fixes #158.
-
Inputselection handling when dragging below or above the text field is now handled correctly. -
Nested hierarchies of widgets stored in a reused
WidgetInstanceare now properly unmounted and remounted. For widgets that storeMountedWidgets, in theirmountedevents the widgets should remount their children if needed.This fix not only fixes underlying issues with how unmounting was occuring, but also fixes
Stack,Grid, andWidgetRefto automatically remount as needed.
Added
AnimationRecorder::animate_keypressis a new helper that animates a single key press.AnimationRecorder::animate_mouse_buttonis a new helper that animates a single mouse button press and release.Window::on_close_requestedis a new function that allows providing a callback that is invoked before the window is closed when the user or operating system requests that a window is closed. If the callback returns true, the window is allowed to be closed. If false is returned, the window will remain open. This feature is most commonly used to prevent losing unsaved changes.Fractionnow hasLinearInterpolationandPercentBetweenimplementations.Window::zoomallows setting aDynamic<Fraction>that scales all DPI-scaled operations by an additional scaling factor.EdgesandContainerShadownow implementfigures::Round.
v0.3.0 (2024-05-12)
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 aVirtualWindow. -
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 Tparameter. This type tracks whether the reference is accessed usingDerefMut, allowingmap_mutto skip invoking change callbacks if onlyDerefis 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 anIntoReadOnly<T>instead ofIntoValue<String>. -
Dynamic<WidgetList>::wrapandWidgetList::wraphave been renamed tointo_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 nowFlexibleDimensionimplementsZerowhich defines an associated constant of the same name and purpose. -
Childrenhas been renamed toWidgetList. -
ColorExt::into_source_and_lightnesshas been renamed toColorExt::into_hsl, and its return type is nowHslinstead of the individual components. -
Window::font_data_to_loadhas been renamed tofonts, and now has theFontCollectiontype. -
Several font-related functions have been moved from
GraphicsContexttoWidgetContext: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_iconandPlatformWindow::set_cursor_iconhave been renamed toset_cursorand acceptwinit0.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 their
redrawfunctions 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 ofIntoDynamic<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 theCallbackHandlenow 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 usingSource<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 utilizesVirtualStateas 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 aCollapsewidget 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 a
Button-specific behavior that has been refactored into an automatic behavior for all widgets. -
GridWidgetsnow implementsFromIteratorfor types that implementInto<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, andDynamicReader<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 aReadOnly<T>. -
IntoReader<T>is a new trait that types can implement to convert into aDynamicReader<T>. -
ReadOnly<T>is a type similar toValue<T>but instead of possibly being aDynamic<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 theplotterscrate supports. -
Delimiteris a new widget that is similar to html'shrtag. -
Listis a new widget that creates lists similar to HTML'solandultags. -
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 TextFontSystem. -
Window::vsyncis a new setting that allows disabling VSync for that window. -
ModifiersExtis an extension trait for winit'sModifiersandModifiersStatetypes. 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. TheDefaultRuntimeautomatically will use theTokioRuntimeif either feature is enabled.When the
tokiointegration is enabled,tokio::spawnis able to be invoked from all Cushy code safely.
v0.2.0
Breaking Changes
- This crate has been renamed from
GooeytoCushy. Other than the name of the library changing, the only type to change name isGooey->Cushy. This changelog has had all references and links updated. - Many bounds required
UnwindSafedue to a misunderstanding on how to handle this trait inappit. All requirements forUnwindSafehave been removed. Cushyno longer implements default. To gain access to aCushyinstance, create aPendingAppor get a reference to the runningApp.Window::newno longer accepts aCushyparameter. The window now adopts theCushyfrom the application it is opened within.MakeWidget::into_window()no longer takes any parameters.Label<T>is now generic over a new trait:DynamicDisplay. This new trait allows a way to query aWidgetContextto resolve the value to display. The trait is automatically implemented for all types that implementDisplay, so this change in practice shouldn't break much code.
Changed
-
#92: When a Window is resizable and the root widget's
layout()function returns a size larger than the window's inner size, the window will no longer be resized to fit. The content will be forced to render in the given space, which may result in clipping.Using a
Resizewidget in the root hierarchy allows setting minimum width and heights for the content.
Fixed
- A memory leak has been fixed that prevented the underlying widget tree of each
window from being dropped. This was caused by a reference counting cycle, and
has been fixed by switching
MountedWidgetto use a weak reference internally and having the window hold the strong reference to the tree. - #112: Click-selection is handled correctly across graphemes now. Previously, code that was handling selecting between "ff" where cosmic_text had merged the two ASCII characters into a single glpyh was not honoring graphemes, allowing dragging selections inbetween multi-character glyphs.
- #113:
Inputnow constraints its internal selection to the value's length automatically. This fixes an issue where the backspace key no longer would work after clearing the text field by setting theDynamic. - Validation callbacks are now associated with the
Dynamic<Validation>being created rather than being persisted indefinitely on the source dynamic.
Added
-
Validations::validate_resultattaches aDynamic<Result<T,E>>to the validations. This was already available onwhenconditioned validations. -
Dynamic::[try_]compare_swapallows swapping the contents of a dynamic after verifying the current contents. -
#91: Multi-window support has been implemented.
PendingAppallows opening one or more windows before starting the program.Appis a handle to the running application that can be used to open additional windows at runtime.Openis a new trait that allows various types to open as a window given a reference to an application. This trait is implemented for all types that implementedRun, which means any type that was previously able to be run as a standalone executable can now be opened as a window within a multi-window application.The
multi-windowexample demonstates using this feature to open multiple windows before starting Cushy as well as dynamically opening windows at runtime. -
Window::on_closesets a callback to be invoked when the window has closed. -
WindowHandleis a handle to a Cushy window. It enables requesting that the window closes, refreshing the window, or invalidating a widget contained in the window. -
RunningWindow::handle()returns aWindowHandlefor the current window. -
RunningWindow::request_close()requests that the window should close. This ensuresWindowBehavior::close_requestedis invoked before the window is closed. -
PendingWindowis a new type that can return aWindowHandlefor a window that hasn't opened yet. This can be used to allow a widget on a window to close the window. -
Style components for customizing default widget colors have been added:
DefaultForegroundColorDefaultBackgroundColorDefaultHoveredForegroundColorDefaultHoveredBackgroundColorDefaultActiveForegroundColorDefaultActiveBackgroundColorDefaultDisabledForegroundColorDefaultDisabledBackgroundColor
-
CallbackHandlecan now be added with otherCallbackHandles to merge multiple handles into a single handle. -
Dynamic::set_sourceallows attaching aCallbackHandleto aDynamic, ensuring the callback stays alive as long as the dynamic has an instance alive.
v0.1.3 (2023-12-19)
Added
-
#94
Window::inner_sizeallows setting a dynamic that will be synchronized with the window's inner size. When the dynamic is set to a new value, a resize request will be sent to the operating system. When the window's size is changed by the operating system, this dynamic will be updated with the new value.This dynamic is also accessible through
RunningWindow::inner_size, which is accessible through contexts passed into variousWidgetfunctions. -
Progressnow implementsDefaultby returningProgress::Indeterminant. -
WeakDynamic<T>now implementsDebugwhenTisDebug.
Fixed
-
#97:
Dynamiccallback invocations could be missed for a value when multiple threads were updating values at the same time. Now it is guaranteed that each callback will observe the latest value at least once.Cycles on the same thread are still detected and logged to prevent infinite loops from callback chain cycles.
-
An integer underflow has been fixed in the Grid/Stack widgets.
-
Padding is now rounded to the nearest whole pixel when applied across widgets.
v0.1.2 (2023-12-18)
Fixed
- Cushy now compiles for Windows. An indirect dependency,
appit, also needs to be updated to v0.1.1. Runningcargo updateshould be enough to updateappit.
v0.1.1 (2023-12-18)
This release only contains fixed links in the README. No code was changed.
v0.1.0 (2023-12-18)
This is the initial alpha release of Cushy.