feat: add remaining styles to libvaxis renderer
This commit is contained in:
parent
1cd3cb17ce
commit
ec1fcd475b
3 changed files with 57 additions and 45 deletions
|
@ -22,7 +22,7 @@ pub inline fn set_style(self: *Cell, style_: Style) void {
|
|||
switch (fs) {
|
||||
.normal => {},
|
||||
.bold => self.cell.style.bold = true,
|
||||
.italic => self.cell.style.italic = false,
|
||||
.italic => self.cell.style.italic = true,
|
||||
.underline => self.cell.style.ul_style = .single,
|
||||
.undercurl => self.cell.style.ul_style = .curly,
|
||||
.strikethrough => self.cell.style.strikethrough = true,
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
const std = @import("std");
|
||||
const Style = @import("theme").Style;
|
||||
const FontStyle = @import("theme").FontStyle;
|
||||
const StyleBits = @import("style.zig").StyleBits;
|
||||
const Cell = @import("Cell.zig");
|
||||
const vaxis = @import("vaxis");
|
||||
|
@ -13,6 +14,7 @@ name_buf: [128]u8,
|
|||
name_len: usize,
|
||||
cache: GraphemeCache = .{},
|
||||
style: vaxis.Cell.Style = .{},
|
||||
style_base: vaxis.Cell.Style = .{},
|
||||
|
||||
pub const Options = struct {
|
||||
y: usize = 0,
|
||||
|
@ -61,7 +63,7 @@ pub fn below(_: Plane) ?Plane {
|
|||
}
|
||||
|
||||
pub fn erase(self: Plane) void {
|
||||
self.window.clear();
|
||||
self.window.fill(.{ .style = self.style_base });
|
||||
}
|
||||
|
||||
pub inline fn abs_y(self: Plane) c_int {
|
||||
|
@ -136,10 +138,8 @@ pub fn putstr(self: *Plane, text: []const u8) !usize {
|
|||
const width = self.window.width;
|
||||
var iter = self.window.screen.unicode.graphemeIterator(text);
|
||||
while (iter.next()) |grapheme| {
|
||||
if (self.col >= width) {
|
||||
self.row += 1;
|
||||
self.col = 0;
|
||||
}
|
||||
if (self.col >= width)
|
||||
return result;
|
||||
const s = grapheme.bytes(text);
|
||||
if (std.mem.eql(u8, s, "\n")) {
|
||||
self.row += 1;
|
||||
|
@ -172,10 +172,6 @@ pub fn putc_yx(self: *Plane, y: c_int, x: c_int, cell: *const Cell) !usize {
|
|||
if (w == 0) return w;
|
||||
self.window.writeCell(@intCast(self.col), @intCast(self.row), cell.cell);
|
||||
self.col += @intCast(w);
|
||||
if (self.col >= self.window.width) {
|
||||
self.row += 1;
|
||||
self.col = 0;
|
||||
}
|
||||
return w;
|
||||
}
|
||||
|
||||
|
@ -230,22 +226,28 @@ pub fn at_cursor_cell(self: Plane, cell: *Cell) !usize {
|
|||
return cell.cell.char.grapheme.len;
|
||||
}
|
||||
|
||||
pub fn set_styles(self: Plane, stylebits: StyleBits) void {
|
||||
_ = self;
|
||||
_ = stylebits;
|
||||
// FIXME
|
||||
pub fn set_styles(self: *Plane, stylebits: StyleBits) void {
|
||||
self.style.strikethrough = false;
|
||||
self.style.bold = false;
|
||||
self.style.ul_style = .off;
|
||||
self.style.italic = false;
|
||||
self.on_styles(stylebits);
|
||||
}
|
||||
|
||||
pub fn on_styles(self: Plane, stylebits: StyleBits) void {
|
||||
_ = self;
|
||||
_ = stylebits;
|
||||
// FIXME
|
||||
pub fn on_styles(self: *Plane, stylebits: StyleBits) void {
|
||||
if (stylebits.struck) self.style.strikethrough = true;
|
||||
if (stylebits.bold) self.style.bold = true;
|
||||
if (stylebits.undercurl) self.style.ul_style = .curly;
|
||||
if (stylebits.underline) self.style.ul_style = .single;
|
||||
if (stylebits.italic) self.style.italic = true;
|
||||
}
|
||||
|
||||
pub fn off_styles(self: Plane, stylebits: StyleBits) void {
|
||||
_ = self;
|
||||
_ = stylebits;
|
||||
// FIXME
|
||||
pub fn off_styles(self: *Plane, stylebits: StyleBits) void {
|
||||
if (stylebits.struck) self.style.strikethrough = false;
|
||||
if (stylebits.bold) self.style.bold = false;
|
||||
if (stylebits.undercurl) self.style.ul_style = .off;
|
||||
if (stylebits.underline) self.style.ul_style = .off;
|
||||
if (stylebits.italic) self.style.italic = false;
|
||||
}
|
||||
|
||||
pub fn set_fg_rgb(self: *Plane, channel: u32) !void {
|
||||
|
@ -264,42 +266,52 @@ pub fn set_bg_palindex(self: *Plane, idx: c_uint) !void {
|
|||
self.style.bg = .{ .index = @intCast(idx) };
|
||||
}
|
||||
|
||||
pub fn set_channels(self: Plane, channels_: u64) void {
|
||||
_ = self;
|
||||
_ = channels_;
|
||||
// FIXME
|
||||
pub inline fn set_base_style(self: *Plane, _: [*c]const u8, style_: Style) void {
|
||||
self.style_base.fg = if (style_.fg) |color| vaxis.Cell.Color.rgbFromUint(@intCast(color)) else .default;
|
||||
self.style_base.bg = if (style_.bg) |color| vaxis.Cell.Color.rgbFromUint(@intCast(color)) else .default;
|
||||
if (style_.fs) |fs| set_font_style(&self.style, fs);
|
||||
self.set_style(style_);
|
||||
}
|
||||
|
||||
pub inline fn set_base_style(self: *const Plane, egc_: [*c]const u8, style_: Style) void {
|
||||
_ = self;
|
||||
_ = egc_;
|
||||
_ = style_;
|
||||
// FIXME
|
||||
pub fn set_base_style_transparent(self: *Plane, _: [*:0]const u8, style_: Style) void {
|
||||
self.style_base.fg = if (style_.fg) |color| vaxis.Cell.Color.rgbFromUint(@intCast(color)) else .default;
|
||||
self.style_base.bg = if (style_.bg) |color| vaxis.Cell.Color.rgbFromUint(@intCast(color)) else .default;
|
||||
if (style_.fs) |fs| set_font_style(&self.style, fs);
|
||||
self.set_style(style_);
|
||||
}
|
||||
|
||||
pub fn set_base_style_transparent(self: Plane, egc_: [*:0]const u8, style_: Style) void {
|
||||
_ = self;
|
||||
_ = egc_;
|
||||
_ = style_;
|
||||
// FIXME
|
||||
}
|
||||
|
||||
pub fn set_base_style_bg_transparent(self: Plane, egc_: [*:0]const u8, style_: Style) void {
|
||||
_ = self;
|
||||
_ = egc_;
|
||||
_ = style_;
|
||||
// FIXME
|
||||
pub fn set_base_style_bg_transparent(self: *Plane, _: [*:0]const u8, style_: Style) void {
|
||||
self.style_base.fg = if (style_.fg) |color| vaxis.Cell.Color.rgbFromUint(@intCast(color)) else .default;
|
||||
self.style_base.bg = if (style_.bg) |color| vaxis.Cell.Color.rgbFromUint(@intCast(color)) else .default;
|
||||
if (style_.fs) |fs| set_font_style(&self.style, fs);
|
||||
self.set_style(style_);
|
||||
}
|
||||
|
||||
pub inline fn set_style(self: *Plane, style_: Style) void {
|
||||
if (style_.fg) |color| self.style.fg = vaxis.Cell.Color.rgbFromUint(@intCast(color));
|
||||
if (style_.bg) |color| self.style.bg = vaxis.Cell.Color.rgbFromUint(@intCast(color));
|
||||
// if (style_.fs) |fontstyle| ... FIXME
|
||||
if (style_.fs) |fs| set_font_style(&self.style, fs);
|
||||
}
|
||||
|
||||
pub inline fn set_style_bg_transparent(self: *Plane, style_: Style) void {
|
||||
if (style_.fg) |color| self.style.fg = vaxis.Cell.Color.rgbFromUint(@intCast(color));
|
||||
self.style.bg = .default;
|
||||
if (style_.fs) |fs| set_font_style(&self.style, fs);
|
||||
}
|
||||
|
||||
inline fn set_font_style(style: *vaxis.Cell.Style, fs: FontStyle) void {
|
||||
switch (fs) {
|
||||
.normal => {
|
||||
style.bold = false;
|
||||
style.italic = false;
|
||||
style.dim = false;
|
||||
},
|
||||
.bold => style.bold = true,
|
||||
.italic => style.italic = true,
|
||||
.underline => style.ul_style = .single,
|
||||
.undercurl => style.ul_style = .curly,
|
||||
.strikethrough => style.strikethrough = true,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn egc_length(self: *const Plane, egcs: []const u8, colcount: *c_int, abs_col: usize) usize {
|
||||
|
|
|
@ -76,7 +76,7 @@ pub fn run(self: *Self) !void {
|
|||
}
|
||||
|
||||
pub fn render(self: *Self) !void {
|
||||
self.vx.queueRefresh(); // FIXME: why do differential updates not work?
|
||||
self.vx.queueRefresh(); // FIXME: differential updates may break if we overflow the output buffer and get a WouldBlock
|
||||
return self.vx.render();
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue