Skip to content

Commit fa25bab

Browse files
committed
docs: add screenshot of generated KDL UI screen to README and codegen guide
1 parent 660395d commit fa25bab

8 files changed

Lines changed: 47 additions & 11 deletions

File tree

README.md

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,16 +32,22 @@ Heavily inspired by modern wearable and smartwatch UI frameworks—its animation
3232
Author your UI screen in declarative KDL (`ui/dashboard.kdl`):
3333
```kdl
3434
screen id="Dashboard" width=320 height=240 theme="dark" {
35-
grid cols="140px 1fr" rows="24px 1fr 40px" gap=6 padding=8 {
36-
status_bar id="Header" col=0 row=0 col_span=2 time="10:42"
37-
scale id="Tach" col=0 row=1 mode="radial" min=0.0 max=120.0 value=65.0
38-
spinbox id="TargetTemp" col=1 row=1 min=150 max=350 value=225
39-
button id="ApplyBtn" col=0 row=2 text="APPLY"
40-
toggle id="EcoMode" col=1 row=2 label="ECO" checked=true
35+
grid cols="140px 1fr" rows="24px 1fr 48px" gap=6 padding=8 {
36+
banner col=0 row=0 col_span=2 text="Living Room Climate"
37+
spinbox id="TempSetpoint" col=0 row=1 min=100 max=350 value=225 digits=4 decimals=1
38+
scale id="RoomGauge" col=1 row=1 mode="radial" min=10.0 max=40.0 value=22.5
39+
button id="FanBtn" col=0 row=2 text="FAN HIGH"
40+
toggle id="EcoMode" col=1 row=2 checked=true
4141
}
4242
}
4343
```
4444

45+
<div align="center">
46+
<img src="docs/screenshots/kdl_generated_screen.png" width="420" alt="Generated KDL Screen Render"><br/>
47+
<sub><b>Zero-Allocation Result:</b> 2D Grid Layout, decimal spinbox, tachometer scale, button, and toggle compiled directly into pure <code>no_std</code> Rust.</sub>
48+
</div>
49+
<br/>
50+
4551
Include and compile directly into zero-allocation `#![no_std]` Rust code:
4652
```rust
4753
use embedded_gui::prelude::*;
@@ -54,9 +60,9 @@ fn main() {
5460
let app = DashboardApp::build(&mut gui).expect("failed to build UI");
5561

5662
// Strongly-typed widget IDs generated automatically:
57-
// app.widgets.tach
58-
// app.widgets.target_temp
59-
// app.widgets.apply_btn
63+
// app.widgets.room_gauge
64+
// app.widgets.temp_setpoint
65+
// app.widgets.fan_btn
6066
// app.widgets.eco_mode
6167
}
6268
```

crates/embedded-gui/Cargo.toml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,3 +143,8 @@ required-features = ["std"]
143143
name = "cinematic_transitions_showcase"
144144
path = "examples/basics/cinematic_transitions_showcase.rs"
145145
required-features = ["std"]
146+
147+
[[example]]
148+
name = "generate_readme_screenshots"
149+
path = "examples/integrations/generate_readme_screenshots.rs"
150+
required-features = ["std", "macros"]

crates/embedded-gui/examples/integrations/generate_readme_screenshots.rs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ use embedded_graphics_core::{
55
use embedded_graphics_simulator::{OutputSettingsBuilder, SimulatorDisplay};
66
use embedded_gui::prelude::*;
77

8+
embedded_gui::include_gui!("examples/ui/smart_thermostat.kdl");
9+
810
const DASHBOARD_W: u32 = 192;
911
const DASHBOARD_H: u32 = 120;
1012
const FONT_W: u32 = 240;
@@ -70,10 +72,23 @@ fn run() -> Result<(), Box<dyn std::error::Error>> {
7072
.save_png(path)?;
7173
}
7274

73-
println!("wrote dashboard/fonts/motion/flipcard PNGs to docs/screenshots");
75+
let mut kdl_display = SimulatorDisplay::<Rgb565>::new(Size::new(320, 240));
76+
draw_kdl_screen_showcase(&mut kdl_display);
77+
let kdl_settings = OutputSettingsBuilder::new().scale(2).build();
78+
kdl_display
79+
.to_rgb_output_image(&kdl_settings)
80+
.save_png("docs/screenshots/kdl_generated_screen.png")?;
81+
82+
println!("wrote dashboard/fonts/motion/flipcard/kdl PNGs to docs/screenshots");
7483
Ok(())
7584
}
7685

86+
fn draw_kdl_screen_showcase(display: &mut SimulatorDisplay<Rgb565>) {
87+
let mut gui = GuiContext::<32, 16, 16>::new(Rect::new(0, 0, 320, 240));
88+
let _app = SmartThermostatApp::build(&mut gui).expect("build kdl app");
89+
gui.render(display).expect("render");
90+
}
91+
7792
fn draw_dashboard_showcase(display: &mut SimulatorDisplay<Rgb565>) {
7893
let mut gui = GuiContext::<32, 32, 24>::new(Rect::new(0, 0, DASHBOARD_W, DASHBOARD_H));
7994
gui.add_themed_panel(Rect::new(4, 4, 184, 112))

docs/kdl-gui-codegen-guide.md

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,17 @@ screen id="ClimateControl" width=320 height=240 theme="dark" {
4949
}
5050
```
5151

52-
### 3. Include and Instantiate in Rust
52+
### 3. Generated Visual UI Output
53+
54+
<div align="center">
55+
<img src="../docs/screenshots/kdl_generated_screen.png" width="480" alt="Generated KDL Screen Render">
56+
<br/>
57+
<sub><b>Compiled KDL UI:</b> 2D Grid Layout, precision numeric spinbox, radial scale tachometer, action button, and stateful toggle.</sub>
58+
</div>
59+
60+
<br/>
61+
62+
### 4. Include and Instantiate in Rust
5363
```rust
5464
use embedded_gui::prelude::*;
5565

docs/screenshots/dashboard.png

4.52 KB
Loading

docs/screenshots/fonts.png

4.99 KB
Loading
3.61 KB
Loading

docs/screenshots/motion.png

5.16 KB
Loading

0 commit comments

Comments
 (0)