Jelajahi Sumber

wallet/chatedit: correctly delete selected text.

darkfi 1 tahun lalu
induk
melakukan
ccdf6ec083
2 mengubah file dengan 37 tambahan dan 33 penghapusan
  1. 36 33
      bin/darkwallet/src/ui/chatedit.rs
  2. 1 0
      bin/darkwallet/src/ui/editbox/mod.rs

+ 36 - 33
bin/darkwallet/src/ui/chatedit.rs

@@ -186,6 +186,34 @@ impl TextWrap {
 
 
         (pos_start, pos_end)
         (pos_start, pos_end)
     }
     }
+
+    fn delete_selected(&mut self) {
+        let selection = std::mem::take(&mut self.select);
+
+        let sel = selection.first().unwrap();
+        let cursor_pos = std::cmp::min(sel.start, sel.end);
+
+        let render = self.get_render();
+        let mut before_text = String::new();
+        let mut after_text = String::new();
+        'next: for (pos, glyph) in render.glyphs.iter().enumerate() {
+            for select in &selection {
+                let start = std::cmp::min(select.start, select.end);
+                let end = std::cmp::max(select.start, select.end);
+
+                if start <= pos && pos < end {
+                    continue 'next
+                }
+            }
+            if pos <= cursor_pos {
+                before_text += &glyph.substr;
+            } else {
+                after_text += &glyph.substr;
+            }
+        }
+        self.editable.set_text(before_text, after_text);
+        self.clear_cache();
+    }
 }
 }
 
 
 struct WrappedLine {
 struct WrappedLine {
@@ -982,6 +1010,9 @@ impl ChatEdit {
         {
         {
             let mut text_wrap = &mut self.text_wrap.lock();
             let mut text_wrap = &mut self.text_wrap.lock();
             text_wrap.clear_cache();
             text_wrap.clear_cache();
+            if !text_wrap.select.is_empty() {
+                text_wrap.delete_selected();
+            }
             let mut tmp = [0; 4];
             let mut tmp = [0; 4];
             let key_str = key.encode_utf8(&mut tmp);
             let key_str = key.encode_utf8(&mut tmp);
             text_wrap.editable.compose(key_str, true);
             text_wrap.editable.compose(key_str, true);
@@ -1037,10 +1068,7 @@ impl ChatEdit {
             KeyCode::Kp8 => self.insert_char('8').await,
             KeyCode::Kp8 => self.insert_char('8').await,
             KeyCode::Kp9 => self.insert_char('9').await,
             KeyCode::Kp9 => self.insert_char('9').await,
             KeyCode::KpDecimal => self.insert_char('.').await,
             KeyCode::KpDecimal => self.insert_char('.').await,
-            KeyCode::Enter | KeyCode::KpEnter => {
-                let node = self.node.upgrade().unwrap();
-                node.trigger("enter_pressed", vec![]).await.unwrap();
-            }
+            KeyCode::Enter | KeyCode::KpEnter => self.insert_char('\n').await,
             KeyCode::Delete => {
             KeyCode::Delete => {
                 self.delete(0, 1);
                 self.delete(0, 1);
                 self.clamp_scroll(&mut self.text_wrap.lock());
                 self.clamp_scroll(&mut self.text_wrap.lock());
@@ -1071,38 +1099,13 @@ impl ChatEdit {
 
 
     fn delete(&self, before: usize, after: usize) {
     fn delete(&self, before: usize, after: usize) {
         let mut text_wrap = &mut self.text_wrap.lock();
         let mut text_wrap = &mut self.text_wrap.lock();
-        text_wrap.clear_cache();
-        let selection = std::mem::take(&mut self.text_wrap.lock().select);
-
-        if selection.is_empty() {
+        if text_wrap.select.is_empty() {
             text_wrap.editable.delete(before, after);
             text_wrap.editable.delete(before, after);
-            return
-        }
-
-        let sel = selection.first().unwrap();
-        let cursor_pos = std::cmp::min(sel.start, sel.end);
-
-        let render = text_wrap.get_render();
-        let mut before_text = String::new();
-        let mut after_text = String::new();
-        'next: for (pos, glyph) in render.glyphs.iter().enumerate() {
-            for select in &selection {
-                let start = std::cmp::min(select.start, select.end);
-                let end = std::cmp::max(select.start, select.end);
-
-                if start <= pos && pos < end {
-                    continue 'next
-                }
-            }
-            if pos <= cursor_pos {
-                before_text += &glyph.substr;
-            } else {
-                after_text += &glyph.substr;
-            }
+            text_wrap.clear_cache();
+        } else {
+            text_wrap.delete_selected();
         }
         }
 
 
-        text_wrap.editable.set_text(before_text, after_text);
-
         self.is_phone_select.store(false, Ordering::Relaxed);
         self.is_phone_select.store(false, Ordering::Relaxed);
         // Reshow cursor (if hidden)
         // Reshow cursor (if hidden)
         self.hide_cursor.store(false, Ordering::Relaxed);
         self.hide_cursor.store(false, Ordering::Relaxed);

+ 1 - 0
bin/darkwallet/src/ui/editbox/mod.rs

@@ -722,6 +722,7 @@ impl EditBox {
         let cursor_pos = std::cmp::min(sel.start, sel.end);
         let cursor_pos = std::cmp::min(sel.start, sel.end);
 
 
         let render = editable.render();
         let render = editable.render();
+        // Same code in chatedit's TextWrap::delete_selected()
         let mut before_text = String::new();
         let mut before_text = String::new();
         let mut after_text = String::new();
         let mut after_text = String::new();
         'next: for (pos, glyph) in render.glyphs.iter().enumerate() {
         'next: for (pos, glyph) in render.glyphs.iter().enumerate() {