gocui/place.go

201 lines
4.5 KiB
Go

package main
import (
"strings"
"go.wit.com/log"
"go.wit.com/toolkits/tree"
"go.wit.com/widget"
)
func placeBox(n *tree.Node, startW int, startH int) {
var tk *guiWidget
tk = n.TK.(*guiWidget)
if n.WidgetType != widget.Box {
return
}
showWidgetPlacement(n, true, "boxS()")
newW := startW
newH := startH
for _, child := range tk.children {
placeWidgets(child.node, newW, newH)
// n.showWidgetPlacement(logNow, "boxS()")
newR := realGocuiSize(child.node)
w := newR.w1 - newR.w0
h := newR.h1 - newR.h0
if child.direction == widget.Horizontal {
log.Log(NOW, "BOX IS HORIZONTAL", n.String(), "newWH()", newW, newH, "child()", w, h, child.String())
// expand based on the child width
newW += w
} else {
log.Log(NOW, "BOX IS VERTICAL ", n.String(), "newWH()", newW, newH, "child()", w, h, child.String())
// expand based on the child height
newH += h
}
}
// just compute this every time?
// newR := n.realGocuiSize()
showWidgetPlacement(n, true, "boxE()")
}
func placeWidgets(n *tree.Node, startW int, startH int) {
if n == nil {
return
}
if me.treeRoot == nil {
return
}
var tk *guiWidget
tk = n.TK.(*guiWidget)
switch n.WidgetType {
case widget.Window:
for _, child := range tk.children {
placeWidgets(child.node, me.RawW, me.RawH)
return
}
case widget.Tab:
for _, child := range tk.children {
placeWidgets(child.node, me.RawW, me.RawH)
return
}
case widget.Grid:
placeGrid(n, startW, startH)
case widget.Box:
placeBox(n, startW, startH)
case widget.Group:
// move the group to the parent's next location
tk.gocuiSetWH(startW, startH)
showWidgetPlacement(n, true, "group()")
newW := startW + me.GroupPadW
newH := startH + 3 // normal hight of the group label
// now move all the children aka: run place() on them
for _, child := range tk.children {
placeWidgets(child.node, newW, newH)
newR := realGocuiSize(child.node)
// w := newR.w1 - newR.w0
h := newR.h1 - newR.h0
// increment straight down
newH += h
}
default:
tk.gocuiSetWH(startW, startH)
// n.moveTo(startW, startH)
}
}
func placeGrid(n *tree.Node, startW int, startH int) {
var w *guiWidget
w = n.TK.(*guiWidget)
showWidgetPlacement(n, true, "grid0:")
if n.WidgetType != widget.Grid {
return
}
// first compute the max sizes of the rows and columns
for _, child := range w.children {
newR := realGocuiSize(child.node)
childW := newR.w1 - newR.w0
childH := newR.h1 - newR.h0
// set the child's realWidth, and grid offset
if w.widths[child.AtW] < childW {
w.widths[child.AtW] = childW
}
if w.heights[child.AtH] < childH {
w.heights[child.AtH] = childH
}
// child.showWidgetPlacement(logInfo, "grid: ")
log.Log(INFO, "placeGrid:", child.String(), "child()", childW, childH, "At()", child.AtW, child.AtH)
}
// find the width and height offset of the grid for AtW,AtH
for _, child := range w.children {
showWidgetPlacement(w.node, true, "grid1:")
var totalW, totalH int
for i, w := range w.widths {
if i < child.AtW {
totalW += w
}
}
for i, h := range w.heights {
if i < child.AtH {
totalH += h
}
}
// the new corner to move the child to
newW := startW + totalW
newH := startH + totalH
log.Log(INFO, "placeGrid:", child.String(), "new()", newW, newH, "At()", child.AtW, child.AtH)
placeWidgets(child.node, newW, newH)
showWidgetPlacement(child.node, true, "grid2:")
}
showWidgetPlacement(n, true, "grid3:")
}
// computes the real, actual size of all the gocli objects in a widget
func realGocuiSize(n *tree.Node) *rectType {
var f func(n *tree.Node, r *rectType)
newR := new(rectType)
// initialize the values to opposite
newR.w0 = 80
newR.h0 = 24
if me.baseGui != nil {
maxW, maxH := me.baseGui.Size()
newR.w0 = maxW
newR.h0 = maxH
}
newR.w1 = 0
newR.h1 = 0
// expand the rectangle to the biggest thing displayed
f = func(n *tree.Node, r *rectType) {
var tk *guiWidget
tk = n.TK.(*guiWidget)
newR := tk.gocuiSize
if !tk.isFake {
if r.w0 > newR.w0 {
r.w0 = newR.w0
}
if r.h0 > newR.h0 {
r.h0 = newR.h0
}
if r.w1 < newR.w1 {
r.w1 = newR.w1
}
if r.h1 < newR.h1 {
r.h1 = newR.h1
}
}
for _, child := range tk.children {
f(child.node, r)
}
}
f(n, newR)
return newR
}
func textSize(n *tree.Node) (int, int) {
var tk *guiWidget
tk = n.TK.(*guiWidget)
var width, height int
for _, s := range strings.Split(widget.GetString(tk.value), "\n") {
if width < len(s) {
width = len(s)
}
height += 1
}
return width, height
}