// Copyright 2019 The Druid Authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. //! This is a very small example of how to setup a Druid application. //! It does the almost bare minimum while still being useful. // On Windows platform, don't show a console when opening the app. #![windows_subsystem = "windows"] use druid::widget::prelude::*; use druid::widget::{Flex, Label, TextBox}; use druid::{AppLauncher, Data, Lens, UnitPoint, WidgetExt, WindowDesc}; const VERTICAL_WIDGET_SPACING: f64 = 20.0; const TEXT_BOX_WIDTH: f64 = 200.0; #[derive(Clone, Data, Lens)] struct HelloState { name: String, } pub fn main() { // describe the main window let main_window = WindowDesc::new(build_root_widget()) .title("Hello World!") .window_size((400.0, 400.0)); // create the initial app state let initial_state: HelloState = HelloState { name: "World".into(), }; // start the application. Here we pass in the application state. AppLauncher::with_window(main_window) .log_to_console() .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| { if data.name.is_empty() { "Hello anybody!?".to_string() } else { format!("Hello {}!", data.name) } }) .with_text_size(32.0); // a textbox that modifies `name`. let textbox = TextBox::new() .with_placeholder("Who are we greeting?") .with_text_size(18.0) .fix_width(TEXT_BOX_WIDTH) .lens(HelloState::name); // arrange the two widgets vertically, with some padding Flex::column() .with_child(label) .with_spacer(VERTICAL_WIDGET_SPACING) .with_child(textbox) .align_vertical(UnitPoint::CENTER) }