From 8fb372e7431a5f8990a340cbd16814687ac67d6b Mon Sep 17 00:00:00 2001 From: Jonathan Johnson Date: Sat, 6 Jan 2024 10:26:23 -0800 Subject: [PATCH] Work on guide --- .github/workflows/docs.yml | 33 +++- guide/book.toml | 7 + guide/guide-examples/examples/align.rs | 228 ++++++++++++++---------- guide/guide-examples/src/lib.rs | 7 + guide/src/SUMMARY.md | 41 ++++- guide/src/about.md | 1 + guide/src/about/philosophies.md | 34 ++++ guide/src/chapter_1.md | 33 ---- guide/src/examples/align-horizontal.png | Bin 33666 -> 0 bytes guide/src/examples/align.png | Bin 0 -> 40093 bytes guide/src/intro.md | 1 + guide/src/widgets/controls.md | 4 + guide/src/widgets/layout.md | 4 + guide/src/widgets/layout/align.md | 96 ++++++++++ guide/src/widgets/layout/layout.md | 1 + guide/src/widgets/utility.md | 4 + guide/src/widgets/utility/space.md | 5 + 17 files changed, 366 insertions(+), 133 deletions(-) create mode 100644 guide/src/about.md create mode 100644 guide/src/about/philosophies.md delete mode 100644 guide/src/chapter_1.md delete mode 100644 guide/src/examples/align-horizontal.png create mode 100644 guide/src/examples/align.png create mode 100644 guide/src/intro.md create mode 100644 guide/src/widgets/controls.md create mode 100644 guide/src/widgets/layout.md create mode 100644 guide/src/widgets/layout/align.md create mode 100644 guide/src/widgets/layout/layout.md create mode 100644 guide/src/widgets/utility.md create mode 100644 guide/src/widgets/utility/space.md diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 5e7c422..2d340b3 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -5,7 +5,6 @@ on: [push] jobs: docs: runs-on: ubuntu-latest - if: github.ref == 'refs/heads/main' steps: - uses: actions/checkout@v3 @@ -32,4 +31,34 @@ jobs: api-key: ${{ secrets.DOSSIER_API_KEY }} project: cushy from: target/doc/ - to: /${{ github.ref_name }}/docs \ No newline at end of file + to: /${{ github.ref_name }}/docs + + guide: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - uses: dtolnay/rust-toolchain@stable + + - name: Download mdbook + run: | + curl -sSL https://github.com/rust-lang/mdBook/releases/download/v0.4.36/mdbook-v0.4.36-x86_64-unknown-linux-gnu.tar.gz | tar -xz + + - name: Install mdbook-variables + run: | + cargo install mdbook-variables + + - name: Build Guide + run: | + ./mdbook build guide + + - name: Deploy + uses: khonsulabs/sync-to-dossier@main + if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/release' || startsWith(github.ref, 'refs/tags/') + with: + url: ${{ secrets.DOSSIER_URL }} + api-key-id: ${{ secrets.DOSSIER_API_KEY_ID }} + api-key: ${{ secrets.DOSSIER_API_KEY }} + project: cushy + from: target/guide/ + to: /${{ github.ref_name }}/guide \ No newline at end of file diff --git a/guide/book.toml b/guide/book.toml index 0690ff1..5c28854 100644 --- a/guide/book.toml +++ b/guide/book.toml @@ -4,3 +4,10 @@ language = "en" multilingual = false src = "src" title = "Cushy User's Guide" + +[build] +build-dir = "../target/guide" +extra-watch-dirs = ["./guide-examples/"] + +[preprocessor.variables.variables] +docs = "https://cushy.rs/main/docs/cushy" diff --git a/guide/guide-examples/examples/align.rs b/guide/guide-examples/examples/align.rs index 2797060..09a42a3 100644 --- a/guide/guide-examples/examples/align.rs +++ b/guide/guide-examples/examples/align.rs @@ -1,133 +1,167 @@ +use std::array; + use cushy::figures::units::{Lp, Px}; use cushy::figures::{Point, Size}; -use cushy::styles::{Edges, ThemePair}; +use cushy::styles::ThemePair; use cushy::widget::MakeWidget; -use cushy::widgets::Space; -use guide_examples::BookExample; +use cushy::widgets::grid::{GridDimension, GridWidgets}; +use cushy::widgets::{Grid, Space}; +use guide_examples::book_example; +// ANCHOR: content fn content() -> impl MakeWidget { - Space::primary().size(Size::squared(Px::new(32))) + Space::primary().size(Size::squared(Px::new(32)..)) +} +// ANCHOR_END: content + +fn align_left() -> impl MakeWidget { + // ANCHOR: align-left + content().align_left() + // ANCHOR_END: align-left +} + +fn centered() -> impl MakeWidget { + // ANCHOR: horizontal-center + content().centered() + // ANCHOR_END: horizontal-center +} + +fn align_right() -> impl MakeWidget { + // ANCHOR: align-right + content().align_right() + // ANCHOR_END: align-right +} + +fn align_horizontal() -> impl MakeWidget { + Grid::from_rows( + GridWidgets::new() + .and(("Unaligned", content())) + .and(("align_left()", align_left())) + .and(("centered()", centered())) + .and(("align_right()", align_right())), + ) + .dimensions([ + GridDimension::FitContent, + GridDimension::Fractional { weight: 1 }, + ]) +} + +fn align_top() -> impl MakeWidget { + // ANCHOR: align-top + content().align_top() + // ANCHOR_END: align-top +} + +fn align_bottom() -> impl MakeWidget { + // ANCHOR: align-bottom + content().align_bottom() + // ANCHOR_END: align-bottom +} + +fn align_vertical() -> impl MakeWidget { + Grid::from_rows( + GridWidgets::new() + .and(("Unaligned", "align_top()", "centered()", "align_bottom()")) + .and(( + content().height(Lp::inches(1)).centered(), + align_top(), + centered(), + align_bottom(), + )), + ) + .dimensions(array::from_fn(|_| GridDimension::Fractional { weight: 1 })) +} + +fn align() -> impl MakeWidget { + "Horizontal Alignment" + .and(align_horizontal().contain()) + .and("Vertical Alignment") + .and(align_vertical().contain()) + .into_rows() } fn main() { - BookExample::new( - "align-horizontal", - "Default Behavior" - .and(content()) - .and("align_left()") - .and({ - // ANCHOR: align-left - content().align_left() - // ANCHOR_END: align-left - }) - .and("pad_by().align_left()") - .and({ - // ANCHOR: align-left-pad - content() - .pad_by(Edges::default().with_left(Lp::inches(1))) - .align_left() - // ANCHOR_END: align-left-pad - }) - .and("centered()") - .and({ - // ANCHOR: centered - content().centered() - // ANCHOR_END: centered - }) - .and("pad_by().align_right()") - .and({ - // ANCHOR: align-right-pad - content() - .pad_by(Edges::default().with_right(Lp::inches(1))) - .align_right() - // ANCHOR_END: align-right-pad - }) - .and("align_right()") - .and({ - // ANCHOR: align-right - content().align_right() - // ANCHOR_END: align-right - }) - .into_rows(), - ) - .still_frame(|recorder| { - const LEFT: u32 = 40; - const PADDING: u32 = 96; - const RIGHT: u32 = 710; - const CENTER: u32 = 375; + let theme = ThemePair::default(); + let container_color = theme.dark.surface.low_container; + let primary = theme.dark.primary.color; + book_example!(align).still_frame(|recorder| { + const LEFT: u32 = 145; + const RIGHT: u32 = 705; + const H_CENTER: u32 = (RIGHT + LEFT) / 2; + const TOP: u32 = 282; + const BOTTOM: u32 = 345; + const V_CENTER: u32 = (TOP + BOTTOM) / 2; - let container_color = ThemePair::default().dark.surface.lowest_container; - let primary = ThemePair::default().dark.primary.color; - - recorder.assert_pixel_color(Point::new(LEFT, 35), container_color, "surface"); + // Verify the inner container color + recorder.assert_pixel_color(Point::new(32, 62), container_color, "surface"); // Default fills the entire space - recorder.assert_pixel_color(Point::new(LEFT, 70), primary, "default spacer"); - recorder.assert_pixel_color(Point::new(CENTER, 70), primary, "default spacer"); - recorder.assert_pixel_color(Point::new(RIGHT, 70), primary, "default spacer"); + recorder.assert_pixel_color(Point::new(LEFT, 78), primary, "default spacer"); + recorder.assert_pixel_color(Point::new(H_CENTER, 78), primary, "default spacer"); + recorder.assert_pixel_color(Point::new(RIGHT, 78), primary, "default spacer"); // align-left - recorder.assert_pixel_color(Point::new(LEFT, 140), primary, "align-left spacer"); + recorder.assert_pixel_color(Point::new(LEFT, 110), primary, "align-left spacer"); recorder.assert_pixel_color( - Point::new(LEFT + PADDING, 140), + Point::new(H_CENTER, 110), container_color, "align-left empty", ); - // align-left-pad - recorder.assert_pixel_color( - Point::new(LEFT + PADDING, 215), - primary, - "align-left-pad spacer", - ); - recorder.assert_pixel_color( - Point::new(LEFT, 215), - container_color, - "align-left-pad empty before", - ); - recorder.assert_pixel_color( - Point::new(CENTER, 215), - container_color, - "align-left-pad empty after", - ); - // centered - recorder.assert_pixel_color(Point::new(CENTER, 295), primary, "centered spacer"); + recorder.assert_pixel_color(Point::new(H_CENTER, 142), primary, "centered spacer"); recorder.assert_pixel_color( - Point::new(LEFT + PADDING, 295), + Point::new(LEFT, 142), container_color, "centered empty before", ); recorder.assert_pixel_color( - Point::new(RIGHT - PADDING, 295), + Point::new(RIGHT, 142), container_color, "centered empty after", ); - // align-right-pad - recorder.assert_pixel_color( - Point::new(RIGHT - PADDING, 360), - primary, - "align-right-pad spacer", - ); - recorder.assert_pixel_color( - Point::new(CENTER, 360), - container_color, - "align-right-pad empty before", - ); - recorder.assert_pixel_color( - Point::new(RIGHT, 360), - container_color, - "align-right-pad empty after", - ); - // align-right - recorder.assert_pixel_color(Point::new(RIGHT, 435), primary, "align-right spacer"); + recorder.assert_pixel_color(Point::new(RIGHT, 175), primary, "align-right spacer"); recorder.assert_pixel_color( - Point::new(RIGHT - PADDING, 435), + Point::new(V_CENTER, 175), container_color, "align-right empty", ); + + // Default fills the entire space + recorder.assert_pixel_color(Point::new(115, TOP), primary, "default spacer"); + recorder.assert_pixel_color(Point::new(115, V_CENTER), primary, "default spacer"); + recorder.assert_pixel_color(Point::new(115, BOTTOM), primary, "default spacer"); + + // align-top + recorder.assert_pixel_color(Point::new(285, TOP), primary, "align-top spacer"); + recorder.assert_pixel_color( + Point::new(285, V_CENTER), + container_color, + "align-top empty", + ); + + // centered + recorder.assert_pixel_color(Point::new(460, V_CENTER), primary, "centered spacer"); + recorder.assert_pixel_color( + Point::new(460, TOP), + container_color, + "centered empty before", + ); + recorder.assert_pixel_color( + Point::new(460, BOTTOM), + container_color, + "centered empty after", + ); + + // align-bottom + recorder.assert_pixel_color(Point::new(635, BOTTOM), primary, "align-bottom spacer"); + recorder.assert_pixel_color( + Point::new(635, V_CENTER), + container_color, + "align-bottom empty", + ); }); } diff --git a/guide/guide-examples/src/lib.rs b/guide/guide-examples/src/lib.rs index 99930ff..40f2bcb 100644 --- a/guide/guide-examples/src/lib.rs +++ b/guide/guide-examples/src/lib.rs @@ -67,3 +67,10 @@ impl BookExample { // { // } } + +#[macro_export] +macro_rules! book_example { + ($name:ident) => { + guide_examples::BookExample::new(stringify!($name), $name()) + }; +} diff --git a/guide/src/SUMMARY.md b/guide/src/SUMMARY.md index 7390c82..2660906 100644 --- a/guide/src/SUMMARY.md +++ b/guide/src/SUMMARY.md @@ -1,3 +1,42 @@ # Summary -- [Chapter 1](./chapter_1.md) + + +[Introduction](./intro.md) + +- [About Cushy](./about.md) + - [Cushy's Philosophies](./about/philosophies.md) +- [Widgets]() + - [Layout Widgets](./widgets/layout.md) + - [Align](./widgets/layout/align.md) + - [Collapse]() + - [Container]() + - [Expand]() + - [Grid]() + - [Layers]() + - [Resize]() + - [Stack]() + - [Wrap]() + - [Controls](./widgets/controls.md) + - [Button]() + - [Canvas]() + - [Checkbox]() + - [Color Pickers]() + - [Disclose]() + - [Input]() + - [Label]() + - [ProgressBar]() + - [Radio]() + - [Scroll]() + - [Select]() + - [Slider]() + - [Switcher]() + - [Image]() + - [TileMap]() + - [Utility Widgets](./widgets/utility.md) + - [Custom]() + - [Data]() + - [Style]() + - [Themed]() + - [ThemedMode]() + - [Space](./widgets/utility/space.md) diff --git a/guide/src/about.md b/guide/src/about.md new file mode 100644 index 0000000..4b51d64 --- /dev/null +++ b/guide/src/about.md @@ -0,0 +1 @@ +# About diff --git a/guide/src/about/philosophies.md b/guide/src/about/philosophies.md new file mode 100644 index 0000000..7db8f71 --- /dev/null +++ b/guide/src/about/philosophies.md @@ -0,0 +1,34 @@ +# Cushy's Philosophies + +There are a lot of GUI libraries with wildly varying approaches to how UIs are +displayed. Here's the philosophies that drive Cushy's design: + +- Cushy retains information between redraws so that many events can be handled + without redrawing the user interface. +- Everything is a widget. The "root" of a user interface/window is a widget, and + widgets can contain other widgets. +- Composition is powerful and easy to reason about. The built-in widget library + is aimed at providing a suite of libraries each with an individual purpose to + aide in developers being able to compose more complex user interfaces from + more basic widgets. +- If a developer dislikes a built-in widget's behavior, they should be empowered + to create their own that behaves the way they desire. To ensure developers + have this flexibility, all provided widgets must only utilize functionality + that is publicly available. +- Widgets should be flexible in the types they support, prefering trait + implementations instead of hard-coded types. For example, the Label widget + supports any type that implements `Display`. +- Cushy needs both physical pixel and resolution independent measurement types. + UI designers want to use real-world measurements that scale based on the DPI + resolution of the device it is being rendered on. Widget authors and game + developers want to work with pixel-perfect measurements to ensure perfect + alignment. + +From an implementation standpoint, Cushy has these goals: + +- For graphics, provide a wgpu-centric library that exposes a rendering API + inspired by wgpu's Encapsulating Graphics Work article. +- For windowing, embrace winit and route input events to the correct widgets. + This allows widgets to support any features that winit can support. +- Cushy should be able to idle at close to 0% CPU. Cushy should not redraw + unless needed. diff --git a/guide/src/chapter_1.md b/guide/src/chapter_1.md deleted file mode 100644 index c94bb7e..0000000 --- a/guide/src/chapter_1.md +++ /dev/null @@ -1,33 +0,0 @@ -# Aligning Widgets - -![align.rs - horizontal-align](/examples/align-horizontal.png) - -## Align a widget to the left - -```rust,no_run,no_playground -{{#include ../guide-examples/examples/align.rs:align-left}} -``` - -## Align a widget to the left, with padding - -```rust,no_run,no_playground -{{#include ../guide-examples/examples/align.rs:align-left-pad}} -``` - -## Align a widget to the center - -```rust,no_run,no_playground -{{#include ../guide-examples/examples/align.rs:centered}} -``` - -## Align a widget to the right, with padding - -```rust,no_run,no_playground -{{#include ../guide-examples/examples/align.rs:align-right-pad}} -``` - -## Align a widget to the right - -```rust,no_run,no_playground -{{#include ../guide-examples/examples/align.rs:align-right}} -``` diff --git a/guide/src/examples/align-horizontal.png b/guide/src/examples/align-horizontal.png deleted file mode 100644 index c74c4d4cdbc84d4c508a5b3d66ebd80ecfb2f9e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33666 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%0AvmD>>Vi9s=?i9tHJHXzNxr^7E^wuD8)}= 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

fsb^)8CkrUxNF}b%P7Q{d~m4z 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 literal 0 HcmV?d00001 diff --git a/guide/src/intro.md b/guide/src/intro.md new file mode 100644 index 0000000..f82f58e --- /dev/null +++ b/guide/src/intro.md @@ -0,0 +1 @@ +# Welcome diff --git a/guide/src/widgets/controls.md b/guide/src/widgets/controls.md new file mode 100644 index 0000000..3dfb862 --- /dev/null +++ b/guide/src/widgets/controls.md @@ -0,0 +1,4 @@ +# Controls + +This section contains interactive widgets that read and/or write data through +the reactive data model. diff --git a/guide/src/widgets/layout.md b/guide/src/widgets/layout.md new file mode 100644 index 0000000..3c175a6 --- /dev/null +++ b/guide/src/widgets/layout.md @@ -0,0 +1,4 @@ +# Layout + +Widgets in this section have a primary purpose of performing some layout +functionality on one or more child widgets. diff --git a/guide/src/widgets/layout/align.md b/guide/src/widgets/layout/align.md new file mode 100644 index 0000000..685c9bd --- /dev/null +++ b/guide/src/widgets/layout/align.md @@ -0,0 +1,96 @@ +# Aligning Widgets + +{{#title Align - Layout Widgets - Cushy User's Guide}} + +The [`Align`][align] widget positions a child widget within its parent. It +supports both horizontal and vertical alignment. + +It accomplishes this by requesting the child measure itself using +[`SizeToFit`][sizetofit] for the child's width and/or height, and then positions +the child to align it. + +The align widget uses [`Edges`][edges][``][flexibledimension] +to specify the alignment of each edge. If an edge is +[`FlexibleDimension::Dimension`][flexexact], that edge of the child will be +placed the exact measurement from the parent's matching edge. If an edge is +[`FlexibleDimension::Auto`][flexauto], that edge will not be positioned relative +to the parent's matching edge. + +## Examples + +![Align widget example](/examples/align.png) + +The `content()` function in each of these snippets is a [`Space`][space] widget +occupying at least 32px squared: + +```rust,no_run,no_playground +{{#include ../../../guide-examples/examples/align.rs:content}} +``` + +### Align a widget to the left + +Any widget can be aligned to the left using +[`MakeWidget::align_left()`][align-left]: + +```rust,no_run,no_playground +{{#include ../../../guide-examples/examples/align.rs:align-left}} +``` + +### Align a widget to the center + +Any widget can be centered using +[`MakeWidget::centered()`][align-center]: + +```rust,no_run,no_playground +{{#include ../../../guide-examples/examples/align.rs:horizontal-center}} +``` + +`centered()` works in both axis. To center only in one direction, "fit" the +other direction: + +- To center vertically but occupy the parent's width, use + [`MakeWidget::fit_horizontally()`][fit-vert]. +- To center horizontally but occupy the parent's height, use + [`MakeWidget::fit_vertically()`][fit-horiz]. + +### Align a widget to the right + +Any widget can be aligned to the right using +[`MakeWidget::align_right()`][align-right]: + +```rust,no_run,no_playground +{{#include ../../../guide-examples/examples/align.rs:align-right}} +``` + +### Align a widget to the top + +Any widget can be aligned to the top using +[`MakeWidget::align_top()`][align-top]: + +```rust,no_run,no_playground +{{#include ../../../guide-examples/examples/align.rs:align-top}} +``` + +### Align a widget to the bottom + +Any widget can be aligned to the bottom using +[`MakeWidget::align_bottom()`][align-bottom]: + +```rust,no_run,no_playground +{{#include ../../../guide-examples/examples/align.rs:align-bottom}} +``` + +[align]: <{{ docs }}/widgets/struct.Align.html> +[align-left]: <{{ docs }}/widget/trait.MakeWidget.html#method.align_left> +[align-center]: <{{ docs }}/widget/trait.MakeWidget.html#method.centered> +[align-right]: <{{ docs }}/widget/trait.MakeWidget.html#method.align_right> +[align-top]: <{{ docs }}/widget/trait.MakeWidget.html#method.align_top> +[align-bottom]: <{{ docs }}/widget/trait.MakeWidget.html#method.align_bottom> +[sizetofit]: <{{ docs }}/enum.ConstraintLimit.html#variant.SizeToFit> +[edges]: <{{ docs }}/styles/struct.Edges.html> +[flexibledimension]: <{{ docs }}/styles/enum.FlexibleDimension.html> +[flexexact]: <{{ docs }}/styles/enum.FlexibleDimension.html#variant.Dimension> +[flexauto]: <{{ docs }}/styles/enum.FlexibleDimension.html#variant.Auto> +[fit-vert]: +[fit-horiz]: +[space]: ../utility/space.md diff --git a/guide/src/widgets/layout/layout.md b/guide/src/widgets/layout/layout.md new file mode 100644 index 0000000..40eefa2 --- /dev/null +++ b/guide/src/widgets/layout/layout.md @@ -0,0 +1 @@ +# Layout Widgets diff --git a/guide/src/widgets/utility.md b/guide/src/widgets/utility.md new file mode 100644 index 0000000..e02d2dd --- /dev/null +++ b/guide/src/widgets/utility.md @@ -0,0 +1,4 @@ +# Utility Widgets + +The widgets in this section are non-interactive widgets that do not directly +impact the layout of other widgets. diff --git a/guide/src/widgets/utility/space.md b/guide/src/widgets/utility/space.md new file mode 100644 index 0000000..01d908a --- /dev/null +++ b/guide/src/widgets/utility/space.md @@ -0,0 +1,5 @@ +# Space Widget + +The [`Space`][space] + +[space]: <{{ docs }}/widgets/struct.Space.html>