From df3107e1d45229f9a55e504cbf050291b15fadda Mon Sep 17 00:00:00 2001 From: Olivier FAURE Date: Thu, 23 Jan 2025 18:21:53 +0000 Subject: [PATCH] Add screenshots to documentation (#832) Create include_screenshot macro --- masonry/examples/calc_masonry.rs | 2 +- masonry/examples/custom_widget.rs | 2 +- masonry/examples/grid_masonry.rs | 2 +- masonry/examples/readme.md | 45 ++++++++++++++++-- ...lc_masonry__tests__initial_screenshot.png} | Bin ...tom_widget__tests__initial_screenshot.png} | Bin ...id_masonry__tests__initial_screenshot.png} | Bin ...mple_image__tests__initial_screenshot.png} | Bin ...to_do_list__tests__initial_screenshot.png} | Bin masonry/examples/simple_image.rs | 2 +- masonry/examples/to_do_list.rs | 2 +- masonry/src/lib.rs | 2 + masonry/src/testing/screenshots.rs | 27 +++++++++++ masonry/src/widget/align.rs | 2 + masonry/src/widget/button.rs | 2 + masonry/src/widget/checkbox.rs | 2 + masonry/src/widget/flex.rs | 2 + masonry/src/widget/grid.rs | 3 ++ masonry/src/widget/label.rs | 2 + masonry/src/widget/progress_bar.rs | 2 + masonry/src/widget/prose.rs | 2 + masonry/src/widget/scroll_bar.rs | 3 ++ masonry/src/widget/sized_box.rs | 2 + masonry/src/widget/spinner.rs | 2 + masonry/src/widget/split.rs | 2 + masonry/src/widget/zstack.rs | 2 + 26 files changed, 103 insertions(+), 9 deletions(-) rename masonry/examples/screenshots/{calc_masonry__tests__calc.png => calc_masonry__tests__initial_screenshot.png} (100%) rename masonry/examples/screenshots/{custom_widget__tests__custom_widget.png => custom_widget__tests__initial_screenshot.png} (100%) rename masonry/examples/screenshots/{grid_masonry__tests__grid_masonry.png => grid_masonry__tests__initial_screenshot.png} (100%) rename masonry/examples/screenshots/{simple_image__tests__grid_masonry.png => simple_image__tests__initial_screenshot.png} (100%) rename masonry/examples/screenshots/{to_do_list__tests__to_do_list.png => to_do_list__tests__initial_screenshot.png} (100%) diff --git a/masonry/examples/calc_masonry.rs b/masonry/examples/calc_masonry.rs index 1595268b..5c1c16be 100644 --- a/masonry/examples/calc_masonry.rs +++ b/masonry/examples/calc_masonry.rs @@ -414,7 +414,7 @@ mod tests { fn screenshot_test() { let mut harness = TestHarness::create(build_calc()); assert_debug_snapshot!(harness.root_widget()); - assert_render_snapshot!(harness, "calc"); + assert_render_snapshot!(harness, "initial_screenshot"); // TODO - Test clicking buttons } diff --git a/masonry/examples/custom_widget.rs b/masonry/examples/custom_widget.rs index 5d30c8fe..3da5e353 100644 --- a/masonry/examples/custom_widget.rs +++ b/masonry/examples/custom_widget.rs @@ -193,6 +193,6 @@ mod tests { let mut harness = TestHarness::create(CustomWidget(my_string)); assert_debug_snapshot!(harness.root_widget()); - assert_render_snapshot!(harness, "custom_widget"); + assert_render_snapshot!(harness, "initial_screenshot"); } } diff --git a/masonry/examples/grid_masonry.rs b/masonry/examples/grid_masonry.rs index 60e441c5..3dec8d3b 100644 --- a/masonry/examples/grid_masonry.rs +++ b/masonry/examples/grid_masonry.rs @@ -140,7 +140,7 @@ mod tests { fn screenshot_test() { let mut harness = TestHarness::create(make_grid(1.0)); assert_debug_snapshot!(harness.root_widget()); - assert_render_snapshot!(harness, "grid_masonry"); + assert_render_snapshot!(harness, "initial_screenshot"); // TODO - Test clicking buttons } diff --git a/masonry/examples/readme.md b/masonry/examples/readme.md index 46cb089e..b52a6fa6 100644 --- a/masonry/examples/readme.md +++ b/masonry/examples/readme.md @@ -1,7 +1,44 @@ # Masonry examples -TODO: +## `hello_masonry` -- List examples in this folder -- Add screenshot test to each example -- Use the screenshot in this list +Simples possible Masonry app. + +## `two_textboxes` + +Example used to test text input and text focus. + + +## `calc_masonry` + +![](screenshots/calc_masonry__tests__initial_screenshot.png) + +Calculator app. + + +## `to_do_list` + +![](screenshots/to_do_list__tests__initial_screenshot.png) + +To-do list app. + + +## `custom_widget` + +![](screenshots/custom_widget__tests__initial_screenshot.png) + +Static render showing off Vello's capabilities. + + +## `grid_masonry` + +![](screenshots/grid_masonry__tests__initial_screenshot.png) + +Demonstration of the grid layout. + + +## `simple_image` + +![](screenshots/simple_image__tests__initial_screenshot.png) + +Simple image example. diff --git a/masonry/examples/screenshots/calc_masonry__tests__calc.png b/masonry/examples/screenshots/calc_masonry__tests__initial_screenshot.png similarity index 100% rename from masonry/examples/screenshots/calc_masonry__tests__calc.png rename to masonry/examples/screenshots/calc_masonry__tests__initial_screenshot.png diff --git a/masonry/examples/screenshots/custom_widget__tests__custom_widget.png b/masonry/examples/screenshots/custom_widget__tests__initial_screenshot.png similarity index 100% rename from masonry/examples/screenshots/custom_widget__tests__custom_widget.png rename to masonry/examples/screenshots/custom_widget__tests__initial_screenshot.png diff --git a/masonry/examples/screenshots/grid_masonry__tests__grid_masonry.png b/masonry/examples/screenshots/grid_masonry__tests__initial_screenshot.png similarity index 100% rename from masonry/examples/screenshots/grid_masonry__tests__grid_masonry.png rename to masonry/examples/screenshots/grid_masonry__tests__initial_screenshot.png diff --git a/masonry/examples/screenshots/simple_image__tests__grid_masonry.png b/masonry/examples/screenshots/simple_image__tests__initial_screenshot.png similarity index 100% rename from masonry/examples/screenshots/simple_image__tests__grid_masonry.png rename to masonry/examples/screenshots/simple_image__tests__initial_screenshot.png diff --git a/masonry/examples/screenshots/to_do_list__tests__to_do_list.png b/masonry/examples/screenshots/to_do_list__tests__initial_screenshot.png similarity index 100% rename from masonry/examples/screenshots/to_do_list__tests__to_do_list.png rename to masonry/examples/screenshots/to_do_list__tests__initial_screenshot.png diff --git a/masonry/examples/simple_image.rs b/masonry/examples/simple_image.rs index 35218374..f594ecfd 100644 --- a/masonry/examples/simple_image.rs +++ b/masonry/examples/simple_image.rs @@ -63,6 +63,6 @@ mod tests { fn screenshot_test() { let mut harness = TestHarness::create(make_image()); assert_debug_snapshot!(harness.root_widget()); - assert_render_snapshot!(harness, "grid_masonry"); + assert_render_snapshot!(harness, "initial_screenshot"); } } diff --git a/masonry/examples/to_do_list.rs b/masonry/examples/to_do_list.rs index c5f641ea..c6d62d8e 100644 --- a/masonry/examples/to_do_list.rs +++ b/masonry/examples/to_do_list.rs @@ -88,7 +88,7 @@ mod tests { fn screenshot_test() { let mut harness = TestHarness::create(make_widget_tree()); assert_debug_snapshot!(harness.root_widget()); - assert_render_snapshot!(harness, "to_do_list"); + assert_render_snapshot!(harness, "initial_screenshot"); // TODO - Test clicking buttons // TODO - Test typing text diff --git a/masonry/src/lib.rs b/masonry/src/lib.rs index 4769e890..6a3c5b40 100644 --- a/masonry/src/lib.rs +++ b/masonry/src/lib.rs @@ -96,6 +96,8 @@ //! [Druid]: https://crates.io/crates/druid //! [Xilem]: https://crates.io/crates/xilem //! [tracing_tracy]: https://crates.io/crates/tracing-tracy +// TODO: Add screenshot. This can't use include_screenshot as that doesn't work with cargo-rdme +// See https://github.com/linebender/xilem/issues/851 // LINEBENDER LINT SET - lib.rs - v1 // See https://linebender.org/wiki/canonical-lints/ diff --git a/masonry/src/testing/screenshots.rs b/masonry/src/testing/screenshots.rs index 7d27efe6..57e808b1 100644 --- a/masonry/src/testing/screenshots.rs +++ b/masonry/src/testing/screenshots.rs @@ -6,6 +6,33 @@ use image::{GenericImageView as _, RgbImage}; use nv_flip::{FlipImageRgb8, DEFAULT_PIXELS_PER_DEGREE}; +#[cfg(docsrs)] +#[doc(hidden)] +#[macro_export] +macro_rules! include_screenshot { + ($path:literal $(, $caption:literal)? $(,)?) => { + concat!( + "![", $($caption,)? "]", + "(", "https://media.githubusercontent.com/media/linebender/xilem/", + "masonry-v", env!("CARGO_PKG_VERSION"), "/masonry/src/", $path, + ")", + ) + }; +} + +#[cfg(not(docsrs))] +#[doc(hidden)] +#[macro_export] +/// Macro used to create markdown img tag, with a different URL when uploading to docs.rs. +macro_rules! include_screenshot { + ($path:literal $(, $caption:literal)? $(,)?) => { + concat!( + "![", $($caption,)? "]", + "(", env!("CARGO_MANIFEST_DIR"), "/src/", $path, ")", + ) + }; +} + pub(crate) fn get_image_diff(ref_image: &RgbImage, new_image: &RgbImage) -> Option { assert_eq!( (ref_image.width(), ref_image.height()), diff --git a/masonry/src/widget/align.rs b/masonry/src/widget/align.rs index f6d7ec43..4da55f39 100644 --- a/masonry/src/widget/align.rs +++ b/masonry/src/widget/align.rs @@ -24,6 +24,8 @@ use crate::{ // TODO - Have child widget type as generic argument /// A widget that aligns its child. +/// +#[doc = crate::include_screenshot!("widget/screenshots/masonry__widget__align__tests__right.png", "Right-aligned label.")] pub struct Align { align: UnitPoint, child: WidgetPod, diff --git a/masonry/src/widget/button.rs b/masonry/src/widget/button.rs index 4d9a532e..367dea5b 100644 --- a/masonry/src/widget/button.rs +++ b/masonry/src/widget/button.rs @@ -26,6 +26,8 @@ const LABEL_INSETS: Insets = Insets::uniform_xy(8., 2.); /// A button with a text label. /// /// Emits [`Action::ButtonPressed`] when pressed. +/// +#[doc = crate::include_screenshot!("widget/screenshots/masonry__widget__button__tests__hello.png", "Button with text label.")] pub struct Button { label: WidgetPod