diff options
| author | Polesznyák Márk <contact@pml68.dev> | 2025-10-21 19:58:20 +0200 |
|---|---|---|
| committer | Polesznyák Márk <contact@pml68.dev> | 2025-10-21 19:59:43 +0200 |
| commit | 58fe7987198e001f2ab1bc27406130f2c581961d (patch) | |
| tree | a1108ab2e7afd54ee453ed80badf139c5bf5b467 | |
| parent | feat: implement triple-click + drag by-line selection (diff) | |
| download | iced_selection-58fe7987198e001f2ab1bc27406130f2c581961d.tar.gz | |
fix: triple-click + drag edge cases
| -rw-r--r-- | src/selection.rs | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/src/selection.rs b/src/selection.rs index 2c1e43d..d3cdb76 100644 --- a/src/selection.rs +++ b/src/selection.rs @@ -215,6 +215,12 @@ impl Selection { new_line: usize, paragraph: &Paragraph, ) { + if self.active_end().line == new_line { + return; + } + + let old_direction = self.direction; + if new_line < self.start.line { self.direction = Direction::Left; } else if new_line > self.end.line { @@ -224,9 +230,28 @@ impl Selection { let (start, end) = if self.direction == Direction::Right { let value = Value::new(paragraph.buffer().lines[new_line].text()); - (self.start, SelectionEnd::new(new_line, value.len())) + let start = if self.direction == old_direction { + self.start + } else { + SelectionEnd::new(self.end.line, 0) + }; + + let end = SelectionEnd::new(new_line, value.len()); + + (start, end) } else { - (SelectionEnd::new(new_line, 0), self.end) + let start = SelectionEnd::new(new_line, 0); + let end = if self.direction == old_direction { + self.end + } else { + let value = Value::new( + paragraph.buffer().lines[self.start.line].text(), + ); + + SelectionEnd::new(self.start.line, value.len()) + }; + + (start, end) }; self.moving_line_index = None; |
