From 3623c5b31501a801de90020b7d618ce763c931a7 Mon Sep 17 00:00:00 2001 From: Aaron Honeycutt Date: Fri, 17 May 2024 08:41:30 -0600 Subject: [PATCH 01/13] Init work on the menu --- i18n/en/cosmic_backups.ftl | 7 +++++++ src/app.rs | 33 ++++++++++++++++++++++++++++++++- src/app/menu.rs | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 src/app/menu.rs diff --git a/i18n/en/cosmic_backups.ftl b/i18n/en/cosmic_backups.ftl index 33cb36b..0a284b5 100644 --- a/i18n/en/cosmic_backups.ftl +++ b/i18n/en/cosmic_backups.ftl @@ -1,2 +1,9 @@ app-title = COSMIC Backups welcome = Backup and backup often! ✨ + +# Menu + +## File +file = File +new-window = New window +quit = Quit diff --git a/src/app.rs b/src/app.rs index 5e10c01..ff35b03 100644 --- a/src/app.rs +++ b/src/app.rs @@ -4,8 +4,12 @@ use crate::fl; use cosmic::app::{Command, Core}; use cosmic::iced::alignment::{Horizontal, Vertical}; use cosmic::iced::Length; +use cosmic::widget::menu::action::MenuAction; +use cosmic::widget::segmented_button::Entity; use cosmic::{widget, Application, Element}; +pub mod menu; + /// This is the struct that represents your application. /// It is used to define the data that will be used by your application. #[derive(Clone, Default)] @@ -19,7 +23,33 @@ pub struct CosmicBackups { /// This is used to communicate between the different parts of your application. /// If your application does not need to send messages, you can use an empty enum or `()`. #[derive(Debug, Clone)] -pub enum Message {} +pub enum Message { + NavMenuAction(NavMenuAction), +} + +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum Action { + WindowClose, + WindowNew, +} + +impl MenuAction for Action { + type Message = Message; + fn message(&self, _entity_opt: Option) -> Self::Message { + match self { + Action::WindowClose => Message::WindowClose, + Action::WindowNew => Message::WindowNew, + } + } +} + +impl MenuAction for NavMenuAction { + type Message = cosmic::app::Message; + + fn message(&self, _entity: Option) -> Self::Message { + cosmic::app::Message::App(Message::NavMenuAction(*self)) + } +} /// Implement the `Application` trait for your application. /// This is where you define the behavior of your application. @@ -48,6 +78,7 @@ impl Application for CosmicBackups { /// This is the header of your application, it can be used to display the title of your application. fn header_center(&self) -> Vec> { + vec![menu::menu_bar(&self.key_binds)]; vec![widget::text::heading(fl!("app-title")).into()] } diff --git a/src/app/menu.rs b/src/app/menu.rs new file mode 100644 index 0000000..7363bf7 --- /dev/null +++ b/src/app/menu.rs @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: GPL-3.0-only + +use std::collections::HashMap; + +use cosmic::widget::menu::key_bind::KeyBind; +use cosmic::{ + widget::menu::{items, root, Item, ItemHeight, ItemWidth, MenuBar, Tree}, + Element, +}; + +use crate::{ + app::{Action, Message}, + fl, +}; + +pub fn menu_bar<'a>(key_binds: &HashMap) -> Element<'a, Message> { + MenuBar::new(vec![Tree::with_children( + root(fl!("file")), + items( + key_binds, + vec![ + Item::Button(fl!("new-window"), Action::WindowNew), + Item::Divider, + Item::Button(fl!("quit"), Action::WindowClose), + ], + ), + )]) + .item_height(ItemHeight::Dynamic(40)) + .item_width(ItemWidth::Uniform(240)) + .spacing(4.0) + .into() +} From 508899d3224e7ded3cee26712454ffa882231704 Mon Sep 17 00:00:00 2001 From: Aaron Honeycutt Date: Fri, 17 May 2024 10:23:04 -0600 Subject: [PATCH 02/13] Work on menu --- src/app.rs | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/src/app.rs b/src/app.rs index ff35b03..b7c71c6 100644 --- a/src/app.rs +++ b/src/app.rs @@ -1,10 +1,13 @@ // SPDX-License-Identifier: GPL-3.0-only +use std::collections::HashMap; + use crate::fl; use cosmic::app::{Command, Core}; use cosmic::iced::alignment::{Horizontal, Vertical}; use cosmic::iced::Length; use cosmic::widget::menu::action::MenuAction; +use cosmic::widget::menu::key_bind::KeyBind; use cosmic::widget::segmented_button::Entity; use cosmic::{widget, Application, Element}; @@ -17,6 +20,7 @@ pub struct CosmicBackups { /// This is the core of your application, it is used to communicate with the Cosmic runtime. /// It is used to send messages to your application, and to access the resources of the Cosmic runtime. core: Core, + key_binds: HashMap, } /// This is the enum that contains all the possible variants that your application will need to transmit messages. @@ -24,7 +28,8 @@ pub struct CosmicBackups { /// If your application does not need to send messages, you can use an empty enum or `()`. #[derive(Debug, Clone)] pub enum Message { - NavMenuAction(NavMenuAction), + WindowClose, + WindowNew, } #[derive(Clone, Copy, Debug, Eq, PartialEq)] @@ -43,14 +48,6 @@ impl MenuAction for Action { } } -impl MenuAction for NavMenuAction { - type Message = cosmic::app::Message; - - fn message(&self, _entity: Option) -> Self::Message { - cosmic::app::Message::App(Message::NavMenuAction(*self)) - } -} - /// Implement the `Application` trait for your application. /// This is where you define the behavior of your application. /// @@ -78,8 +75,7 @@ impl Application for CosmicBackups { /// This is the header of your application, it can be used to display the title of your application. fn header_center(&self) -> Vec> { - vec![menu::menu_bar(&self.key_binds)]; - vec![widget::text::heading(fl!("app-title")).into()] + vec![menu::menu_bar(&self.key_binds)] } /// This is the entry point of your application, it is where you initialize your application. @@ -89,10 +85,13 @@ impl Application for CosmicBackups { /// - `core` is used to passed on for you by libcosmic to use in the core of your own application. /// - `flags` is used to pass in any data that your application needs to use before it starts. /// - `Command` type is used to send messages to your application. `Command::none()` can be used to send no messages to your application. - fn init(core: Core, _flags: Self::Flags) -> (Self, Command) { - let example = CosmicBackups { core }; + fn init(core: Core, _input: Self::Flags) -> (Self, Command) { + let app = CosmicBackups { + core, + key_binds: key_binds(), + }; - (example, Command::none()) + (app, Command::none()) } /// This is the main view of your application, it is the root of your widget tree. From 3c2f751b78ac2d01ac5279768a18138e1501a20f Mon Sep 17 00:00:00 2001 From: Aaron Honeycutt Date: Fri, 17 May 2024 10:28:55 -0600 Subject: [PATCH 03/13] almost a working menu --- src/app.rs | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/app.rs b/src/app.rs index b7c71c6..41c44b9 100644 --- a/src/app.rs +++ b/src/app.rs @@ -6,8 +6,10 @@ use crate::fl; use cosmic::app::{Command, Core}; use cosmic::iced::alignment::{Horizontal, Vertical}; use cosmic::iced::Length; +use cosmic::iced_core::keyboard::Key; use cosmic::widget::menu::action::MenuAction; use cosmic::widget::menu::key_bind::KeyBind; +use cosmic::widget::menu::key_bind::Modifier; use cosmic::widget::segmented_button::Entity; use cosmic::{widget, Application, Element}; @@ -109,3 +111,24 @@ impl Application for CosmicBackups { .into() } } + +pub fn key_binds() -> HashMap { + let mut key_binds = HashMap::new(); + + macro_rules! bind { + ([$($modifier:ident),* $(,)?], $key:expr, $action:ident) => {{ + key_binds.insert( + KeyBind { + modifiers: vec![$(Modifier::$modifier),*], + key: $key, + }, + Action::$action, + ); + }}; + } + + bind!([Ctrl], Key::Character("w".into()), WindowClose); + bind!([Ctrl, Shift], Key::Character("n".into()), WindowNew); + + key_binds +} From 7f65cb63d154579dae1f46e39ab8b548e6267fd7 Mon Sep 17 00:00:00 2001 From: Aaron Honeycutt Date: Fri, 17 May 2024 11:16:21 -0600 Subject: [PATCH 04/13] Fix placement of menubar --- src/app.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app.rs b/src/app.rs index 41c44b9..dcd600a 100644 --- a/src/app.rs +++ b/src/app.rs @@ -76,7 +76,7 @@ impl Application for CosmicBackups { } /// This is the header of your application, it can be used to display the title of your application. - fn header_center(&self) -> Vec> { + fn header_start(&self) -> Vec> { vec![menu::menu_bar(&self.key_binds)] } From 58ca1fe76a7dd7e21e864eb950094e50783500e3 Mon Sep 17 00:00:00 2001 From: Aaron Honeycutt Date: Fri, 17 May 2024 11:18:59 -0600 Subject: [PATCH 05/13] Update screenshot of current state --- COSMIC-Backups-PoC.png | Bin 147856 -> 0 bytes COSMIC-Backups.png | Bin 0 -> 14759 bytes README.md | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 COSMIC-Backups-PoC.png create mode 100644 COSMIC-Backups.png diff --git a/COSMIC-Backups-PoC.png b/COSMIC-Backups-PoC.png deleted file mode 100644 index 93b5ab4736324455ac0329b1e3f94040bbce0417..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147856 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 diff --git a/COSMIC-Backups.png b/COSMIC-Backups.png new file mode 100644 index 0000000000000000000000000000000000000000..e2adcb9220b9c4794ec79286caed9ce39880f120 GIT binary patch literal 14759 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 Date: Fri, 17 May 2024 12:34:25 -0600 Subject: [PATCH 06/13] Add Edit menu --- i18n/en/cosmic_backups.ftl | 4 ++++ src/app.rs | 5 ++++- src/app/menu.rs | 27 ++++++++++++++++++--------- 3 files changed, 26 insertions(+), 10 deletions(-) diff --git a/i18n/en/cosmic_backups.ftl b/i18n/en/cosmic_backups.ftl index 0a284b5..ee529f7 100644 --- a/i18n/en/cosmic_backups.ftl +++ b/i18n/en/cosmic_backups.ftl @@ -7,3 +7,7 @@ welcome = Backup and backup often! ✨ file = File new-window = New window quit = Quit + +## Edit +edit = Edit +cut = Cut diff --git a/src/app.rs b/src/app.rs index dcd600a..783c2f0 100644 --- a/src/app.rs +++ b/src/app.rs @@ -30,22 +30,25 @@ pub struct CosmicBackups { /// If your application does not need to send messages, you can use an empty enum or `()`. #[derive(Debug, Clone)] pub enum Message { + Cut(Option), WindowClose, WindowNew, } #[derive(Clone, Copy, Debug, Eq, PartialEq)] pub enum Action { + Cut, WindowClose, WindowNew, } impl MenuAction for Action { type Message = Message; - fn message(&self, _entity_opt: Option) -> Self::Message { + fn message(&self, entity_opt: Option) -> Self::Message { match self { Action::WindowClose => Message::WindowClose, Action::WindowNew => Message::WindowNew, + Action::Cut => Message::Cut(entity_opt), } } } diff --git a/src/app/menu.rs b/src/app/menu.rs index 7363bf7..5ad75c1 100644 --- a/src/app/menu.rs +++ b/src/app/menu.rs @@ -15,16 +15,25 @@ use crate::{ pub fn menu_bar<'a>(key_binds: &HashMap) -> Element<'a, Message> { MenuBar::new(vec![Tree::with_children( - root(fl!("file")), - items( - key_binds, - vec![ - Item::Button(fl!("new-window"), Action::WindowNew), - Item::Divider, - Item::Button(fl!("quit"), Action::WindowClose), - ], + root(fl!("file")), + items( + key_binds, + vec![ + Item::Button(fl!("new-window"), Action::WindowNew), + Item::Button(fl!("quit"), Action::WindowClose), + ], + ), ), - )]) + Tree::with_children( + root(fl!("edit")), + items( + key_binds, + vec![ + Item::Button(fl!("cut"), Action::Cut), + ], + ), + ), + ]) .item_height(ItemHeight::Dynamic(40)) .item_width(ItemWidth::Uniform(240)) .spacing(4.0) From 8fed54d3da5b061bcebea7eb92372b8ab885ceb6 Mon Sep 17 00:00:00 2001 From: Aaron Honeycutt Date: Fri, 17 May 2024 13:03:49 -0600 Subject: [PATCH 07/13] Work on View -> About --- i18n/en/cosmic_backups.ftl | 10 +++++++ src/app.rs | 57 ++++++++++++++++++++++++++++++++++++-- src/app/menu.rs | 9 ++++++ 3 files changed, 74 insertions(+), 2 deletions(-) diff --git a/i18n/en/cosmic_backups.ftl b/i18n/en/cosmic_backups.ftl index ee529f7..da6c2ec 100644 --- a/i18n/en/cosmic_backups.ftl +++ b/i18n/en/cosmic_backups.ftl @@ -1,6 +1,12 @@ +cosmic-backups = COSMIC Backups app-title = COSMIC Backups welcome = Backup and backup often! ✨ +# Context Pages + +## About +git-description = Git commit {$hash} on {$date} + # Menu ## File @@ -11,3 +17,7 @@ quit = Quit ## Edit edit = Edit cut = Cut + +## View +view = View +menu-about = About COSMIC Backups... diff --git a/src/app.rs b/src/app.rs index 783c2f0..0f74971 100644 --- a/src/app.rs +++ b/src/app.rs @@ -3,7 +3,11 @@ use std::collections::HashMap; use crate::fl; -use cosmic::app::{Command, Core}; +use cosmic::{ + app::{Command, Core}, + cosmic_theme, + iced::{Alignment}, +}; use cosmic::iced::alignment::{Horizontal, Vertical}; use cosmic::iced::Length; use cosmic::iced_core::keyboard::Key; @@ -31,12 +35,28 @@ pub struct CosmicBackups { #[derive(Debug, Clone)] pub enum Message { Cut(Option), + ToggleContextPage(ContextPage), + LaunchUrl(String), WindowClose, WindowNew, } +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum ContextPage { + About, +} + +impl ContextPage { + fn title(&self) -> String { + match self { + Self::About => String::new(), + } + } +} + #[derive(Clone, Copy, Debug, Eq, PartialEq)] pub enum Action { + About, Cut, WindowClose, WindowNew, @@ -46,9 +66,10 @@ impl MenuAction for Action { type Message = Message; fn message(&self, entity_opt: Option) -> Self::Message { match self { + Action::About => Message::ToggleContextPage(ContextPage::About), + Action::Cut => Message::Cut(entity_opt), Action::WindowClose => Message::WindowClose, Action::WindowNew => Message::WindowNew, - Action::Cut => Message::Cut(entity_opt), } } } @@ -115,6 +136,38 @@ impl Application for CosmicBackups { } } + fn about(&self) -> Element { + let cosmic_theme::Spacing { space_xxs, .. } = cosmic::theme::active().cosmic().spacing; + let repository = "https://github.com/ahoneybun/cosmic-backups"; + let hash = env!("VERGEN_GIT_SHA"); + let short_hash: String = hash.chars().take(7).collect(); + let date = env!("VERGEN_GIT_COMMIT_DATE"); + widget::column::with_children(vec![ + widget::svg(widget::svg::Handle::from_memory( + &include_bytes!( + "../res/icons/hicolor/128x128/apps/com.example.CosmicAppTemplate.svg" + )[..], + )) + .into(), + widget::text::title3(fl!("cosmic-backups")).into(), + widget::button::link(repository) + .on_press(Message::LaunchUrl(repository.to_string())) + .padding(0) + .into(), + widget::button::link(fl!( + "git-description", + hash = short_hash.as_str(), + date = date + )) + .on_press(Message::LaunchUrl(format!("{}/commits/{}", repository, hash))) + .padding(0) + .into(), + ]) + .align_items(Alignment::Center) + .spacing(space_xxs) + .into() + } + pub fn key_binds() -> HashMap { let mut key_binds = HashMap::new(); diff --git a/src/app/menu.rs b/src/app/menu.rs index 5ad75c1..97db2b4 100644 --- a/src/app/menu.rs +++ b/src/app/menu.rs @@ -33,6 +33,15 @@ pub fn menu_bar<'a>(key_binds: &HashMap) -> Element<'a, Message ], ), ), + Tree::with_children( + root(fl!("view")), + items( + key_binds, + vec![ + Item::Button(fl!("menu-about"), Action::About), + ], + ), + ), ]) .item_height(ItemHeight::Dynamic(40)) .item_width(ItemWidth::Uniform(240)) From 923955884e49a03b7c15094968b2d4e451729ec3 Mon Sep 17 00:00:00 2001 From: Aaron Honeycutt Date: Fri, 17 May 2024 13:07:41 -0600 Subject: [PATCH 08/13] Clean up imports --- src/app.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/app.rs b/src/app.rs index 0f74971..fe74e8b 100644 --- a/src/app.rs +++ b/src/app.rs @@ -6,14 +6,14 @@ use crate::fl; use cosmic::{ app::{Command, Core}, cosmic_theme, - iced::{Alignment}, + iced::{Alignment, Length}, }; use cosmic::iced::alignment::{Horizontal, Vertical}; -use cosmic::iced::Length; use cosmic::iced_core::keyboard::Key; -use cosmic::widget::menu::action::MenuAction; -use cosmic::widget::menu::key_bind::KeyBind; -use cosmic::widget::menu::key_bind::Modifier; +use cosmic::widget::menu::{ + action::{MenuAction}, + key_bind::{KeyBind, Modifier}, +}; use cosmic::widget::segmented_button::Entity; use cosmic::{widget, Application, Element}; From 338d4309a895a0b4c3ffc8661b3d9b8dd9e8015f Mon Sep 17 00:00:00 2001 From: Aaron Honeycutt Date: Fri, 17 May 2024 13:19:15 -0600 Subject: [PATCH 09/13] Almost done with basic About page --- Cargo.toml | 3 +++ build.rs | 17 +++++++++++++++++ src/app.rs | 6 ++++-- 3 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 build.rs diff --git a/Cargo.toml b/Cargo.toml index 2868f5c..6b41f95 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,6 +4,9 @@ version = "0.1.0" edition = "2021" license = "GPL-3.0" +[build-dependencies] +vergen = { version = "8", features = ["git", "gitcl"] } + [dependencies] i18n-embed-fl = "0.8" once_cell = "1.19.0" diff --git a/build.rs b/build.rs new file mode 100644 index 0000000..be10241 --- /dev/null +++ b/build.rs @@ -0,0 +1,17 @@ +fn main() -> Result<(), Box> { + // Rebuild if i18n files change + println!("cargo:rerun-if-changed=i18n"); + + // Emit version information (if not cached by just vendor) + let mut vergen = vergen::EmitBuilder::builder(); + println!("cargo:rerun-if-env-changed=VERGEN_GIT_COMMIT_DATE"); + if std::env::var_os("VERGEN_GIT_COMMIT_DATE").is_none() { + vergen.git_commit_date(); + } + println!("cargo:rerun-if-env-changed=VERGEN_GIT_SHA"); + if std::env::var_os("VERGEN_GIT_SHA").is_none() { + vergen.git_sha(false); + } + vergen.fail_on_error().emit()?; + Ok(()) +} diff --git a/src/app.rs b/src/app.rs index fe74e8b..da91924 100644 --- a/src/app.rs +++ b/src/app.rs @@ -1,7 +1,9 @@ // SPDX-License-Identifier: GPL-3.0-only -use std::collections::HashMap; - +use std::{ + collections::{HashMap}, + env, +}; use crate::fl; use cosmic::{ app::{Command, Core}, From 80d7d2a7c12d44492540609e6ca53b1f98f5acfe Mon Sep 17 00:00:00 2001 From: Aaron Honeycutt Date: Fri, 17 May 2024 13:36:12 -0600 Subject: [PATCH 10/13] Clean up code to match standards --- src/app.rs | 96 +++++++++++++++++++++++------------------------------- 1 file changed, 41 insertions(+), 55 deletions(-) diff --git a/src/app.rs b/src/app.rs index da91924..b307e6e 100644 --- a/src/app.rs +++ b/src/app.rs @@ -6,7 +6,7 @@ use std::{ }; use crate::fl; use cosmic::{ - app::{Command, Core}, + app::{Command, Core, Message as CosmicMessage}, cosmic_theme, iced::{Alignment, Length}, }; @@ -76,15 +76,46 @@ impl MenuAction for Action { } } -/// Implement the `Application` trait for your application. -/// This is where you define the behavior of your application. -/// -/// The `Application` trait requires you to define the following types and constants: -/// - `Executor` is the executor that will be used to run your application. -/// - `Flags` is the data that your application needs to use before it starts. -/// - `Message` is the enum that contains all the possible variants that your application will need to transmit messages. -/// - `APP_ID` is the unique identifier of your application. -impl Application for CosmicBackups { +impl App { + fn update_config(&mut self) -> Command> { + app::command::set_theme(self.config.app_theme.theme()) + } + + fn about(&self) -> Element { + let cosmic_theme::Spacing { space_xxs, .. } = cosmic::theme::active().cosmic().spacing; + let repository = "https://github.com/ahoneybun/cosmic-backups"; + let hash = env!("VERGEN_GIT_SHA"); + let short_hash: String = hash.chars().take(7).collect(); + let date = env!("VERGEN_GIT_COMMIT_DATE"); + widget::column::with_children(vec![ + widget::svg(widget::svg::Handle::from_memory( + &include_bytes!( + "../res/icons/hicolor/128x128/apps/com.example.CosmicAppTemplate.svg" + )[..], + )) + .into(), + widget::text::title3(fl!("cosmic-backups")).into(), + widget::button::link(repository) + .on_press(Message::LaunchUrl(repository.to_string())) + .padding(0) + .into(), + widget::button::link(fl!( + "git-description", + hash = short_hash.as_str(), + date = date + )) + .on_press(Message::LaunchUrl(format!("{}/commits/{}", repository, hash))) + .padding(0) + .into(), + ]) + .align_items(Alignment::Center) + .spacing(space_xxs) + .into() + } +} + + +impl Application for App { type Executor = cosmic::executor::Default; type Flags = (); @@ -106,13 +137,6 @@ impl Application for CosmicBackups { vec![menu::menu_bar(&self.key_binds)] } - /// This is the entry point of your application, it is where you initialize your application. - /// - /// Any work that needs to be done before the application starts should be done here. - /// - /// - `core` is used to passed on for you by libcosmic to use in the core of your own application. - /// - `flags` is used to pass in any data that your application needs to use before it starts. - /// - `Command` type is used to send messages to your application. `Command::none()` can be used to send no messages to your application. fn init(core: Core, _input: Self::Flags) -> (Self, Command) { let app = CosmicBackups { core, @@ -122,12 +146,6 @@ impl Application for CosmicBackups { (app, Command::none()) } - /// This is the main view of your application, it is the root of your widget tree. - /// - /// The `Element` type is used to represent the visual elements of your application, - /// it has a `Message` associated with it, which dictates what type of message it can send. - /// - /// To get a better sense of which widgets are available, check out the `widget` module. fn view(&self) -> Element { widget::container(widget::text::title1(fl!("welcome"))) .width(Length::Fill) @@ -138,38 +156,6 @@ impl Application for CosmicBackups { } } - fn about(&self) -> Element { - let cosmic_theme::Spacing { space_xxs, .. } = cosmic::theme::active().cosmic().spacing; - let repository = "https://github.com/ahoneybun/cosmic-backups"; - let hash = env!("VERGEN_GIT_SHA"); - let short_hash: String = hash.chars().take(7).collect(); - let date = env!("VERGEN_GIT_COMMIT_DATE"); - widget::column::with_children(vec![ - widget::svg(widget::svg::Handle::from_memory( - &include_bytes!( - "../res/icons/hicolor/128x128/apps/com.example.CosmicAppTemplate.svg" - )[..], - )) - .into(), - widget::text::title3(fl!("cosmic-backups")).into(), - widget::button::link(repository) - .on_press(Message::LaunchUrl(repository.to_string())) - .padding(0) - .into(), - widget::button::link(fl!( - "git-description", - hash = short_hash.as_str(), - date = date - )) - .on_press(Message::LaunchUrl(format!("{}/commits/{}", repository, hash))) - .padding(0) - .into(), - ]) - .align_items(Alignment::Center) - .spacing(space_xxs) - .into() - } - pub fn key_binds() -> HashMap { let mut key_binds = HashMap::new(); From 1d8fe4c172ae607b3293aa69be356c3b98822ee4 Mon Sep 17 00:00:00 2001 From: Aaron Honeycutt Date: Fri, 17 May 2024 14:06:32 -0600 Subject: [PATCH 11/13] Work on Messages for actions --- src/app.rs | 81 +++++++++++++++++++++++++++++++++++++++++++++++++---- src/main.rs | 4 +-- 2 files changed, 77 insertions(+), 8 deletions(-) diff --git a/src/app.rs b/src/app.rs index b307e6e..dbd806f 100644 --- a/src/app.rs +++ b/src/app.rs @@ -5,8 +5,8 @@ use std::{ env, }; use crate::fl; +use cosmic::app::{Command, Core, Message as CosmicMessage}; use cosmic::{ - app::{Command, Core, Message as CosmicMessage}, cosmic_theme, iced::{Alignment, Length}, }; @@ -24,10 +24,11 @@ pub mod menu; /// This is the struct that represents your application. /// It is used to define the data that will be used by your application. #[derive(Clone, Default)] -pub struct CosmicBackups { +pub struct App { /// This is the core of your application, it is used to communicate with the Cosmic runtime. /// It is used to send messages to your application, and to access the resources of the Cosmic runtime. core: Core, + context_page: ContextPage, key_binds: HashMap, } @@ -77,9 +78,9 @@ impl MenuAction for Action { } impl App { - fn update_config(&mut self) -> Command> { - app::command::set_theme(self.config.app_theme.theme()) - } +// fn update_config(&mut self) -> Command> { +// cosmic::app::command::set_theme(self.config.app_theme.theme()) +// } fn about(&self) -> Element { let cosmic_theme::Spacing { space_xxs, .. } = cosmic::theme::active().cosmic().spacing; @@ -112,6 +113,16 @@ impl App { .spacing(space_xxs) .into() } + + fn context_drawer(&self) -> Option> { + if !self.core.window.show_context { + return None; + } + + Some(match self.context_page { + ContextPage::About => self.about(), + }) + } } @@ -138,7 +149,7 @@ impl Application for App { } fn init(core: Core, _input: Self::Flags) -> (Self, Command) { - let app = CosmicBackups { + let app = App { core, key_binds: key_binds(), }; @@ -154,6 +165,64 @@ impl Application for App { .align_y(Vertical::Center) .into() } + + /// Handle application events here. + fn update(&mut self, message: Self::Message) -> Command { + // Helper for updating config values efficiently + macro_rules! config_set { + ($name: ident, $value: expr) => { + match &self.config_handler { + Some(config_handler) => { + match paste::paste! { self.config.[](config_handler, $value) } { + Ok(_) => {} + Err(err) => { + log::warn!( + "failed to save config {:?}: {}", + stringify!($name), + err + ); + } + } + } + None => { + self.config.$name = $value; + log::warn!( + "failed to save config {:?}: no config handler", + stringify!($name) + ); + } + } + }; + } + + match message { + Message::Key(modifiers, key) => { + let entity = self.tab_model.active(); + for (key_bind, action) in self.key_binds.iter() { + if key_bind.matches(modifiers, &key) { + return self.update(action.message(Some(entity))); + } + } + } + Message::LaunchUrl(url) => match open::that_detached(&url) { + Ok(()) => {} + Err(err) => { + log::warn!("failed to open {:?}: {}", url, err); + } + }, + Message::ToggleContextPage(context_page) => { + //TODO: ensure context menus are closed + if self.context_page == context_page { + self.core.window.show_context = !self.core.window.show_context; + } else { + self.context_page = context_page; + self.core.window.show_context = true; + } + self.set_context_title(context_page.title()); + } + Message::WindowClose => { + return window::close(window::Id::MAIN); + } } pub fn key_binds() -> HashMap { diff --git a/src/main.rs b/src/main.rs index d142887..b0f01f5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-3.0-only -use app::CosmicBackups; +use crate::app::App; /// The `app` module is used by convention to indicate the main component of our application. mod app; mod core; @@ -12,5 +12,5 @@ mod core; /// If your app does not need any flags, you can pass in `()`. fn main() -> cosmic::iced::Result { let settings = cosmic::app::Settings::default(); - cosmic::app::run::(settings, ()) + cosmic::app::run::(settings, ()) } From f5e9d54d831a9b5884e3c31b88c93c6817f84607 Mon Sep 17 00:00:00 2001 From: Aaron Honeycutt Date: Fri, 17 May 2024 14:31:08 -0600 Subject: [PATCH 12/13] Working on messages --- src/app.rs | 55 +++++++++--------------------------------------------- 1 file changed, 9 insertions(+), 46 deletions(-) diff --git a/src/app.rs b/src/app.rs index dbd806f..13fc705 100644 --- a/src/app.rs +++ b/src/app.rs @@ -5,9 +5,9 @@ use std::{ env, }; use crate::fl; -use cosmic::app::{Command, Core, Message as CosmicMessage}; +use cosmic::app::{Command, Core}; use cosmic::{ - cosmic_theme, + cosmic_theme, ApplicationExt, iced::{Alignment, Length}, }; use cosmic::iced::alignment::{Horizontal, Vertical}; @@ -23,7 +23,7 @@ pub mod menu; /// This is the struct that represents your application. /// It is used to define the data that will be used by your application. -#[derive(Clone, Default)] +#[derive(Clone)] pub struct App { /// This is the core of your application, it is used to communicate with the Cosmic runtime. /// It is used to send messages to your application, and to access the resources of the Cosmic runtime. @@ -151,6 +151,7 @@ impl Application for App { fn init(core: Core, _input: Self::Flags) -> (Self, Command) { let app = App { core, + context_page: ContextPage::About, key_binds: key_binds(), }; @@ -168,48 +169,8 @@ impl Application for App { /// Handle application events here. fn update(&mut self, message: Self::Message) -> Command { - // Helper for updating config values efficiently - macro_rules! config_set { - ($name: ident, $value: expr) => { - match &self.config_handler { - Some(config_handler) => { - match paste::paste! { self.config.[](config_handler, $value) } { - Ok(_) => {} - Err(err) => { - log::warn!( - "failed to save config {:?}: {}", - stringify!($name), - err - ); - } - } - } - None => { - self.config.$name = $value; - log::warn!( - "failed to save config {:?}: no config handler", - stringify!($name) - ); - } - } - }; - } match message { - Message::Key(modifiers, key) => { - let entity = self.tab_model.active(); - for (key_bind, action) in self.key_binds.iter() { - if key_bind.matches(modifiers, &key) { - return self.update(action.message(Some(entity))); - } - } - } - Message::LaunchUrl(url) => match open::that_detached(&url) { - Ok(()) => {} - Err(err) => { - log::warn!("failed to open {:?}: {}", url, err); - } - }, Message::ToggleContextPage(context_page) => { //TODO: ensure context menus are closed if self.context_page == context_page { @@ -220,9 +181,11 @@ impl Application for App { } self.set_context_title(context_page.title()); } - Message::WindowClose => { - return window::close(window::Id::MAIN); - } + } + + Command::none() + + } } pub fn key_binds() -> HashMap { From 2a86152364e5e0081d985f641f37f5263f06e940 Mon Sep 17 00:00:00 2001 From: Aaron Honeycutt Date: Fri, 17 May 2024 19:21:04 -0600 Subject: [PATCH 13/13] Menu and ContextMenu is working now --- Cargo.toml | 2 ++ src/app.rs | 49 ++++++++++++++++++++++++++++++++++++------------- src/app/menu.rs | 18 +++++++++--------- 3 files changed, 47 insertions(+), 22 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 6b41f95..e68e242 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,6 +11,8 @@ vergen = { version = "8", features = ["git", "gitcl"] } i18n-embed-fl = "0.8" once_cell = "1.19.0" rust-embed = "8.3.0" +log = "0.4" +open = "5.0.2" [dependencies.libcosmic] git = "https://github.com/pop-os/libcosmic.git" diff --git a/src/app.rs b/src/app.rs index 13fc705..a84ff60 100644 --- a/src/app.rs +++ b/src/app.rs @@ -3,6 +3,7 @@ use std::{ collections::{HashMap}, env, + process, }; use crate::fl; use cosmic::app::{Command, Core}; @@ -11,6 +12,7 @@ use cosmic::{ iced::{Alignment, Length}, }; use cosmic::iced::alignment::{Horizontal, Vertical}; +use cosmic::iced::window; use cosmic::iced_core::keyboard::Key; use cosmic::widget::menu::{ action::{MenuAction}, @@ -37,7 +39,7 @@ pub struct App { /// If your application does not need to send messages, you can use an empty enum or `()`. #[derive(Debug, Clone)] pub enum Message { - Cut(Option), + // Cut(Option), ToggleContextPage(ContextPage), LaunchUrl(String), WindowClose, @@ -60,17 +62,17 @@ impl ContextPage { #[derive(Clone, Copy, Debug, Eq, PartialEq)] pub enum Action { About, - Cut, + // Cut, WindowClose, WindowNew, } impl MenuAction for Action { type Message = Message; - fn message(&self, entity_opt: Option) -> Self::Message { + fn message(&self, _entity_opt: Option) -> Self::Message { match self { Action::About => Message::ToggleContextPage(ContextPage::About), - Action::Cut => Message::Cut(entity_opt), + // Action::Cut => Message::Cut(entity_opt), Action::WindowClose => Message::WindowClose, Action::WindowNew => Message::WindowNew, } @@ -114,15 +116,6 @@ impl App { .into() } - fn context_drawer(&self) -> Option> { - if !self.core.window.show_context { - return None; - } - - Some(match self.context_page { - ContextPage::About => self.about(), - }) - } } @@ -158,6 +151,16 @@ impl Application for App { (app, Command::none()) } + fn context_drawer(&self) -> Option> { + if !self.core.window.show_context { + return None; + } + + Some(match self.context_page { + ContextPage::About => self.about(), + }) + } + fn view(&self) -> Element { widget::container(widget::text::title1(fl!("welcome"))) .width(Length::Fill) @@ -181,6 +184,26 @@ impl Application for App { } self.set_context_title(context_page.title()); } + Message::WindowClose => { + return window::close(window::Id::MAIN); + } + Message::WindowNew => match env::current_exe() { + Ok(exe) => match process::Command::new(&exe).spawn() { + Ok(_child) => {} + Err(err) => { + eprintln!("failed to execute {:?}: {}", exe, err); + } + }, + Err(err) => { + eprintln!("failed to get current executable path: {}", err); + } + }, + Message::LaunchUrl(url) => match open::that_detached(&url) { + Ok(()) => {} + Err(err) => { + log::warn!("failed to open {:?}: {}", url, err); + } + }, } Command::none() diff --git a/src/app/menu.rs b/src/app/menu.rs index 97db2b4..8d1532f 100644 --- a/src/app/menu.rs +++ b/src/app/menu.rs @@ -24,15 +24,15 @@ pub fn menu_bar<'a>(key_binds: &HashMap) -> Element<'a, Message ], ), ), - Tree::with_children( - root(fl!("edit")), - items( - key_binds, - vec![ - Item::Button(fl!("cut"), Action::Cut), - ], - ), - ), + // Tree::with_children( + // root(fl!("edit")), + // items( + // key_binds, + // vec![ + // Item::Button(fl!("cut"), Action::Cut), + // ], + // ), + // ), Tree::with_children( root(fl!("view")), items(