summaryrefslogtreecommitdiff
path: root/toolkit/democui/view.go
diff options
context:
space:
mode:
authorJeff Carr <[email protected]>2023-03-29 22:44:08 -0500
committerJeff Carr <[email protected]>2023-03-29 22:44:08 -0500
commit947169df5a22c9f9b53f825764747f648c70ff1e (patch)
tree3c84fffc14352329bc41e6b58910ff278c99f08c /toolkit/democui/view.go
parent6013fde8332e8ecbffaf1a0977ba2e1da8ea8775 (diff)
ready for version v0.7.4
start deprecating toolkit.Widget switch to variable name 'ParentId' use 'ActionType' and 'WidgetType' preliminary redraw() final definition of variables 'Name' and 'Text' more cleaning of the code remove lots of dumb code bind 'd' key press to dump out debugging info early color handling in gocui! Signed-off-by: Jeff Carr <[email protected]>
Diffstat (limited to 'toolkit/democui/view.go')
-rw-r--r--toolkit/democui/view.go317
1 files changed, 317 insertions, 0 deletions
diff --git a/toolkit/democui/view.go b/toolkit/democui/view.go
new file mode 100644
index 0000000..8699bf6
--- /dev/null
+++ b/toolkit/democui/view.go
@@ -0,0 +1,317 @@
+package main
+
+import (
+ "fmt"
+ "errors"
+ "strconv"
+
+ "github.com/awesome-gocui/gocui"
+ "git.wit.org/wit/gui/toolkit"
+)
+
+var adjusted bool = false
+
+// expands the logical size of the parents
+func (w *cuiWidget) setParentLogical(p *cuiWidget) {
+ if (w.visable) {
+ // expand the parent logicalsize to include the widget realSize
+ if (p.logicalSize.w0 > w.realSize.w0) {
+ p.logicalSize.w0 = w.realSize.w0
+ adjusted = true
+ }
+ if (p.logicalSize.h0 > w.realSize.h0) {
+ p.logicalSize.h0 = w.realSize.h0
+ adjusted = true
+ }
+ if (p.logicalSize.w1 < w.realSize.w1) {
+ p.logicalSize.w1 = w.realSize.w1
+ adjusted = true
+ }
+ if (p.logicalSize.h1 < w.realSize.h1) {
+ p.logicalSize.h1 = w.realSize.h1
+ adjusted = true
+ }
+ } else {
+ // expand the parent logicalsize to include the widget logicalsize
+ if (p.logicalSize.w0 > w.logicalSize.w0) {
+ p.logicalSize.w0 = w.logicalSize.w0
+ adjusted = true
+ }
+ if (p.logicalSize.h0 > w.logicalSize.h0) {
+ p.logicalSize.h0 = w.logicalSize.h0
+ adjusted = true
+ }
+ if (p.logicalSize.w1 < w.logicalSize.w1) {
+ p.logicalSize.w1 = w.logicalSize.w1
+ adjusted = true
+ }
+ if (p.logicalSize.h1 < w.logicalSize.h1) {
+ p.logicalSize.h1 = w.logicalSize.h1
+ adjusted = true
+ }
+ }
+ if (w.visable) {
+ // adjust the widget realSize to the top left corner of the logicalsize
+ if (w.logicalSize.w0 > w.realSize.w0) {
+ w.realSize.w0 = w.logicalSize.w0
+ w.realSize.w1 = w.realSize.w0 + w.realWidth
+ adjusted = true
+ }
+ if (w.logicalSize.h0 > w.realSize.h0) {
+ w.realSize.h0 = w.logicalSize.h0
+ w.realSize.h1 = w.realSize.h0 + w.realHeight
+ adjusted = true
+ }
+ }
+ w.showWidgetPlacement(logNow, "setParentLogical() widget")
+ p.showWidgetPlacement(logNow, "setParentLogical() parent")
+ if (w.id == 0) || (p.id == 0) {
+ // stop resizing when you hit the root widget
+ return
+ }
+ // pass the logical resizing up
+ pP := me.widgets[p.parentId]
+ if (pP != nil) {
+ p.setParentLogical(pP)
+ }
+}
+
+var fakeStartWidth int = 80
+var fakeStartHeight int = 0
+func (w *cuiWidget) setFake() {
+ if (w.visable) {
+ return
+ }
+ // setup fake labels for non-visable things off screen
+ w.realWidth = me.defaultWidth
+ w.realHeight = me.defaultHeight
+ w.realSize.w0 = fakeStartWidth
+ w.realSize.h0 = fakeStartHeight
+ w.realSize.w1 = w.realSize.w0 + me.defaultWidth
+ w.realSize.h1 = w.realSize.h0 + me.defaultHeight
+ fakeStartHeight += 2
+ w.showWidgetPlacement(logNow, "setFake()")
+}
+
+func drawView(w *cuiWidget) *gocui.View {
+ var newName string = ""
+ newName = strconv.Itoa(w.id)
+ if (me.baseGui == nil) {
+ log(logError, "drawView() me.baseGui == nil")
+ return nil
+ }
+
+ a := w.realSize.w0
+ b := w.realSize.h0
+ c := w.realSize.w1
+ d := w.realSize.h1
+ v, err := me.baseGui.SetView(newName, a, b, c, d, 0)
+ if err == nil {
+ log(logError, "drawView() internal plugin error err = nil")
+ return nil
+ }
+ if !errors.Is(err, gocui.ErrUnknownView) {
+ log(logError, "drawView() internal plugin error error.IS()", err)
+ return nil
+ }
+ w.v = v
+
+ return v
+}
+
+func boxedPlace(w *cuiWidget) {
+ t := len(w.name)
+ if (w.id == 0) {
+ w.realWidth = 0
+ w.realHeight = 0
+ return
+ }
+ p := me.widgets[w.parentId]
+ if (p == nil) {
+ log(logError, "ERRRRRRRRRRRORRRRRRRRRRRRR: parentId widget == nil")
+ return
+ }
+
+ switch p.widgetType {
+ case toolkit.Box:
+ w.realWidth = t + 3
+ w.realHeight = me.defaultHeight
+ w.realSize.w0 = p.nextX
+ w.realSize.h0 = p.nextY
+ w.realSize.w1 = p.nextX + w.realWidth
+ w.realSize.h1 = p.nextY + w.realHeight
+
+ w.logicalSize.w0 = p.nextX
+ w.logicalSize.h0 = p.nextY
+ w.logicalSize.w1 = p.nextX + w.realWidth
+ w.logicalSize.h1 = p.nextY + w.realHeight
+
+ w.nextX = p.nextX
+ w.nextY = p.nextY
+ if (w.horizontal) {
+ log(logNow, "PARENT BOX IS HORIZONTAL")
+ p.nextX += w.realWidth
+ } else {
+ log(logNow, "PARENT BOX IS VERTICAL")
+ p.nextY += w.realHeight
+ }
+ case toolkit.Group:
+ w.realWidth = t + 3
+ w.realHeight = me.defaultHeight
+
+ w.realSize.w0 = p.nextX
+ w.realSize.h0 = p.nextY
+ w.realSize.w1 = p.nextX + w.realWidth
+ w.realSize.h1 = p.nextY + w.realHeight
+
+ w.logicalSize.w0 = p.nextX
+ w.logicalSize.h0 = p.nextY
+ w.logicalSize.w1 = p.nextX + w.realWidth
+ w.logicalSize.h1 = p.nextY + w.realHeight
+
+ w.nextX = w.logicalSize.w0 + 3 // default group padding
+ w.nextY = w.logicalSize.h1
+
+ // increment parent
+ p.nextY += w.realHeight
+ default:
+ w.realWidth = t + 3
+ w.realHeight = me.defaultHeight
+ w.realSize.w0 = p.nextX
+ w.realSize.h0 = p.nextY
+ w.realSize.w1 = w.realSize.w0 + w.realWidth
+ w.realSize.h1 = w.realSize.h0 + w.realHeight
+
+ // increment parent
+ p.nextY += w.realHeight
+ }
+ p.showWidgetPlacement(logNow, "bP parent")
+ w.showWidgetPlacement(logNow, "bP widget")
+}
+
+func findPlace(w *cuiWidget, a *toolkit.Action) {
+ t := len(w.name)
+ w.visable = true
+ switch w.widgetType {
+ case toolkit.Root:
+ w.visable = false
+ w.setFake()
+ w.showWidgetPlacement(logNow, "Root:")
+ case toolkit.Flag:
+ w.visable = false
+ w.setFake()
+ w.showWidgetPlacement(logNow, "Flag:")
+ case toolkit.Window:
+ w.realWidth = t + 3
+ w.realHeight = me.defaultHeight
+
+ w.realSize.w0 = me.nextW
+ w.realSize.h0 = 0
+ w.realSize.w1 = w.realSize.w0 + w.realWidth
+ w.realSize.h1 = w.realHeight
+
+ w.logicalSize.w0 = me.nextW
+ w.logicalSize.h0 = 0
+ w.logicalSize.w1 = w.logicalSize.w0 + w.realWidth
+ w.logicalSize.h1 = w.realHeight
+
+ w.nextX = w.logicalSize.w0 + t // default group padding
+ w.nextY = w.logicalSize.h1
+
+ me.nextW += w.realWidth
+ w.showWidgetPlacement(logNow, "window:")
+ case toolkit.Tab:
+ w.realWidth = t + 3
+ w.realHeight = me.defaultHeight
+
+ w.realSize.w0 = me.nextW
+ w.realSize.h0 = 0
+ w.realSize.w1 = w.realSize.w0 + w.realWidth
+ w.realSize.h1 = w.realHeight
+
+ w.logicalSize.w0 = me.nextW
+ w.logicalSize.h0 = 0
+ w.logicalSize.w1 = w.logicalSize.w0 + w.realWidth
+ w.logicalSize.h1 = w.realHeight
+
+ w.nextX = w.logicalSize.w0 + t // default group padding
+ w.nextY = w.logicalSize.h1
+ me.nextW += w.realWidth
+ w.showWidgetPlacement(logNow, "tab:")
+ case toolkit.Grid:
+ p := me.widgets[w.parentId]
+ w.horizontal = a.B
+ w.visable = false
+ w.setFake()
+
+ if (p == nil) {
+ log(logError, "ERRRRRRRRRRRORRRRRRRRRRRRR: parentId widget == nil")
+ return
+ }
+ w.logicalSize.w0 = p.nextX
+ w.logicalSize.h0 = p.nextY
+ w.logicalSize.w1 = p.nextX
+ w.logicalSize.h1 = p.nextY
+
+ w.nextX = p.nextX
+ w.nextY = p.nextY
+ w.showWidgetPlacement(logNow, "grid:")
+ case toolkit.Box:
+ p := me.widgets[w.parentId]
+ w.horizontal = a.B
+ w.visable = false
+ w.setFake()
+
+ if (p == nil) {
+ log(logError, "ERRRRRRRRRRRORRRRRRRRRRRRR: parentId widget == nil")
+ return
+ }
+ w.logicalSize.w0 = p.nextX
+ w.logicalSize.h0 = p.nextY
+ w.logicalSize.w1 = p.nextX
+ w.logicalSize.h1 = p.nextY
+
+ w.nextX = p.nextX
+ w.nextY = p.nextY
+ w.showWidgetPlacement(logNow, "box:")
+ case toolkit.Group:
+ p := me.widgets[w.parentId]
+ w.horizontal = a.B
+ w.visable = false
+ w.setFake()
+
+ if (p == nil) {
+ log(logError, "ERRRRRRRRRRRORRRRRRRRRRRRR: parentId widget == nil")
+ return
+ }
+ w.logicalSize.w0 = p.nextX
+ w.logicalSize.h0 = p.nextY
+ w.logicalSize.w1 = p.nextX
+ w.logicalSize.h1 = p.nextY
+
+ w.nextX = p.nextX
+ w.nextY = p.nextY
+ w.showWidgetPlacement(logNow, "group:")
+ default:
+ boxedPlace(w)
+ }
+}
+
+func place(w *cuiWidget, a *toolkit.Action) {
+ log(logInfo, "place() START")
+ findPlace(w, a)
+ v := drawView(w)
+ if (v == nil) {
+ log(logError, "place() drawView(w) returned nil")
+ return
+ }
+ me.baseGui.SetKeybinding(v.Name(), gocui.MouseLeft, gocui.ModNone, click)
+
+ v.Wrap = true
+ fmt.Fprintln(v, " " + w.name)
+
+ w.SetDefaultWidgetColor()
+
+ log(logInfo, "place() END")
+ return
+}