summaryrefslogtreecommitdiff
path: root/toolkit/democui
diff options
context:
space:
mode:
authorJeff Carr <[email protected]>2023-04-03 10:26:47 -0500
committerJeff Carr <[email protected]>2023-04-03 10:26:47 -0500
commit4b6207743b90968d6b822032a4355e43b6ce6da9 (patch)
tree2cb9f13d5e95f14e165f8e41e8484320b7454177 /toolkit/democui
parent0320ebe4bb49ea80761d77af80fa208157ffdb89 (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/democui')
-rw-r--r--toolkit/democui/,191
-rw-r--r--toolkit/democui/Makefile15
-rw-r--r--toolkit/democui/click.go49
-rw-r--r--toolkit/democui/common.go90
-rw-r--r--toolkit/democui/debug.go111
-rw-r--r--toolkit/democui/help.go46
-rw-r--r--toolkit/democui/keybindings.go62
-rw-r--r--toolkit/democui/log.go30
-rw-r--r--toolkit/democui/main.go67
-rw-r--r--toolkit/democui/mouse.go169
-rw-r--r--toolkit/democui/plugin.go18
-rw-r--r--toolkit/democui/structs.go127
-rw-r--r--toolkit/democui/tab.go52
-rw-r--r--toolkit/democui/view.go349
14 files changed, 0 insertions, 1376 deletions
diff --git a/toolkit/democui/, b/toolkit/democui/,
deleted file mode 100644
index 762f8eb..0000000
--- a/toolkit/democui/,
+++ /dev/null
@@ -1,191 +0,0 @@
-// Copyright 2014 The gocui Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "errors"
- "fmt"
- "log"
-
- "github.com/awesome-gocui/gocui"
-)
-
-func main() {
- g, err := gocui.NewGui(gocui.OutputNormal, true)
- if err != nil {
- log.Panicln(err)
- }
- defer g.Close()
-
- g.Cursor = false
- g.Mouse = true
-
- g.SetManagerFunc(layout)
-
- if err := keybindings(g); err != nil {
- log.Panicln(err)
- }
-
- if err := g.MainLoop(); err != nil && !errors.Is(err, gocui.ErrQuit) {
- log.Panicln(err)
- }
-}
-
-var initialMouseX, initialMouseY, xOffset, yOffset int
-var globalMouseDown, msgMouseDown, movingMsg bool
-
-func layout(g *gocui.Gui) error {
- maxX, maxY := g.Size()
- if _, err := g.View("msg"); msgMouseDown && err == nil {
- moveMsg(g)
- }
- if v, err := g.SetView("global", -1, -1, maxX, maxY, 0); err != nil {
- if !errors.Is(err, gocui.ErrUnknownView) {
- return err
- }
- v.Frame = false
- }
- if v, err := g.SetView("but1", 2, 2, 22, 7, 0); err != nil {
- if !errors.Is(err, gocui.ErrUnknownView) {
- return err
- }
- v.SelBgColor = gocui.ColorGreen
- v.SelFgColor = gocui.ColorBlack
- fmt.Fprintln(v, "Button 1 - line 1")
- fmt.Fprintln(v, "Button 1 - line 2")
- fmt.Fprintln(v, "Button 1 - line 3")
- fmt.Fprintln(v, "Button 1 - line 4")
- if _, err := g.SetCurrentView("but1"); err != nil {
- return err
- }
- }
- if v, err := g.SetView("but2", 24, 2, 44, 4, 0); err != nil {
- if !errors.Is(err, gocui.ErrUnknownView) {
- return err
- }
- v.SelBgColor = gocui.ColorGreen
- v.SelFgColor = gocui.ColorBlack
- fmt.Fprintln(v, "Button 2 - line 1")
- }
- updateHighlightedView(g)
- return nil
-}
-
-func keybindings(g *gocui.Gui) error {
- if err := g.SetKeybinding("", gocui.KeyCtrlC, gocui.ModNone, quit); err != nil {
- return err
- }
- for _, n := range []string{"but1", "but2"} {
- if err := g.SetKeybinding(n, gocui.MouseLeft, gocui.ModNone, showMsg); err != nil {
- return err
- }
- }
- if err := g.SetKeybinding("", gocui.MouseRelease, gocui.ModNone, mouseUp); err != nil {
- return err
- }
- if err := g.SetKeybinding("", gocui.MouseLeft, gocui.ModNone, globalDown); err != nil {
- return err
- }
- if err := g.SetKeybinding("msg", gocui.MouseLeft, gocui.ModNone, msgDown); err != nil {
- return err
- }
- return nil
-}
-
-func quit(g *gocui.Gui, v *gocui.View) error {
- return gocui.ErrQuit
-}
-
-func showMsg(g *gocui.Gui, v *gocui.View) error {
- var l string
- var err error
-
- if _, err := g.SetCurrentView(v.Name()); err != nil {
- return err
- }
-
- _, cy := v.Cursor()
- if l, err = v.Line(cy); err != nil {
- l = ""
- }
-
- maxX, maxY := g.Size()
- if v, err := g.SetView("msg", maxX/2-10, maxY/2, maxX/2+10, maxY/2+2, 0); err == nil || errors.Is(err, gocui.ErrUnknownView) {
- v.Clear()
- v.SelBgColor = gocui.ColorCyan
- v.SelFgColor = gocui.ColorBlack
- fmt.Fprintln(v, l)
- }
- return nil
-}
-
-func updateHighlightedView(g *gocui.Gui) {
- mx, my := g.MousePosition()
- for _, view := range g.Views() {
- view.Highlight = false
- }
- if v, err := g.ViewByPosition(mx, my); err == nil {
- v.Highlight = true
- }
-}
-
-func moveMsg(g *gocui.Gui) {
- mx, my := g.MousePosition()
- if !movingMsg && (mx != initialMouseX || my != initialMouseY) {
- movingMsg = true
- }
- g.SetView("msg", mx-xOffset, my-yOffset, mx-xOffset+20, my-yOffset+2, 0)
-}
-
-func msgDown(g *gocui.Gui, v *gocui.View) error {
- initialMouseX, initialMouseY = g.MousePosition()
- if vx, vy, _, _, err := g.ViewPosition("msg"); err == nil {
- xOffset = initialMouseX - vx
- yOffset = initialMouseY - vy
- msgMouseDown = true
- }
- return nil
-}
-
-func globalDown(g *gocui.Gui, v *gocui.View) error {
- mx, my := g.MousePosition()
- if vx0, vy0, vx1, vy1, err := g.ViewPosition("msg"); err == nil {
- if mx >= vx0 && mx <= vx1 && my >= vy0 && my <= vy1 {
- return msgDown(g, v)
- }
- }
- globalMouseDown = true
- maxX, _ := g.Size()
- msg := fmt.Sprintf("Mouse down at: %d,%d", mx, my)
- x := mx - len(msg)/2
- if x < 0 {
- x = 0
- } else if x+len(msg)+1 > maxX-1 {
- x = maxX - 1 - len(msg) - 1
- }
- if v, err := g.SetView("globalDown", x, my-1, x+len(msg)+1, my+1, 0); err != nil {
- if !errors.Is(err, gocui.ErrUnknownView) {
- return err
- }
- v.WriteString(msg)
- }
- return nil
-}
-
-func mouseUp(g *gocui.Gui, v *gocui.View) error {
- if msgMouseDown {
- msgMouseDown = false
- if movingMsg {
- movingMsg = false
- return nil
- } else {
- g.DeleteView("msg")
- }
- } else if globalMouseDown {
- globalMouseDown = false
- g.DeleteView("globalDown")
- }
- return nil
-}
diff --git a/toolkit/democui/Makefile b/toolkit/democui/Makefile
deleted file mode 100644
index 96b8928..0000000
--- a/toolkit/democui/Makefile
+++ /dev/null
@@ -1,15 +0,0 @@
-all: plugin
- ldd ../democui.so
-
-build:
- GO111MODULE="off" go build
-
-plugin:
- GO111MODULE="off" go build -buildmode=plugin -o ../democui.so
-
-objdump:
- objdump -t ../democui.so |less
-
-log:
- reset
- tail -f /tmp/witgui.* /tmp/guilogfile
diff --git a/toolkit/democui/click.go b/toolkit/democui/click.go
deleted file mode 100644
index adc611c..0000000
--- a/toolkit/democui/click.go
+++ /dev/null
@@ -1,49 +0,0 @@
-package main
-
-import (
- "fmt"
- "errors"
- "strconv"
-
- "github.com/awesome-gocui/gocui"
- // "git.wit.org/wit/gui/toolkit"
-)
-
-func click(g *gocui.Gui, v *gocui.View) error {
- var l string
- var err error
-
- log(logNow, "click() START", v.Name())
- i, err := strconv.Atoi(v.Name())
- if (err != nil) {
- log(logNow, "click() Can't find widget. error =", err)
- } else {
- log(logNow, "click() Found widget id =", i)
- if (me.widgets[i] != nil) {
- w := me.widgets[i]
- log(logNow, "click() Found widget =", w)
- }
- }
-
- if _, err := g.SetCurrentView(v.Name()); err != nil {
- return err
- }
-
- _, cy := v.Cursor()
- if l, err = v.Line(cy); err != nil {
- l = ""
- }
-
- maxX, maxY := g.Size()
- if v, err := g.SetView("msg", maxX/2-10, maxY/2, maxX/2+10, maxY/2+2, 0); err == nil || errors.Is(err, gocui.ErrUnknownView) {
- v.Clear()
- v.SelBgColor = gocui.ColorCyan
- v.SelFgColor = gocui.ColorBlack
- fmt.Fprintln(v, l)
- }
-
- // this seems to delete the button(?)
- // g.SetViewOnBottom(v.Name())
- log(logNow, "click() END")
- return nil
-}
diff --git a/toolkit/democui/common.go b/toolkit/democui/common.go
deleted file mode 100644
index 799ac9c..0000000
--- a/toolkit/democui/common.go
+++ /dev/null
@@ -1,90 +0,0 @@
-package main
-
-import (
- "github.com/awesome-gocui/gocui"
- "git.wit.org/wit/gui/toolkit"
-)
-
-func setupWidgetT(a *toolkit.Action) *cuiWidget {
- var w *cuiWidget
- w = new(cuiWidget)
-
- w.name = a.Name
- w.text = a.Text
-
- w.widgetType = a.WidgetType
- w.id = a.WidgetId
- if (w.id > me.highest) {
- me.highest = w.id
- }
- w.parentId = a.ParentId
- me.widgets[w.id] = w
-
- // w.showWidgetPlacement(logNow)
- return w
-}
-
-// ColorBlack ColorRed ColorGreen ColorYellow ColorBlue ColorMagenta ColorCyan ColorWhite
-// gocui.GetColor("#FFAA55") // Dark Purple
-func (w *cuiWidget) SetDefaultWidgetColor() {
- log(logInfo, "SetDefaultWidgetColor() on", w.widgetType, w.name)
- if (w.v == nil) {
- log(logError, "SetDefaultWidgetColor() failed on view == nil")
- return
- }
- w.SetDefaultHighlight()
- switch w.widgetType {
- case toolkit.Button:
- w.v.BgColor = gocui.ColorGreen
- w.v.FrameColor = gocui.ColorGreen
- case toolkit.Checkbox:
- w.v.BgColor = gocui.GetColor("#FFAA55") // Dark Purple
- w.v.FrameColor = gocui.GetColor("#FFEE11")
- case toolkit.Dropdown:
- w.v.BgColor = gocui.ColorCyan
- w.v.FrameColor = gocui.ColorGreen
- case toolkit.Textbox:
- w.v.BgColor = gocui.ColorYellow
- w.v.FrameColor = gocui.ColorGreen
- case toolkit.Slider:
- w.v.BgColor = gocui.GetColor("#FFAA55") // Dark Purple
- w.v.FrameColor = gocui.ColorRed
- case toolkit.Label:
- w.v.FrameColor = gocui.ColorRed
- default:
- w.v.BgColor = gocui.ColorYellow
- }
-}
-
-// SetColor("#FFAA55") // purple
-func (w *cuiWidget) SetColor(c string) {
- if (w.v == nil) {
- log(logError, "SetColor() failed on view == nil")
- return
- }
- w.v.SelBgColor = gocui.ColorCyan
- w.v.SelFgColor = gocui.ColorBlack
- switch c {
- case "Green":
- w.v.BgColor = gocui.ColorGreen
- case "Purple":
- w.v.BgColor = gocui.GetColor("#FFAA55")
- case "Yellow":
- w.v.BgColor = gocui.ColorYellow
- case "Blue":
- w.v.BgColor = gocui.ColorBlue
- case "Red":
- w.v.BgColor = gocui.ColorRed
- default:
- w.v.BgColor = gocui.GetColor(c)
- }
-}
-
-func (w *cuiWidget) SetDefaultHighlight() {
- if (w.v == nil) {
- log(logError, "SetColor() failed on view == nil")
- return
- }
- w.v.SelBgColor = gocui.ColorGreen
- w.v.SelFgColor = gocui.ColorBlack
-}
diff --git a/toolkit/democui/debug.go b/toolkit/democui/debug.go
deleted file mode 100644
index 28afa0d..0000000
--- a/toolkit/democui/debug.go
+++ /dev/null
@@ -1,111 +0,0 @@
-package main
-
-import (
- "fmt"
- "strconv"
-
- "git.wit.org/wit/gui/toolkit"
- "github.com/awesome-gocui/gocui"
-)
-
-// var debugError bool = true
-
-// This is important. This sets the defaults for the gui. Without this, there isn't correct padding, etc
-func setDefaultBehavior(s bool) {
- me.defaultBehavior = s
- if (me.defaultBehavior) {
- log(logInfo, "Setting this toolkit to use the default behavior.")
- log(logInfo, "This is the 'guessing' part as defined by the wit/gui 'Principles'. Refer to the docs.")
- me.stretchy = false
- me.padded = true
- me.menubar = true
- me.margin = true
- me.canvas = false
- me.bookshelf = true // 99% of the time, things make a vertical stack of objects
- } else {
- log(logInfo, "This toolkit is set to ignore the default behavior.")
- }
-}
-
-func actionDump(b bool, a *toolkit.Action) {
- if (a == nil) {
- log(b, "action = nil")
- return
- }
-
- log(b, "a.Name =", a.Name)
- log(b, "a.Text =", a.Text)
- log(b, "a.WidgetId =", a.WidgetId)
- log(b, "a.ParentId =", a.ParentId)
- log(b, "a.B =", a.B)
- log(b, "a.S =", a.S)
- widgetDump(b, a.Widget)
-}
-
-func widgetDump(b bool, w *toolkit.Widget) {
- if (w == nil) {
- log(b, "widget = nil")
- return
- }
-
- /*
- log(b, "widget.Name =", w.Name)
- log(b, "widget.Type =", w.Type)
- log(b, "widget.Custom =", w.Custom)
- log(b, "widget.B =", w.B)
- log(b, "widget.I =", w.I)
- log(b, "widget.Width =", w.Width)
- log(b, "widget.Height =", w.Height)
- log(b, "widget.X =", w.X)
- log(b, "widget.Y =", w.Y)
- */
-}
-
-func dumpWidgets(g *gocui.Gui, v *gocui.View) {
- for _, view := range g.Views() {
- i, _ := strconv.Atoi(view.Name())
- if (me.widgets[i] != nil) {
- continue
- }
- log(logNow, "dump() not a widget. view.Name =", view.Name())
- }
-
- for i := 0; i <= me.highest; i++ {
- w := me.widgets[i]
- if (w == nil) {
- continue
- }
- w.showWidgetPlacement(logNow, "")
-
- if (w.v == nil) {
- log(logError, "dump() ERROR w.v == nil")
- } else {
- if (strconv.Itoa(i) != w.v.Name()) {
- log(logError, "dump() ERROR unequal str.Itoa(i) =", strconv.Itoa(i))
- log(logError, "dump() ERROR unequal w.v.Name() =", w.v.Name())
- }
- }
- }
-}
-
-func (w *cuiWidget) showWidgetPlacement(b bool, s string) {
- log(b, "dump()", s,
- fmt.Sprintf("(wId,pId)=(%3d,%3d)", w.id, w.parentId),
- fmt.Sprintf("real()=(%3d,%3d,%3d,%3d)", w.realSize.w0, w.realSize.h0, w.realSize.w1, w.realSize.h1),
- "next()=(", w.nextX, ",", w.nextY, ")",
- "logical()=(", w.logicalSize.w0, ",", w.logicalSize.h0, ",", w.logicalSize.w1, ",", w.logicalSize.h1, ")",
- w.widgetType, ",", w.name, "text=", w.text)
-
- if (w.realWidth != (w.realSize.w1 - w.realSize.w0)) {
- log(b, "dump()", s,
- "badsize()=(", w.realWidth, ",", w.realHeight, ")",
- "badreal()=(", w.realSize.w0, ",", w.realSize.h0, ",", w.realSize.w1, ",", w.realSize.h1, ")",
- w.widgetType, ",", w.name)
- }
- if (w.realHeight != (w.realSize.h1 - w.realSize.h0)) {
- log(b, "dump()", s,
- "badsize()=(", w.realWidth, ",", w.realHeight, ")",
- "badreal()=(", w.realSize.w0, ",", w.realSize.h0, ",", w.realSize.w1, ",", w.realSize.h1, ")",
- w.widgetType, ",", w.name)
- }
-}
diff --git a/toolkit/democui/help.go b/toolkit/democui/help.go
deleted file mode 100644
index f012fef..0000000
--- a/toolkit/democui/help.go
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2014 The gocui Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "errors"
- "fmt"
-
- "github.com/awesome-gocui/gocui"
-)
-
-func addHelp() {
- me.baseGui.SetManagerFunc(helplayout)
-}
-
-func helplayout(g *gocui.Gui) error {
- var err error
- maxX, _ := g.Size()
-
- help, err := g.SetView("help", maxX-32, 0, maxX-1, 12, 0)
- if err != nil {
- if !errors.Is(err, gocui.ErrUnknownView) {
- return err
- }
- help.SelBgColor = gocui.ColorGreen
- help.SelFgColor = gocui.ColorBlack
- fmt.Fprintln(help, "KEYBINDINGS")
- fmt.Fprintln(help, "Enter: Click Button")
- fmt.Fprintln(help, "Tab/Space: Switch Buttons")
- fmt.Fprintln(help, "")
- fmt.Fprintln(help, "h: Help")
- fmt.Fprintln(help, "Backspace: Delete Button")
- fmt.Fprintln(help, "Arrow keys: Move Button")
- fmt.Fprintln(help, "t: Move Button to the top")
- fmt.Fprintln(help, "b: Move Button to the button")
- fmt.Fprintln(help, "STDOUT: /tmp/witgui.log")
- fmt.Fprintln(help, "Ctrl-C or Q: Exit")
- if _, err := g.SetCurrentView("help"); err != nil {
- return err
- }
- }
- me.helpLabel = help
- return nil
-}
diff --git a/toolkit/democui/keybindings.go b/toolkit/democui/keybindings.go
deleted file mode 100644
index 977a375..0000000
--- a/toolkit/democui/keybindings.go
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2014 The gocui Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "github.com/awesome-gocui/gocui"
-)
-
-func defaultKeybindings(g *gocui.Gui) error {
- if err := g.SetKeybinding("", gocui.KeyCtrlC, gocui.ModNone, quit); err != nil {
- return err
- }
- for _, n := range []string{"but1", "but2", "help", "but3"} {
- if err := g.SetKeybinding(n, gocui.MouseLeft, gocui.ModNone, showMsg); err != nil {
- return err
- }
- }
- if err := g.SetKeybinding("", gocui.MouseRelease, gocui.ModNone, mouseUp); err != nil {
- return err
- }
- if err := g.SetKeybinding("", gocui.MouseLeft, gocui.ModNone, globalDown); err != nil {
- return err
- }
- if err := g.SetKeybinding("msg", gocui.MouseLeft, gocui.ModNone, msgDown); err != nil {
- return err
- }
- addDebugKeys(g)
- return nil
-}
-
-// dump out the widgets
-func addDebugKeys(g *gocui.Gui) {
- // dump all widget info to the log
- g.SetKeybinding("", 'd', gocui.ModNone,
- func(g *gocui.Gui, v *gocui.View) error {
- dumpWidgets(g, v)
- return nil
- })
-
- // hide all widgets
- g.SetKeybinding("", 'h', gocui.ModNone,
- func(g *gocui.Gui, v *gocui.View) error {
- hideWidgets()
- return nil
- })
-
- // show all widgets
- g.SetKeybinding("", 's', gocui.ModNone,
- func(g *gocui.Gui, v *gocui.View) error {
- showWidgets()
- return nil
- })
-
- // try to adjust all the widget positions
- g.SetKeybinding("", 'r', gocui.ModNone,
- func(g *gocui.Gui, v *gocui.View) error {
- adjustWidgets()
- return nil
- })
-}
diff --git a/toolkit/democui/log.go b/toolkit/democui/log.go
deleted file mode 100644
index 2d7e27e..0000000
--- a/toolkit/democui/log.go
+++ /dev/null
@@ -1,30 +0,0 @@
-package main
-
-import (
- "os"
- witlog "git.wit.org/wit/gui/log"
-)
-
-// various debugging flags
-var logNow bool = true // useful for active development
-var logError bool = true
-var logWarn bool = false
-var logInfo bool = false
-var logVerbose bool = false
-
-func log(a ...any) {
- witlog.Where = "wit/democui"
- witlog.Log(a...)
-}
-
-func sleep(a ...any) {
- witlog.Sleep(a...)
-}
-
-func exit(a ...any) {
- witlog.Exit(a...)
-}
-
-func setOutput(f *os.File) {
- witlog.SetOutput(f)
-}
diff --git a/toolkit/democui/main.go b/toolkit/democui/main.go
deleted file mode 100644
index 19b326d..0000000
--- a/toolkit/democui/main.go
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright 2014 The gocui Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "os"
-)
-
-/*
-func OnExit(f func(string)) {
- Custom = f
-}
-*/
-
-func Init() {
- log(logInfo, "Init() of democui")
- me.widgets = make(map[int]*cuiWidget)
- me.defaultWidth = 10
- me.defaultHeight = 2
- me.defaultBehavior = true
-}
-
-func Exit() {
- // TODO: exit correctly
- me.baseGui.Close()
-}
-
-/*
-func mouseClick(name string) {
- // output screws up the console. Need to fix this by redirecting all console output to a file from log.Println()
- // log.Println("g.Close()")
- // g.Close()
-
- log("Found andlabs Running custom function for the mouse click")
- Custom(name)
- // panic("got andlabs")
-}
-*/
-
-func Main(f func()) {
- log("start Init()")
-
- outf, err := os.OpenFile("/tmp/witgui.log", os.O_RDWR | os.O_CREATE | os.O_APPEND, 0666)
- if err != nil {
- exit("error opening file: %v", err)
- }
- defer outf.Close()
-
- setOutput(outf)
- log("This is a test log entry")
-
- MouseMain()
-}
-
-/*
-func StartConsoleMouse() {
- defer g.Close()
- log("start Main()")
-
- if err := g.MainLoop(); err != nil && !errors.Is(err, gocui.ErrQuit) {
- exit(err)
- }
- log("exit Main()")
-}
-*/
diff --git a/toolkit/democui/mouse.go b/toolkit/democui/mouse.go
deleted file mode 100644
index fc74d27..0000000
--- a/toolkit/democui/mouse.go
+++ /dev/null
@@ -1,169 +0,0 @@
-// Copyright 2014 The gocui Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "errors"
- "fmt"
-
- "github.com/awesome-gocui/gocui"
-)
-
-func MouseMain() {
- g, err := gocui.NewGui(gocui.OutputNormal, true)
- if err != nil {
- panic(err)
- }
- defer g.Close()
-
- me.baseGui = g
-
- g.Cursor = true
- g.Mouse = true
-
- g.SetManagerFunc(layout)
-
- if err := defaultKeybindings(g); err != nil {
- panic(err)
- }
-
- if err := g.MainLoop(); err != nil && !errors.Is(err, gocui.ErrQuit) {
- panic(err)
- }
-}
-
-func layout(g *gocui.Gui) error {
- maxX, maxY := g.Size()
- if _, err := g.View("msg"); msgMouseDown && err == nil {
- moveMsg(g)
- }
- if v, err := g.SetView("global", -1, -1, maxX, maxY, 0); err != nil {
- if !errors.Is(err, gocui.ErrUnknownView) {
- return err
- }
- v.Frame = false
- }
- if v, err := g.SetView("but1", 2, 2, 22, 7, 0); err != nil {
- if !errors.Is(err, gocui.ErrUnknownView) {
- return err
- }
- v.SelBgColor = gocui.ColorGreen
- v.SelFgColor = gocui.ColorBlack
- fmt.Fprintln(v, "Button 1 - line 1")
- fmt.Fprintln(v, "Button 1 - line 2")
- fmt.Fprintln(v, "Button 1 - line 3")
- fmt.Fprintln(v, "Button 1 - line 4")
- if _, err := g.SetCurrentView("but1"); err != nil {
- return err
- }
- }
- if v, err := g.SetView("but2", 24, 2, 44, 4, 0); err != nil {
- if !errors.Is(err, gocui.ErrUnknownView) {
- return err
- }
- v.SelBgColor = gocui.ColorGreen
- v.SelFgColor = gocui.ColorBlack
- fmt.Fprintln(v, "Button 2 - line 1")
- }
- helplayout(g)
- updateHighlightedView(g)
- return nil
-}
-
-func quit(g *gocui.Gui, v *gocui.View) error {
- return gocui.ErrQuit
-}
-
-func showMsg(g *gocui.Gui, v *gocui.View) error {
- var l string
- var err error
-
- if _, err := g.SetCurrentView(v.Name()); err != nil {
- return err
- }
-
- _, cy := v.Cursor()
- if l, err = v.Line(cy); err != nil {
- l = ""
- }
-
- maxX, maxY := g.Size()
- if v, err := g.SetView("msg", maxX/2-10, maxY/2, maxX/2+10, maxY/2+2, 0); err == nil || errors.Is(err, gocui.ErrUnknownView) {
- v.Clear()
- v.SelBgColor = gocui.ColorCyan
- v.SelFgColor = gocui.ColorBlack
- fmt.Fprintln(v, l)
- }
- return nil
-}
-
-func updateHighlightedView(g *gocui.Gui) {
- mx, my := g.MousePosition()
- for _, view := range g.Views() {
- view.Highlight = false
- }
- if v, err := g.ViewByPosition(mx, my); err == nil {
- v.Highlight = true
- }
-}
-
-func moveMsg(g *gocui.Gui) {
- mx, my := g.MousePosition()
- if !movingMsg && (mx != initialMouseX || my != initialMouseY) {
- movingMsg = true
- }
- g.SetView("msg", mx-xOffset, my-yOffset, mx-xOffset+20, my-yOffset+2, 0)
-}
-
-func msgDown(g *gocui.Gui, v *gocui.View) error {
- initialMouseX, initialMouseY = g.MousePosition()
- if vx, vy, _, _, err := g.ViewPosition("msg"); err == nil {
- xOffset = initialMouseX - vx
- yOffset = initialMouseY - vy
- msgMouseDown = true
- }
- return nil
-}
-
-func globalDown(g *gocui.Gui, v *gocui.View) error {
- mx, my := g.MousePosition()
- if vx0, vy0, vx1, vy1, err := g.ViewPosition("msg"); err == nil {
- if mx >= vx0 && mx <= vx1 && my >= vy0 && my <= vy1 {
- return msgDown(g, v)
- }
- }
- globalMouseDown = true
- maxX, _ := g.Size()
- msg := fmt.Sprintf("Mouse down at: %d,%d", mx, my)
- x := mx - len(msg)/2
- if x < 0 {
- x = 0
- } else if x+len(msg)+1 > maxX-1 {
- x = maxX - 1 - len(msg) - 1
- }
- if v, err := g.SetView("globalDown", x, my-1, x+len(msg)+1, my+1, 0); err != nil {
- if !errors.Is(err, gocui.ErrUnknownView) {
- return err
- }
- v.WriteString(msg)
- }
- return nil
-}
-
-func mouseUp(g *gocui.Gui, v *gocui.View) error {
- if msgMouseDown {
- msgMouseDown = false
- if movingMsg {
- movingMsg = false
- return nil
- } else {
- g.DeleteView("msg")
- }
- } else if globalMouseDown {
- globalMouseDown = false
- g.DeleteView("globalDown")
- }
- return nil
-}
diff --git a/toolkit/democui/plugin.go b/toolkit/democui/plugin.go
deleted file mode 100644
index 86125d4..0000000
--- a/toolkit/democui/plugin.go
+++ /dev/null
@@ -1,18 +0,0 @@
-package main
-
-import (
- // if you include more than just this import
- // then your plugin might be doing something un-ideal (just a guess from 2023/02/27)
- "git.wit.org/wit/gui/toolkit"
-)
-
-func Quit() {
- me.baseGui.Close()
-}
-
-func Action(a *toolkit.Action) {
- log(logNow, "Action()", a)
- w := setupWidgetT(a)
- place(w, a)
- log(logInfo, "Action() END")
-}
diff --git a/toolkit/democui/structs.go b/toolkit/democui/structs.go
deleted file mode 100644
index 37a8f28..0000000
--- a/toolkit/democui/structs.go
+++ /dev/null
@@ -1,127 +0,0 @@
-// LICENSE: same as the go language itself
-// Copyright 2023 WIT.COM
-
-// all structures and variables are local (aka lowercase)
-// since the plugin should be isolated to access only
-// by functions() to insure everything here is run
-// inside a dedicated goroutine
-
-package main
-
-import (
- "fmt"
- "sync"
- "github.com/awesome-gocui/gocui"
- "git.wit.org/wit/gui/toolkit"
-)
-
-// const delta = 1
-
-// It's probably a terrible idea to call this 'me'
-var me config
-
-type config struct {
- highest int // highest widgetId
- baseGui *gocui.Gui // the main gocui handle
- widgets map[int]*cuiWidget
- callback func(int)
- helpLabel *gocui.View
-
- defaultBehavior bool
- defaultWidth int
- defaultHeight int
- nextW int // where the next window or tab flag should go
-
- bookshelf bool // do you want things arranged in the box like a bookshelf or a stack?
- canvas bool // if set to true, the windows are a raw canvas
- menubar bool // for windows
- stretchy bool // expand things like buttons to the maximum size
- padded bool // add space between things like buttons
- margin bool // add space around the frames of windows
-}
-
-/*
-// This is a map between the widgets in wit/gui and the internal structures of gocui
-var viewWidget map[*gocui.View]*toolkit.Widget
-var stringWidget map[string]*toolkit.Widget
-*/
-
-var (
-// g *gocui.Gui
-// Custom func(string)
-
- initialMouseX, initialMouseY, xOffset, yOffset int
- globalMouseDown, msgMouseDown, movingMsg bool
-
-// err error
-)
-
-// the gocui way
-// the logical size of the widget
-// corner starts at in the upper left corner
-type rectType struct {
- // this is the gocui way
- w0, h0, w1, h1 int // left top right bottom
-}
-
-/*
-type realSizeT struct {
- width, height int
-}
-*/
-
-
-type cuiWidget struct {
- id int // widget ID
- parentId int
- widgetType toolkit.WidgetType
-
- name string // a descriptive name of the widget
- text string // the current text being displayed
-
- visable bool // widget types like 'box' are 'false'
- realWidth int // the real width
- realHeight int // the real height
- realSize rectType // the display size of this widget
- logicalSize rectType // the logical size. Includes all the child widgets
-
- nextX int
- nextY int
-
- // horizontal=true means layout widgets like books on a bookshelf
- // horizontal=false means layout widgets like books in a stack
- horizontal bool `default:false`
-
- tainted bool
- v *gocui.View
- baseGui *gocui.Gui // use gogui.Manager ? as 'workspaces?'
-
- // writeMutex protects locks the write process
- writeMutex sync.Mutex
-
- // deprecate
- // logicalWidth int `default:8`
- // logicalHeight int `default:2`
- // rect rectType
- // current rectType // the logical size. Includes all the child widgets
- // width int
- // height int
-}
-
-// from the gocui devs:
-// Write appends a byte slice into the view's internal buffer. Because
-// View implements the io.Writer interface, it can be passed as parameter
-// of functions like fmt.Fprintf, fmt.Fprintln, io.Copy, etc. Clear must
-// be called to clear the view's buffer.
-
-func (w *cuiWidget) Write(p []byte) (n int, err error) {
- w.tainted = true
- w.writeMutex.Lock()
- defer w.writeMutex.Unlock()
- // v.makeWriteable(v.wx, v.wy)
- // v.writeRunes(bytes.Runes(p))
- fmt.Fprintln(w.v, p)
- log(logNow, "widget.Write()")
-
- return len(p), nil
-}
diff --git a/toolkit/democui/tab.go b/toolkit/democui/tab.go
deleted file mode 100644
index 745956c..0000000
--- a/toolkit/democui/tab.go
+++ /dev/null
@@ -1,52 +0,0 @@
-package main
-
-// implements widgets 'Window' and 'Tab'
-
-import (
-// "fmt"
- "strconv"
-
-// "git.wit.org/wit/gui/toolkit"
-// "github.com/awesome-gocui/gocui"
-)
-
-func adjustWidgets() {
- for i := 0; i <= me.highest; i++ {
- w := me.widgets[i]
- if (w == nil) {
- continue
- }
- p := me.widgets[w.parentId]
- if (p != nil) {
- w.setParentLogical(p)
- }
- }
-}
-
-func hideWidgets() {
- for i := 0; i <= me.highest; i++ {
- w := me.widgets[i]
- if (w == nil) {
- continue
- }
- if (w.visable) {
- if (w.v != nil) {
- cuiName := strconv.Itoa(i)
- log(logNow, "about to delete", cuiName, w.name)
- me.baseGui.DeleteView(cuiName)
- }
- }
- }
-}
-
-func showWidgets() {
- for i := 0; i <= me.highest; i++ {
- w := me.widgets[i]
- if (w == nil) {
- continue
- }
- if (w.visable) {
- w.drawView()
- }
- }
-}
diff --git a/toolkit/democui/view.go b/toolkit/democui/view.go
deleted file mode 100644
index 5ff44ad..0000000
--- a/toolkit/democui/view.go
+++ /dev/null
@@ -1,349 +0,0 @@
-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
-}
-
-func (w *cuiWidget) drawView() {
- var err error
- if (me.baseGui == nil) {
- log(logError, "drawView() me.baseGui == nil")
- return
- }
-
- a := w.realSize.w0
- b := w.realSize.h0
- c := w.realSize.w1
- d := w.realSize.h1
-
- var newName string = ""
- newName = strconv.Itoa(w.id)
- w.v, err = me.baseGui.SetView(newName, a, b, c, d, 0)
- if err == nil {
- log(logError, "drawView() internal plugin error err = nil")
- return
- }
- if !errors.Is(err, gocui.ErrUnknownView) {
- log(logError, "drawView() internal plugin error error.IS()", err)
- return
- }
-
- me.baseGui.SetKeybinding(w.v.Name(), gocui.MouseLeft, gocui.ModNone, click)
-
- w.v.Wrap = true
- fmt.Fprintln(w.v, " " + w.text)
-
- w.SetDefaultWidgetColor()
-}