Expand description
Cushy is an experimental Graphical User Interface (GUI) crate for the Rust
programming language. It features a reactive data model and aims to enable
easily creating responsive, efficient user interfaces. To enable easy
cross-platform development, Cushy uses its own collection of consistently-styled
Widget
s.
Cushy is powered by:
Kludgine
, a 2d graphics library powered by:winit
for windowing/inputwgpu
for graphicscosmic_text
for text layout + rasterization
palette
for OKLab-based HSL color calculationsarboard
for clipboard supportfigures
for integer-based 2d math
§Getting Started with Cushy
The Widget
trait is the building block of Cushy: Every user
interface element implements Widget
. The Widget
trait
documentation has an overview of how Cushy works. A list of built-in
widgets can be found in the cushy::widgets
module.
Cushy uses a reactive data model. To see an example of how reactive data models work, consider this example that displays a button that increments its own label:
fn main() -> cushy::Result {
// Create a dynamic usize.
let count = Dynamic::new(0_isize);
// Create a new label displaying `count`
count
.to_label()
// Use the label as the contents of a button
.into_button()
// Set the `on_click` callback to a closure that increments the counter.
.on_click(move |_| count.set(count.get() + 1))
// Run the application
.run()
}
Here are some ways to learn more about Cushy:
-
Explore the examples directory. Nearly every feature in Cushy was initially tested by creating an example. Many are focused on demonstrating a single feature, but there are some complex example such as a theme editor/previewer:
-
Browse the user’s guide. The user guide is a work in progress, but features CI-generated screenshots and animations for its examples:
-
Ask questions in Discussions or on Discord.
§Project Status
This project is early in development, but is quickly becoming a decent framework. It is considered alpha and unsupported at this time, and the primary focus for @ecton is to use this for his own projects. Feature requests and bug fixes will be prioritized based on @ecton’s own needs.
If you would like to contribute, bug fixes are always appreciated. Before working on a new feature, please open an issue proposing the feature and problem it aims to solve. Doing so will help prevent friction in merging pull requests, as it ensures changes fit the vision the maintainers have for Cushy.
§Open-source Licenses
This project, like all projects from Khonsu Labs, is open-source. This repository is available under the MIT License or the Apache License 2.0.
To learn more about contributing, please see CONTRIBUTING.md.
Re-exports§
pub use figures;
pub use kludgine;
Modules§
- Types for creating animations.
- Types that provide access to the Cushy runtime.
- Utililies to help debug Cushy apps.
- Modal dialogs such as message boxes and file pickers.
- Types for loading fonts to use in Cushy.
- Types for styling widgets.
- Types for storing and interacting with values in Widgets.
- Types for creating reusable widgets (aka components or views).
- Built-in
Widget
implementations. - Types for displaying a
Widget
inside of a desktop window.
Macros§
- Defines a set of style components for Cushy.
- Creates a
Styles
instance with the given name/component pairs.
Structs§
- A handle to a Cushy application.
- Shared resources for a GUI application.
- A default application runtime.
- A 2d graphics context
- The current state of input during the execution of a
Tick
. - A
OnceLock
-based lazy initializer. - A smart-string type that is used as a “name” in Cushy.
- A Cushy application that has not started running yet.
- A fixed-rate callback that provides access to tracked input on its associated widget.
- A spawned
tokio
runtime.
Enums§
- A limit used when measuring a widget.
Traits§
- A runtime associated with the Cushy application.
- A type that is a Cushy application.
- An extension trait for
Size<ConstraintLimit>
. - Helper functions for [
Modifiers
] and [ModifiersState
]. - Helper constants for [
ModifiersState
] - A type that can be opened as a window in an application.
- A custom wgpu-powered rendering operation.
- A type that can be run as an application.
- A
RenderOperation
with no per-drawing-call state. - Invokes a function with a clone of
self
.
Functions§
- Starts running a Cushy application, invoking
app_init
after the event loop has started.
Type Aliases§
- A result alias that defaults to the result type commonly used throughout this crate.
- A guard preventing an
App
from shutting down.
Attribute Macros§
- A macro to create a
main()
function with less boilerplate.