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);
		};
	};
};
