flow/src/tui/status/widget.zig
CJ van den Berg aa568dfd5e
feat: add status bar widget parameter support with parameters for linenumber and spacer widgets
linenumber widgets may have three parameters: pad width (int), pad value (space/zero) and
digit style (ascii/digital/subscript/superscript). eg `5,zero,digital`

spacers may have one parameter: width (int)
2025-03-25 20:50:11 +01:00

48 lines
2 KiB
Zig

const std = @import("std");
const EventHandler = @import("EventHandler");
const Plane = @import("renderer").Plane;
const log = @import("log");
const Widget = @import("../Widget.zig");
const widgets = std.static_string_map.StaticStringMap(CreateFunction).initComptime(.{
.{ "mode", @import("modestate.zig").create },
.{ "file", @import("filestate.zig").create },
.{ "log", @import("minilog.zig").create },
.{ "selection", @import("selectionstate.zig").create },
.{ "diagnostics", @import("diagstate.zig").create },
.{ "linenumber", @import("linenumstate.zig").create },
.{ "modifiers", @import("modstate.zig").create },
.{ "keystate", @import("keystate.zig").create },
.{ "expander", @import("blank.zig").Create(.dynamic) },
.{ "spacer", @import("blank.zig").Create(.{ .static = 1 }) },
.{ "clock", @import("clock.zig").create },
.{ "keybind", @import("keybindstate.zig").create },
.{ "tabs", @import("tabs.zig").create },
});
pub const CreateError = error{ OutOfMemory, WidgetInitFailed };
pub const CreateFunction = *const fn (allocator: std.mem.Allocator, parent: Plane, event_handler: ?EventHandler, arg: ?[]const u8) CreateError!Widget;
pub fn create(descriptor: []const u8, allocator: std.mem.Allocator, parent: Plane, event_handler: ?EventHandler) CreateError!?Widget {
var it = std.mem.splitScalar(u8, descriptor, ':');
const name = it.next() orelse {
const logger = log.logger("statusbar");
logger.print_err("config", "bad widget descriptor \"{s}\" (see log)", .{descriptor});
return null;
};
const arg = it.next();
const create_ = widgets.get(name) orelse {
const logger = log.logger("statusbar");
logger.print_err("config", "unknown widget \"{s}\" (see log)", .{name});
log_widgets(logger);
return null;
};
return try create_(allocator, parent, event_handler, arg);
}
fn log_widgets(logger: anytype) void {
logger.print("available widgets:", .{});
for (widgets.keys()) |name|
logger.print(" {s}", .{name});
}