No description
Find a file
Jonathan Johnson 4bc3f5a884
Refactored VirtualList
These set of changes attempt to resolve a few complexities from the
original implementation: sizing and how to dynamically update the
content in the list.

On the sizing front, manually specifying the width and height of the
rows felt like it was more complex than measuring the first widget and
using that for all other widgets. This allows a user who wants to force
an explicit size to use the Resize widget, while also supporting
SizeToFit flows. Additionally, this paves the way for us to add
horizontal scrolling to this list, but this commit was already complex
enough I held off on that change for now.

One workflow I wanted to see supported was going from 0 rows to 50 rows.
When the item count comes from a trait, it was pretty complicated to
determine how to tell the list to ask for a new row count. By having the
user provide a Value<usize>, they can provide a `Dynamic<usize>` that
can be updated with a new row count whenever the application determines
there is new data. We still need to figure out a way to force a refresh
of the data even if the row count doesn't change.

Ultimately changing this allowed removing the trait and seemingly
simplified the basic usage in addition to adding more flexibility.
2024-11-07 14:27:08 -08:00
.github/workflows Adding xdg to ci 2024-09-21 13:54:19 -07:00
.rustme Bumping version 2024-08-20 12:30:41 -07:00
assets Component type safety, some font support 2023-11-19 21:52:45 -08:00
cushy-macros cushy::main attribute macro 2024-09-08 09:31:35 -07:00
examples Refactored VirtualList 2024-11-07 14:27:08 -08:00
guide Refactored VirtualList 2024-11-07 14:27:08 -08:00
src Refactored VirtualList 2024-11-07 14:27:08 -08:00
.crate-docs.md Adding theme editor screenshot to readme 2024-05-12 08:12:24 -07:00
.gitignore Initial implementation of offscreen rendering 2024-01-03 11:35:43 -08:00
Cargo.lock Refactored VirtualList 2024-11-07 14:27:08 -08:00
Cargo.toml Nested modals 2024-10-04 10:17:40 -07:00
CHANGELOG.md Consistently apply overridden theme 2024-10-24 07:34:27 -07:00
CODE_OF_CONDUCT.md Resize/Expand rework + basic readme 2023-11-02 14:23:36 -07:00
CONTRIBUTING.md Resize/Expand rework + basic readme 2023-11-02 14:23:36 -07:00
LICENSE-APACHE Resize/Expand rework + basic readme 2023-11-02 14:23:36 -07:00
LICENSE-MIT Resize/Expand rework + basic readme 2023-11-02 14:23:36 -07:00
README.md Adding theme editor screenshot to readme 2024-05-12 08:12:24 -07:00
rustfmt.toml Initial commit 2023-10-18 08:22:41 -07:00

Cushy

Cushy is considered alpha and unsupported crate version Documentation for main Cushy User's Guide

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 Widgets.

Cushy is powered by:

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:

    Theme Editor Example

  • Browse the user's guide. The user guide is a work in progress, but features CI-generated screenshots and animations for its examples:

    Hello, World User Guide Example

  • 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.