From 119e82a758ba80e37cef7cabf97317c64b6700b4 Mon Sep 17 00:00:00 2001 From: Eduardo Flores Date: Mon, 25 Nov 2024 15:08:08 +0100 Subject: [PATCH] add: image example --- examples/image/Cargo.toml | 13 +++++ examples/image/src/main.rs | 105 +++++++++++++++++++++++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 examples/image/Cargo.toml create mode 100644 examples/image/src/main.rs diff --git a/examples/image/Cargo.toml b/examples/image/Cargo.toml new file mode 100644 index 00000000..2af9135f --- /dev/null +++ b/examples/image/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "image" +version = "0.1.0" +edition = "2021" + +[dependencies] +tracing = "0.1.37" +tracing-subscriber = "0.3.17" + +[dependencies.libcosmic] +path = "../../" +default-features = false +features = ["debug", "winit", "wgpu", "tokio"] diff --git a/examples/image/src/main.rs b/examples/image/src/main.rs new file mode 100644 index 00000000..16bc9934 --- /dev/null +++ b/examples/image/src/main.rs @@ -0,0 +1,105 @@ +// Copyright 2023 System76 +// SPDX-License-Identifier: MPL-2.0 + +//! Application API example + +use cosmic::app::{Core, Settings, Task}; +use cosmic::{executor, iced, widget, ApplicationExt, Element}; + +/// Runs application with these settings +#[rustfmt::skip] +fn main() -> Result<(), Box> { + cosmic::app::run::(Settings::default(), ())?; + + Ok(()) +} + +/// Messages that are used specifically by our [`App`]. +#[derive(Clone, Debug)] +pub enum Message { + SetAlternateHandle, +} + +/// The [`App`] stores application-specific state. +pub struct App { + core: Core, +} + +/// 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.AppDemo"; + + fn core(&self) -> &Core { + &self.core + } + + fn core_mut(&mut self) -> &mut Core { + &mut self.core + } + + /// Creates the application, and optionally emits task on initialize. + fn init(core: Core, _input: Self::Flags) -> (Self, Task) { + let mut app = App { core }; + + let command = app.update_title(); + + (app, command) + } + + /// Handle application events here. + fn update(&mut self, message: Self::Message) -> Task { + match message { + Message::SetAlternateHandle => { + let path = "/usr/share/backgrounds/pop/nick-nazzaro-ice-cave.png"; + Task::batch(vec![cosmic::widget::image::set_handle( + widget::Id::new(path.clone()), + path, + )]) + } + } + } + + /// Creates a view after each update. + fn view(&self) -> Element { + let mut content = cosmic::widget::column().spacing(12); + let path = "/usr/share/backgrounds/pop/kait-herzog-8242.jpg"; + content = content.push( + cosmic::widget::button::custom( + cosmic::widget::image::image(path).id(widget::Id::new(path.clone())), + ) + .width(300.0), + ); + + content = content.push( + widget::button::text("Set alternate handle").on_press(Message::SetAlternateHandle), + ); + + let centered = cosmic::widget::container(content) + .width(iced::Length::Fill) + .height(iced::Length::Shrink) + .align_x(iced::Alignment::Center) + .align_y(iced::Alignment::Center); + + Element::from(centered) + } +} + +impl App +where + Self: cosmic::Application, +{ + fn update_title(&mut self) -> Task { + self.set_header_title(String::from("Image Button Demo")); + self.set_window_title(String::from("Image Button Demo")) + } +}