Skip to main content

dialog/
dialog.rs

1// Copyright (c) 2026 John Law
2// SPDX-License-Identifier: MIT
3
4//! An app with only a dialog: a small form placed with rows and columns.
5//!
6//! Run it with `cargo run -p glasskit --example dialog`.
7
8use glasskit::Ui;
9use glasskit::dialog::{Bounds, Dialog, EditStyle, Event, Flow};
10use glasskit::layout::{Column, Size};
11
12fn main() -> glasskit::Result<()> {
13    let ui = Ui::new()?;
14    let (width, height) = (420, 186);
15    let mut d = Dialog::new(&ui, "Profile", width, height)?;
16    let mut rows = Column::new(Bounds::new(0, 0, width, height).inset(16), 10);
17
18    let field = |row: Bounds| row.columns([Size::Fixed(110), Size::Fill(1)], 8);
19    let [label, control] = field(rows.next(26));
20    d.add_label("Name", label)?;
21    let name = d.add_edit(EditStyle::default(), control)?;
22    let [label, control] = field(rows.next(26));
23    d.add_label("Language", label)?;
24    let language = d.add_drop_down(control)?;
25    d.set_items(language, &["English", "Cantonese", "Japanese"]);
26    d.set_selected(language, Some(0));
27    let news = d.add_check("Send me news", rows.next(26))?;
28
29    let [_, save, cancel] = rows
30        .next(30)
31        .columns([Size::Fill(1), Size::Fixed(96), Size::Fixed(96)], 8);
32    let save = d.add_button("Save", save)?;
33    let cancel = d.add_button("Cancel", cancel)?;
34
35    d.run(|d, event| match event {
36        Event::Clicked(id) if id == save => {
37            println!(
38                "{} / {:?} / news: {}",
39                d.text(name),
40                d.selected(language),
41                d.checked(news)
42            );
43            Flow::Close
44        }
45        Event::Submit => Flow::Continue,
46        Event::Clicked(id) if id == cancel => Flow::Close,
47        Event::Close => Flow::Close,
48        _ => Flow::Continue,
49    })?;
50    Ok(())
51}