diff --git a/src/tui/editor.zig b/src/tui/editor.zig index 5e34ca3..ddcda8f 100644 --- a/src/tui/editor.zig +++ b/src/tui/editor.zig @@ -125,7 +125,7 @@ pub const CurSel = struct { return if (self.selection) |*sel| sel else unreachable; } - fn to_selection(self: *const Self, root: Buffer.Root, metrics: Buffer.Metrics) Selection { + pub fn to_selection(self: *const Self, root: Buffer.Root, metrics: Buffer.Metrics) Selection { return switch (tui.get_selection_style()) { .normal => self.to_selection_normal(), .inclusive => self.to_selection_inclusive(root, metrics), @@ -146,6 +146,13 @@ pub const CurSel = struct { }; } + fn to_cursor_inclusive(self: *const Self, root: Buffer.Root, metrics: Buffer.Metrics) Cursor { + var cursor = self.cursor; + if (self.selection) |sel| if (!sel.is_reversed()) + cursor.move_left(root, metrics) catch {}; + return cursor; + } + pub fn disable_selection(self: *Self, root: Buffer.Root, metrics: Buffer.Metrics) void { switch (tui.get_selection_style()) { .normal => self.disable_selection_normal(), @@ -1174,18 +1181,26 @@ pub const Editor = struct { } fn render_cursors(self: *Self, theme: *const Widget.Theme, cell_map: CellMap) !void { + const style = tui.get_selection_style(); const frame = tracy.initZone(@src(), .{ .name = "editor render cursors" }); defer frame.deinit(); if (tui.config().enable_terminal_cursor and tui.rdr().vx.caps.multi_cursor) tui.rdr().clear_all_multi_cursors() catch {}; for (self.cursels.items[0 .. self.cursels.items.len - 1]) |*cursel_| if (cursel_.*) |*cursel| { - const cursor = cursel.cursor; + const cursor = self.get_rendered_cursor(style, cursel); try self.render_cursor_secondary(&cursor, theme, cell_map); }; - const cursor = self.get_primary().cursor; + const cursor = self.get_rendered_cursor(style, self.get_primary()); try self.render_cursor_primary(&cursor, theme, cell_map); } + fn get_rendered_cursor(self: *Self, style: anytype, cursel: anytype) Cursor { + return switch (style) { + .normal => cursel.cursor, + .inclusive => cursel.to_cursor_inclusive(self.buf_root() catch return cursel.cursor, self.metrics), + }; + } + fn render_cursor_primary(self: *Self, cursor: *const Cursor, theme: *const Widget.Theme, cell_map: CellMap) !void { if (!tui.is_mainview_focused() or !self.enable_terminal_cursor) { if (self.screen_cursor(cursor)) |pos| { @@ -2117,21 +2132,6 @@ pub const Editor = struct { return if (someone_stopped) error.Stop else {}; } - pub fn with_cursels_const_repeat(self: *Self, root: Buffer.Root, move: cursel_operator_const, ctx: Context) error{Stop}!void { - var someone_stopped = false; - var repeat: usize = 1; - _ = ctx.args.match(.{tp.extract(&repeat)}) catch false; - while (repeat > 0) : (repeat -= 1) { - for (self.cursels.items) |*cursel_| if (cursel_.*) |*cursel| - with_cursel_const(root, move, cursel, self.metrics) catch { - someone_stopped = true; - }; - self.collapse_cursors(); - if (someone_stopped) break; - } - return if (someone_stopped) error.Stop else {}; - } - fn with_cursel_mut_arg(self: *Self, root: Buffer.Root, op: cursel_operator_mut_arg, cursel: *CurSel, allocator: Allocator, ctx: Context) error{Stop}!Buffer.Root { return op(self, root, cursel, allocator, ctx); }