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