refactor: move render_decoration to WidgetStyle
This commit is contained in:
parent
a1455e8e3d
commit
aaca270de4
2 changed files with 36 additions and 27 deletions
|
|
@ -205,33 +205,7 @@ pub fn render(self: *Self, theme: *const Widget.Theme) bool {
|
|||
fn on_render_default(_: ?*anyopaque, _: *const Widget.Theme) void {}
|
||||
|
||||
fn render_decoration_default(self: *Self, theme: *const Widget.Theme, widget_style: *const Widget.Style) void {
|
||||
const style = Widget.Style.theme_style_from_type(self.widget_type, theme);
|
||||
const padding = widget_style.padding;
|
||||
const border = widget_style.border;
|
||||
const plane = &self.plane;
|
||||
const box = self.deco_box;
|
||||
|
||||
plane.set_style(style);
|
||||
plane.fill(" ");
|
||||
|
||||
if (padding.top > 0 and padding.left > 0) put_at_pos(plane, 0, 0, border.nw);
|
||||
if (padding.top > 0 and padding.right > 0) put_at_pos(plane, 0, box.w - 1, border.ne);
|
||||
if (padding.bottom > 0 and padding.left > 0 and box.h > 0) put_at_pos(plane, box.h - 1, 0, border.sw);
|
||||
if (padding.bottom > 0 and padding.right > 0 and box.h > 0) put_at_pos(plane, box.h - 1, box.w - 1, border.se);
|
||||
|
||||
{
|
||||
const start: usize = if (padding.left > 0) 1 else 0;
|
||||
const end: usize = if (padding.right > 0 and box.w > 0) box.w - 1 else box.w;
|
||||
if (padding.top > 0) for (start..end) |x| put_at_pos(plane, 0, x, border.n);
|
||||
if (padding.bottom > 0) for (start..end) |x| put_at_pos(plane, box.h - 1, x, border.s);
|
||||
}
|
||||
|
||||
{
|
||||
const start: usize = if (padding.top > 0) 1 else 0;
|
||||
const end: usize = if (padding.bottom > 0 and box.h > 0) box.h - 1 else box.h;
|
||||
if (padding.left > 0) for (start..end) |y| put_at_pos(plane, y, 0, border.w);
|
||||
if (padding.right > 0) for (start..end) |y| put_at_pos(plane, y, box.w - 1, border.e);
|
||||
}
|
||||
widget_style.render_decoration(self.deco_box, self.widget_type, &self.plane, theme);
|
||||
}
|
||||
|
||||
inline fn put_at_pos(plane: *Plane, y: usize, x: usize, egc: []const u8) void {
|
||||
|
|
|
|||
|
|
@ -4,6 +4,8 @@ border: Border = Border.blank,
|
|||
pub const WidgetType = @import("config").WidgetType;
|
||||
pub const WidgetStyle = @import("config").WidgetStyle;
|
||||
pub const tui = @import("tui.zig");
|
||||
const Plane = @import("renderer").Plane;
|
||||
const Box = @import("Box.zig");
|
||||
|
||||
pub const Padding = struct {
|
||||
pub const Unit = u16;
|
||||
|
|
@ -162,3 +164,36 @@ pub fn theme_style_from_type(style_type: WidgetType, theme: *const Theme) Theme.
|
|||
},
|
||||
};
|
||||
}
|
||||
|
||||
pub fn render_decoration(widget_style: *const @This(), box: Box, widget_type: WidgetType, plane: *Plane, theme: *const Theme) void {
|
||||
const style = theme_style_from_type(widget_type, theme);
|
||||
const padding = widget_style.padding;
|
||||
const border = widget_style.border;
|
||||
|
||||
plane.set_style(style);
|
||||
plane.fill(" ");
|
||||
|
||||
if (padding.top > 0 and padding.left > 0) put_at_pos(plane, 0, 0, border.nw);
|
||||
if (padding.top > 0 and padding.right > 0) put_at_pos(plane, 0, box.w - 1, border.ne);
|
||||
if (padding.bottom > 0 and padding.left > 0 and box.h > 0) put_at_pos(plane, box.h - 1, 0, border.sw);
|
||||
if (padding.bottom > 0 and padding.right > 0 and box.h > 0) put_at_pos(plane, box.h - 1, box.w - 1, border.se);
|
||||
|
||||
{
|
||||
const start: usize = if (padding.left > 0) 1 else 0;
|
||||
const end: usize = if (padding.right > 0 and box.w > 0) box.w - 1 else box.w;
|
||||
if (padding.top > 0) for (start..end) |x| put_at_pos(plane, 0, x, border.n);
|
||||
if (padding.bottom > 0) for (start..end) |x| put_at_pos(plane, box.h - 1, x, border.s);
|
||||
}
|
||||
|
||||
{
|
||||
const start: usize = if (padding.top > 0) 1 else 0;
|
||||
const end: usize = if (padding.bottom > 0 and box.h > 0) box.h - 1 else box.h;
|
||||
if (padding.left > 0) for (start..end) |y| put_at_pos(plane, y, 0, border.w);
|
||||
if (padding.right > 0) for (start..end) |y| put_at_pos(plane, y, box.w - 1, border.e);
|
||||
}
|
||||
}
|
||||
|
||||
inline fn put_at_pos(plane: *Plane, y: usize, x: usize, egc: []const u8) void {
|
||||
plane.cursor_move_yx(@intCast(y), @intCast(x)) catch return;
|
||||
plane.putchar(egc);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue