fix: word/line wise dragging should keep the original word/line selected
Also, fix bad behaviour when double/triple clicking the last word or line in a file. closes #264
This commit is contained in:
parent
e6e5a2f94e
commit
947e55e0c6
1 changed files with 26 additions and 11 deletions
|
@ -276,6 +276,7 @@ pub const Editor = struct {
|
||||||
cursels: CurSel.List = .empty,
|
cursels: CurSel.List = .empty,
|
||||||
cursels_saved: CurSel.List = .empty,
|
cursels_saved: CurSel.List = .empty,
|
||||||
selection_mode: SelectMode = .char,
|
selection_mode: SelectMode = .char,
|
||||||
|
selection_drag_initial: ?Selection = null,
|
||||||
clipboard: ?[]const u8 = null,
|
clipboard: ?[]const u8 = null,
|
||||||
target_column: ?Cursor = null,
|
target_column: ?Cursor = null,
|
||||||
filter_: ?struct {
|
filter_: ?struct {
|
||||||
|
@ -2280,6 +2281,7 @@ pub const Editor = struct {
|
||||||
self.selection_mode = .word;
|
self.selection_mode = .word;
|
||||||
primary.cursor.move_abs(root, &self.view, @intCast(y), @intCast(x), self.metrics) catch return;
|
primary.cursor.move_abs(root, &self.view, @intCast(y), @intCast(x), self.metrics) catch return;
|
||||||
_ = try self.select_word_at_cursor(primary);
|
_ = try self.select_word_at_cursor(primary);
|
||||||
|
self.selection_drag_initial = primary.selection;
|
||||||
self.clamp_mouse();
|
self.clamp_mouse();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2290,6 +2292,7 @@ pub const Editor = struct {
|
||||||
self.selection_mode = .line;
|
self.selection_mode = .line;
|
||||||
primary.cursor.move_abs(root, &self.view, @intCast(y), @intCast(x), self.metrics) catch return;
|
primary.cursor.move_abs(root, &self.view, @intCast(y), @intCast(x), self.metrics) catch return;
|
||||||
try self.select_line_at_cursor(primary);
|
try self.select_line_at_cursor(primary);
|
||||||
|
self.selection_drag_initial = primary.selection;
|
||||||
self.clamp_mouse();
|
self.clamp_mouse();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2300,17 +2303,29 @@ pub const Editor = struct {
|
||||||
const root = self.buf_root() catch return;
|
const root = self.buf_root() catch return;
|
||||||
const sel = primary.enable_selection(root, self.metrics) catch return;
|
const sel = primary.enable_selection(root, self.metrics) catch return;
|
||||||
sel.end.move_abs(root, &self.view, @intCast(y_), @intCast(x_), self.metrics) catch return;
|
sel.end.move_abs(root, &self.view, @intCast(y_), @intCast(x_), self.metrics) catch return;
|
||||||
|
const initial = self.selection_drag_initial orelse sel.*;
|
||||||
switch (self.selection_mode) {
|
switch (self.selection_mode) {
|
||||||
.char => {},
|
.char => {},
|
||||||
.word => if (sel.begin.right_of(sel.end))
|
.word => {
|
||||||
with_selection_const(root, move_cursor_word_begin, primary, self.metrics) catch return
|
if (sel.begin.right_of(sel.end)) {
|
||||||
else
|
sel.begin = initial.end;
|
||||||
with_selection_const(root, move_cursor_word_end, primary, self.metrics) catch return,
|
with_selection_const(root, move_cursor_word_begin, primary, self.metrics) catch {};
|
||||||
.line => if (sel.begin.right_of(sel.end))
|
} else {
|
||||||
with_selection_const(root, move_cursor_begin, primary, self.metrics) catch return
|
sel.begin = initial.begin;
|
||||||
else {
|
with_selection_const(root, move_cursor_word_end, primary, self.metrics) catch {};
|
||||||
with_selection_const(root, move_cursor_end, primary, self.metrics) catch return;
|
}
|
||||||
with_selection_const(root, move_cursor_right, primary, self.metrics) catch return;
|
},
|
||||||
|
.line => {
|
||||||
|
if (sel.begin.right_of(sel.end)) {
|
||||||
|
sel.begin = initial.end;
|
||||||
|
with_selection_const(root, move_cursor_begin, primary, self.metrics) catch {};
|
||||||
|
} else {
|
||||||
|
sel.begin = initial.begin;
|
||||||
|
blk: {
|
||||||
|
with_selection_const(root, move_cursor_end, primary, self.metrics) catch break :blk;
|
||||||
|
with_selection_const(root, move_cursor_right, primary, self.metrics) catch {};
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
primary.cursor = sel.end;
|
primary.cursor = sel.end;
|
||||||
|
@ -4081,7 +4096,7 @@ pub const Editor = struct {
|
||||||
defer cursel.check_selection(root, self.metrics);
|
defer cursel.check_selection(root, self.metrics);
|
||||||
sel.normalize();
|
sel.normalize();
|
||||||
try move_cursor_word_begin(root, &sel.begin, self.metrics);
|
try move_cursor_word_begin(root, &sel.begin, self.metrics);
|
||||||
try move_cursor_word_end(root, &sel.end, self.metrics);
|
move_cursor_word_end(root, &sel.end, self.metrics) catch {};
|
||||||
cursel.cursor = sel.end;
|
cursel.cursor = sel.end;
|
||||||
return sel;
|
return sel;
|
||||||
}
|
}
|
||||||
|
@ -4091,7 +4106,7 @@ pub const Editor = struct {
|
||||||
const sel = try cursel.enable_selection(root, self.metrics);
|
const sel = try cursel.enable_selection(root, self.metrics);
|
||||||
sel.normalize();
|
sel.normalize();
|
||||||
try move_cursor_begin(root, &sel.begin, self.metrics);
|
try move_cursor_begin(root, &sel.begin, self.metrics);
|
||||||
try move_cursor_end(root, &sel.end, self.metrics);
|
move_cursor_end(root, &sel.end, self.metrics) catch {};
|
||||||
cursel.cursor = sel.end;
|
cursel.cursor = sel.end;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue