93 lines
2.4 KiB
Go
93 lines
2.4 KiB
Go
package initwizard
|
|
|
|
// PanelKind identifies a renderable panel in the layout plan.
|
|
type PanelKind int
|
|
|
|
const (
|
|
// PanelForm is the editable field column.
|
|
PanelForm PanelKind = iota
|
|
// PanelSourcePreview is the rendered example source file.
|
|
PanelSourcePreview
|
|
// PanelYAMLPreview is the .license-tool.yaml preview.
|
|
PanelYAMLPreview
|
|
)
|
|
|
|
// Orientation is how the panels are arranged.
|
|
type Orientation int
|
|
|
|
const (
|
|
// LayoutHorizontal places panels side by side.
|
|
LayoutHorizontal Orientation = iota
|
|
// LayoutStacked places panels top to bottom.
|
|
LayoutStacked
|
|
)
|
|
|
|
// Panel is one panel's kind and its allotted interior dimensions.
|
|
type Panel struct {
|
|
Kind PanelKind
|
|
Width int
|
|
Height int
|
|
}
|
|
|
|
// PanelPlan is the adaptive layout decision for a given terminal body size. When
|
|
// TooSmall is set the caller should refuse the TUI and fall back to flag-only init.
|
|
type PanelPlan struct {
|
|
TooSmall bool
|
|
Orientation Orientation
|
|
Panels []Panel
|
|
}
|
|
|
|
// Layout breakpoints. WHY adaptive panel count: a teaching tool wants the source AND
|
|
// yaml previews beside the form when there is room, two panels at medium width, and a
|
|
// stacked single column when narrow; below the floor the previews cannot render
|
|
// usefully so the TUI is refused.
|
|
const (
|
|
layoutMinWidth = 60
|
|
layoutMinHeight = 20
|
|
layoutFormWidth = 46
|
|
layoutWideBreakpoint = 110
|
|
layoutMediumBreakpoint = 80
|
|
layoutGutter = 1
|
|
)
|
|
|
|
// Layout chooses the panel arrangement for the given body width and height.
|
|
func Layout(width, height int) PanelPlan {
|
|
if width < layoutMinWidth || height < layoutMinHeight {
|
|
return PanelPlan{TooSmall: true}
|
|
}
|
|
|
|
switch {
|
|
case width >= layoutWideBreakpoint:
|
|
rest := width - layoutFormWidth - 2*layoutGutter
|
|
src := rest / 2
|
|
yaml := rest - src
|
|
return PanelPlan{
|
|
Orientation: LayoutHorizontal,
|
|
Panels: []Panel{
|
|
{PanelForm, layoutFormWidth, height},
|
|
{PanelSourcePreview, src, height},
|
|
{PanelYAMLPreview, yaml, height},
|
|
},
|
|
}
|
|
case width >= layoutMediumBreakpoint:
|
|
src := width - layoutFormWidth - layoutGutter
|
|
return PanelPlan{
|
|
Orientation: LayoutHorizontal,
|
|
Panels: []Panel{
|
|
{PanelForm, layoutFormWidth, height},
|
|
{PanelSourcePreview, src, height},
|
|
},
|
|
}
|
|
default:
|
|
formHeight := height / 2
|
|
srcHeight := height - formHeight - layoutGutter
|
|
return PanelPlan{
|
|
Orientation: LayoutStacked,
|
|
Panels: []Panel{
|
|
{PanelForm, width, formHeight},
|
|
{PanelSourcePreview, width, srcHeight},
|
|
},
|
|
}
|
|
}
|
|
}
|