summaryrefslogtreecommitdiff
path: root/tui/widget/list/list.ha
diff options
context:
space:
mode:
Diffstat (limited to 'tui/widget/list/list.ha')
-rw-r--r--tui/widget/list/list.ha58
1 files changed, 58 insertions, 0 deletions
diff --git a/tui/widget/list/list.ha b/tui/widget/list/list.ha
new file mode 100644
index 0000000..4da52d5
--- /dev/null
+++ b/tui/widget/list/list.ha
@@ -0,0 +1,58 @@
+use tui::widget;
+use io;
+use unix::tty;
+use memio;
+use strings;
+
+export type frame = struct {
+ start: u16,
+ end: u16,
+};
+
+export type list = struct {
+ widget: widget::widget,
+ items: []str,
+ frame: frame,
+};
+
+export fn newlist(out: io::file, pos: widget::coords, sz: widget::widgetsize, items: str...) (list | tty::error) = {
+ const tsz = tty::winsize(out)?;
+
+ let end = match (sz) {
+ case let sz: tty::ttysize =>
+ yield if (tsz.rows < sz.rows) tsz.rows else sz.rows;
+ case widget::nosize =>
+ yield tsz.rows;
+ };
+
+ if (end > len(items)) {
+ end = len(items): u16;
+ };
+
+ return list {
+ widget = widget::widget {
+ out = out,
+ print = &printlist,
+ resize = &resizelist,
+ pos = pos,
+ sz = sz,
+ },
+ items = items,
+ frame = frame {
+ start = 0,
+ end = end,
+ },
+ };
+};
+
+export fn printlist(widget: *widget::widget) void = {
+ const list = widget: *list;
+ let st = memio::dynamic();
+ defer io::close(&st)!;
+ memio::concat(&st, strings::join("\n", list.items[list.frame.start..list.frame.end]...))!;
+ widget::print(list.widget.out, memio::string(&st)!, (1, 1));
+};
+
+export fn resizelist(widget: *widget::widget, ttysize: tty::ttysize) void = {
+ return;
+};