just a "gui" from <STDIN>
Signed-off-by: Jeff Carr <jcarr@wit.com>
This commit is contained in:
commit
66f87e3448
|
@ -0,0 +1,16 @@
|
|||
all: plugin
|
||||
ldd ../nocui.so
|
||||
|
||||
plugin:
|
||||
GO111MODULE="off" go build -v -x -buildmode=plugin -o ../nocui.so
|
||||
|
||||
cleanbuild:
|
||||
go build -v -x -buildmode=plugin -o ../nocui.so
|
||||
|
||||
check-git-clean:
|
||||
@git diff-index --quiet HEAD -- || (echo "Git repository is dirty, please commit your changes first"; exit 1)
|
||||
|
||||
redomod:
|
||||
rm -f go.*
|
||||
GO111MODULE= go mod init
|
||||
GO111MODULE= go mod tidy
|
|
@ -0,0 +1,5 @@
|
|||
# nogui
|
||||
|
||||
Package gui implements a abstraction layer for Go visual elements.
|
||||
|
||||
This is a sample plugin. It's a skeleton intended to be used when making a new toolkit plugin.
|
|
@ -0,0 +1,89 @@
|
|||
package main
|
||||
|
||||
/*
|
||||
a simple function to handle widget actions
|
||||
|
||||
You can tie this into your toolkit here.
|
||||
*/
|
||||
|
||||
import (
|
||||
"go.wit.com/log"
|
||||
"go.wit.com/lib/widget"
|
||||
// "go.wit.com/gui/toolkits/tree"
|
||||
)
|
||||
|
||||
func doAction(a widget.Action) {
|
||||
log.Log(INFO, "doAction() START a.ActionType =", a.ActionType)
|
||||
log.Log(INFO, "doAction() START a.ProgName =", a.ProgName)
|
||||
|
||||
if (a.ActionType == widget.ToolkitInit) {
|
||||
return
|
||||
}
|
||||
|
||||
log.Log(INFO, "doAction() START a.WidgetId =", a.WidgetId, "a.ParentId =", a.ParentId)
|
||||
switch a.WidgetType {
|
||||
case widget.Root:
|
||||
me.treeRoot = me.myTree.AddNode(&a)
|
||||
log.Log(INFO, "doAction() found treeRoot")
|
||||
return
|
||||
}
|
||||
|
||||
switch a.ActionType {
|
||||
case widget.Add:
|
||||
me.myTree.AddNode(&a)
|
||||
return
|
||||
}
|
||||
|
||||
n := me.treeRoot.FindWidgetId(a.WidgetId)
|
||||
if n == nil {
|
||||
log.Warn("FindId() n == nil", a.WidgetId, a.ActionType)
|
||||
log.Warn("FindId() n == nil", a.WidgetId, a.ActionType)
|
||||
log.Warn("FindId() n == nil", a.WidgetId, a.ActionType)
|
||||
log.Warn("Aaaaa!, return")
|
||||
return
|
||||
}
|
||||
|
||||
switch a.ActionType {
|
||||
case widget.Show:
|
||||
n.State.Visable = true
|
||||
case widget.Hide:
|
||||
n.State.Visable = false
|
||||
case widget.Enable:
|
||||
n.State.Visable = true
|
||||
case widget.Disable:
|
||||
n.State.Visable = false
|
||||
case widget.Get:
|
||||
log.Warn("value =", n.State.Value)
|
||||
case widget.GetText:
|
||||
log.Warn("value =", n.String())
|
||||
case widget.Set:
|
||||
n.State.Value = a.State.Value
|
||||
case widget.SetText:
|
||||
log.Warn("GOT TO SetText()", a.WidgetId)
|
||||
log.Warn("GOT TO SetText()", a.WidgetId)
|
||||
log.Warn("GOT TO SetText()", a.WidgetId)
|
||||
log.Warn("GOT TO SetText()", a.WidgetId)
|
||||
if n == nil {
|
||||
log.Warn("HOT DIGGITY. n == nil")
|
||||
}
|
||||
n.State.Value = a.State.Value
|
||||
case widget.AddText:
|
||||
n.State.Strings = append(a.State.Strings, widget.GetString(a.State.Value))
|
||||
case widget.Margin:
|
||||
n.State.Pad = true
|
||||
case widget.Unmargin:
|
||||
n.State.Pad = false
|
||||
case widget.Pad:
|
||||
n.State.Pad = true
|
||||
case widget.Unpad:
|
||||
n.State.Pad = false
|
||||
case widget.Delete:
|
||||
log.Warn("doAction() TODO: Delete()")
|
||||
// n.Delete()
|
||||
case widget.Move:
|
||||
log.Warn("doAction() TODO: Move()")
|
||||
default:
|
||||
log.Log(ERROR, "doAction() Unknown =", a.ActionType, a.WidgetType)
|
||||
}
|
||||
log.Log(INFO, "doAction() END =", a.ActionType, a.WidgetType)
|
||||
}
|
|
@ -0,0 +1,30 @@
|
|||
package main
|
||||
|
||||
/*
|
||||
this enables command line options from other packages like 'gui' and 'log'
|
||||
*/
|
||||
|
||||
import (
|
||||
log "go.wit.com/log"
|
||||
)
|
||||
|
||||
var NOW *log.LogFlag
|
||||
var INFO *log.LogFlag
|
||||
|
||||
var SPEW *log.LogFlag
|
||||
var WARN *log.LogFlag
|
||||
|
||||
var ERROR *log.LogFlag
|
||||
|
||||
func init() {
|
||||
full := "toolkit/nocui"
|
||||
short := "nocui"
|
||||
|
||||
NOW = log.NewFlag( "NOW", true, full, short, "temp debugging stuff")
|
||||
INFO = log.NewFlag("INFO", false, full, short, "normal debugging stuff")
|
||||
|
||||
WARN = log.NewFlag("WARN", true, full, short, "bad things")
|
||||
SPEW = log.NewFlag("SPEW", false, full, short, "spew stuff")
|
||||
|
||||
ERROR = log.NewFlag("ERROR", false, full, short, "toolkit errors")
|
||||
}
|
|
@ -0,0 +1,51 @@
|
|||
package main
|
||||
|
||||
/*
|
||||
import (
|
||||
"go.wit.com/log"
|
||||
"go.wit.com/gui/widget"
|
||||
"go.wit.com/gui/toolkits/tree"
|
||||
)
|
||||
|
||||
func doWidgetClick(n *tree.Node) {
|
||||
switch n.WidgetType {
|
||||
case widget.Root:
|
||||
// THIS IS THE BEGINING OF THE LAYOUT
|
||||
// rootNode.nextW = 0
|
||||
// rootNode.nextH = 0
|
||||
// rootNode.redoTabs(true)
|
||||
case widget.Flag:
|
||||
// me.rootNode.redoColor(true)
|
||||
// rootNode.dumpTree(true)
|
||||
case widget.Window:
|
||||
// setCurrentWindow(w)
|
||||
// n.doUserEvent()
|
||||
case widget.Tab:
|
||||
// setCurrentTab(w)
|
||||
case widget.Group:
|
||||
// n.placeWidgets()
|
||||
// n.toggleTree()
|
||||
case widget.Checkbox:
|
||||
if n.Bool() {
|
||||
// n.setCheckbox(false)
|
||||
} else {
|
||||
// n.setCheckbox(true)
|
||||
}
|
||||
// n.doUserEvent()
|
||||
case widget.Grid:
|
||||
// rootNode.hideWidgets()
|
||||
// n.placeGrid()
|
||||
// n.showWidgets()
|
||||
case widget.Box:
|
||||
// n.showWidgetPlacement(logNow, "drawTree()")
|
||||
if n.Bool() {
|
||||
log.Log(NOW, "BOX IS HORIZONTAL", n.GetProgName())
|
||||
} else {
|
||||
log.Log(NOW, "BOX IS VERTICAL", n.GetProgName())
|
||||
}
|
||||
case widget.Button:
|
||||
// n.doUserEvent()
|
||||
default:
|
||||
}
|
||||
}
|
||||
*/
|
|
@ -0,0 +1,24 @@
|
|||
package main
|
||||
|
||||
/*
|
||||
This is reference code for toolkit developers
|
||||
|
||||
The 'nocui' is a bare minimum toolkit. It's all you need
|
||||
to interact with the GUI
|
||||
*/
|
||||
|
||||
import (
|
||||
"go.wit.com/log"
|
||||
"go.wit.com/toolkits/tree"
|
||||
)
|
||||
|
||||
func init() {
|
||||
log.Log(INFO, "Init()")
|
||||
|
||||
me.myTree = tree.New()
|
||||
me.myTree.PluginName = "nocui"
|
||||
me.myTree.ActionFromChannel = doAction
|
||||
|
||||
go simpleStdin()
|
||||
log.Log(INFO, "Init() END")
|
||||
}
|
|
@ -0,0 +1,74 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"os"
|
||||
"fmt"
|
||||
"bufio"
|
||||
"runtime/debug"
|
||||
"strings"
|
||||
"strconv"
|
||||
|
||||
"go.wit.com/log"
|
||||
"go.wit.com/lib/widget"
|
||||
)
|
||||
|
||||
func simpleStdin() {
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
log.Warn("nocui YAHOOOO Recovered in simpleStdin()", r)
|
||||
log.Println("Recovered from panic:", r)
|
||||
log.Println("Stack trace:")
|
||||
debug.PrintStack()
|
||||
me.myTree.DoToolkitPanic()
|
||||
}
|
||||
}()
|
||||
scanner := bufio.NewScanner(os.Stdin)
|
||||
for scanner.Scan() {
|
||||
s := scanner.Text()
|
||||
s = strings.TrimSuffix(s, "\n")
|
||||
switch s {
|
||||
case "l":
|
||||
log.Log(NOW, "list widgets")
|
||||
me.treeRoot.ListWidgets()
|
||||
case "b":
|
||||
log.Log(NOW, "show buttons")
|
||||
me.treeRoot.ShowButtons()
|
||||
case "g":
|
||||
me.myTree.DoToolkitLoad("gocui")
|
||||
case "a":
|
||||
me.myTree.DoToolkitLoad("andlabs")
|
||||
case "d":
|
||||
me.myTree.DoEnableDebugger()
|
||||
case "":
|
||||
fmt.Println("")
|
||||
fmt.Println("Enter:")
|
||||
fmt.Println("'l': list all widgets")
|
||||
fmt.Println("'b': for buttons")
|
||||
fmt.Println("'g': load gocui plugin")
|
||||
fmt.Println("'a': load andlabs plugin")
|
||||
fmt.Println("'d': enable debugging")
|
||||
default:
|
||||
i, _ := strconv.Atoi(s)
|
||||
log.Log(NOW, "got input:", i)
|
||||
n := me.treeRoot.FindWidgetId(i)
|
||||
if (n != nil) {
|
||||
n.DumpWidget("found node")
|
||||
for i, s := range n.State.Strings {
|
||||
log.Warn("n.State.Strings =", i, s)
|
||||
}
|
||||
switch n.WidgetType {
|
||||
case widget.Root:
|
||||
log.Warn("this is the root widget")
|
||||
case widget.Dropdown:
|
||||
log.Warn("print out dropdown values here")
|
||||
case widget.Button:
|
||||
me.myTree.DoUserEvent(n)
|
||||
case widget.Checkbox:
|
||||
me.myTree.DoUserEvent(n)
|
||||
default:
|
||||
log.Warn("you haven't defined an event for", n.WidgetType)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"go.wit.com/toolkits/tree"
|
||||
)
|
||||
|
||||
// stores the raw toolkit internals
|
||||
type guiWidget struct {
|
||||
Width int
|
||||
Height int
|
||||
|
||||
c int
|
||||
val map[string]int
|
||||
}
|
||||
|
||||
// It's probably a terrible idea to call this 'me'
|
||||
var me config
|
||||
|
||||
type config struct {
|
||||
treeRoot *tree.Node // the base of the binary tree. it should have id == 0
|
||||
myTree *tree.TreeInfo
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
package main
|
||||
|
||||
/*
|
||||
This is reference code for toolkit developers
|
||||
*/
|
||||
|
||||
import (
|
||||
"go.wit.com/lib/widget"
|
||||
)
|
||||
|
||||
// Other goroutines must use this to access the GUI
|
||||
//
|
||||
// You can not acess / process the GUI thread directly from
|
||||
// other goroutines. This is due to the nature of how
|
||||
// Linux, MacOS and Windows work (they all work differently. suprise. surprise.)
|
||||
//
|
||||
// this sets the channel to send user events back from the plugin
|
||||
func Callback(guiCallback chan widget.Action) {
|
||||
me.myTree.Callback(guiCallback)
|
||||
}
|
||||
|
||||
func PluginChannel() chan widget.Action {
|
||||
return me.myTree.PluginChannel()
|
||||
}
|
Loading…
Reference in New Issue