From f625eaacfa95ceeb7894fd45dbe3d0495b8df3d7 Mon Sep 17 00:00:00 2001 From: Alexander Mohr Date: Sun, 4 May 2025 00:48:00 +0200 Subject: [PATCH] support password --- src/lib/config.rs | 5 +++++ src/lib/gui.rs | 43 ++++++++++++++++++++++++++++++------------- 2 files changed, 35 insertions(+), 13 deletions(-) diff --git a/src/lib/config.rs b/src/lib/config.rs index f288c9c..19ad77c 100644 --- a/src/lib/config.rs +++ b/src/lib/config.rs @@ -488,6 +488,11 @@ impl Config { pub fn allow_markup(&self) -> bool { self.allow_markup.unwrap_or(false) } + + #[must_use] + pub fn password(&self) -> Option { + self.password.clone() + } } fn default_false() -> bool { diff --git a/src/lib/gui.rs b/src/lib/gui.rs index 3bb393e..67cddef 100644 --- a/src/lib/gui.rs +++ b/src/lib/gui.rs @@ -149,6 +149,7 @@ struct UiElements { search: SearchEntry, main_box: FlowBox, menu_rows: ArcMenuMap, + search_text: Arc>, } /// Shows the user interface and **blocks** until the user selected an entry @@ -240,6 +241,7 @@ fn build_ui( search: SearchEntry::new(), main_box: FlowBox::new(), menu_rows: Arc::new(Mutex::new(HashMap::new())), + search_text: Arc::new(Mutex::new(String::new())), }); // handle keys as soon as possible @@ -283,7 +285,7 @@ fn build_ui( outer_box.append(&scroll); build_main_box(config, &ui_elements); - build_search_entry(config, &ui_elements); + build_search_entry(config, &ui_elements, &meta); let wrapper_box = gtk4::Box::new(Orientation::Vertical, 0); wrapper_box.append(&ui_elements.main_box); @@ -334,7 +336,7 @@ fn build_main_box(config: &Config, ui_elements: &Rc(config: &Config, ui_elements: &UiElements) { +fn build_search_entry(config: &Config, ui_elements: &UiElements, meta: &MetaData) { ui_elements.search.set_widget_name("input"); ui_elements.search.set_css_classes(&["input"]); ui_elements @@ -345,7 +347,21 @@ fn build_search_entry(config: &Config, ui_elements: &UiElements) { ui_elements.search.set_visible(false); } if let Some(search) = config.search() { - ui_elements.search.set_text(&search); + set_search_text(&search, ui_elements, meta); + } +} + +fn set_search_text(text: &str, ui: &UiElements, meta: &MetaData) { + let mut lock = ui.search_text.lock().unwrap(); + text.clone_into(&mut lock); + if let Some(pw) = meta.config.password() { + let mut ui_text = String::new(); + for _ in 0..text.len() { + ui_text += &pw; + } + ui.search.set_text(&ui_text); + } else { + ui.search.set_text(text); } } @@ -379,10 +395,10 @@ fn build_ui_from_menu_items( } } - let query = ui_clone.search.text(); + let search_lock = ui_clone.search_text.lock().unwrap(); let menus = &mut *lock; set_menu_visibility_for_search( - &query, + &search_lock, menus, &meta_clone.config, meta_clone.search_ignored_words.as_ref(), @@ -460,17 +476,19 @@ fn handle_key_press( close_gui(ui.app.clone(), ui.window.clone(), &meta.config); } Key::Return => { - let query = ui.search.text().to_string(); - if let Err(e) = handle_selected_item(ui, meta, Some(&query), None, meta.new_on_empty) { + let search_lock = ui.search_text.lock().unwrap(); + if let Err(e) = + handle_selected_item(ui, meta, Some(&search_lock), None, meta.new_on_empty) + { log::error!("{e}"); } } Key::BackSpace => { - let mut query = ui.search.text().to_string(); + let mut query = ui.search_text.lock().unwrap().to_string(); if !query.is_empty() { query.pop(); - ui.search.set_text(&query); + set_search_text(&query, ui, meta); update_view_from_provider(&query); } } @@ -502,7 +520,7 @@ fn handle_key_press( } let query = changed.1; - ui.search.set_text(&query); + set_search_text(&query, ui, meta); update_view(&query); } } @@ -512,9 +530,8 @@ fn handle_key_press( } _ => { if let Some(c) = keyboard_key.to_unicode() { - let current = ui.search.text().to_string(); - let query = format!("{current}{c}"); - ui.search.set_text(&query); + let query = format!("{}{c}", ui.search_text.lock().unwrap()); + set_search_text(&query, ui, meta); update_view_from_provider(&query); } }