wip fix: use app id for grouping window lists & replace top level if it already exists & show separator for active and saved app lists

This commit is contained in:
Ashley Wulber 2022-07-19 23:12:37 -04:00
parent e7f9e95440
commit 223c7855cf
No known key found for this signature in database
GPG key ID: 5216D4F46A90A820
5 changed files with 38 additions and 30 deletions

4
Cargo.lock generated
View file

@ -2141,7 +2141,7 @@ checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244"
[[package]] [[package]]
name = "relm4" name = "relm4"
version = "0.5.0-beta.1" version = "0.5.0-beta.1"
source = "git+https://github.com/relm4/relm4?branch=next#746d244004e23764294b23519f6f8be1002c1ceb" source = "git+https://github.com/Relm4/Relm4.git?branch=next#746d244004e23764294b23519f6f8be1002c1ceb"
dependencies = [ dependencies = [
"async-broadcast", "async-broadcast",
"async-oneshot", "async-oneshot",
@ -2158,7 +2158,7 @@ dependencies = [
[[package]] [[package]]
name = "relm4-macros" name = "relm4-macros"
version = "0.5.0-beta.1" version = "0.5.0-beta.1"
source = "git+https://github.com/relm4/relm4?branch=next#746d244004e23764294b23519f6f8be1002c1ceb" source = "git+https://github.com/Relm4/Relm4.git?branch=next#746d244004e23764294b23519f6f8be1002c1ceb"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",

View file

@ -7,6 +7,7 @@ use crate::dock_list::DockListType;
use crate::utils::AppListEvent; use crate::utils::AppListEvent;
use cascade::cascade; use cascade::cascade;
use cosmic_panel_config::{PanelAnchor, CosmicPanelConfig}; use cosmic_panel_config::{PanelAnchor, CosmicPanelConfig};
use gtk4::Separator;
use gtk4::prelude::*; use gtk4::prelude::*;
use gtk4::subclass::prelude::*; use gtk4::subclass::prelude::*;
use gtk4::Orientation; use gtk4::Orientation;
@ -38,21 +39,21 @@ impl AppsContainer {
let saved_app_list_view = DockList::new(DockListType::Saved, config.clone()); let saved_app_list_view = DockList::new(DockListType::Saved, config.clone());
self_.append(&saved_app_list_view); self_.append(&saved_app_list_view);
// let separator_container = cascade! { let separator_container = cascade! {
// gtk4::Box::new(Orientation::Vertical, 0); gtk4::Box::new(Orientation::Vertical, 0);
// ..set_margin_top(8); ..set_margin_top(8);
// ..set_margin_bottom(8); ..set_margin_bottom(8);
// ..set_vexpand(true); ..set_vexpand(true);
// }; };
// self_.append(&separator_container); self_.append(&separator_container);
// let separator = cascade! { let separator = cascade! {
// Separator::new(Orientation::Vertical); Separator::new(Orientation::Vertical);
// ..set_margin_start(8); ..set_margin_start(8);
// ..set_margin_end(8); ..set_margin_end(8);
// ..set_vexpand(true); ..set_vexpand(true);
// ..add_css_class("dock_separator"); ..add_css_class("dock_separator");
// }; };
// separator_container.append(&separator); separator_container.append(&separator);
let active_app_list_view = DockList::new(DockListType::Active, config.clone()); let active_app_list_view = DockList::new(DockListType::Active, config.clone());
self_.append(&active_app_list_view); self_.append(&active_app_list_view);
// self_.connect_orientation_notify(glib::clone!(@weak separator => move |c| { // self_.connect_orientation_notify(glib::clone!(@weak separator => move |c| {

View file

@ -85,6 +85,7 @@ impl DockList {
} }
fn restore_data(&self) { fn restore_data(&self) {
// TODO use IDs instead of names
if let Ok(file) = File::open(data_path()) { if let Ok(file) = File::open(data_path()) {
if let Ok(data) = serde_json::from_reader::<_, Vec<String>>(file) { if let Ok(data) = serde_json::from_reader::<_, Vec<String>>(file) {
// dbg!(&data); // dbg!(&data);

View file

@ -78,7 +78,7 @@ impl DockObject {
imp.saved.replace(is_saved); imp.saved.replace(is_saved);
} }
pub fn from_search_results(results: BoxedWindowList) -> Self { pub fn from_window_list(results: BoxedWindowList) -> Self {
let appinfo = if let Some(first) = results.0.get(0) { let appinfo = if let Some(first) = results.0.get(0) {
xdg::BaseDirectories::new() xdg::BaseDirectories::new()
.expect("could not access XDG Base directory") .expect("could not access XDG Base directory")
@ -95,7 +95,7 @@ impl DockObject {
if let Some(path) = path.to_str() { if let Some(path) = path.to_str() {
if let Some(app_info) = gio::DesktopAppInfo::new(path) { if let Some(app_info) = gio::DesktopAppInfo::new(path) {
if app_info.should_show() if app_info.should_show()
&& first.name.as_str() == app_info.name().as_str() && Some(&first.app_id) == app_info.id().map(|s| s.to_string()).as_ref()
{ {
return Some(app_info); return Some(app_info);
} }

View file

@ -125,11 +125,11 @@ fn main() {
let stack_active = cached_results.iter().fold( let stack_active = cached_results.iter().fold(
BTreeMap::new(), BTreeMap::new(),
|mut acc: BTreeMap<String, BoxedWindowList>, elem: &Toplevel| { |mut acc: BTreeMap<String, BoxedWindowList>, elem: &Toplevel| {
if let Some(v) = acc.get_mut(&elem.name) { if let Some(v) = acc.get_mut(&elem.app_id) {
v.0.push(elem.clone()); v.0.push(elem.clone());
} else { } else {
acc.insert( acc.insert(
elem.name.clone(), elem.app_id.clone(),
BoxedWindowList(vec![elem.clone()]), BoxedWindowList(vec![elem.clone()]),
); );
} }
@ -152,7 +152,7 @@ fn main() {
if let Some((i, _s)) = stack_active if let Some((i, _s)) = stack_active
.iter() .iter()
.enumerate() .enumerate()
.find(|(_i, s)| s.0[0].name == cur_app_info.name()) .find(|(_i, s)| Some(&s.0[0].app_id) == cur_app_info.id().map(|s| s.to_string()).as_ref())
{ {
// println!( // println!(
// "found active saved app {} at {}", // "found active saved app {} at {}",
@ -163,7 +163,7 @@ fn main() {
saved_app_model.items_changed(saved_i, 0, 0); saved_app_model.items_changed(saved_i, 0, 0);
} else if cached_results } else if cached_results
.iter() .iter()
.any(|s| s.name == cur_app_info.name()) .any(|s| Some(&s.app_id) == cur_app_info.id().map(|s| s.to_string()).as_ref())
{ {
dock_obj.set_property( dock_obj.set_property(
"active", "active",
@ -180,7 +180,7 @@ fn main() {
let model_len = active_app_model.n_items(); let model_len = active_app_model.n_items();
let new_results: Vec<glib::Object> = stack_active let new_results: Vec<glib::Object> = stack_active
.into_iter() .into_iter()
.map(|v| DockObject::from_search_results(v).upcast()) .map(|v| DockObject::from_window_list(v).upcast())
.collect(); .collect();
active_app_model.splice(0, model_len, &new_results[..]); active_app_model.splice(0, model_len, &new_results[..]);
true true
@ -197,7 +197,11 @@ fn main() {
} }
AppListEvent::Add(top_level) => { AppListEvent::Add(top_level) => {
// sort to make comparison with cache easier // sort to make comparison with cache easier
cached_results.push(top_level); if let Some(i) = cached_results.iter().position(|t| t.toplevel_handle == top_level.toplevel_handle) {
cached_results[i] = top_level;
} else {
cached_results.push(top_level);
}
true true
} }
}; };
@ -207,11 +211,11 @@ fn main() {
let stack_active = cached_results.iter().fold( let stack_active = cached_results.iter().fold(
BTreeMap::new(), BTreeMap::new(),
|mut acc: BTreeMap<String, BoxedWindowList>, elem| { |mut acc: BTreeMap<String, BoxedWindowList>, elem| {
if let Some(v) = acc.get_mut(&elem.name) { if let Some(v) = acc.get_mut(&elem.app_id) {
v.0.push(elem.clone()); v.0.push(elem.clone());
} else { } else {
acc.insert( acc.insert(
elem.name.clone(), elem.app_id.clone(),
BoxedWindowList(vec![elem.clone()]), BoxedWindowList(vec![elem.clone()]),
); );
} }
@ -234,7 +238,7 @@ fn main() {
if let Some((i, _s)) = stack_active if let Some((i, _s)) = stack_active
.iter() .iter()
.enumerate() .enumerate()
.find(|(_i, s)| s.0[0].app_id == cur_app_info.name()) .find(|(_i, s)| Some(&s.0[0].app_id) == cur_app_info.id().map(|s| s.to_string()).as_ref())
{ {
// println!("found active saved app {} at {}", s.0[0].name, i); // println!("found active saved app {} at {}", s.0[0].name, i);
let active = stack_active.remove(i); let active = stack_active.remove(i);
@ -242,7 +246,7 @@ fn main() {
saved_app_model.items_changed(saved_i, 0, 0); saved_app_model.items_changed(saved_i, 0, 0);
} else if cached_results } else if cached_results
.iter() .iter()
.any(|s| s.app_id == cur_app_info.name()) .any(|s| Some(&s.app_id) == cur_app_info.id().map(|s| s.to_string()).as_ref())
{ {
dock_obj.set_property( dock_obj.set_property(
"active", "active",
@ -259,8 +263,10 @@ fn main() {
let model_len = active_app_model.n_items(); let model_len = active_app_model.n_items();
let new_results: Vec<glib::Object> = stack_active let new_results: Vec<glib::Object> = stack_active
.into_iter() .into_iter()
.map(|v| DockObject::from_search_results(v).upcast()) .map(|v| DockObject::from_window_list(v).upcast())
.collect(); .collect();
dbg!(&new_results);
active_app_model.splice(0, model_len, &new_results[..]); active_app_model.splice(0, model_len, &new_results[..]);
} }
glib::prelude::Continue(true) glib::prelude::Continue(true)