summaryrefslogtreecommitdiff
path: root/toolkit/gocui
diff options
context:
space:
mode:
authorJeff Carr <[email protected]>2022-11-06 12:59:24 -0600
committerJeff Carr <[email protected]>2022-11-06 12:59:24 -0600
commite55fb6675d692e3f44fa67b02b12661e476bd028 (patch)
treec16084dea9779f5ef244adb3937d33adb17e7bad /toolkit/gocui
parent099efb6b24caf9eaad50d7386636a7ac23552bde (diff)
start trying to make the tookits pluginsv0.4.3
totally minimize helloworld demo try to make a button plugin example debug changes final changes before attempting to use a golang plugin actually running gocui as a plugin add gocli-as-plugin example try to convert the go-cui toolkit into a plugin doc updates make a minimal console gui Signed-off-by: Jeff Carr <[email protected]>
Diffstat (limited to 'toolkit/gocui')
-rw-r--r--toolkit/gocui/Makefile8
-rwxr-xr-xtoolkit/gocui/gocuibin0 -> 3409595 bytes
-rw-r--r--toolkit/gocui/greeter.go57
-rw-r--r--toolkit/gocui/keybindings.go130
-rw-r--r--toolkit/gocui/main.go97
-rw-r--r--toolkit/gocui/newJ.go46
-rw-r--r--toolkit/gocui/orig/mouse.go (renamed from toolkit/gocui/mouse.go)0
-rw-r--r--toolkit/gocui/views.go80
8 files changed, 418 insertions, 0 deletions
diff --git a/toolkit/gocui/Makefile b/toolkit/gocui/Makefile
new file mode 100644
index 0000000..42798cc
--- /dev/null
+++ b/toolkit/gocui/Makefile
@@ -0,0 +1,8 @@
+all: plugin
+ ldd ../gocli.so
+
+build:
+ GO111MODULE="off" go build
+
+plugin:
+ GO111MODULE="off" go build -buildmode=plugin -o ../gocli.so
diff --git a/toolkit/gocui/gocui b/toolkit/gocui/gocui
new file mode 100755
index 0000000..094619c
--- /dev/null
+++ b/toolkit/gocui/gocui
Binary files differ
diff --git a/toolkit/gocui/greeter.go b/toolkit/gocui/greeter.go
new file mode 100644
index 0000000..9d546a7
--- /dev/null
+++ b/toolkit/gocui/greeter.go
@@ -0,0 +1,57 @@
+package main
+
+import (
+ "errors"
+ "fmt"
+ "log"
+ "strings"
+
+ "github.com/awesome-gocui/gocui"
+)
+
+type greeting string
+
+
+// func main() {
+func (g greeting) Greet() {
+ fmt.Println("Hello Universe")
+ Init()
+ // ToolkitMain()
+}
+
+// this is exported
+var Greeter greeting
+
+func AddGroup(name string) {
+ log.Println("addGroup()", name)
+ currentY = 2
+ currentX += groupSize + 6
+}
+
+func AddButton(name string) error {
+ t := len(name)
+ v, err := baseGui.SetView(name, currentX, currentY, currentX+t+3, currentY+2, 0)
+ if err == nil {
+ return err
+ }
+ if !errors.Is(err, gocui.ErrUnknownView) {
+ return err
+ }
+
+ v.Wrap = true
+ fmt.Fprintln(v, " " + name)
+ fmt.Fprintln(v, strings.Repeat("foo\n", 2))
+
+ if _, err := baseGui.SetCurrentView(name); err != nil {
+ return err
+ }
+
+ views = append(views, name)
+ curView = len(views) - 1
+ idxView += 1
+ currentY += 3
+ if (groupSize < len(views)) {
+ groupSize = len(views)
+ }
+ return nil
+}
diff --git a/toolkit/gocui/keybindings.go b/toolkit/gocui/keybindings.go
new file mode 100644
index 0000000..fdac1ff
--- /dev/null
+++ b/toolkit/gocui/keybindings.go
@@ -0,0 +1,130 @@
+// 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"
+// "strings"
+
+ "github.com/awesome-gocui/gocui"
+)
+
+func initKeybindings(g *gocui.Gui) error {
+ log.Println("got to initKeybindings")
+ if err := g.SetKeybinding("", 'q', gocui.ModNone,
+ func(g *gocui.Gui, v *gocui.View) error {
+ return gocui.ErrQuit
+ }); err != nil {
+ return err
+ }
+ if err := g.SetKeybinding("", 'Q', gocui.ModNone,
+ func(g *gocui.Gui, v *gocui.View) error {
+ return gocui.ErrQuit
+ }); err != nil {
+ return err
+ }
+ if err := g.SetKeybinding("", gocui.KeyCtrlC, gocui.ModNone,
+ func(g *gocui.Gui, v *gocui.View) error {
+ return gocui.ErrQuit
+ }); err != nil {
+ return err
+ }
+ if err := g.SetKeybinding("", gocui.KeySpace, gocui.ModNone,
+ func(g *gocui.Gui, v *gocui.View) error {
+ return newView(g)
+ }); err != nil {
+ return err
+ }
+ if err := g.SetKeybinding("", gocui.KeyBackspace, gocui.ModNone,
+ func(g *gocui.Gui, v *gocui.View) error {
+ return delView(g)
+ }); err != nil {
+ return err
+ }
+ if err := g.SetKeybinding("", gocui.KeyBackspace2, gocui.ModNone,
+ func(g *gocui.Gui, v *gocui.View) error {
+ return delView(g)
+ }); err != nil {
+ return err
+ }
+ if err := g.SetKeybinding("", gocui.KeyTab, gocui.ModNone,
+ func(g *gocui.Gui, v *gocui.View) error {
+ log.Println("tab", v.Name())
+ return nextView(g, true)
+ }); err != nil {
+ return err
+ }
+ if err := g.SetKeybinding("", gocui.KeyArrowLeft, gocui.ModNone,
+ func(g *gocui.Gui, v *gocui.View) error {
+ return moveView(g, v, -delta, 0)
+ }); err != nil {
+ return err
+ }
+ if err := g.SetKeybinding("", gocui.KeyArrowRight, gocui.ModNone,
+ func(g *gocui.Gui, v *gocui.View) error {
+ return moveView(g, v, delta, 0)
+ }); err != nil {
+ return err
+ }
+ if err := g.SetKeybinding("", gocui.KeyArrowDown, gocui.ModNone,
+ func(g *gocui.Gui, v *gocui.View) error {
+ log.Println("down", v.Name())
+ return moveView(g, v, 0, delta)
+ }); err != nil {
+ return err
+ }
+ if err := g.SetKeybinding("", gocui.KeyArrowUp, gocui.ModNone,
+ func(g *gocui.Gui, v *gocui.View) error {
+ log.Println("up", v.Name())
+ return moveView(g, v, 0, -delta)
+ }); err != nil {
+ return err
+ }
+ if err := g.SetKeybinding("", gocui.KeyEnter, gocui.ModNone,
+ func(g *gocui.Gui, v *gocui.View) error {
+ log.Println("enter", v.Name())
+ return nil
+ }); err != nil {
+ return err
+ }
+ if err := g.SetKeybinding("", 't', gocui.ModNone,
+ func(g *gocui.Gui, v *gocui.View) error {
+ _, err := g.SetViewOnTop(views[curView])
+ return err
+ }); err != nil {
+ return err
+ }
+ if err := g.SetKeybinding("", 'b', gocui.ModNone,
+ func(g *gocui.Gui, v *gocui.View) error {
+ _, err := g.SetViewOnBottom(views[curView])
+ return err
+ }); err != nil {
+ return err
+ }
+ if err := g.SetKeybinding("", 'j', gocui.ModNone,
+ func(g *gocui.Gui, v *gocui.View) error {
+ return newJ(g)
+ }); err != nil {
+ return err
+ }
+ if err := g.SetKeybinding("", 'h', gocui.ModNone,
+ func(g *gocui.Gui, v *gocui.View) error {
+ log.Println("help", v.Name())
+ tmp, _ := g.SetViewOnTop("help")
+ log.Println("help 2", tmp.Name(), "blah")
+// g.SetView("help", 2, 2, 30, 15, 0);
+ g.SetCurrentView("help")
+// moveView(g, tmp, 0, -delta)
+ if err := g.DeleteView("help"); err != nil {
+ panic(err)
+ }
+ return nil
+ }); err != nil {
+ return err
+ }
+ return nil
+}
diff --git a/toolkit/gocui/main.go b/toolkit/gocui/main.go
new file mode 100644
index 0000000..2439a3a
--- /dev/null
+++ b/toolkit/gocui/main.go
@@ -0,0 +1,97 @@
+// 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"
+)
+
+const delta = 1
+
+var (
+ views = []string{}
+ curView = -1
+ idxView = 0
+ currentX = 5
+ currentY = 2
+ groupSize = 0
+ baseGui *gocui.Gui
+)
+
+var helpLabel *gocui.View
+
+func Init() {
+ // setup log to write to a file
+// logInit()
+
+ g, err := gocui.NewGui(gocui.OutputNormal, true)
+ baseGui = g
+ if err != nil {
+ log.Panicln(err)
+ }
+ defer g.Close()
+
+ g.Highlight = true
+ g.SelFgColor = gocui.ColorRed
+ g.SelFrameColor = gocui.ColorRed
+
+ g.SetManagerFunc(layout)
+
+ if err := initKeybindings(g); err != nil {
+ log.Panicln(err)
+ }
+ if err := newView(g); err != nil {
+ log.Panicln(err)
+ }
+
+ AddButton("hello")
+ AddButton("world")
+ AddButton("foo")
+
+ AddGroup("blank")
+ AddButton("bar")
+ AddButton("bar none")
+ AddButton("bar going")
+
+ AddGroup("te")
+ AddButton("world 2")
+ AddButton("foo 2")
+
+ if err := baseGui.MainLoop(); err != nil && !errors.Is(err, gocui.ErrQuit) {
+ log.Panicln(err)
+ }
+}
+
+func ToolkitMain() {
+ if err := baseGui.MainLoop(); err != nil && !errors.Is(err, gocui.ErrQuit) {
+ log.Panicln(err)
+ }
+}
+
+func layout(g *gocui.Gui) error {
+ var err error
+ maxX, _ := g.Size()
+ helpLabel, err = g.SetView("help", maxX-32, 0, maxX-1, 11, 0)
+ if err != nil {
+ if !errors.Is(err, gocui.ErrUnknownView) {
+ return err
+ }
+ fmt.Fprintln(helpLabel, "KEYBINDINGS")
+ fmt.Fprintln(helpLabel, "Enter: Click Button")
+ fmt.Fprintln(helpLabel, "Tab/Space: Switch Buttons")
+ fmt.Fprintln(helpLabel, "")
+ fmt.Fprintln(helpLabel, "h: Help")
+ fmt.Fprintln(helpLabel, "Backspace: Delete Button")
+ fmt.Fprintln(helpLabel, "Arrow keys: Move Button")
+ fmt.Fprintln(helpLabel, "t: Move Button to the top")
+ fmt.Fprintln(helpLabel, "b: Move Button to the button")
+ fmt.Fprintln(helpLabel, "Ctrl-C or Q: Exit")
+ }
+ return nil
+}
diff --git a/toolkit/gocui/newJ.go b/toolkit/gocui/newJ.go
new file mode 100644
index 0000000..47c7439
--- /dev/null
+++ b/toolkit/gocui/newJ.go
@@ -0,0 +1,46 @@
+// 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"
+ "strings"
+
+ "github.com/awesome-gocui/gocui"
+)
+
+var topX int = 2
+var bottomX int = 20
+var topY int = 2
+var bottomY int = 7
+
+func newJ(g *gocui.Gui) error {
+ // maxX, maxY := g.Size()
+ name := fmt.Sprintf("jcarr %v test ", idxView)
+ v, err := g.SetView(name, topX, topY, bottomX, bottomY, 0)
+ if err == nil {
+ return err
+ }
+ if !errors.Is(err, gocui.ErrUnknownView) {
+ return err
+ }
+
+ v.Wrap = true
+ fmt.Fprintln(v, name)
+ fmt.Fprintln(v, strings.Repeat("foo\n", 2))
+ // fmt.Fprintln(v, strings.Repeat(name+" ", 30))
+ log.Println("newJ added a new view", v.Name())
+
+ if _, err := g.SetCurrentView(name); err != nil {
+ return err
+ }
+
+ views = append(views, name)
+ curView = len(views) - 1
+ idxView += 1
+ return nil
+}
diff --git a/toolkit/gocui/mouse.go b/toolkit/gocui/orig/mouse.go
index 7c77b14..7c77b14 100644
--- a/toolkit/gocui/mouse.go
+++ b/toolkit/gocui/orig/mouse.go
diff --git a/toolkit/gocui/views.go b/toolkit/gocui/views.go
new file mode 100644
index 0000000..6c9c65d
--- /dev/null
+++ b/toolkit/gocui/views.go
@@ -0,0 +1,80 @@
+// 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"
+ "strings"
+
+ "github.com/awesome-gocui/gocui"
+)
+
+func newView(g *gocui.Gui) error {
+ maxX, maxY := g.Size()
+ name := fmt.Sprintf("v%v", idxView)
+ v, err := g.SetView(name, maxX/2-5, maxY/2-5, maxX/2+5, maxY/2+5, 0)
+ if err == nil {
+ return err
+ }
+ if !errors.Is(err, gocui.ErrUnknownView) {
+ return err
+ }
+
+ v.Wrap = true
+ fmt.Fprintln(v, strings.Repeat(name+" ", 30))
+
+ if _, err := g.SetCurrentView(name); err != nil {
+ return err
+ }
+
+ views = append(views, name)
+ curView = len(views) - 1
+ idxView += 1
+ return nil
+}
+
+func delView(g *gocui.Gui) error {
+ if len(views) <= 1 {
+ return nil
+ }
+
+ if err := g.DeleteView(views[curView]); err != nil {
+ return err
+ }
+ views = append(views[:curView], views[curView+1:]...)
+
+ return nextView(g, false)
+}
+
+func nextView(g *gocui.Gui, disableCurrent bool) error {
+ next := curView + 1
+ if next > len(views)-1 {
+ next = 0
+ }
+
+ if _, err := g.SetCurrentView(views[next]); err != nil {
+ return err
+ }
+
+ curView = next
+ return nil
+}
+
+func moveView(g *gocui.Gui, v *gocui.View, dx, dy int) error {
+ name := v.Name()
+ x0, y0, x1, y1, err := g.ViewPosition(name)
+ if err != nil {
+ return err
+ }
+ log.Println(x0, y0, x1, y1)
+ if _, err := g.SetView(name, x0+dx, y0+dy, x1+dx, y1+dy, 0); err != nil {
+ return err
+ }
+ x0, y0, x1, y1, err = g.ViewPosition(name)
+ log.Println(x0, y0, x1, y1)
+ return nil
+}