From 93e21edc2b4351bc62bae5b92fc0f838abb7554d Mon Sep 17 00:00:00 2001 From: Vadim Khitrin Date: Mon, 30 Dec 2024 07:23:58 +0200 Subject: [PATCH] fix: Bundle Icons For macOS * macOS platform does not use XDG icons (or cosmic-icons), as a workaround for the time being, we will ship icons as part of the application bundle. * Update cargo dependencies. * Updated README. --- Cargo.lock | 132 ++++++++++++-------- README.md | 1 + justfile | 3 +- res/icons/accessories-clock-symbolic.svg | 12 ++ res/icons/contact-new-symbolic.svg | 10 ++ res/icons/dialog-information-symbolic.svg | 11 ++ res/icons/dialog-warning-symbolic.svg | 11 ++ res/icons/emblem-shared-symbolic.svg | 4 + res/icons/emblem-synchronizing-symbolic.svg | 11 ++ res/icons/insert-text-symbolic.svg | 12 ++ res/icons/mail-archive-symbolic.svg | 13 ++ res/icons/mail-mark-important-symbolic.svg | 3 + res/icons/network-server-symbolic.svg | 13 ++ res/icons/system-lock-screen-symbolic.svg | 10 ++ res/icons/text-x-generic-symbolic.svg | 11 ++ res/icons/user-available-symbolic.svg | 11 ++ res/icons/web-browser-symbolic.svg | 15 +++ res/icons/x-office-document-symbolic.svg | 11 ++ res/icons/x-office-spreadsheet-symbolic.svg | 11 ++ src/app.rs | 5 +- src/main.rs | 1 + src/nav.rs | 5 +- src/pages/accounts.rs | 39 +++--- src/pages/bookmarks.rs | 51 ++++---- src/utils/icons.rs | 28 +++++ src/utils/mod.rs | 1 + 26 files changed, 335 insertions(+), 100 deletions(-) create mode 100644 res/icons/accessories-clock-symbolic.svg create mode 100644 res/icons/contact-new-symbolic.svg create mode 100644 res/icons/dialog-information-symbolic.svg create mode 100644 res/icons/dialog-warning-symbolic.svg create mode 100644 res/icons/emblem-shared-symbolic.svg create mode 100644 res/icons/emblem-synchronizing-symbolic.svg create mode 100644 res/icons/insert-text-symbolic.svg create mode 100644 res/icons/mail-archive-symbolic.svg create mode 100644 res/icons/mail-mark-important-symbolic.svg create mode 100644 res/icons/network-server-symbolic.svg create mode 100644 res/icons/system-lock-screen-symbolic.svg create mode 100644 res/icons/text-x-generic-symbolic.svg create mode 100644 res/icons/user-available-symbolic.svg create mode 100644 res/icons/web-browser-symbolic.svg create mode 100644 res/icons/x-office-document-symbolic.svg create mode 100644 res/icons/x-office-spreadsheet-symbolic.svg create mode 100644 src/utils/icons.rs create mode 100644 src/utils/mod.rs diff --git a/Cargo.lock b/Cargo.lock index d82a92b..07503d4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -506,7 +506,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -541,7 +541,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -767,7 +767,7 @@ checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -810,9 +810,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.5" +version = "1.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31a0499c1dc64f458ad13872de75c0eb7e3fdb0e67964610c914b034fc5956e" +checksum = "8d6dbb628b8f8555f86d0323c2eb39e3ec81901f4b83e091db8a6a76d316a333" dependencies = [ "jobserver", "libc", @@ -1328,7 +1328,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -1339,7 +1339,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -1402,7 +1402,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -1461,7 +1461,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -1601,7 +1601,7 @@ checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -1945,7 +1945,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -2097,7 +2097,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -2589,7 +2589,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.91", + "syn 2.0.93", "unic-langid", ] @@ -2603,7 +2603,7 @@ dependencies = [ "i18n-config", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -2956,7 +2956,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -3886,7 +3886,7 @@ dependencies = [ "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -4179,7 +4179,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -4257,7 +4257,7 @@ dependencies = [ "proc-macro2", "proc-macro2-diagnostics", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -4291,7 +4291,7 @@ dependencies = [ "by_address", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -4405,7 +4405,7 @@ dependencies = [ "phf_shared", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -4440,7 +4440,7 @@ checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -4602,7 +4602,7 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -4622,7 +4622,7 @@ checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", "version_check", "yansi", ] @@ -4653,9 +4653,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.37" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" dependencies = [ "proc-macro2", ] @@ -4813,9 +4813,9 @@ checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" [[package]] name = "reqwest" -version = "0.12.9" +version = "0.12.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" +checksum = "7fe060fe50f524be480214aba758c71f99f90ee8c83c5a36b5e9e1d568eb4eb3" dependencies = [ "base64 0.22.1", "bytes", @@ -4846,6 +4846,7 @@ dependencies = [ "system-configuration", "tokio", "tokio-native-tls", + "tower", "tower-service", "url", "wasm-bindgen", @@ -4975,7 +4976,7 @@ dependencies = [ "proc-macro2", "quote", "rust-embed-utils", - "syn 2.0.91", + "syn 2.0.93", "walkdir", ] @@ -5085,9 +5086,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" +checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" [[package]] name = "rustybuzz" @@ -5195,22 +5196,22 @@ checksum = "c2fdfc24bc566f839a2da4c4295b82db7d25a24253867d5c64355abb5799bdbe" [[package]] name = "serde" -version = "1.0.216" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b9781016e935a97e8beecf0c933758c97a5520d32930e460142b4cd80c6338e" +checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.216" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e" +checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -5234,7 +5235,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -5559,7 +5560,7 @@ dependencies = [ "quote", "sqlx-core", "sqlx-macros-core", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -5582,7 +5583,7 @@ dependencies = [ "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", - "syn 2.0.91", + "syn 2.0.93", "tempfile", "tokio", "url", @@ -5778,9 +5779,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.91" +version = "2.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53cbcb5a243bd33b7858b1d7f4aca2153490815872d86d955d6ea29f743c035" +checksum = "9c786062daee0d6db1132800e623df74274a0a87322d8e183338e01b3d98d058" dependencies = [ "proc-macro2", "quote", @@ -5804,7 +5805,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -5887,7 +5888,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -6034,7 +6035,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -6118,6 +6119,27 @@ dependencies = [ "winnow 0.6.20", ] +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + [[package]] name = "tower-service" version = "0.3.3" @@ -6144,7 +6166,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -6470,7 +6492,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", "wasm-bindgen-shared", ] @@ -6505,7 +6527,7 @@ checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -6883,7 +6905,7 @@ checksum = "942ac266be9249c84ca862f0a164a39533dc2f6f33dc98ec89c8da99b82ea0bd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -6894,7 +6916,7 @@ checksum = "da33557140a288fae4e1d5f8873aaf9eb6613a9cf82c3e070223ff177f598b60" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -7362,7 +7384,7 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", "synstructure", ] @@ -7464,7 +7486,7 @@ dependencies = [ "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", "zvariant_utils 2.1.0", ] @@ -7514,7 +7536,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -7534,7 +7556,7 @@ checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", "synstructure", ] @@ -7563,7 +7585,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] [[package]] @@ -7625,7 +7647,7 @@ dependencies = [ "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", "zvariant_utils 2.1.0", ] @@ -7648,5 +7670,5 @@ checksum = "c51bcff7cc3dbb5055396bcf774748c3dab426b4b8659046963523cee4808340" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.93", ] diff --git a/README.md b/README.md index 38c76ef..49586e9 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,7 @@ Dependencies (Linux) - `libxkbcommon-dev` - `libcosmic` - `libsqlite3-dev` +- `cosmic-icons` Dependencies (macOS) diff --git a/justfile b/justfile index 070c59b..16b12b2 100644 --- a/justfile +++ b/justfile @@ -64,9 +64,10 @@ build-release-macos *args: lipo "target/aarch64-apple-darwin/release/{{name}}" -create -output "{{app-binary}}" mkdir -p "{{app-binary-dir}}" - mkdir -p "{{app-extras-dir}}" + mkdir -p "{{app-extras-dir}}/icons/" cp -fRp "{{app-template}}" "{{app-dir}}" cp -fp "{{app-binary}}" "{{app-binary-dir}}" + cp ./res/icons/* "{{app-extras-dir}}/icons/" touch -r "{{app-binary}}" "{{app-dir}}/{{app-name}}" echo "Created '{{app-name}}' in '{{app-dir}}'" git stash -- {{app-template-plist}} diff --git a/res/icons/accessories-clock-symbolic.svg b/res/icons/accessories-clock-symbolic.svg new file mode 100644 index 0000000..b7120f9 --- /dev/null +++ b/res/icons/accessories-clock-symbolic.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/res/icons/contact-new-symbolic.svg b/res/icons/contact-new-symbolic.svg new file mode 100644 index 0000000..312640d --- /dev/null +++ b/res/icons/contact-new-symbolic.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/res/icons/dialog-information-symbolic.svg b/res/icons/dialog-information-symbolic.svg new file mode 100644 index 0000000..af6b69e --- /dev/null +++ b/res/icons/dialog-information-symbolic.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/res/icons/dialog-warning-symbolic.svg b/res/icons/dialog-warning-symbolic.svg new file mode 100644 index 0000000..092162b --- /dev/null +++ b/res/icons/dialog-warning-symbolic.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/res/icons/emblem-shared-symbolic.svg b/res/icons/emblem-shared-symbolic.svg new file mode 100644 index 0000000..09a0006 --- /dev/null +++ b/res/icons/emblem-shared-symbolic.svg @@ -0,0 +1,4 @@ + + + + diff --git a/res/icons/emblem-synchronizing-symbolic.svg b/res/icons/emblem-synchronizing-symbolic.svg new file mode 100644 index 0000000..e3bef86 --- /dev/null +++ b/res/icons/emblem-synchronizing-symbolic.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/res/icons/insert-text-symbolic.svg b/res/icons/insert-text-symbolic.svg new file mode 100644 index 0000000..8e62062 --- /dev/null +++ b/res/icons/insert-text-symbolic.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/res/icons/mail-archive-symbolic.svg b/res/icons/mail-archive-symbolic.svg new file mode 100644 index 0000000..1f306fe --- /dev/null +++ b/res/icons/mail-archive-symbolic.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/res/icons/mail-mark-important-symbolic.svg b/res/icons/mail-mark-important-symbolic.svg new file mode 100644 index 0000000..60f0612 --- /dev/null +++ b/res/icons/mail-mark-important-symbolic.svg @@ -0,0 +1,3 @@ + + + diff --git a/res/icons/network-server-symbolic.svg b/res/icons/network-server-symbolic.svg new file mode 100644 index 0000000..2e0c077 --- /dev/null +++ b/res/icons/network-server-symbolic.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/res/icons/system-lock-screen-symbolic.svg b/res/icons/system-lock-screen-symbolic.svg new file mode 100644 index 0000000..563fa7b --- /dev/null +++ b/res/icons/system-lock-screen-symbolic.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/res/icons/text-x-generic-symbolic.svg b/res/icons/text-x-generic-symbolic.svg new file mode 100644 index 0000000..8c5e535 --- /dev/null +++ b/res/icons/text-x-generic-symbolic.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/res/icons/user-available-symbolic.svg b/res/icons/user-available-symbolic.svg new file mode 100644 index 0000000..582949a --- /dev/null +++ b/res/icons/user-available-symbolic.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/res/icons/web-browser-symbolic.svg b/res/icons/web-browser-symbolic.svg new file mode 100644 index 0000000..7c8dd8b --- /dev/null +++ b/res/icons/web-browser-symbolic.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/res/icons/x-office-document-symbolic.svg b/res/icons/x-office-document-symbolic.svg new file mode 100644 index 0000000..c7da5ac --- /dev/null +++ b/res/icons/x-office-document-symbolic.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/res/icons/x-office-spreadsheet-symbolic.svg b/res/icons/x-office-spreadsheet-symbolic.svg new file mode 100644 index 0000000..ae63695 --- /dev/null +++ b/res/icons/x-office-spreadsheet-symbolic.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/app.rs b/src/app.rs index 5594b8b..f8d6e43 100644 --- a/src/app.rs +++ b/src/app.rs @@ -10,6 +10,7 @@ use crate::pages::accounts::{add_account, edit_account, AppAccountsMessage, Page use crate::pages::bookmarks::{ edit_bookmark, new_bookmark, view_notes, AppBookmarksMessage, PageBookmarksView, }; +use crate::utils::icons::load_icon; use cosmic::app::{Core, Task}; use cosmic::cosmic_config::{self, CosmicConfigEntry, Update}; use cosmic::cosmic_theme::{self, ThemeMode}; @@ -255,7 +256,7 @@ impl Application for Cosmicding { let dialog = match dialog_page { DialogPage::RemoveAccount(account) => { widget::dialog(fl!("remove") + " " + { &account.display_name }) - .icon(icon::from_name("dialog-warning-symbolic").size(58).icon()) + .icon(icon::icon(load_icon("dialog-warning-symbolic")).size(58)) .body(fl!("remove-account-confirm")) .primary_action( widget::button::destructive(fl!("yes")).on_press_maybe(Some( @@ -268,7 +269,7 @@ impl Application for Cosmicding { } DialogPage::RemoveBookmark(account, bookmark) => { widget::dialog(fl!("remove") + " " + { &bookmark.title }) - .icon(icon::from_name("dialog-warning-symbolic").size(58).icon()) + .icon(icon::icon(load_icon("dialog-warning-symbolic")).size(58)) .body(fl!("remove-bookmark-confirm")) .primary_action(widget::button::destructive(fl!("yes")).on_press_maybe(Some( Message::CompleteRemoveDialog(account.clone(), Some(bookmark.clone())), diff --git a/src/main.rs b/src/main.rs index 78ead6d..c22aa8c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -9,6 +9,7 @@ mod models; mod nav; mod pages; mod style; +mod utils; use crate::config::{Config, CONFIG_VERSION}; use app::{Flags, APPID}; diff --git a/src/nav.rs b/src/nav.rs index 1f56de6..3a76aef 100644 --- a/src/nav.rs +++ b/src/nav.rs @@ -1,3 +1,4 @@ +use crate::utils::icons::load_icon; use cosmic::{widget::icon, Element}; use crate::{app, fl}; @@ -24,8 +25,8 @@ impl AppNavPage { } pub fn icon(self) -> cosmic::widget::Icon { match self { - Self::BookmarksView => icon::from_name("web-browser-symbolic").icon(), - Self::AccountsView => icon::from_name("contact-new-symbolic").icon(), + Self::BookmarksView => icon::icon(load_icon("web-browser-symbolic")), + Self::AccountsView => icon::icon(load_icon("contact-new-symbolic")), } } diff --git a/src/pages/accounts.rs b/src/pages/accounts.rs index 3951f61..1bea5fb 100644 --- a/src/pages/accounts.rs +++ b/src/pages/accounts.rs @@ -2,6 +2,7 @@ use crate::app::{ApplicationState, Message}; use crate::fl; use crate::models::account::Account; use crate::style::disabled_link_button; +use crate::utils::icons::load_icon; use chrono::{DateTime, Local}; use cosmic::iced::Length; use cosmic::iced_widget::tooltip; @@ -13,7 +14,6 @@ use cosmic::{ widget::{self}, Apply, Element, }; -use iced::alignment::{Horizontal, Vertical}; #[derive(Debug, Clone)] pub enum AppAccountsMessage { @@ -37,7 +37,7 @@ impl PageAccountsView { if self.accounts.is_empty() { let container = widget::container( widget::column::with_children(vec![ - widget::icon::from_name("contact-new-symbolic") + widget::icon::icon(load_icon("contact-new-symbolic")) .size(64) .into(), widget::text::title3(fl!("no-accounts")).into(), @@ -48,8 +48,8 @@ impl PageAccountsView { .spacing(20) .align_x(Alignment::Center), ) - .align_y(Vertical::Center) - .align_x(Horizontal::Center) + .align_y(iced::alignment::Vertical::Center) + .align_x(iced::alignment::Horizontal::Center) .height(Length::Fill) .width(Length::Fill); widget::column::with_capacity(2) @@ -96,7 +96,7 @@ impl PageAccountsView { columns.push( widget::row::with_capacity(2) .spacing(spacing.space_xs) - .push(widget::icon::from_name("user-available-symbolic")) + .push(widget::icon::icon(load_icon("user-available-symbolic"))) .push(widget::text(item.display_name.clone())) .padding([ spacing.space_xs, @@ -117,7 +117,9 @@ impl PageAccountsView { spacing.space_xxxs, spacing.space_xxxs, ]) - .push(widget::icon::from_name("emblem-synchronizing-symbolic")) + .push(widget::icon::icon(load_icon( + "emblem-synchronizing-symbolic", + ))) .push(widget::text::body(format!( "{}: {}", fl!("last-sync-status"), @@ -140,11 +142,10 @@ impl PageAccountsView { spacing.space_xxxs, spacing.space_xxxs, ]) - .push(widget::icon::from_name("accessories-clock-symbolic")) + .push(widget::icon::icon(load_icon("accessories-clock-symbolic"))) .push(widget::text::body(format!( "{}: {}", fl!("last-sync-time"), - //local_time.to_rfc2822() local_time.format("%a, %d %b %Y %H:%M:%S") ))) .align_y(Alignment::Center) @@ -160,7 +161,7 @@ impl PageAccountsView { spacing.space_xxxs, spacing.space_xxxs, ]) - .push(widget::icon::from_name("dialog-information-symbolic")) + .push(widget::icon::icon(load_icon("dialog-information-symbolic"))) .push(widget::container(widget::column::with_children(vec![ if item.tls { widget::text::body(fl!("tls-enabled")).into() @@ -308,7 +309,7 @@ pub fn add_account<'a>(account: Account) -> Element<'a, Message> { .push( widget::row::with_capacity(2) .spacing(spacing.space_xxs) - .push(widget::icon::from_name("user-available-symbolic")) + .push(widget::icon::icon(load_icon("user-available-symbolic"))) .push(display_name_widget_title) .padding([ spacing.space_none, @@ -322,7 +323,7 @@ pub fn add_account<'a>(account: Account) -> Element<'a, Message> { .push( widget::row::with_capacity(2) .spacing(spacing.space_xxs) - .push(widget::icon::from_name("network-server-symbolic")) + .push(widget::icon::icon(load_icon("network-server-symbolic"))) .push(instance_widget_title) .padding([ spacing.space_xxxs, @@ -336,7 +337,7 @@ pub fn add_account<'a>(account: Account) -> Element<'a, Message> { .push( widget::row::with_capacity(2) .spacing(spacing.space_xxs) - .push(widget::icon::from_name("system-lock-screen-symbolic")) + .push(widget::icon::icon(load_icon("system-lock-screen-symbolic"))) .push(api_key_widget_title) .padding([ spacing.space_xxxs, @@ -382,7 +383,7 @@ pub fn edit_account<'a>(account: Account) -> Element<'a, Message> { widget::row::with_capacity(2) .spacing(spacing.space_xxs) .push(widget::text::body(fl!("enabled-sharing"))) - .push(widget::icon::from_name("dialog-information-symbolic").size(18)), + .push(widget::icon::icon(load_icon("dialog-information-symbolic")).size(18)), widget::container(widget::text::body(fl!("setting-managed-externally"))), tooltip::Position::FollowCursor, ) @@ -392,7 +393,7 @@ pub fn edit_account<'a>(account: Account) -> Element<'a, Message> { widget::row::with_capacity(2) .spacing(spacing.space_xxs) .push(widget::text::body(fl!("disabled-sharing"))) - .push(widget::icon::from_name("dialog-information-symbolic").size(18)), + .push(widget::icon::icon(load_icon("dialog-information-symbolic")).size(18)), widget::container(widget::text::body(fl!("setting-managed-externally"))), tooltip::Position::FollowCursor, ) @@ -403,7 +404,7 @@ pub fn edit_account<'a>(account: Account) -> Element<'a, Message> { widget::row::with_capacity(2) .spacing(spacing.space_xxs) .push(widget::text::body(fl!("enabled-public-sharing"))) - .push(widget::icon::from_name("dialog-information-symbolic").size(18)), + .push(widget::icon::icon(load_icon("dialog-information-symbolic")).size(18)), widget::container(widget::text::body(fl!("setting-managed-externally"))), tooltip::Position::FollowCursor, ) @@ -413,7 +414,7 @@ pub fn edit_account<'a>(account: Account) -> Element<'a, Message> { widget::row::with_capacity(2) .spacing(spacing.space_xxs) .push(widget::text::body(fl!("disabled-public-sharing"))) - .push(widget::icon::from_name("dialog-information-symbolic").size(18)), + .push(widget::icon::icon(load_icon("dialog-information-symbolic")).size(18)), widget::container(widget::text::body(fl!("setting-managed-externally"))), tooltip::Position::FollowCursor, ) @@ -430,7 +431,7 @@ pub fn edit_account<'a>(account: Account) -> Element<'a, Message> { .push( widget::row::with_capacity(2) .spacing(spacing.space_xxs) - .push(widget::icon::from_name("user-available-symbolic")) + .push(widget::icon::icon(load_icon("user-available-symbolic"))) .push(display_name_widget_title) .padding([ spacing.space_none, @@ -444,7 +445,7 @@ pub fn edit_account<'a>(account: Account) -> Element<'a, Message> { .push( widget::row::with_capacity(2) .spacing(spacing.space_xxs) - .push(widget::icon::from_name("network-server-symbolic")) + .push(widget::icon::icon(load_icon("network-server-symbolic"))) .push(instance_widget_title) .padding([ spacing.space_xxxs, @@ -458,7 +459,7 @@ pub fn edit_account<'a>(account: Account) -> Element<'a, Message> { .push( widget::row::with_capacity(2) .spacing(spacing.space_xxs) - .push(widget::icon::from_name("system-lock-screen-symbolic")) + .push(widget::icon::icon(load_icon("system-lock-screen-symbolic"))) .push(api_key_widget_title) .padding([ spacing.space_xxxs, diff --git a/src/pages/bookmarks.rs b/src/pages/bookmarks.rs index 8dc2d5c..53bc6e2 100644 --- a/src/pages/bookmarks.rs +++ b/src/pages/bookmarks.rs @@ -3,6 +3,7 @@ use crate::fl; use crate::models::account::Account; use crate::models::bookmarks::Bookmark; use crate::style::disabled_link_button; +use crate::utils::icons::load_icon; use chrono::{DateTime, Local}; use cosmic::iced::Length; use cosmic::{ @@ -44,7 +45,7 @@ impl PageBookmarksView { if self.accounts.is_empty() { let container = widget::container( widget::column::with_children(vec![ - widget::icon::from_name("web-browser-symbolic") + widget::icon::icon(load_icon("web-browser-symbolic")) .size(64) .into(), widget::text::title3(fl!("no-accounts")).into(), @@ -87,7 +88,7 @@ impl PageBookmarksView { spacing.space_none, spacing.space_xxxs, ]) - .push(widget::icon::from_name("web-browser-symbolic")) + .push(widget::icon::icon(load_icon("web-browser-symbolic"))) .push( widget::button::link(item.title.clone()) .spacing(spacing.space_xxxs) @@ -114,7 +115,7 @@ impl PageBookmarksView { }, spacing.space_xxxs, ]) - .push(widget::icon::from_name("text-x-generic-symbolic")) + .push(widget::icon::icon(load_icon("text-x-generic-symbolic"))) .push(widget::text(item.description.clone())) .align_y(Alignment::Start) .into(), @@ -135,7 +136,9 @@ impl PageBookmarksView { spacing.space_xxxs, spacing.space_xxxs, ]) - .push(widget::icon::from_name("mail-mark-important-symbolic")) + .push(widget::icon::icon(load_icon( + "mail-mark-important-symbolic", + ))) .push( widget::text::body( item.tag_names @@ -222,30 +225,32 @@ impl PageBookmarksView { // Mandatory fifth row - details let mut details_row = widget::row::with_capacity(1).spacing(spacing.space_xxs); details_row = details_row - .push(widget::icon::from_name("accessories-clock-symbolic").size(12)) + .push(widget::icon::icon(load_icon("accessories-clock-symbolic")).size(12)) .push( widget::text(date_added.format("%a, %d %b %Y %H:%M:%S").to_string()) .size(12), ); if item.is_archived { details_row = details_row - .push(widget::icon::from_name("mail-archive-symbolic").size(12)) + .push(widget::icon::icon(load_icon("mail-archive-symbolic")).size(12)) .push(widget::text(fl!("archived")).size(12)); } if item.unread { details_row = details_row - .push(widget::icon::from_name("x-office-spreadsheet-symbolic").size(12)) + .push( + widget::icon::icon(load_icon("x-office-spreadsheet-symbolic")).size(12), + ) .push(widget::text(fl!("unread")).size(12)); } if item.shared { details_row = details_row - .push(widget::icon::from_name("emblem-shared-symbolic").size(12)) + .push(widget::icon::icon(load_icon("emblem-shared-symbolic")).size(12)) .push(widget::text(fl!("shared")).size(12)); } columns.push( details_row .push(widget::horizontal_space()) - .push(widget::icon::from_name("user-available-symbolic").size(12)) + .push(widget::icon::icon(load_icon("user-available-symbolic")).size(12)) .push(widget::text(derived_account.display_name.clone()).size(12)) .align_y(iced::alignment::Vertical::Center) .spacing(spacing.space_xxs) @@ -439,7 +444,7 @@ where .push( widget::row::with_capacity(2) .spacing(spacing.space_xxs) - .push(widget::icon::from_name("user-available-symbolic")) + .push(widget::icon::icon(load_icon("user-available-symbolic"))) .push(account_widget_title) .padding([ spacing.space_none, @@ -454,7 +459,7 @@ where .push( widget::row::with_capacity(2) .spacing(spacing.space_xxs) - .push(widget::icon::from_name("web-browser-symbolic")) + .push(widget::icon::icon(load_icon("web-browser-symbolic"))) .push(url_widget_title) .padding([ spacing.space_xxxs, @@ -468,7 +473,7 @@ where .push( widget::row::with_capacity(2) .spacing(spacing.space_xxs) - .push(widget::icon::from_name("insert-text-symbolic")) + .push(widget::icon::icon(load_icon("insert-text-symbolic"))) .push(title_widget_title) .padding([ spacing.space_xxxs, @@ -483,7 +488,7 @@ where .push( widget::row::with_capacity(2) .spacing(spacing.space_xxs) - .push(widget::icon::from_name("text-x-generic-symbolic")) + .push(widget::icon::icon(load_icon("text-x-generic-symbolic"))) .push(description_widget_title) .padding([ spacing.space_xxxs, @@ -497,7 +502,7 @@ where .push( widget::row::with_capacity(2) .spacing(spacing.space_xxs) - .push(widget::icon::from_name("x-office-document-symbolic")) + .push(widget::icon::icon(load_icon("x-office-document-symbolic"))) .push(notes_widget_title) .padding([ spacing.space_xxxs, @@ -511,7 +516,9 @@ where .push( widget::row::with_capacity(2) .spacing(spacing.space_xxs) - .push(widget::icon::from_name("mail-mark-important-symbolic")) + .push(widget::icon::icon(load_icon( + "mail-mark-important-symbolic", + ))) .push(tags_widget_title) .padding([ spacing.space_xxxs, @@ -586,7 +593,7 @@ where .push( widget::row::with_capacity(2) .spacing(spacing.space_xxs) - .push(widget::icon::from_name("user-available-symbolic")) + .push(widget::icon::icon(load_icon("user-available-symbolic"))) .push(account_widget_title) .padding([ spacing.space_none, @@ -601,7 +608,7 @@ where .push( widget::row::with_capacity(2) .spacing(spacing.space_xxs) - .push(widget::icon::from_name("web-browser-symbolic")) + .push(widget::icon::icon(load_icon("web-browser-symbolic"))) .push(url_widget_title) .padding([ spacing.space_xxxs, @@ -615,7 +622,7 @@ where .push( widget::row::with_capacity(2) .spacing(spacing.space_xxs) - .push(widget::icon::from_name("insert-text-symbolic")) + .push(widget::icon::icon(load_icon("insert-text-symbolic"))) .push(title_widget_title) .padding([ spacing.space_xxxs, @@ -630,7 +637,7 @@ where .push( widget::row::with_capacity(2) .spacing(spacing.space_xxs) - .push(widget::icon::from_name("text-x-generic-symbolic")) + .push(widget::icon::icon(load_icon("text-x-generic-symbolic"))) .push(description_widget_title) .padding([ spacing.space_xxxs, @@ -644,7 +651,7 @@ where .push( widget::row::with_capacity(2) .spacing(spacing.space_xxs) - .push(widget::icon::from_name("x-office-document-symbolic")) + .push(widget::icon::icon(load_icon("x-office-document-symbolic"))) .push(notes_widget_title) .padding([ spacing.space_xxxs, @@ -658,7 +665,9 @@ where .push( widget::row::with_capacity(2) .spacing(spacing.space_xxs) - .push(widget::icon::from_name("mail-mark-important-symbolic")) + .push(widget::icon::icon(load_icon( + "mail-mark-important-symbolic", + ))) .push(tags_widget_title) .padding([ spacing.space_xxxs, diff --git a/src/utils/icons.rs b/src/utils/icons.rs new file mode 100644 index 0000000..6110ac4 --- /dev/null +++ b/src/utils/icons.rs @@ -0,0 +1,28 @@ +use cosmic::widget::{self, icon::Handle}; +use std::env; + +pub fn load_icon(icon: &str) -> Handle { + // On Linux, we use the XDG desktop icons + #[cfg(target_os = "linux")] + { + widget::icon::from_name(icon).handle() + } + + // On macOS, we bundle images as part of the application + #[cfg(target_os = "macos")] + { + let binary_path = env::current_exe().expect("Failed to get executable path"); + + let resources_dir = binary_path + .parent() + .and_then(|p| p.parent()) + .expect("Failed to find app bundle path"); + + let icon_path = resources_dir + .join("Resources") + .join("icons") + .join(format!("{icon}.svg")); + + widget::icon::from_path(icon_path) + } +} diff --git a/src/utils/mod.rs b/src/utils/mod.rs new file mode 100644 index 0000000..b8ebe8a --- /dev/null +++ b/src/utils/mod.rs @@ -0,0 +1 @@ +pub mod icons;