222 lines
5.0 KiB
Go
222 lines
5.0 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
// "github.com/awesome-gocui/gocui"
|
||
|
"git.wit.org/wit/gui/toolkit"
|
||
|
)
|
||
|
|
||
|
var fakeStartWidth int = 80
|
||
|
var fakeStartHeight int = 0
|
||
|
func (w *cuiWidget) setFake() {
|
||
|
if (w.visable) {
|
||
|
return
|
||
|
}
|
||
|
t := len(w.name)
|
||
|
// setup fake labels for non-visable things off screen
|
||
|
w.realWidth = t + 2
|
||
|
w.realHeight = me.defaultHeight
|
||
|
w.realSize.w0 = fakeStartWidth
|
||
|
w.realSize.h0 = fakeStartHeight
|
||
|
w.realSize.w1 = w.realSize.w0 + w.realWidth
|
||
|
w.realSize.h1 = w.realSize.h0 + w.realHeight
|
||
|
fakeStartHeight += 3
|
||
|
if (fakeStartHeight > 24) {
|
||
|
fakeStartHeight = 0
|
||
|
fakeStartWidth += 20
|
||
|
}
|
||
|
w.showWidgetPlacement(logNow, "setFake()")
|
||
|
}
|
||
|
|
||
|
func findPlace(w *cuiWidget) {
|
||
|
w.visable = true
|
||
|
switch w.widgetType {
|
||
|
case toolkit.Root:
|
||
|
w.visable = false
|
||
|
w.setFake()
|
||
|
case toolkit.Flag:
|
||
|
w.visable = false
|
||
|
w.setFake()
|
||
|
case toolkit.Grid:
|
||
|
w.visable = false
|
||
|
w.setFake()
|
||
|
case toolkit.Box:
|
||
|
w.visable = false
|
||
|
w.setFake()
|
||
|
default:
|
||
|
w.redoBox(true)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (w *cuiWidget) redoBox(draw bool) {
|
||
|
if (w == nil) {
|
||
|
return
|
||
|
}
|
||
|
if (me.rootNode == nil) {
|
||
|
return
|
||
|
}
|
||
|
p := w.parent
|
||
|
if (p == nil) {
|
||
|
log(logInfo, "redoBox()", w.id, "parent == nil")
|
||
|
return
|
||
|
}
|
||
|
|
||
|
t := len(w.text)
|
||
|
w.visable = true
|
||
|
switch w.widgetType {
|
||
|
case toolkit.Window:
|
||
|
for _, child := range w.children {
|
||
|
child.redoBox(draw)
|
||
|
}
|
||
|
case toolkit.Tab:
|
||
|
for _, child := range w.children {
|
||
|
child.redoBox(draw)
|
||
|
}
|
||
|
case toolkit.Grid:
|
||
|
// hmm
|
||
|
w.logicalSize.w0 = p.nextW
|
||
|
w.logicalSize.h0 = p.nextH
|
||
|
w.logicalSize.w1 = p.nextW
|
||
|
w.logicalSize.h1 = p.nextH
|
||
|
|
||
|
w.nextW = p.nextW
|
||
|
w.nextH = p.nextH
|
||
|
|
||
|
var wCount, hCount int
|
||
|
var b bool = true
|
||
|
for _, child := range w.children {
|
||
|
child.redoBox(draw)
|
||
|
if (b) {
|
||
|
wCount += 1
|
||
|
b = false
|
||
|
} else {
|
||
|
wCount = 0
|
||
|
w.nextH += 1
|
||
|
b = true
|
||
|
}
|
||
|
w.nextW = p.nextW + wCount * 20
|
||
|
w.nextH = p.nextH + hCount * 4
|
||
|
log(logInfo, "redoBox(GRID) (w,h count)", wCount, hCount, "(X,Y)", w.x, w.y, w.name)
|
||
|
}
|
||
|
w.showWidgetPlacement(logNow, "grid:")
|
||
|
case toolkit.Box:
|
||
|
w.logicalSize.w0 = p.nextW
|
||
|
w.logicalSize.h0 = p.nextH
|
||
|
w.logicalSize.w1 = p.nextW
|
||
|
w.logicalSize.h1 = p.nextH
|
||
|
|
||
|
w.nextW = p.nextW
|
||
|
w.nextH = p.nextH
|
||
|
for _, child := range w.children {
|
||
|
child.redoBox(draw)
|
||
|
if (w.horizontal) {
|
||
|
log("BOX IS HORIZONTAL", p.nextW, p.nextW, p.name)
|
||
|
log("BOX IS HORIZONTAL", w.nextW, w.nextH, w.name)
|
||
|
log("BOX IS HORIZONTAL")
|
||
|
// expand based on the child width
|
||
|
w.nextW = child.nextW + me.horizontalPadding
|
||
|
// reset height to parent
|
||
|
w.nextH = p.nextH
|
||
|
} else {
|
||
|
log("BOX IS VERTICAL", p.nextW, p.nextW, p.name)
|
||
|
log("BOX IS VERTICAL", w.nextW, w.nextH, w.name)
|
||
|
log("BOX IS VERTICAL")
|
||
|
// go straight down
|
||
|
w.nextW = p.nextW
|
||
|
// expand based on the child height
|
||
|
w.nextH = child.nextH
|
||
|
}
|
||
|
}
|
||
|
w.showWidgetPlacement(logNow, "box:")
|
||
|
case toolkit.Group:
|
||
|
w.realWidth = t + me.buttonPadding
|
||
|
w.realHeight = me.defaultHeight
|
||
|
|
||
|
w.realSize.w0 = p.nextW
|
||
|
w.realSize.h0 = p.nextH
|
||
|
w.realSize.w1 = w.realSize.w0 + w.realWidth
|
||
|
w.realSize.h1 = w.realHeight
|
||
|
|
||
|
w.logicalSize.w0 = w.realSize.w0
|
||
|
w.logicalSize.h0 = w.realSize.h0
|
||
|
w.logicalSize.w1 = w.realSize.w1
|
||
|
w.logicalSize.h1 = w.realSize.h1
|
||
|
|
||
|
w.nextW = p.nextW + me.groupPadding
|
||
|
w.nextH = p.nextH + me.buttonPadding
|
||
|
for _, child := range w.children {
|
||
|
child.redoBox(draw)
|
||
|
// reset nextW to straight down
|
||
|
w.nextW = p.nextW + 4
|
||
|
w.nextH = child.nextH
|
||
|
}
|
||
|
// expand the height of the parent now that the group is done
|
||
|
// p.nextW = w.nextW
|
||
|
// p.nextH = w.nextH
|
||
|
w.showWidgetPlacement(logNow, "group:")
|
||
|
default:
|
||
|
w.realWidth = t + 3
|
||
|
w.realHeight = me.defaultHeight
|
||
|
w.realSize.w0 = p.nextW
|
||
|
w.realSize.h0 = p.nextH
|
||
|
w.realSize.w1 = p.nextW + w.realWidth
|
||
|
w.realSize.h1 = p.nextH + w.realHeight
|
||
|
|
||
|
w.logicalSize.w0 = p.nextW
|
||
|
w.logicalSize.h0 = p.nextH
|
||
|
w.logicalSize.w1 = p.nextW + w.realWidth
|
||
|
w.logicalSize.h1 = p.nextH + w.realHeight
|
||
|
|
||
|
w.nextW = w.realSize.w1
|
||
|
w.nextH = w.realSize.h1
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (w *cuiWidget) boxedPlace() {
|
||
|
t := len(w.name)
|
||
|
if (w.id == 0) {
|
||
|
w.realWidth = 0
|
||
|
w.realHeight = 0
|
||
|
return
|
||
|
}
|
||
|
p := w.parent
|
||
|
if (p == nil) {
|
||
|
log(logError, "boxedPlace() parentId widget == nil")
|
||
|
return
|
||
|
}
|
||
|
|
||
|
w.realWidth = t + 3
|
||
|
w.realHeight = me.defaultHeight
|
||
|
w.realSize.w0 = p.nextW
|
||
|
w.realSize.h0 = p.nextH
|
||
|
w.realSize.w1 = p.nextW + w.realWidth
|
||
|
w.realSize.h1 = p.nextH + w.realHeight
|
||
|
|
||
|
w.logicalSize.w0 = p.nextW
|
||
|
w.logicalSize.h0 = p.nextH
|
||
|
w.logicalSize.w1 = p.nextW + w.realWidth
|
||
|
w.logicalSize.h1 = p.nextH + w.realHeight
|
||
|
|
||
|
w.nextW = w.realSize.w1
|
||
|
w.nextH = w.realSize.h1
|
||
|
|
||
|
w.showWidgetPlacement(logNow, "bP widget")
|
||
|
}
|
||
|
|
||
|
func (w *cuiWidget) updateLogicalSizes() {
|
||
|
for _, child := range w.children {
|
||
|
child.updateLogicalSizes()
|
||
|
if (w.logicalSize.w0 > child.logicalSize.w0) {
|
||
|
w.logicalSize.w0 = child.logicalSize.w0
|
||
|
}
|
||
|
if (w.logicalSize.w1 < child.logicalSize.w1) {
|
||
|
w.logicalSize.w1 = child.logicalSize.w1
|
||
|
}
|
||
|
if (w.logicalSize.h0 > child.logicalSize.h0) {
|
||
|
w.logicalSize.h0 = child.logicalSize.h0
|
||
|
}
|
||
|
if (w.logicalSize.h1 < child.logicalSize.h1) {
|
||
|
w.logicalSize.h1 = child.logicalSize.h1
|
||
|
}
|
||
|
}
|
||
|
}
|