diff options
Diffstat (limited to 'toolkit/democui')
| -rw-r--r-- | toolkit/democui/, | 191 | ||||
| -rw-r--r-- | toolkit/democui/Makefile | 15 | ||||
| -rw-r--r-- | toolkit/democui/click.go | 49 | ||||
| -rw-r--r-- | toolkit/democui/common.go | 90 | ||||
| -rw-r--r-- | toolkit/democui/debug.go | 111 | ||||
| -rw-r--r-- | toolkit/democui/help.go | 46 | ||||
| -rw-r--r-- | toolkit/democui/keybindings.go | 62 | ||||
| -rw-r--r-- | toolkit/democui/log.go | 30 | ||||
| -rw-r--r-- | toolkit/democui/main.go | 67 | ||||
| -rw-r--r-- | toolkit/democui/mouse.go | 169 | ||||
| -rw-r--r-- | toolkit/democui/plugin.go | 18 | ||||
| -rw-r--r-- | toolkit/democui/structs.go | 127 | ||||
| -rw-r--r-- | toolkit/democui/tab.go | 52 | ||||
| -rw-r--r-- | toolkit/democui/view.go | 349 |
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() -} |
