diff options
Diffstat (limited to 'libtui/layout/vlayout/vlayout.ha')
| -rw-r--r-- | libtui/layout/vlayout/vlayout.ha | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/libtui/layout/vlayout/vlayout.ha b/libtui/layout/vlayout/vlayout.ha new file mode 100644 index 0000000..579625c --- /dev/null +++ b/libtui/layout/vlayout/vlayout.ha @@ -0,0 +1,44 @@ +use libtui; +use libtui::widget; +use libtui::layout; +use unix::tty; + +export type vlayout = struct { + layout: layout::layout, +}; + +// Create and return a new vlayout from a list of widgets. [[finishall]] must be +// called to properly free the widget's and layout's resources. +export fn newvlayout(widgets: *widget::widget...) vlayout = { + let sz = libtui::getwinsize(u.list.ui)!; + let cols = sz.columns / len(widgets); + for (let i = 0z; i < len(widgets); i += 1) { + const s = tty::ttysize { + columns = cols, + rows = sz.rows, + }; + widget::setsize(widgets[i], s); + }; + return vlayout { + layout = layout { + widgets = widgets, + }, + }; +}; + +// Display all the widgets contained in the given layout. +export fn print(layout: layout::layout) (void | widget::error) = { + const layout = layout: vlayout; + for (let i = 0z; i < len(layout.widgets); i += 1) { + match (layout.widgets[i].print) { + case null => + return; + case let f: *widget::print => + f(layout.widgets[i])?; + }; + libtui::cursorhome(widgets[i].ui); + for (let j = 0z; j < widgets[i].sz.columns; j += 1) { + libtui::cursorright(widgets[i].ui); + }; + }; +}; |
