From c3e04e0a892e2da1c14a0d23703f877dbad586e6 Mon Sep 17 00:00:00 2001 From: Aleksander Date: Sun, 4 Jan 2026 13:11:31 +0100 Subject: [PATCH] tweak watch ui, load application list gradually (prevent lag) --- dash-frontend/src/tab/apps.rs | 85 +++++++++++++------------- wlx-overlay-s/src/assets/gui/watch.xml | 47 ++++++++------ 2 files changed, 69 insertions(+), 63 deletions(-) diff --git a/dash-frontend/src/tab/apps.rs b/dash-frontend/src/tab/apps.rs index 923157b..0080b4f 100644 --- a/dash-frontend/src/tab/apps.rs +++ b/dash-frontend/src/tab/apps.rs @@ -1,4 +1,9 @@ -use std::{cell::RefCell, collections::HashMap, marker::PhantomData, rc::Rc}; +use std::{ + cell::RefCell, + collections::{HashMap, VecDeque}, + marker::PhantomData, + rc::Rc, +}; use wgui::{ assets::AssetPath, @@ -33,7 +38,6 @@ pub struct TabApps { parser_state: ParserState, state: Rc>, - entries: Vec, app_list: AppList, tasks: Tasks, marker: PhantomData, @@ -53,6 +57,10 @@ impl Tab for TabApps { } } + self + .app_list + .tick(frontend, &self.state, &self.tasks, &mut self.parser_state)?; + if let Some((_, launcher)) = &mut state.view_launcher { launcher.update(&mut frontend.interface, data)?; } @@ -60,9 +68,10 @@ impl Tab for TabApps { } } -#[derive(Default)] struct AppList { //data: Vec, + entries_to_mount: VecDeque, + list_parent: WidgetPair, } // called after the user clicks any desktop entry @@ -109,47 +118,31 @@ fn on_app_click( }) } +fn doc_params(globals: WguiGlobals) -> ParseDocumentParams<'static> { + ParseDocumentParams { + globals, + path: AssetPath::BuiltIn("gui/tab/apps.xml"), + extra: Default::default(), + } +} + impl TabApps { pub fn new(frontend: &mut Frontend, parent_id: WidgetID) -> anyhow::Result { - let doc_params = &ParseDocumentParams { - globals: frontend.layout.state.globals.clone(), - path: AssetPath::BuiltIn("gui/tab/apps.xml"), - extra: Default::default(), - }; - - let entries = frontend.desktop_finder.find_entries(); - - let frontend_tasks = frontend.tasks.clone(); let globals = frontend.layout.state.globals.clone(); - let tasks = Tasks::new(); let state = Rc::new(RefCell::new(State { view_launcher: None })); - let mut parser_state = wgui::parser::parse_from_assets(doc_params, &mut frontend.layout, parent_id)?; + let mut entries = frontend.desktop_finder.find_entries(); + let parser_state = wgui::parser::parse_from_assets(&doc_params(globals.clone()), &mut frontend.layout, parent_id)?; let app_list_parent = parser_state.fetch_widget(&frontend.layout.state, "app_list_parent")?; - let mut app_list = AppList::default(); - app_list.mount_entries( - frontend, - &entries, - &mut parser_state, - doc_params, - &app_list_parent, - |button, entry| { - // Set up the click handler for the app button - button.on_click(on_app_click( - frontend_tasks.clone(), - globals.clone(), - entry.clone(), - state.clone(), - tasks.clone(), - )); - }, - )?; + let app_list = AppList { + entries_to_mount: entries.drain(..).collect(), + list_parent: app_list_parent, + }; Ok(Self { app_list, parser_state, - entries, state, tasks, marker: PhantomData, @@ -163,7 +156,6 @@ impl AppList { frontend: &mut Frontend, parser_state: &mut ParserState, doc_params: &ParseDocumentParams, - list_parent: &WidgetPair, entry: &DesktopEntry, ) -> anyhow::Result> { let mut template_params = HashMap::new(); @@ -193,25 +185,32 @@ impl AppList { doc_params, "AppEntry", &mut frontend.layout, - list_parent.id, + self.list_parent.id, template_params, )?; data.fetch_component_as::("button") } - fn mount_entries( + fn tick( &mut self, frontend: &mut Frontend, - entries: &[DesktopEntry], + state: &Rc>, + tasks: &Tasks, parser_state: &mut ParserState, - doc_params: &ParseDocumentParams, - list_parent: &WidgetPair, - on_button: impl Fn(Rc, &DesktopEntry), ) -> anyhow::Result<()> { - for entry in entries { - let button = self.mount_entry(frontend, parser_state, doc_params, list_parent, entry)?; - on_button(button, entry); + if let Some(entry) = self.entries_to_mount.pop_front() { + let globals = frontend.layout.state.globals.clone(); + let button = self.mount_entry(frontend, parser_state, &doc_params(globals.clone()), &entry)?; + + button.on_click(on_app_click( + frontend.tasks.clone(), + globals.clone(), + entry.clone(), + state.clone(), + tasks.clone(), + )); } + Ok(()) } } diff --git a/wlx-overlay-s/src/assets/gui/watch.xml b/wlx-overlay-s/src/assets/gui/watch.xml index 4590ab6..f65f9a6 100644 --- a/wlx-overlay-s/src/assets/gui/watch.xml +++ b/wlx-overlay-s/src/assets/gui/watch.xml @@ -26,7 +26,7 @@ + + + @@ -131,29 +135,32 @@ -
- -
- + +
+ +
+
+ +
-
+ +
-
- -
-
- + \ No newline at end of file