use druid::widget::{Align, Flex, Label, TextBox}; use druid::{AppLauncher, Data, Env, Lens, LocalizedString, Widget, WindowDesc, WidgetExt}; const VERTICAL_WIDGET_SPACING: f64 = 20.0; const TEXT_BOX_WIDTH: f64 = 200.0; const WINDOW_TITLE: LocalizedString = LocalizedString::new("Hello World!"); #[derive(Clone, Data, Lens)] struct HelloState { name: String, } fn main() { // describe the main window let main_window = WindowDesc::new(build_root_widget) .title(WINDOW_TITLE) .window_size((400.0, 400.0)); // create the initial app state let initial_state = HelloState { name: "World".into(), }; // start the application AppLauncher::with_window(main_window) .launch(initial_state) .expect("Failed to launch application"); } fn build_root_widget() -> impl Widget { // a label that will determine its text based on the current app data. let label = Label::new(|data: &HelloState, _env: &Env| format!("Hello {}!", data.name)); // a text box that modifies `name`. let text_box = TextBox::new() .with_placeholder("Who are we greeting?") .fix_width(TEXT_BOX_WIDTH) // .expand_width() .lens(HelloState::name); // arrange the two widgets vertically, with some padding let layout = Flex::column() .with_child(label) .with_spacer(VERTICAL_WIDGET_SPACING) .with_child(text_box); // center the two widgets in the available space Align::centered(layout) }