diff --git a/dash-frontend/assets/gui/dashboard.xml b/dash-frontend/assets/gui/dashboard.xml index bb97d5e..5d214f2 100644 --- a/dash-frontend/assets/gui/dashboard.xml +++ b/dash-frontend/assets/gui/dashboard.xml @@ -99,6 +99,7 @@ + + + + + -->
- + \ No newline at end of file diff --git a/dash-frontend/assets/gui/view/app_launcher.xml b/dash-frontend/assets/gui/view/app_launcher.xml index 92f1c03..3611edf 100644 --- a/dash-frontend/assets/gui/view/app_launcher.xml +++ b/dash-frontend/assets/gui/view/app_launcher.xml @@ -7,7 +7,7 @@ @@ -15,7 +15,7 @@
- +
@@ -25,7 +25,7 @@ - +
- + \ No newline at end of file diff --git a/dash-frontend/src/tab/apps.rs b/dash-frontend/src/tab/apps.rs index aa52a27..0c4b078 100644 --- a/dash-frontend/src/tab/apps.rs +++ b/dash-frontend/src/tab/apps.rs @@ -70,6 +70,7 @@ struct AppList { //data: Vec, entries_to_mount: VecDeque, list_parent: WidgetPair, + prev_first_letter: char, } // called after the user clicks any desktop entry @@ -130,12 +131,21 @@ impl TabApps { let tasks = Tasks::new(); let state = Rc::new(RefCell::new(State { view_launcher: None })); - let mut entries = frontend.interface.desktop_finder(data).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 entries_sorted: Vec<_> = frontend + .interface + .desktop_finder(data) + .find_entries() + .into_values() + .collect(); + entries_sorted.sort_by(|a, b| a.app_name.cmp(&b.app_name)); + let app_list = AppList { - entries_to_mount: entries.into_values().collect(), + entries_to_mount: entries_sorted.drain(..).collect(), list_parent: app_list_parent, + prev_first_letter: ' ', }; Ok(Self { @@ -156,37 +166,55 @@ impl AppList { doc_params: &ParseDocumentParams, entry: &DesktopEntry, ) -> anyhow::Result> { - let mut template_params = HashMap::new(); + if let Some(ch) = entry.app_name.chars().next() + && self.prev_first_letter != ch + { + self.prev_first_letter = ch; + let mut params = HashMap::, Rc>::new(); + params.insert("text".into(), format!("{}", ch).into()); - // entry icon - template_params.insert( - Rc::from("src_ext"), - entry - .icon_path - .as_ref() - .map_or_else(|| Rc::from(""), |icon_path| icon_path.clone()), - ); + parser_state.parse_template( + doc_params, + "CategoryText", + &mut frontend.layout, + self.list_parent.id, + params, + )?; + } - // entry fallback (question mark) icon - template_params.insert( - Rc::from("src"), - if entry.icon_path.is_none() { - Rc::from("dashboard/terminal.svg") - } else { - Rc::from("") - }, - ); + { + let mut params = HashMap::new(); - template_params.insert(Rc::from("name"), entry.app_name.clone()); + // entry icon + params.insert( + "src_ext".into(), + entry + .icon_path + .as_ref() + .map_or_else(|| "".into(), |icon_path| icon_path.clone()), + ); - let data = parser_state.parse_template( - doc_params, - "AppEntry", - &mut frontend.layout, - self.list_parent.id, - template_params, - )?; - data.fetch_component_as::("button") + // entry fallback (question mark) icon + params.insert( + "src".into(), + if entry.icon_path.is_none() { + "dashboard/terminal.svg".into() + } else { + "".into() + }, + ); + params.insert("name".into(), entry.app_name.clone()); + + let data = parser_state.parse_template( + doc_params, + "AppEntry", + &mut frontend.layout, + self.list_parent.id, + params, + )?; + + data.fetch_component_as::("button") + } } fn tick( diff --git a/uidev/src/testbed/testbed_generic.rs b/uidev/src/testbed/testbed_generic.rs index ac1a522..5b44483 100644 --- a/uidev/src/testbed/testbed_generic.rs +++ b/uidev/src/testbed/testbed_generic.rs @@ -79,7 +79,7 @@ fn handle_button_click(button: Rc, label: Widget, text: &'stati } impl TestbedGeneric { - fn doc_params(globals: &WguiGlobals, extra: ParseDocumentExtra) -> ParseDocumentParams { + fn doc_params(globals: &'_ WguiGlobals, extra: ParseDocumentExtra) -> ParseDocumentParams<'_> { ParseDocumentParams { globals: globals.clone(), path: AssetPath::BuiltIn("gui/various_widgets.xml"),