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;