From 33db28327ab5c826d818f050934cc2f1173ab845 Mon Sep 17 00:00:00 2001 From: Michael Aaron Murphy Date: Tue, 9 Apr 2024 09:49:08 +0200 Subject: [PATCH] feat(example): add text-input example --- examples/text-input/Cargo.toml | 14 ++++ examples/text-input/src/main.rs | 123 ++++++++++++++++++++++++++++++++ 2 files changed, 137 insertions(+) create mode 100644 examples/text-input/Cargo.toml create mode 100644 examples/text-input/src/main.rs diff --git a/examples/text-input/Cargo.toml b/examples/text-input/Cargo.toml new file mode 100644 index 00000000..e84f9eec --- /dev/null +++ b/examples/text-input/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "text-input" +version = "0.1.0" +edition = "2021" + +[dependencies] +tracing = "0.1.37" +tracing-subscriber = "0.3.17" +tracing-log = "0.2.0" + +[dependencies.libcosmic] +path = "../../" +default-features = false +features = ["debug", "winit", "tokio", "xdg-portal"] diff --git a/examples/text-input/src/main.rs b/examples/text-input/src/main.rs new file mode 100644 index 00000000..26343bdd --- /dev/null +++ b/examples/text-input/src/main.rs @@ -0,0 +1,123 @@ +// Copyright 2023 System76 +// SPDX-License-Identifier: MPL-2.0 + +//! Application API example + +use cosmic::app::{Command, Core, Settings}; +use cosmic::{executor, iced, ApplicationExt, Element}; + +/// Runs application with these settings +#[rustfmt::skip] +fn main() -> Result<(), Box> { + tracing_subscriber::fmt::init(); + let _ = tracing_log::LogTracer::init(); + + cosmic::app::run::(Settings::default(), ())?; + + Ok(()) +} + +/// Messages that are used specifically by our [`App`]. +#[derive(Clone, Debug)] +pub enum Message { + EditMode(bool), + Input(String), +} + +/// The [`App`] stores application-specific state. +pub struct App { + core: Core, + input: String, + editing: bool, + search_id: cosmic::widget::Id, +} + +/// Implement [`cosmic::Application`] to integrate with COSMIC. +impl cosmic::Application for App { + /// Default async executor to use with the app. + type Executor = executor::Default; + + /// Argument received [`cosmic::Application::new`]. + type Flags = (); + + /// Message type specific to our [`App`]. + type Message = Message; + + /// The unique application ID to supply to the window manager. + const APP_ID: &'static str = "org.cosmic.TextInputsDemo"; + + fn core(&self) -> &Core { + &self.core + } + + fn core_mut(&mut self) -> &mut Core { + &mut self.core + } + + /// Creates the application, and optionally emits command on initialize. + fn init(core: Core, _input: Self::Flags) -> (Self, Command) { + let mut app = App { + core, + editing: false, + input: String::from("Test"), + search_id: cosmic::widget::Id::unique(), + }; + + let commands = Command::batch(vec![ + cosmic::widget::text_input::focus(app.search_id.clone()), + app.update_title(), + ]); + + (app, commands) + } + + /// Handle application events here. + fn update(&mut self, message: Self::Message) -> Command { + match message { + Message::Input(text) => { + self.input = text; + } + + Message::EditMode(editing) => { + self.editing = editing; + } + } + + Command::none() + } + + /// Creates a view after each update. + fn view(&self) -> Element { + let editable = cosmic::widget::editable_input( + "Input text here", + &self.input, + self.editing, + Message::EditMode, + ) + .on_input(Message::Input) + .id(self.search_id.clone()); + + let inline = cosmic::widget::inline_input(&self.input).on_input(Message::Input); + + let column = cosmic::widget::column().push(editable).push(inline); + + let centered = cosmic::widget::container(column.width(200)) + .width(iced::Length::Fill) + .height(iced::Length::Shrink) + .align_x(iced::alignment::Horizontal::Center) + .align_y(iced::alignment::Vertical::Center); + + Element::from(centered) + } +} + +impl App +where + Self: cosmic::Application, +{ + fn update_title(&mut self) -> Command { + let window_title = format!("COSMIC TextInputs Demo"); + self.set_header_title(window_title.clone()); + self.set_window_title(window_title) + } +}