From c9b699a6381139d8285ebc448a861bef36bb61cd Mon Sep 17 00:00:00 2001 From: darkfi Date: Thu, 4 Jul 2024 17:15:28 +0200 Subject: [PATCH] wallet: editbox full unicode input --- bin/darkwallet/src/ui/editbox.rs | 49 +++++++++++++++----------------- 1 file changed, 23 insertions(+), 26 deletions(-) diff --git a/bin/darkwallet/src/ui/editbox.rs b/bin/darkwallet/src/ui/editbox.rs index 221f011d8..9e08a9de7 100644 --- a/bin/darkwallet/src/ui/editbox.rs +++ b/bin/darkwallet/src/ui/editbox.rs @@ -33,7 +33,7 @@ const CURSOR_WIDTH: f32 = 4.; struct PressedKeysSmoothRepeat { /// When holding keys, we track from start and last sent time. /// This is useful for initial delay and smooth scrolling. - pressed_keys: HashMap, + pressed_keys: HashMap, /// Initial delay before allowing keys start_delay: u32, /// Minimum time between repeated keys @@ -45,7 +45,7 @@ impl PressedKeysSmoothRepeat { Self { pressed_keys: HashMap::new(), start_delay, step_time } } - fn key_down(&mut self, key: KeyCode, repeat: bool) -> u32 { + fn key_down(&mut self, key: char, repeat: bool) -> u32 { debug!(target: "PressedKeysSmoothRepeat", "key_up({:?}, {})", key, repeat); if !repeat { self.pressed_keys.remove(&key); @@ -62,7 +62,7 @@ impl PressedKeysSmoothRepeat { repeater.update(self.start_delay, self.step_time) } - fn key_up(&mut self, key: &KeyCode) { + fn key_up(&mut self, key: &char) { debug!(target: "PressedKeysSmoothRepeat", "key_up({:?})", key); assert!(self.pressed_keys.contains_key(key)); self.pressed_keys.remove(key); @@ -172,9 +172,9 @@ impl EditBox { let self_ = Arc::new_cyclic(|me: &Weak| { // Start a task monitoring for key down events - let ev_sub = event_pub.subscribe_key_down(); + let ev_sub = event_pub.subscribe_char(); let me2 = me.clone(); - let key_down_task = ex.spawn(async move { + let char_task = ex.spawn(async move { loop { let Ok((key, mods, repeat)) = ev_sub.receive().await else { debug!(target: "ui::editbox", "Event relayer closed"); @@ -183,7 +183,7 @@ impl EditBox { let Some(self_) = me2.upgrade() else { // Should not happen - panic!("self destroyed before key_down_task was stopped!"); + panic!("self destroyed before char_task was stopped!"); }; let actions = { @@ -192,11 +192,12 @@ impl EditBox { }; debug!(target: "ui::editbox", "Key {:?} has {} actions", key, actions); for _ in 0..actions { - self_.do_key_action(&key, &mods).await; + self_.insert_char(key, &mods).await; } } }); + /* let ev_sub = event_pub.subscribe_key_up(); let me2 = me.clone(); let key_up_task = ex.spawn(async move { @@ -215,9 +216,10 @@ impl EditBox { repeater.key_up(&key); } }); + */ // on modify tasks too - let tasks = vec![key_down_task, key_up_task]; + let tasks = vec![char_task]; Self { node_id, @@ -283,39 +285,34 @@ impl EditBox { TextRenderInfo { glyphs, mesh, texture_id: atlas.texture_id } } - async fn do_key_action(&self, key: &KeyCode, mods: &KeyMods) { + async fn do_key_action(&self, key: char, mods: &KeyMods) { match key { - KeyCode::Left => {} + //KeyCode::Left => {} _ => self.insert_char(key, mods).await, } } - async fn insert_char(&self, key: &KeyCode, mods: &KeyMods) { - // we could use a char but fuck the law - let Some(key) = keycode_to_string(key) else { - return; - }; - + async fn insert_char(&self, key: char, mods: &KeyMods) { // First filter for only single digit keys let allowed_keys = [ - "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", - "R", "S", "T", "U", "V", "W", "X", "Y", "Z", " ", ":", ";", "'", "-", ".", "/", "=", - "(", "\\", ")", "`", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', + 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', ' ', ':', ';', '\'', '-', '.', '/', '=', + '(', '\\', ')', '`', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ]; - if !allowed_keys.contains(&key.as_str()) { - return - } + //if !allowed_keys.contains(&key) && !allowed_keys.contains(&key.to_uppercase().next().unwrap()) { + // return + //} // If we want to only allow specific chars in a String here //let ch = key.chars().next().unwrap(); // if !self.allowed_chars.chars().any(|c| c == ch) { return } - let key = if mods.shift { key.to_string() } else { key.to_lowercase() }; + //let key = if mods.shift { key.to_string() } else { key.to_lowercase() }; self.insert_text(key).await; } - async fn insert_text(&self, key: String) { + async fn insert_text(&self, key: char) { let mut text = String::new(); let cursor_pos = self.cursor_pos.get(); @@ -330,13 +327,13 @@ impl EditBox { // themselves. for (i, glyph) in glyphs.iter().enumerate() { if cursor_pos == i as u32 { - text.push_str(&key); + text.push(key); } text.push_str(&glyph.substr); } // Append to the end if cursor_pos == glyphs.len() as u32 { - text.push_str(&key); + text.push(key); } self.text.set(text);