diff options
| author | Julian Hurst <ark@mansus.space> | 2025-03-19 23:53:56 +0100 |
|---|---|---|
| committer | Julian Hurst <ark@mansus.space> | 2025-03-19 23:53:58 +0100 |
| commit | 05794aae570fd3c2f6ed27937b785f3d086f57f4 (patch) | |
| tree | daadef54404131604bbda28cfa315f2d8eb5e522 /tui/widget/list | |
| parent | 0d8f330ccf366a2733bb6d5d1e51eef3579f04aa (diff) | |
| download | hare-tui-05794aae570fd3c2f6ed27937b785f3d086f57f4.tar.gz | |
Replace widget buf string with linesbuf
This allows the generic widget print code to iterate more easily on the
lines and to apply widget-specific styles without breaking them by
truncating the console codes.
Diffstat (limited to 'tui/widget/list')
| -rw-r--r-- | tui/widget/list/list.ha | 18 | ||||
| -rw-r--r-- | tui/widget/list/scrolllist.ha | 39 |
2 files changed, 21 insertions, 36 deletions
diff --git a/tui/widget/list/list.ha b/tui/widget/list/list.ha index 23127ac..61ab22d 100644 --- a/tui/widget/list/list.ha +++ b/tui/widget/list/list.ha @@ -56,22 +56,10 @@ style: (*widget::style | void), items: str...) (list | tty::error) = { export fn printlist(widget: *widget::widget) void = { const list = widget: *list; - let st = memio::dynamic(); - defer io::close(&st)!; - for (let i = list.frame.start; i < list.frame.end; i += 1) { - //let item = match (list.widget.sz) { - //case let sz: tty::ttysize => - // yield strings::sub(list.items[i], 0z, sz.columns); - //case widget::nosize => - // yield list.items[i]; - //}; - //memio::concat(&st, item)!; - memio::concat(&st, list.items[i])!; - if (i != list.frame.end - 1) { - memio::concat(&st, "\n")!; - }; + list.widget.buf = widget::linesbuf { + lines = list.items[list.frame.start..list.frame.end], + styles = null, }; - list.widget.buf = memio::string(&st)!; widget::print(list); }; diff --git a/tui/widget/list/scrolllist.ha b/tui/widget/list/scrolllist.ha index 55cee9a..5057116 100644 --- a/tui/widget/list/scrolllist.ha +++ b/tui/widget/list/scrolllist.ha @@ -53,28 +53,10 @@ style: (*widget::style | void), items: str...) (scrolllist | tty::error) = { fn printscrolllist(widget: *widget::widget) void = { const list = widget: *scrolllist; - let st = memio::dynamic(); - defer io::close(&st)!; - for (let i = list.frame.start; i < list.frame.end; i += 1) { - //let item = match (list.widget.sz) { - //case let sz: tty::ttysize => - // yield strings::sub(list.items[i], 0z, sz.columns); - //case widget::nosize => - // yield list.items[i]; - //}; - //memio::concat(&st, item)!; - if (i == list.cursor) { - memio::concat(&st, "\x1B[7m")!; - }; - memio::concat(&st, list.items[i])!; - if (i == list.cursor) { - memio::concat(&st, "\x1B[27m")!; - }; - if (i != list.frame.end - 1) { - memio::concat(&st, widget::NEWLINE)!; - }; + list.widget.buf = widget::linesbuf { + lines = list.items[list.frame.start..list.frame.end], + styles = &stylesscrolllist, }; - list.widget.buf = memio::string(&st)!; widget::print(list); }; @@ -131,3 +113,18 @@ export fn bottom(li: *scrolllist) void = { li.frame.end = len(li.items): u16; li.frame.start = len(li.items): u16 - sz; }; + +fn stylesscrolllist(widget: *widget::widget, txt: str, idx: size) str = { + const list = widget: *scrolllist; + const idx = idx + list.frame.start; + let st = memio::dynamic(); + defer io::close(&st)!; + if (idx == list.cursor) { + memio::concat(&st, "\x1B[7m")!; + }; + memio::concat(&st, txt)!; + if (idx == list.cursor) { + memio::concat(&st, "\x1B[27m")!; + }; + return strings::dup(memio::string(&st)!); +}; |
