fix search and select
This commit is contained in:
parent
24fa66a2de
commit
8623e3109a
2 changed files with 32 additions and 14 deletions
|
@ -270,7 +270,8 @@ pub struct Config {
|
||||||
pub show_animation_time: Option<u64>,
|
pub show_animation_time: Option<u64>,
|
||||||
|
|
||||||
/// Defines the animation when the window is hidden.
|
/// Defines the animation when the window is hidden.
|
||||||
/// Defaults to Expand
|
/// Defaults to None, because it is a bit buggy with
|
||||||
|
/// gtk layer shell. works fine with normal window though
|
||||||
#[serde(default = "default_hide_animation")]
|
#[serde(default = "default_hide_animation")]
|
||||||
#[clap(long = "hide-animation")]
|
#[clap(long = "hide-animation")]
|
||||||
pub hide_animation: Option<Animation>,
|
pub hide_animation: Option<Animation>,
|
||||||
|
@ -383,7 +384,7 @@ pub fn default_hide_animation_time() -> Option<u64> {
|
||||||
#[allow(clippy::unnecessary_wraps)]
|
#[allow(clippy::unnecessary_wraps)]
|
||||||
#[must_use]
|
#[must_use]
|
||||||
pub fn default_hide_animation() -> Option<Animation> {
|
pub fn default_hide_animation() -> Option<Animation> {
|
||||||
Some(Animation::Expand)
|
Some(Animation::None)
|
||||||
}
|
}
|
||||||
|
|
||||||
// allowed because option is needed for serde macro
|
// allowed because option is needed for serde macro
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
use std::ops::DerefMut;
|
||||||
use std::sync::{Arc, Mutex};
|
use std::sync::{Arc, Mutex};
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
|
@ -172,13 +173,16 @@ fn build_ui<T>(
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
let items_clone = Arc::<Mutex<HashMap<FlowBoxChild, MenuItem<T>>>>::clone(&list_items);
|
let items_sort = Arc::<Mutex<HashMap<FlowBoxChild, MenuItem<T>>>>::clone(&list_items);
|
||||||
inner_box.set_sort_func(move |child1, child2| sort_menu_items(child1, child2, &items_clone));
|
inner_box.set_sort_func(move |child1, child2| sort_menu_items(child1, child2, &items_sort));
|
||||||
|
|
||||||
// Set focus after everything is realized
|
let items_focus = Arc::<Mutex<HashMap<FlowBoxChild, MenuItem<T>>>>::clone(&list_items);
|
||||||
inner_box.connect_map(|fb| {
|
inner_box.connect_map(move |fb| {
|
||||||
fb.grab_focus();
|
fb.grab_focus();
|
||||||
fb.invalidate_sort();
|
fb.invalidate_sort();
|
||||||
|
|
||||||
|
let mut item_lock = items_focus.lock().unwrap();
|
||||||
|
select_first_visible_child(item_lock.deref_mut(), fb)
|
||||||
});
|
});
|
||||||
|
|
||||||
let wrapper_box = gtk4::Box::new(Orientation::Vertical, 0);
|
let wrapper_box = gtk4::Box::new(Orientation::Vertical, 0);
|
||||||
|
@ -265,6 +269,13 @@ fn sort_menu_items<T>(
|
||||||
let m1 = lock.get(child1);
|
let m1 = lock.get(child1);
|
||||||
let m2 = lock.get(child2);
|
let m2 = lock.get(child2);
|
||||||
|
|
||||||
|
if !child1.is_visible() {
|
||||||
|
return Ordering::Smaller;
|
||||||
|
}
|
||||||
|
if !child2.is_visible() {
|
||||||
|
return Ordering::Larger;
|
||||||
|
}
|
||||||
|
|
||||||
match (m1, m2) {
|
match (m1, m2) {
|
||||||
(Some(menu1), Some(menu2)) => {
|
(Some(menu1), Some(menu2)) => {
|
||||||
if menu1.search_sort_score != 0.0 || menu2.search_sort_score != 0.0 {
|
if menu1.search_sort_score != 0.0 || menu2.search_sort_score != 0.0 {
|
||||||
|
@ -704,7 +715,6 @@ fn filter_widgets<T>(
|
||||||
}
|
}
|
||||||
|
|
||||||
let query = query.to_owned().to_lowercase();
|
let query = query.to_owned().to_lowercase();
|
||||||
let mut fb: Option<&FlowBoxChild> = None;
|
|
||||||
for (flowbox_child, menu_item) in items.iter_mut() {
|
for (flowbox_child, menu_item) in items.iter_mut() {
|
||||||
let menu_item_search = format!(
|
let menu_item_search = format!(
|
||||||
"{} {}",
|
"{} {}",
|
||||||
|
@ -745,16 +755,23 @@ fn filter_widgets<T>(
|
||||||
};
|
};
|
||||||
|
|
||||||
menu_item.search_sort_score = search_sort_score;
|
menu_item.search_sort_score = search_sort_score;
|
||||||
if visible {
|
|
||||||
fb = Some(flowbox_child);
|
|
||||||
}
|
|
||||||
|
|
||||||
flowbox_child.set_visible(visible);
|
flowbox_child.set_visible(visible);
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(top_item) = fb {
|
select_first_visible_child(items, inner_box);
|
||||||
inner_box.select_child(top_item);
|
}
|
||||||
top_item.grab_focus();
|
|
||||||
|
fn select_first_visible_child<T>(
|
||||||
|
items: &mut HashMap<FlowBoxChild, MenuItem<T>>,
|
||||||
|
inner_box: &FlowBox,
|
||||||
|
) {
|
||||||
|
for i in 0..items.len() {
|
||||||
|
if let Some(child) = inner_box.child_at_index(i as i32) {
|
||||||
|
if child.is_visible() {
|
||||||
|
inner_box.select_child(&child);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue