fix: app-list ordering of favorites and config updates on drop

This commit is contained in:
Ashley Wulber 2023-07-27 12:11:58 -04:00 • committed by Ashley Wulber
parent 20e084c808
commit aaf0aa674c
2 changed files with 26 additions and 37 deletions

View file

@ -281,6 +281,7 @@ struct DesktopInfo {
} }
fn desktop_info_for_app_ids(mut app_ids: Vec<String>) -> Vec<DesktopInfo> { fn desktop_info_for_app_ids(mut app_ids: Vec<String>) -> Vec<DesktopInfo> {
let app_ids_clone = app_ids.clone();
let mut ret = freedesktop_desktop_entry::Iter::new(freedesktop_desktop_entry::default_paths()) let mut ret = freedesktop_desktop_entry::Iter::new(freedesktop_desktop_entry::default_paths())
.filter_map(|path| { .filter_map(|path| {
std::fs::read_to_string(&path).ok().and_then(|input| { std::fs::read_to_string(&path).ok().and_then(|input| {
@ -316,6 +317,7 @@ fn desktop_info_for_app_ids(mut app_ids: Vec<String>) -> Vec<DesktopInfo> {
}) })
.collect_vec(), .collect_vec(),
); );
ret.sort_by(|a, b| app_ids_clone.iter().position(|id| id == &a.id || id.eq(&a.name)).cmp(&app_ids_clone.iter().position(|id| id == &b.id || id.eq(&b.name))));
ret ret
} }
@ -644,10 +646,7 @@ impl Application for CosmicAppList {
.and_then(|o| o.dock_item.map(|i| (i, o.preview_index))) .and_then(|o| o.dock_item.map(|i| (i, o.preview_index)))
{ {
self.item_ctr += 1; self.item_ctr += 1;
let _ = self.config.add_favorite(
dock_item.desktop_info.id.clone(),
&Config::new(APP_ID, 1).unwrap(),
);
if let Some((pos, is_favorite)) = self if let Some((pos, is_favorite)) = self
.active_list .active_list
.iter() .iter()
@ -672,8 +671,10 @@ impl Application for CosmicAppList {
dock_item.toplevels = t.toplevels; dock_item.toplevels = t.toplevels;
}; };
dock_item.id = self.item_ctr; dock_item.id = self.item_ctr;
self.favorite_list self.favorite_list
.insert(index.min(self.favorite_list.len()), dock_item); .insert(index.min(self.favorite_list.len()), dock_item);
self.config.update_favorites(self.favorite_list.iter().map(|dock_item| dock_item.desktop_info.id.clone()).collect(), &Config::new(APP_ID, 1).unwrap());
} }
return finish_dnd(); return finish_dnd();
} }
@ -803,48 +804,31 @@ impl Application for CosmicAppList {
} }
Message::ConfigUpdated(config) => { Message::ConfigUpdated(config) => {
self.config = config; self.config = config;
// drain to active list
let mut new_list: Vec<_> = desktop_info_for_app_ids(self.config.favorites.clone())
.into_iter()
.map(|e| {
self.item_ctr += 1;
DockItem {
id: self.item_ctr,
toplevels: Default::default(),
desktop_info: e,
}
})
.collect();
for item in &mut new_list {
if let Some(old_item) = self
.favorite_list
.iter()
.position(|i| i.desktop_info.id == item.desktop_info.id)
{
let old_item = self.favorite_list.swap_remove(old_item);
*item = old_item;
} else if let Some(old_item) = self
.active_list
.iter()
.position(|i| i.desktop_info.id == item.desktop_info.id)
{
let old_item = self.active_list.remove(old_item);
*item = old_item;
}
}
for item in self.favorite_list.drain(..) { for item in self.favorite_list.drain(..) {
self.active_list.push(item); self.active_list.push(item);
} }
self.favorite_list = new_list; // pull back configured items into the favorites list
self.favorite_list = desktop_info_for_app_ids(self.config.favorites.clone()).into_iter().map(|new_dock_item| {
if let Some(p) = self.active_list.iter().position(|dock_item| {
dock_item.desktop_info.id == new_dock_item.id
}) {
self.active_list.remove(p)
} else {
DockItem {
id: self.item_ctr,
toplevels: Default::default(),
desktop_info: new_dock_item,
}
}
}).collect();
} }
Message::Theme(t) => { Message::Theme(t) => {
self.theme = t; self.theme = t;
} }
} }
Command::none() Command::none()
} }

View file

@ -57,4 +57,9 @@ impl AppListConfig {
let _ = self.write_entry(&config); let _ = self.write_entry(&config);
} }
} }
pub fn update_favorites(&mut self, favorites: Vec<String>, config: &Config) {
self.favorites = favorites;
let _ = self.write_entry(&config);
}
} }