widgets(textinput): fix cursor positioning
Fix cursor positioning when jumping more than one cursor location at a time, for example when pressing "ctrl+a" or "ctrl+e" to go to beginning and end of the line
This commit is contained in:
parent
770f6d1c07
commit
310bff369b
1 changed files with 38 additions and 6 deletions
|
@ -98,13 +98,45 @@ pub fn sliceToCursor(self: *TextInput, buf: []u8) []const u8 {
|
||||||
return buf[0..offset];
|
return buf[0..offset];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// calculates the display width from the draw_offset to the cursor
|
||||||
|
fn widthToCursor(self: *TextInput, win: Window) usize {
|
||||||
|
var width: usize = 0;
|
||||||
|
var first_iter = GraphemeIterator.init(self.buf.items);
|
||||||
|
var i: usize = 0;
|
||||||
|
while (first_iter.next()) |grapheme| {
|
||||||
|
defer i += 1;
|
||||||
|
if (i < self.draw_offset) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (i == self.cursor_idx) return width;
|
||||||
|
const g = grapheme.slice(self.buf.items);
|
||||||
|
width += win.gwidth(g);
|
||||||
|
}
|
||||||
|
const second_half = self.buf.secondHalf();
|
||||||
|
var second_iter = GraphemeIterator.init(second_half);
|
||||||
|
while (second_iter.next()) |grapheme| {
|
||||||
|
defer i += 1;
|
||||||
|
if (i < self.draw_offset) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (i == self.cursor_idx) return width;
|
||||||
|
const g = grapheme.slice(second_half);
|
||||||
|
width += win.gwidth(g);
|
||||||
|
}
|
||||||
|
return width;
|
||||||
|
}
|
||||||
|
|
||||||
pub fn draw(self: *TextInput, win: Window) void {
|
pub fn draw(self: *TextInput, win: Window) void {
|
||||||
if (self.cursor_idx > self.prev_cursor_idx and
|
if (self.cursor_idx < self.draw_offset) self.draw_offset = self.cursor_idx;
|
||||||
self.prev_cursor_col > (win.width -| self.scroll_offset))
|
while (true) {
|
||||||
self.draw_offset += 1;
|
const width = self.widthToCursor(win);
|
||||||
if (self.cursor_idx < self.prev_cursor_idx and
|
log.debug("WIDTH TO CURSOR {d}, win.width {d}", .{ width, win.width });
|
||||||
self.prev_cursor_col < self.scroll_offset)
|
if (width >= win.width) {
|
||||||
self.draw_offset -|= 1;
|
self.draw_offset +|= width - win.width + 1;
|
||||||
|
continue;
|
||||||
|
} else break;
|
||||||
|
}
|
||||||
|
|
||||||
self.prev_cursor_idx = self.cursor_idx;
|
self.prev_cursor_idx = self.cursor_idx;
|
||||||
self.prev_cursor_col = 0;
|
self.prev_cursor_col = 0;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue