Add select by word and double/triple click actions
This commit is contained in:
parent
6566350276
commit
94e6cdefda
3 changed files with 87 additions and 8 deletions
|
|
@ -704,12 +704,9 @@ impl Edit for Editor {
|
||||||
// Adjust selection
|
// Adjust selection
|
||||||
match self.selection {
|
match self.selection {
|
||||||
Selection::None => {}
|
Selection::None => {}
|
||||||
Selection::Normal(ref mut select) => {
|
Selection::Normal(ref mut select)
|
||||||
if select.line == line_i && select.index >= after_whitespace {
|
| Selection::Line(ref mut select)
|
||||||
select.index += required_indent;
|
| Selection::Word(ref mut select) => {
|
||||||
}
|
|
||||||
}
|
|
||||||
Selection::Line(ref mut select) => {
|
|
||||||
if select.line == line_i && select.index >= after_whitespace {
|
if select.line == line_i && select.index >= after_whitespace {
|
||||||
select.index += required_indent;
|
select.index += required_indent;
|
||||||
}
|
}
|
||||||
|
|
@ -768,7 +765,9 @@ impl Edit for Editor {
|
||||||
// Adjust selection
|
// Adjust selection
|
||||||
match self.selection {
|
match self.selection {
|
||||||
Selection::None => {}
|
Selection::None => {}
|
||||||
Selection::Normal(ref mut select) | Selection::Line(ref mut select) => {
|
Selection::Normal(ref mut select)
|
||||||
|
| Selection::Line(ref mut select)
|
||||||
|
| Selection::Word(ref mut select) => {
|
||||||
if select.line == line_i && select.index > last_indent {
|
if select.line == line_i && select.index > last_indent {
|
||||||
select.index -= after_whitespace - last_indent;
|
select.index -= after_whitespace - last_indent;
|
||||||
}
|
}
|
||||||
|
|
@ -791,6 +790,33 @@ impl Edit for Editor {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Action::DoubleClick { x, y } => {
|
||||||
|
self.set_selection(Selection::None);
|
||||||
|
|
||||||
|
if let Some(new_cursor) = self.buffer.hit(x as f32, y as f32) {
|
||||||
|
if new_cursor != self.cursor {
|
||||||
|
let color = self.cursor.color;
|
||||||
|
self.cursor = new_cursor;
|
||||||
|
self.cursor.color = color;
|
||||||
|
self.buffer.set_redraw(true);
|
||||||
|
}
|
||||||
|
self.selection = Selection::Word(self.cursor);
|
||||||
|
self.buffer.set_redraw(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Action::TripleClick { x, y } => {
|
||||||
|
self.set_selection(Selection::None);
|
||||||
|
|
||||||
|
if let Some(new_cursor) = self.buffer.hit(x as f32, y as f32) {
|
||||||
|
if new_cursor != self.cursor {
|
||||||
|
let color = self.cursor.color;
|
||||||
|
self.cursor = new_cursor;
|
||||||
|
self.cursor.color = color;
|
||||||
|
}
|
||||||
|
self.selection = Selection::Line(self.cursor);
|
||||||
|
self.buffer.set_redraw(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
Action::Drag { x, y } => {
|
Action::Drag { x, y } => {
|
||||||
if self.selection == Selection::None {
|
if self.selection == Selection::None {
|
||||||
self.selection = Selection::Normal(self.cursor);
|
self.selection = Selection::Normal(self.cursor);
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
#[cfg(not(feature = "std"))]
|
#[cfg(not(feature = "std"))]
|
||||||
use alloc::{string::String, vec::Vec};
|
use alloc::{string::String, vec::Vec};
|
||||||
use core::cmp;
|
use core::cmp;
|
||||||
|
use unicode_segmentation::UnicodeSegmentation;
|
||||||
|
|
||||||
#[cfg(feature = "swash")]
|
#[cfg(feature = "swash")]
|
||||||
use crate::Color;
|
use crate::Color;
|
||||||
|
|
@ -69,6 +70,16 @@ pub enum Action {
|
||||||
x: i32,
|
x: i32,
|
||||||
y: i32,
|
y: i32,
|
||||||
},
|
},
|
||||||
|
/// Mouse double click at specified position
|
||||||
|
DoubleClick {
|
||||||
|
x: i32,
|
||||||
|
y: i32,
|
||||||
|
},
|
||||||
|
/// Mouse triple click at specified position
|
||||||
|
TripleClick {
|
||||||
|
x: i32,
|
||||||
|
y: i32,
|
||||||
|
},
|
||||||
/// Mouse drag to specified position
|
/// Mouse drag to specified position
|
||||||
Drag {
|
Drag {
|
||||||
x: i32,
|
x: i32,
|
||||||
|
|
@ -140,6 +151,8 @@ pub enum Selection {
|
||||||
Normal(Cursor),
|
Normal(Cursor),
|
||||||
/// Select by lines
|
/// Select by lines
|
||||||
Line(Cursor),
|
Line(Cursor),
|
||||||
|
/// Select by words
|
||||||
|
Word(Cursor),
|
||||||
//TODO: Select block
|
//TODO: Select block
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -202,6 +215,46 @@ pub trait Edit {
|
||||||
let end_index = self.buffer().lines[end_line].text().len();
|
let end_index = self.buffer().lines[end_line].text().len();
|
||||||
Some((Cursor::new(start_line, 0), Cursor::new(end_line, end_index)))
|
Some((Cursor::new(start_line, 0), Cursor::new(end_line, end_index)))
|
||||||
}
|
}
|
||||||
|
Selection::Word(select) => {
|
||||||
|
let (mut start, mut end) = match select.line.cmp(&cursor.line) {
|
||||||
|
cmp::Ordering::Greater => (cursor, select),
|
||||||
|
cmp::Ordering::Less => (select, cursor),
|
||||||
|
cmp::Ordering::Equal => {
|
||||||
|
/* select.line == cursor.line */
|
||||||
|
if select.index < cursor.index {
|
||||||
|
(select, cursor)
|
||||||
|
} else {
|
||||||
|
/* select.index >= cursor.index */
|
||||||
|
(cursor, select)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Move start to beginning of word
|
||||||
|
{
|
||||||
|
let line = &self.buffer().lines[start.line];
|
||||||
|
start.index = line
|
||||||
|
.text()
|
||||||
|
.unicode_word_indices()
|
||||||
|
.rev()
|
||||||
|
.map(|(i, _)| i)
|
||||||
|
.find(|&i| i < start.index)
|
||||||
|
.unwrap_or(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Move end to end of word
|
||||||
|
{
|
||||||
|
let line = &self.buffer().lines[end.line];
|
||||||
|
end.index = line
|
||||||
|
.text()
|
||||||
|
.unicode_word_indices()
|
||||||
|
.map(|(i, word)| i + word.len())
|
||||||
|
.find(|&i| i > end.index)
|
||||||
|
.unwrap_or(line.text().len());
|
||||||
|
}
|
||||||
|
|
||||||
|
Some((start, end))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -413,7 +413,7 @@ impl<'a> Edit for ViEditor<'a> {
|
||||||
editor.insert_string(data, None);
|
editor.insert_string(data, None);
|
||||||
} else {
|
} else {
|
||||||
match selection {
|
match selection {
|
||||||
Selection::Normal(_) | Selection::None => {
|
Selection::None | Selection::Normal(_) | Selection::Word(_) => {
|
||||||
let mut cursor = editor.cursor();
|
let mut cursor = editor.cursor();
|
||||||
if after {
|
if after {
|
||||||
let buffer = editor.buffer();
|
let buffer = editor.buffer();
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue