2022-03-27 00:01:24 +00:00
|
|
|
package layout
|
|
|
|
|
|
|
|
import (
|
2022-03-27 21:21:52 +00:00
|
|
|
"strings"
|
|
|
|
|
2022-03-27 00:01:24 +00:00
|
|
|
tea "github.com/charmbracelet/bubbletea"
|
2023-04-16 22:31:03 +00:00
|
|
|
"github.com/lmika/dynamo-browse/internal/dynamo-browse/ui/teamodels/utils"
|
2022-03-27 00:01:24 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
// VBox is a model which will display its children vertically.
|
|
|
|
type VBox struct {
|
2022-03-27 21:21:52 +00:00
|
|
|
boxSize BoxSize
|
2022-03-27 00:01:24 +00:00
|
|
|
children []ResizingModel
|
|
|
|
}
|
|
|
|
|
2022-03-27 21:21:52 +00:00
|
|
|
func NewVBox(boxSize BoxSize, children ...ResizingModel) VBox {
|
|
|
|
return VBox{boxSize: boxSize, children: children}
|
2022-03-27 00:01:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func (vb VBox) Init() tea.Cmd {
|
|
|
|
var cc utils.CmdCollector
|
|
|
|
for _, c := range vb.children {
|
|
|
|
cc.Collect(c, c.Init())
|
|
|
|
}
|
|
|
|
return cc.Cmd()
|
|
|
|
}
|
|
|
|
|
|
|
|
func (vb VBox) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
|
|
|
|
var cc utils.CmdCollector
|
|
|
|
for i, c := range vb.children {
|
|
|
|
vb.children[i] = cc.Collect(c.Update(msg)).(ResizingModel)
|
|
|
|
}
|
|
|
|
return vb, cc.Cmd()
|
|
|
|
}
|
|
|
|
|
|
|
|
func (vb VBox) View() string {
|
|
|
|
sb := new(strings.Builder)
|
|
|
|
for i, c := range vb.children {
|
|
|
|
if i > 0 {
|
|
|
|
sb.WriteRune('\n')
|
|
|
|
}
|
|
|
|
sb.WriteString(c.View())
|
|
|
|
}
|
|
|
|
return sb.String()
|
|
|
|
}
|
|
|
|
|
|
|
|
func (vb VBox) Resize(w, h int) ResizingModel {
|
|
|
|
for i, c := range vb.children {
|
2022-03-27 21:21:52 +00:00
|
|
|
childHeight := vb.boxSize.childSize(i, len(vb.children), h)
|
|
|
|
vb.children[i] = c.Resize(w, childHeight)
|
2022-03-27 00:01:24 +00:00
|
|
|
}
|
|
|
|
return vb
|
|
|
|
}
|