diff --git a/src/widget/ViewPort.zig b/src/widget/ViewPort.zig index 2f4c79e..ef6c872 100644 --- a/src/widget/ViewPort.zig +++ b/src/widget/ViewPort.zig @@ -36,17 +36,10 @@ pub fn deinit(this: *@This()) void { /// Update loop for a given widget to react to the provided `Event`. It may /// change its internal state, update variables, react to user input, etc. pub fn update(this: *@This(), event: Event) void { + // FIXME: limit scroll-able area to corresponding contents! switch (event) { .key_press => |key| { - if (key.matches(vaxis.Key.right, .{}) or key.matches('l', .{})) { - this.view.scroll.x +|= 1; - } else if (key.matches(vaxis.Key.right, .{ .shift = true }) or key.matches('>', .{})) { - this.view.scroll.x +|= 32; - } else if (key.matches(vaxis.Key.left, .{}) or key.matches('h', .{})) { - this.view.scroll.x -|= 1; - } else if (key.matches(vaxis.Key.left, .{ .shift = true }) or key.matches('<', .{})) { - this.view.scroll.x -|= 32; - } else if (key.matches(vaxis.Key.up, .{}) or key.matches('k', .{})) { + if (key.matches(vaxis.Key.up, .{}) or key.matches('k', .{})) { this.view.scroll.y -|= 1; } else if (key.matches(vaxis.Key.page_up, .{}) or key.matches('u', .{ .ctrl = true })) { this.view.scroll.y -|= 32; @@ -94,20 +87,18 @@ pub fn update(this: *@This(), event: Event) void { /// the dimension one widget may take on the screen. The widget itself has no /// control over this. pub fn draw(this: *@This(), win: vaxis.Window) void { - // FIXME: the current node2buffer implementation cannot determine how many rows and columns there are from the read file contents - // this.view.draw(win, .{ .cols = this.buffer.cols, .rows = this.buffer.rows }); // needed for scroll bar scaling and display + // TODO: this is not very performant and should be improved + var rows: usize = 0; + for (this.buffer.items) |cell| { + if (std.mem.eql(u8, cell.char.grapheme, "\n")) { + rows += 1; + } + } + this.view.draw(win, .{ .cols = win.width, .rows = rows }); // needed for scroll bar scaling and display + const Pos = struct { x: usize = 0, y: usize = 0 }; var pos: Pos = .{}; - const bounds = this.view.bounds(win); - for (this.buffer.items) |cell| { - if (bounds.above(pos.y)) break; - - if (!bounds.colInside(pos.x)) { - pos.x = 0; - pos.y += 1; - } - this.view.writeCell(win, pos.x, pos.y, cell); if (std.mem.eql(u8, cell.char.grapheme, "\n")) { pos.x = 0; diff --git a/src/widget/node2buffer.zig b/src/widget/node2buffer.zig index 02ee290..c30b446 100644 --- a/src/widget/node2buffer.zig +++ b/src/widget/node2buffer.zig @@ -14,7 +14,7 @@ pub fn toBuffer( var next_start: ?usize = start; var style = sty; // FIXME: support list display - // TODO: improve code block listings (i.e. add line numbers with corresponding seperator, etc.) + // TODO: improve code block listings (i.e. add line numbers with corresponding separator, etc.) // determine general styling changes switch (node.token.element.type) { @@ -41,6 +41,9 @@ pub fn toBuffer( next_start = node.token.start; style.fg = .{ .index = 8 }; }, + .link => { + style.fg = .{ .index = 3 }; + }, else => {}, } @@ -48,13 +51,12 @@ pub fn toBuffer( const content = value: { switch (node.token.element.type) { .text => break :value input[node.token.start..node.token.end], + // TODO: use corresponding link contents to create 'real' links using escape sequences + .link => break :value input[node.token.start .. node.token.start + node.href.?.len + node.title.?.len + 4], .bold_close, .italic_close, .block_close, .code_close, .title_close, .href_close => { if (next_start) |s| { next_start = null; - const e = node.token.end; - std.log.debug("start - end: {d}..{d}", .{ s, e }); - std.log.debug("content: {s}", .{input[s..e]}); - break :value input[s..e]; + break :value input[s..node.token.end]; } break :value ""; },