diff options
| author | Julian Hurst <ark@mansus.space> | 2025-03-12 04:17:40 +0100 |
|---|---|---|
| committer | Julian Hurst <ark@mansus.space> | 2025-03-12 04:17:40 +0100 |
| commit | f5ebe6b7f42ca673c3fcd82207b3ef68e16ea21b (patch) | |
| tree | 02a78831c500de2f5a0193cb2e41af15d811dff4 /tui | |
| parent | fcff38543be6a1b321641f26aa349cf0f02d66bb (diff) | |
| download | hare-tui-f5ebe6b7f42ca673c3fcd82207b3ef68e16ea21b.tar.gz | |
Add text and list widgets
Diffstat (limited to 'tui')
| -rw-r--r-- | tui/widget/list/list.ha | 58 | ||||
| -rw-r--r-- | tui/widget/text/text.ha | 34 |
2 files changed, 92 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; +}; diff --git a/tui/widget/text/text.ha b/tui/widget/text/text.ha new file mode 100644 index 0000000..5cd8da7 --- /dev/null +++ b/tui/widget/text/text.ha @@ -0,0 +1,34 @@ +use io; +use unix::tty; +use tui::widget; + +export type text = struct { + widget: widget::widget, + txt: str, +}; + +export fn newtext(out: io::file, txt: str, pos: widget::coords) text = { + return text { + widget = widget::widget { + out = out, + print = &printtext, + resize = &resizetext, + pos = pos, + sz = widget::nosize, + }, + txt = txt, + }; +}; + +fn printtext(widget: *widget::widget) void = { + const widget = widget: *text; + widget::print(widget.widget.out, widget.txt, widget.widget.pos); +}; + +fn resizetext(widget: *widget::widget, ttysize: tty::ttysize) void = { + return; +}; + +export fn settext(text: *text, txt: str) void = { + text.txt = txt; +}; |
