fix: fallback to Cosmic icon theme

This commit is contained in:
Ashley Wulber 2024-03-19 16:09:52 -04:00 committed by Jeremy Soller
parent 59e5f2ff38
commit 61427b25b0
3 changed files with 29 additions and 22 deletions

View file

@ -8,7 +8,7 @@ use cosmic::{
iced_core::id, iced_core::id,
theme::ThemeType, theme::ThemeType,
widget::{ widget::{
button, color_picker::ColorPickerUpdate, cosmic_container::container, dropdown, icon, button, color_picker::ColorPickerUpdate, dropdown, icon, layer_container as container,
segmented_button, segmented_control, settings, spin_button, tab_bar, toggler, segmented_button, segmented_control, settings, spin_button, tab_bar, toggler,
ColorPickerModel, ColorPickerModel,
}, },

View file

@ -6,6 +6,8 @@
use std::borrow::Cow; use std::borrow::Cow;
use std::cell::RefCell; use std::cell::RefCell;
pub const COSMIC: &str = "Cosmic";
thread_local! { thread_local! {
/// The fallback icon theme to search if no icon theme was specified. /// The fallback icon theme to search if no icon theme was specified.
pub(crate) static DEFAULT: RefCell<Cow<'static, str>> = RefCell::new("Cosmic".into()); pub(crate) static DEFAULT: RefCell<Cow<'static, str>> = RefCell::new("Cosmic".into());

View file

@ -56,43 +56,48 @@ impl Named {
pub fn path(self) -> Option<PathBuf> { pub fn path(self) -> Option<PathBuf> {
let name = &*self.name; let name = &*self.name;
let fallback = &self.fallback; let fallback = &self.fallback;
let locate = |theme: &str, name| {
let mut lookup = freedesktop_icons::lookup(name)
.with_theme(theme.as_ref())
.with_cache();
if let Some(scale) = self.scale {
lookup = lookup.with_scale(scale);
}
if let Some(size) = self.size {
lookup = lookup.with_size(size);
}
if self.prefer_svg {
lookup = lookup.force_svg();
}
lookup.find()
};
crate::icon_theme::DEFAULT.with(|theme| { crate::icon_theme::DEFAULT.with(|theme| {
let theme = theme.borrow(); let theme = theme.borrow();
let locate = |name| { let themes = if theme.as_ref() == crate::icon_theme::COSMIC {
let mut lookup = freedesktop_icons::lookup(name) vec![theme.as_ref()]
.with_theme(theme.as_ref()) } else {
.with_cache(); vec![theme.as_ref(), crate::icon_theme::COSMIC]
if let Some(scale) = self.scale {
lookup = lookup.with_scale(scale);
}
if let Some(size) = self.size {
lookup = lookup.with_size(size);
}
if self.prefer_svg {
lookup = lookup.force_svg();
}
lookup.find()
}; };
let mut result = locate(name); let mut result = themes.iter().find_map(|t| locate(t, name));
// On failure, attempt to locate fallback icon. // On failure, attempt to locate fallback icon.
if result.is_none() { if result.is_none() {
if matches!(fallback, Some(IconFallback::Default)) { if matches!(fallback, Some(IconFallback::Default)) {
for new_name in name.rmatch_indices('-').map(|(pos, _)| &name[..pos]) { for new_name in name.rmatch_indices('-').map(|(pos, _)| &name[..pos]) {
result = locate(new_name); result = themes.iter().find_map(|t| locate(t, new_name));
if result.is_some() { if result.is_some() {
break; break;
} }
} }
} else if let Some(IconFallback::Names(fallbacks)) = fallback { } else if let Some(IconFallback::Names(fallbacks)) = fallback {
for fallback in fallbacks { for fallback in fallbacks {
result = locate(fallback); result = themes.iter().find_map(|t| locate(t, fallback));
if result.is_some() { if result.is_some() {
break; break;
} }