193 lines
4.3 KiB
Go
193 lines
4.3 KiB
Go
package main
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"go.wit.com/log"
|
|
"go.wit.com/toolkits/tree"
|
|
"go.wit.com/widget"
|
|
)
|
|
|
|
func (tk *guiWidget) placeBox(startW int, startH int) {
|
|
if tk.WidgetType != widget.Box {
|
|
return
|
|
}
|
|
tk.showWidgetPlacement("boxS()")
|
|
|
|
newW := startW
|
|
newH := startH
|
|
for _, child := range tk.children {
|
|
child.placeWidgets(newW, newH)
|
|
// n.showWidgetPlacement("boxS()")
|
|
newR := child.realGocuiSize()
|
|
w := newR.w1 - newR.w0
|
|
h := newR.h1 - newR.h0
|
|
if child.direction == widget.Horizontal {
|
|
log.Log(NOW, "BOX IS HORIZONTAL", tk.String(), "newWH()", newW, newH, "child()", w, h, child.String())
|
|
// expand based on the child width
|
|
newW += w
|
|
} else {
|
|
log.Log(NOW, "BOX IS VERTICAL ", tk.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()
|
|
|
|
tk.showWidgetPlacement("boxE()")
|
|
}
|
|
|
|
func (tk *guiWidget) placeWidgets(startW int, startH int) {
|
|
if tk == nil {
|
|
return
|
|
}
|
|
if me.treeRoot == nil {
|
|
return
|
|
}
|
|
|
|
switch tk.WidgetType {
|
|
case widget.Window:
|
|
for _, child := range tk.children {
|
|
child.placeWidgets(me.RawW, me.RawH)
|
|
return
|
|
}
|
|
case widget.Tab:
|
|
for _, child := range tk.children {
|
|
child.placeWidgets(me.RawW, me.RawH)
|
|
return
|
|
}
|
|
case widget.Grid:
|
|
tk.placeGrid(startW, startH)
|
|
case widget.Box:
|
|
tk.placeBox(startW, startH)
|
|
case widget.Group:
|
|
// move the group to the parent's next location
|
|
tk.gocuiSetWH(startW, startH)
|
|
tk.dumpTree("start place")
|
|
|
|
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 {
|
|
child.placeWidgets(newW, newH)
|
|
newR := child.realGocuiSize()
|
|
// w := newR.w1 - newR.w0
|
|
h := newR.h1 - newR.h0
|
|
|
|
// increment straight down
|
|
newH += h
|
|
log.Log(INFO, "REAL HIGHT ADDED", h, "newH", newH)
|
|
}
|
|
tk.dumpTree("end place")
|
|
default:
|
|
tk.gocuiSetWH(startW, startH)
|
|
// n.moveTo(startW, startH)
|
|
}
|
|
}
|
|
|
|
func (w *guiWidget) placeGrid(startW int, startH int) {
|
|
w.showWidgetPlacement("grid0:")
|
|
if w.WidgetType != widget.Grid {
|
|
return
|
|
}
|
|
|
|
// first compute the max sizes of the rows and columns
|
|
for _, child := range w.children {
|
|
newR := child.realGocuiSize()
|
|
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("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 {
|
|
child.showWidgetPlacement("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)
|
|
child.placeWidgets(newW, newH)
|
|
child.showWidgetPlacement("grid2:")
|
|
}
|
|
w.showWidgetPlacement("grid3:")
|
|
}
|
|
|
|
// computes the real, actual size of all the gocli objects in a widget
|
|
func (w *guiWidget) realGocuiSize() *rectType {
|
|
var f func(tk *guiWidget, 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(tk *guiWidget, r *rectType) {
|
|
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, r)
|
|
}
|
|
}
|
|
f(w, 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
|
|
}
|