initial public release
This commit is contained in:
@@ -0,0 +1,84 @@
|
||||
package tui
|
||||
|
||||
import "github.com/charmbracelet/bubbles/table"
|
||||
|
||||
const (
|
||||
sidebarWidth = 18
|
||||
footerHeight = 1
|
||||
titleHeight = 2
|
||||
boxChromeV = 2
|
||||
boxChromeH = 4
|
||||
)
|
||||
|
||||
// flexColumns grows the columns at flexIdx to fill totalW, distributing extra
|
||||
// space proportionally to each flex column's existing width. Bubble-tea's
|
||||
// table widget reserves padding around every cell, accounted for via colPadding.
|
||||
func flexColumns(totalW int, cols []table.Column, flexIdx []int) []table.Column {
|
||||
out := make([]table.Column, len(cols))
|
||||
copy(out, cols)
|
||||
if totalW <= 0 || len(flexIdx) == 0 {
|
||||
return out
|
||||
}
|
||||
const colPadding = 2
|
||||
used := 0
|
||||
for _, c := range out {
|
||||
used += c.Width + colPadding
|
||||
}
|
||||
extra := totalW - used
|
||||
if extra <= 0 {
|
||||
return out
|
||||
}
|
||||
totalFlex := 0
|
||||
for _, i := range flexIdx {
|
||||
if i < 0 || i >= len(out) {
|
||||
return out
|
||||
}
|
||||
totalFlex += out[i].Width
|
||||
}
|
||||
if totalFlex == 0 {
|
||||
return out
|
||||
}
|
||||
distributed := 0
|
||||
for j, i := range flexIdx {
|
||||
var add int
|
||||
if j == len(flexIdx)-1 {
|
||||
add = extra - distributed
|
||||
} else {
|
||||
add = extra * out[i].Width / totalFlex
|
||||
}
|
||||
out[i].Width += add
|
||||
distributed += add
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
type layoutDims struct {
|
||||
termW, termH int
|
||||
contentW int
|
||||
contentH int
|
||||
sidebarH int
|
||||
}
|
||||
|
||||
func computeLayout(termW, termH int) layoutDims {
|
||||
if termW < 60 {
|
||||
termW = 60
|
||||
}
|
||||
if termH < 18 {
|
||||
termH = 18
|
||||
}
|
||||
contentW := termW - sidebarWidth - boxChromeH - 1
|
||||
if contentW < 40 {
|
||||
contentW = 40
|
||||
}
|
||||
contentH := termH - titleHeight - footerHeight - boxChromeV
|
||||
if contentH < 10 {
|
||||
contentH = 10
|
||||
}
|
||||
return layoutDims{
|
||||
termW: termW,
|
||||
termH: termH,
|
||||
contentW: contentW,
|
||||
contentH: contentH,
|
||||
sidebarH: contentH,
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user