Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions .cargo/config.toml

This file was deleted.

2 changes: 1 addition & 1 deletion .github/workflows/gh-pages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ jobs:
- name: Setup mdBook
uses: peaceiris/actions-mdbook@v2
with:
mdbook-version: '0.4.21'
mdbook-version: '0.4.52'
# mdbook-version: 'latest'

- name: Build book
Expand Down
8 changes: 4 additions & 4 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@
name = "kas-tutorials"
version = "0.1.0"
authors = ["Diggory Hardy <git@dhardy.name>"]
edition = "2021"
edition = "2024"
resolver = "2"
publish = false

[dependencies]
env_logger = "0.10"
kas = "0.14.2"
kas-wgpu = "0.14.1"
env_logger = "0.11"
kas = "0.16"
kas-wgpu = "0.16"
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ Example apps can be found in the

Run examples like this:
```sh
cargo run --example simple-window
cargo run --example hello
```

## Licence
Expand Down
37 changes: 19 additions & 18 deletions examples/calculator.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
use kas::event::NamedKey;
use kas::prelude::*;
use kas::widgets::{AccessLabel, Adapt, Button, EditBox};
use std::num::ParseFloatError;
use std::str::FromStr;

use kas::event::NamedKey;
use kas::prelude::*;
use kas::widgets::{AccessLabel, Adapt, Button, EditBox, column, grid};

type Key = kas::event::Key<kas::event::SmolStr>;

fn key_button(label: &str) -> Button<AccessLabel> {
Expand All @@ -15,15 +16,15 @@ fn key_button_with(label: &str, key: Key) -> Button<AccessLabel> {
Button::label_msg(label, key.clone()).with_access_key(key)
}

fn calc_ui() -> impl Widget<Data = ()> {
fn calc_ui() -> Window<()> {
// We could use kas::widget::Text, but EditBox looks better.
let display = EditBox::string(|calc: &Calculator| calc.display())
.with_multi_line(true)
.with_lines(3, 3)
.with_lines(3.0, 3.0)
.with_width_em(5.0, 10.0);

// We use map_any to avoid passing input data (not wanted by buttons):
let buttons = kas::grid! {
let buttons = grid! {
// Key bindings: C, Del
(0, 0) => Button::label_msg("&clear", Key::Named(NamedKey::Clear))
.with_access_key(NamedKey::Delete.into()),
Expand All @@ -49,22 +50,22 @@ fn calc_ui() -> impl Widget<Data = ()> {
}
.map_any();

Adapt::new(kas::column![display, buttons], Calculator::new())
.on_message(|_, calc, key| calc.handle(key))
.on_configure(|cx, _| {
cx.disable_nav_focus(true);
cx.enable_alt_bypass(true);
})
let ui = Adapt::new(column![display, buttons], Calculator::new())
.on_message(|_, calc, key| calc.handle(key));

Window::new(ui, "Calculator")
.escapable()
.with_alt_bypass()
.without_nav_focus()
}

fn main() -> kas::app::Result<()> {
fn main() -> kas::runner::Result<()> {
env_logger::init();

let theme = kas_wgpu::ShadedTheme::new().with_font_size(16.0);
kas::app::Default::with_theme(theme)
.build(())?
.with(Window::new(calc_ui(), "Calculator"))
.run()
let theme = kas_wgpu::ShadedTheme::new();
let mut app = kas::runner::Runner::with_theme(theme).build(())?;
let _ = app.config_mut().font.set_size(24.0);
app.with(calc_ui()).run()
}

#[derive(Clone, Copy, Debug, PartialEq)]
Expand Down
31 changes: 16 additions & 15 deletions examples/counter.rs
Original file line number Diff line number Diff line change
@@ -1,28 +1,29 @@
use kas::prelude::*;
use kas::widgets::{format_value, Adapt, Button};
use kas::widgets::{Button, column, format_value, row};

#[derive(Clone, Debug)]
struct Increment(i32);

fn counter() -> impl Widget<Data = ()> {
let tree = kas::column![
align!(center, format_value!("{}")),
kas::row![
Button::label_msg("−", Increment(-1)),
Button::label_msg("+", Increment(1)),
]
.map_any(),
let buttons = row![
Button::label_msg("−", Increment(-1)),
Button::label_msg("+", Increment(1)),
];
let tree = column![
format_value!("{}").align(AlignHints::CENTER),
buttons.map_any(),
];

Adapt::new(tree, 0).on_message(|_, count, Increment(add)| *count += add)
tree.with_state(0)
.on_message(|_, count, Increment(add)| *count += add)
}

fn main() -> kas::app::Result<()> {
fn main() -> kas::runner::Result<()> {
env_logger::init();

let theme = kas::theme::SimpleTheme::new().with_font_size(24.0);
kas::app::Default::with_theme(theme)
.build(())?
.with(Window::new(counter(), "Counter"))
.run()
let theme = kas::theme::SimpleTheme::new();
let mut app = kas::runner::Runner::with_theme(theme).build(())?;
let _ = app.config_mut().font.set_size(24.0);
let window = Window::new(counter(), "Counter").escapable();
app.with(window).run()
}
31 changes: 16 additions & 15 deletions examples/custom-widget.rs
Original file line number Diff line number Diff line change
@@ -1,22 +1,22 @@
use kas::prelude::*;
use kas::widgets::{format_value, AccessLabel, Button, Row, Text};
use kas::widgets::{AccessLabel, Button, Row, Text, format_value};

#[derive(Clone, Debug)]
struct Increment(i32);

impl_scope! {
#[widget{
layout = column![
align!(center, self.display),
self.buttons,
];
}]
#[impl_self]
mod Counter {
#[widget]
#[layout(column![
self.display.align(AlignHints::CENTER),
self.buttons,
])]
struct Counter {
core: widget_core!(),
#[widget(&self.count)]
display: Text<i32, String>,
#[widget]
buttons: Row<Button<AccessLabel>>,
buttons: Row<[Button<AccessLabel>; 2]>,
count: i32,
}
impl Self {
Expand Down Expand Up @@ -44,12 +44,13 @@ impl_scope! {
}
}

fn main() -> kas::app::Result<()> {
fn main() -> kas::runner::Result<()> {
env_logger::init();

let theme = kas::theme::SimpleTheme::new().with_font_size(24.0);
kas::app::Default::with_theme(theme)
.build(())?
.with(Window::new(Counter::new(0), "Counter"))
.run()
let window = Window::new(Counter::new(0), "Counter");

let theme = kas::theme::SimpleTheme::new();
let mut app = kas::runner::Runner::with_theme(theme).build(())?;
let _ = app.config_mut().font.set_size(24.0);
app.with(window).run()
}
15 changes: 9 additions & 6 deletions examples/hello.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
use kas::widgets::dialog::MessageBox;
use kas::widgets::{Button, column};
use kas::window::Window;

fn main() -> kas::app::Result<()> {
env_logger::init();
fn main() -> kas::runner::Result<()> {
let ui = column![
"Hello, world!",
Button::label("&Close").with(|cx, _| cx.exit())
];
let window = Window::new(ui, "Hello").escapable();

let window = MessageBox::new("Message").into_window("Hello world");

kas::app::Default::new(())?.with(window).run()
kas::runner::Runner::new(())?.with(window).run()
}
40 changes: 20 additions & 20 deletions examples/sync-counter.rs
Original file line number Diff line number Diff line change
@@ -1,24 +1,20 @@
use kas::widgets::{format_data, label_any, Adapt, Button, Slider};
use kas::{messages::MessageStack, Action, Window};
use kas::widgets::{AdaptWidget, Button, Label, Slider, column, format_data, row};
use kas::window::Window;

#[derive(Clone, Debug)]
struct Increment(i32);

#[derive(Clone, Copy, Debug)]
struct Count(i32);

impl kas::app::AppData for Count {
fn handle_messages(&mut self, messages: &mut MessageStack) -> Action {
impl kas::runner::AppData for Count {
fn handle_messages(&mut self, messages: &mut kas::runner::MessageStack) {
if let Some(Increment(add)) = messages.try_pop() {
self.0 += add;
Action::UPDATE
} else {
Action::empty()
}
}
}

fn counter() -> impl kas::Widget<Data = Count> {
fn counter(title: &str) -> Window<Count> {
// Per window state: (count, increment).
type Data = (Count, i32);
let initial: Data = (Count(0), 1);
Expand All @@ -27,28 +23,32 @@ fn counter() -> impl kas::Widget<Data = Count> {
struct SetValue(i32);

let slider = Slider::right(1..=10, |_, data: &Data| data.1).with_msg(SetValue);
let ui = kas::column![
let ui = column![
format_data!(data: &Data, "Count: {}", data.0.0),
row![slider, format_data!(data: &Data, "{}", data.1)],
row![
Button::new(label_any("Sub")).with(|cx, data: &Data| cx.push(Increment(-data.1))),
Button::new(label_any("Add")).with(|cx, data: &Data| cx.push(Increment(data.1))),
Button::new(Label::new_any("Sub")).with(|cx, data: &Data| cx.push(Increment(-data.1))),
Button::new(Label::new_any("Add")).with(|cx, data: &Data| cx.push(Increment(data.1))),
],
];

Adapt::new(ui, initial)
let ui = ui
.with_state(initial)
.on_update(|_, state, count| state.0 = *count)
.on_message(|_, state, SetValue(v)| state.1 = v)
.on_message(|_, state, SetValue(v)| state.1 = v);
Window::new(ui, title).escapable()
}

fn main() -> kas::app::Result<()> {
fn main() -> kas::runner::Result<()> {
env_logger::init();

let theme = kas_wgpu::ShadedTheme::new().with_font_size(24.0);
let count = Count(0);
let theme = kas_wgpu::ShadedTheme::new();

kas::app::Default::with_theme(theme)
.build(Count(0))?
.with(Window::new(counter(), "Counter 1"))
.with(Window::new(counter(), "Counter 2"))
let mut runner = kas::runner::Runner::with_theme(theme).build(count)?;
let _ = runner.config_mut().font.set_size(24.0);
runner
.with(counter("Counter 1"))
.with(counter("Counter 2"))
.run()
}
1 change: 1 addition & 0 deletions src/SUMMARY.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
- [Hello: push button](hello.md)
- [Counter: an interactive widget](counter.md)
- [Sync-counter: Adapt'ing AppData](sync-counter.md)
- [Configuration](config.md)
- [Calculator: make_widget and grid](calculator.md)
- [Custom widgets](custom-widget.md)
- [Data models](data-models.md)
Loading
Loading