diff options
| author | Jeff Carr <[email protected]> | 2023-04-03 10:26:47 -0500 |
|---|---|---|
| committer | Jeff Carr <[email protected]> | 2023-04-03 10:26:47 -0500 |
| commit | 4b6207743b90968d6b822032a4355e43b6ce6da9 (patch) | |
| tree | 2cb9f13d5e95f14e165f8e41e8484320b7454177 /toolkit/gocui/place.go | |
| parent | 0320ebe4bb49ea80761d77af80fa208157ffdb89 (diff) | |
gocui: working towards correct layout
make a gocui widget binary tree
more debugging cleanups
sample button app displays in gocui
geometry logic closer to correct
improvements in gocui layout
continued attempts to clean up tabs
dump binary tree
moving towards proper chan callback()
deprecate Widget.Name
Signed-off-by: Jeff Carr <[email protected]>
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 + } + } +} |
