perf(appearance): fetch icons on demand
This commit is contained in:
parent
0c9bb0c641
commit
66d96de181
2 changed files with 23 additions and 6 deletions
|
|
@ -219,12 +219,14 @@ pub async fn fetch() -> Message {
|
||||||
theme_paths.entry(name.clone()).or_insert(path);
|
theme_paths.entry(name.clone()).or_insert(path);
|
||||||
|
|
||||||
let theme = id.clone();
|
let theme = id.clone();
|
||||||
|
/* This section is performance critical */
|
||||||
// `icon::from_name` may perform blocking I/O
|
// `icon::from_name` may perform blocking I/O
|
||||||
if let Ok(handles) =
|
if let Ok(handles) =
|
||||||
tokio::task::spawn_blocking(|| preview_handles(theme, valid_dirs)).await
|
tokio::task::spawn_blocking(|| preview_handles(theme, valid_dirs)).await
|
||||||
{
|
{
|
||||||
icon_themes.insert(IconTheme { id, name }, handles);
|
icon_themes.insert(IconTheme { id, name }, handles);
|
||||||
}
|
}
|
||||||
|
/* END */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -60,7 +60,7 @@ enum ContextView {
|
||||||
MonospaceFont,
|
MonospaceFont,
|
||||||
SystemFont,
|
SystemFont,
|
||||||
}
|
}
|
||||||
|
#[allow(clippy::struct_excessive_bools)]
|
||||||
pub struct Page {
|
pub struct Page {
|
||||||
entity: page::Entity,
|
entity: page::Entity,
|
||||||
on_enter_handle: Option<cosmic::iced::task::Handle>,
|
on_enter_handle: Option<cosmic::iced::task::Handle>,
|
||||||
|
|
@ -79,6 +79,10 @@ pub struct Page {
|
||||||
font_filter: Vec<Arc<str>>,
|
font_filter: Vec<Arc<str>>,
|
||||||
font_search: String,
|
font_search: String,
|
||||||
|
|
||||||
|
/** Only fetch icons once. Allows for better cleanup. Also icon fetching can take for ages. */
|
||||||
|
icons_fetched: bool,
|
||||||
|
icon_fetch_handle: Option<cosmic::iced::task::Handle>,
|
||||||
|
|
||||||
icon_theme_active: Option<usize>,
|
icon_theme_active: Option<usize>,
|
||||||
icon_themes: IconThemes,
|
icon_themes: IconThemes,
|
||||||
icon_handles: IconHandles,
|
icon_handles: IconHandles,
|
||||||
|
|
@ -203,6 +207,8 @@ impl
|
||||||
font_config: font_config::Model::new(),
|
font_config: font_config::Model::new(),
|
||||||
font_filter: Vec::new(),
|
font_filter: Vec::new(),
|
||||||
font_search: String::new(),
|
font_search: String::new(),
|
||||||
|
icons_fetched: false,
|
||||||
|
icon_fetch_handle: None,
|
||||||
icon_theme_active: None,
|
icon_theme_active: None,
|
||||||
icon_themes: Vec::new(),
|
icon_themes: Vec::new(),
|
||||||
icon_handles: Vec::new(),
|
icon_handles: Vec::new(),
|
||||||
|
|
@ -1081,10 +1087,17 @@ impl Page {
|
||||||
|
|
||||||
Message::IconsAndToolkit => {
|
Message::IconsAndToolkit => {
|
||||||
self.context_view = Some(ContextView::IconsAndToolkit);
|
self.context_view = Some(ContextView::IconsAndToolkit);
|
||||||
return cosmic::task::message(crate::app::Message::OpenContextDrawer(
|
let mut tasks = Vec::new();
|
||||||
self.entity,
|
tasks.push(cosmic::task::message(
|
||||||
"".into(),
|
crate::app::Message::OpenContextDrawer(self.entity, "".into()),
|
||||||
));
|
));
|
||||||
|
if !self.icons_fetched {
|
||||||
|
self.icons_fetched = true;
|
||||||
|
let (task, handle) = cosmic::task::future(icon_themes::fetch()).abortable();
|
||||||
|
self.icon_fetch_handle = Some(handle);
|
||||||
|
tasks.push(task);
|
||||||
|
}
|
||||||
|
return Task::batch(tasks);
|
||||||
}
|
}
|
||||||
|
|
||||||
Message::Daytime(day_time) => {
|
Message::Daytime(day_time) => {
|
||||||
|
|
@ -1457,7 +1470,7 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
) -> Task<crate::pages::Message> {
|
) -> Task<crate::pages::Message> {
|
||||||
let (task, handle) = cosmic::task::batch(vec![
|
let (task, handle) = cosmic::task::batch(vec![
|
||||||
// Load icon themes
|
// Load icon themes
|
||||||
cosmic::task::future(icon_themes::fetch()).map(crate::pages::Message::Appearance),
|
// cosmic::task::future(icon_themes::fetch()).map(crate::pages::Message::Appearance),
|
||||||
// Load font families
|
// Load font families
|
||||||
cosmic::task::future(async move {
|
cosmic::task::future(async move {
|
||||||
let (mono, interface) = font_config::load_font_families();
|
let (mono, interface) = font_config::load_font_families();
|
||||||
|
|
@ -1475,7 +1488,9 @@ impl page::Page<crate::pages::Message> for Page {
|
||||||
if let Some(handle) = self.on_enter_handle.take() {
|
if let Some(handle) = self.on_enter_handle.take() {
|
||||||
handle.abort();
|
handle.abort();
|
||||||
}
|
}
|
||||||
|
if let Some(handle) = self.icon_fetch_handle.take() {
|
||||||
|
handle.abort();
|
||||||
|
}
|
||||||
cosmic::task::message(crate::pages::Message::Appearance(Message::Left))
|
cosmic::task::message(crate::pages::Message::Appearance(Message::Left))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue