diff options
Diffstat (limited to 'toolkit/gocui/place.go')
| -rw-r--r-- | toolkit/gocui/place.go | 221 |
1 files changed, 221 insertions, 0 deletions
diff --git a/toolkit/gocui/place.go b/toolkit/gocui/place.go new file mode 100644 index 0000000..905ebed --- /dev/null +++ b/toolkit/gocui/place.go @@ -0,0 +1,221 @@ +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 + } + } +} |
