From 213c7d153b06d3e1211d1cdeae1e4f7833cb89f7 Mon Sep 17 00:00:00 2001 From: Jeff Carr Date: Sun, 31 Oct 2021 14:21:36 -0500 Subject: REFACTOR: refactor everything to gui.Node struct Signed-off-by: Jeff Carr --- cmds/gui-example/Makefile | 5 ++ cmds/gui-example/demo-window.go | 105 ++++++++++++++++++++++++++++++++++++++++ cmds/gui-example/main.go | 68 ++++++++++++++++++++++++++ cmds/gui-example/os.go | 99 +++++++++++++++++++++++++++++++++++++ 4 files changed, 277 insertions(+) create mode 100644 cmds/gui-example/Makefile create mode 100644 cmds/gui-example/demo-window.go create mode 100644 cmds/gui-example/main.go create mode 100644 cmds/gui-example/os.go (limited to 'cmds/gui-example') diff --git a/cmds/gui-example/Makefile b/cmds/gui-example/Makefile new file mode 100644 index 0000000..5028ebd --- /dev/null +++ b/cmds/gui-example/Makefile @@ -0,0 +1,5 @@ +run: build + ./gui-example + +build: + GO111MODULE="off" go build diff --git a/cmds/gui-example/demo-window.go b/cmds/gui-example/demo-window.go new file mode 100644 index 0000000..993900d --- /dev/null +++ b/cmds/gui-example/demo-window.go @@ -0,0 +1,105 @@ +package main + +import "log" +import "reflect" + +import "git.wit.org/wit/gui" + +import "github.com/davecgh/go-spew/spew" + +func demoClick (n *gui.Node) { + log.Println("demoClick() Dumping node:") + n.Dump() +} + +var username = "jcarr" +var hostname = "fire" + +func newClick (n *gui.Node) { + var tmp []string + junk := "ssh -v " + username + "@" + hostname + log.Println("junk = " , junk) + xterm(junk) + log.Println("tmp = " , reflect.ValueOf(tmp).Kind()) + // spew.Dump(tmp) +} + +func addDemoTab(n *gui.Node, title string) { + newNode := n.AddTab(title, nil) + if (gui.Config.Debug) { + newNode.Dump() + } + newNode.ListChildren(false) + + groupNode1 := newNode.AddGroup("group 1") + cbNode := groupNode1.AddComboBox("username", "root", "jcarr", "hugo") + cbNode.OnChanged(func () { + username = cbNode.GetText() + }) + groupNode1.AddComboBox("demoCombo3", "foo 3", "bar", "stuff") + + groupNode1.Dump() + + butNode1 := groupNode1.AddButton("button1", demoClick) + butNode1.Dump() + + butNode2 := groupNode1.AddButton("button2", newClick) + butNode2.Dump() + + groupNode2 := newNode.AddGroup("group 2") + groupNode2.AddComboBox("demoCombo2", "more 1", "more 2", "more 3") + + gNode := newNode.AddGroup("domU") + makeSSHbutton(gNode, "hugo@www", "www.wit.org") + makeSSHbutton(gNode, "check.lab", "check.lab.wit.org") + makeSSHbutton(gNode, "gobuild.lab", "gobuild.lab.wit.org") + makeSSHbutton(gNode, "gobuild2.lab", "gobuild2.lab.wit.org") + +/////////////////////////////// Column DNS //////////////////////////////// + gNode = newNode.AddGroup("dns") + makeSSHbutton(gNode, "bind.wit.org", "bind.wit.org") + makeSSHbutton(gNode, "ns1.wit.com", "ns1.wit.com") + makeSSHbutton(gNode, "ns2.wit.com", "ns2.wit.com") + makeSSHbutton(gNode, "coredns", "coredns.lab.wit.org") + +/////////////////////////////// PHYS 530 ////////////////////////////////// + gNode = newNode.AddGroup("phys 530") + // makeXtermButton(gNode, "openwrt", "SUBDOMAIN", "ssh -4 -v root@openwrt") + gNode.AddButton("openwrt", func (*gui.Node) { + stuff := "ssh -4 -v root@openwrt" + xterm(stuff) + }) + makeSSHbutton (gNode, "mirrors", "mirrors.wit.org") + makeSSHbutton (gNode, "node004", "node004.lab.wit.org") + makeSSHbutton (gNode, "lenovo-z70", "lenovo-z70.lab.wit.org") + +/////////////////////////////// PHYS 522 ////////////////////////////////// + gNode = newNode.AddGroup("phys 522") + // makeXtermButton(gNode, "openwrt2", "SUBDOMAIN", "ssh -4 -v root@openwrt2") + gNode.AddButton("openwrt2", func (*gui.Node) { + stuff := "ssh -4 -v root@openwrt2" + xterm(stuff) + }) + makeSSHbutton (gNode, "fire.lab", "fire.lab.wit.org") + makeSSHbutton (gNode, "predator", "predator.lab.wit.org") + +/////////////////////////////// FLOAT ///////////////////////////////////// + gNode = newNode.AddGroup("float") + makeSSHbutton(gNode, "root@asus-n501vw", "asus-n501vw.lab.wit.org") +} + +func makeSSHbutton (n *gui.Node, name string, hostname string) { + bNode := n.AddButton(name, func (*gui.Node) { + var tmp []string + if (username == "") { + username = "root" + } + junk := "ssh -v " + username + "@" + hostname + log.Println("junk = " , junk) + log.Println("username = '" + username + "'") + xterm(junk) + log.Println("tmp = " , reflect.ValueOf(tmp).Kind()) + spew.Dump(tmp) + }) + bNode.Dump() +} diff --git a/cmds/gui-example/main.go b/cmds/gui-example/main.go new file mode 100644 index 0000000..8eae878 --- /dev/null +++ b/cmds/gui-example/main.go @@ -0,0 +1,68 @@ +package main + +import ( + "log" + "os" + "time" + + "git.wit.org/wit/gui" +) + +// This initializes the first window +// +// Then starts a goroutine to demonstrate how to +// inject things into the GUI +func main() { + log.Println("Starting my Control Panel") + + go gui.Main(initGUI) + + watchGUI() +} + +// This initializes the first window +func initGUI() { + gui.Config.Title = "WIT GUI Window Demo 1" + gui.Config.Width = 640 + gui.Config.Height = 480 + gui.Config.Exit = myExit + node1 := gui.NewWindow() + addDemoTab(node1, "A Simple Tab Demo") + + gui.Config.Title = "WIT GUI Window Demo 2" + gui.Config.Width = 640 + gui.Config.Height = 240 + gui.Config.Exit = myExit + node2 := gui.NewWindow() + node2.DemoAndlabsUiTab("A Simple andlabs/ui Tab Demo") +} + +// This demonstrates how to properly interact with the GUI +// You can not involke the GUI from external goroutines in most cases. +func watchGUI() { + var i = 1 + for { + log.Println("Waiting", i, "seconds") + i += 1 + time.Sleep(1 * time.Second) + if i == 4 { + log.Println("Opening a Debug Window via the gui.Queue()") + gui.Config.Width = 800 + gui.Config.Height = 300 + gui.Config.Exit = myDebugExit + gui.Queue(gui.DebugWindow) + } + } +} + +func myExit(n *gui.Node) { + log.Println() + log.Println("Entered myExit() on node.Name =", n.Name) + log.Println() + os.Exit(0) +} + +func myDebugExit(n *gui.Node) { + log.Println("Entered myDebugExit() on node.Name =", n.Name) + log.Println("Don't actually os.Exit()") +} diff --git a/cmds/gui-example/os.go b/cmds/gui-example/os.go new file mode 100644 index 0000000..ce5db8d --- /dev/null +++ b/cmds/gui-example/os.go @@ -0,0 +1,99 @@ +package main + +import "log" +import "strings" +import "os" +import "os/exec" +import "io/ioutil" +import "errors" +// import "bufio" + +// import "github.com/davecgh/go-spew/spew" + +/* +import "time" +import "runtime" +import "runtime/debug" +import "runtime/pprof" + +import "git.wit.org/wit/gui" +import "git.wit.org/wit/shell" +import "github.com/gobuffalo/packr" +*/ + +func runSimpleCommand(s string) { + cmd := strings.TrimSpace(s) // this is like 'chomp' in perl + cmd = strings.TrimSuffix(cmd, "\n") // this is like 'chomp' in perl + cmdArgs := strings.Fields(cmd) + runLinuxCommand(cmdArgs) +} + +var geom string = "120x30+500+500" + +func xterm(cmd string) { + var tmp []string + var argsXterm = []string{"nohup", "xterm", "-geometry", geom} + tmp = append(argsXterm, "-hold", "-e", cmd) + log.Println("xterm cmd=", cmd) + go runCommand(tmp) +} + +func runCommand(cmdArgs []string) { + log.Println("runCommand() START", cmdArgs) + process := exec.Command(cmdArgs[0], cmdArgs[1:len(cmdArgs)]...) + // process := exec.Command("xterm", "-e", "ping localhost") + log.Println("runCommand() process.Start()") + process.Start() + log.Println("runCommand() process.Wait()") + err := process.Wait() + lookupError(err) + log.Println("runCommand() NEED TO CHECK THE TIME HERE TO SEE IF THIS WORKED") + log.Println("runCommand() OTHERWISE INFORM THE USER") + log.Println("runCommand() END", cmdArgs) +} + +func lookupError(err error) { + var ( + ee *exec.ExitError + pe *os.PathError + ) + + if errors.As(err, &ee) { + log.Println("ran, but non-zero exit code =", ee.ExitCode()) // ran, but non-zero exit code + } else if errors.As(err, &pe) { + log.Printf("os.PathError = %v", pe) // "no such file ...", "permission denied" etc. + } else if err != nil { + log.Printf("something really bad happened general err = %v", err) // something really bad happened! + if exitError, ok := err.(*exec.ExitError); ok { + log.Printf("exitError.ExitCode() is %d\n", exitError.ExitCode()) + } + } else { + log.Println("success! // ran without error (exit code zero)") + } +} + +func runLinuxCommand(cmdArgs []string) (string, error) { + process := exec.Command(cmdArgs[0], cmdArgs[1:len(cmdArgs)]...) + + process.Stdin = os.Stdin + process.Stderr = os.Stderr + + stdOut, err := process.StdoutPipe() + if err != nil { + return "", err + } + + if err := process.Start(); err != nil { + return "", err + } + + bytes, err := ioutil.ReadAll(stdOut) + if err != nil { + return "", err + } + err = process.Wait() + lookupError(err) + + log.Println(string(bytes)) + return string(bytes), err +} -- cgit v1.2.3 From 7a9bcbd89c1237aad4740ca0b981248ffc2bccc0 Mon Sep 17 00:00:00 2001 From: Jeff Carr Date: Sun, 31 Oct 2021 15:46:31 -0500 Subject: TEXT: fix OnChanged() handling --- box.go | 18 +++++++++++++++--- cmds/gui-example/demo-window.go | 4 ++-- new-structs.go | 3 +++ 3 files changed, 20 insertions(+), 5 deletions(-) (limited to 'cmds/gui-example') diff --git a/box.go b/box.go index 7a61f55..cf215d7 100644 --- a/box.go +++ b/box.go @@ -187,12 +187,16 @@ func VerticalBreak(box *GuiBox) { } func (n *Node) AddComboBox(title string, s ...string) *Node { + newNode := n.AddNode(title) box := n.uiBox if (box == nil) { return n } ecbox := ui.NewEditableCombobox() + newNode.uiText = ecbox + // newNode.Dump() + // log.Println("ecbox", ecbox) for id, name := range s { log.Println("Adding Combobox Entry:", id, name) @@ -201,19 +205,27 @@ func (n *Node) AddComboBox(title string, s ...string) *Node { ecbox.OnChanged(func(*ui.EditableCombobox) { test := ecbox.Text() - log.Println("node.Name = '" + n.Name + "' text for '" + title + "' is now: '" + test + "'") + log.Println("node.Name = '" + newNode.Name + "' text for '" + title + "' is now: '" + test + "'") + if (newNode.OnChanged == nil) { + log.Println("Not doing custom OnChanged since OnChanged == nil") + newNode.Dump() + } else { + newNode.OnChanged() + } }) box.Append(ecbox, false) - newNode := n.AddNode(title) - newNode.uiText = ecbox + // newNode.Dump() + // panic("junk") return newNode } +/* func (n *Node) OnChanged(f func()) { f() } +*/ func (n *Node) GetText() string { if (n.uiText == nil) { diff --git a/cmds/gui-example/demo-window.go b/cmds/gui-example/demo-window.go index 993900d..f01c1a9 100644 --- a/cmds/gui-example/demo-window.go +++ b/cmds/gui-example/demo-window.go @@ -33,9 +33,9 @@ func addDemoTab(n *gui.Node, title string) { groupNode1 := newNode.AddGroup("group 1") cbNode := groupNode1.AddComboBox("username", "root", "jcarr", "hugo") - cbNode.OnChanged(func () { + cbNode.OnChanged = func () { username = cbNode.GetText() - }) + } groupNode1.AddComboBox("demoCombo3", "foo 3", "bar", "stuff") groupNode1.Dump() diff --git a/new-structs.go b/new-structs.go index 4f9989e..b75fe0b 100644 --- a/new-structs.go +++ b/new-structs.go @@ -44,6 +44,7 @@ type Node struct { Name string Width int Height int + OnChanged func () parent *Node children []*Node @@ -73,6 +74,7 @@ func (n *Node) Dump() { log.Println("gui.Node.Dump() Name = ", n.Name) log.Println("gui.Node.Dump() Width = ", n.Width) log.Println("gui.Node.Dump() Height = ", n.Height) + log.Println("gui.Node.Dump() OnChanged = ", n.OnChanged) if (n.parent == nil) { log.Println("gui.Node.Dump() parent = nil") @@ -89,6 +91,7 @@ func (n *Node) Dump() { log.Println("gui.Node.Dump() uiBox = ", n.uiBox) log.Println("gui.Node.Dump() uiControl = ", n.uiControl) log.Println("gui.Node.Dump() uiButton = ", n.uiButton) + log.Println("gui.Node.Dump() uiText = ", n.uiText) if (n.id == "") { panic("gui.Node.Dump() id == nil") } -- cgit v1.2.3 From 45644ef9bc333f5def62d1c7f474dc96274e63fa Mon Sep 17 00:00:00 2001 From: Jeff Carr Date: Sat, 8 Oct 2022 17:33:12 -0500 Subject: BUILD: builds again with go 1.19 on sid as of today Signed-off-by: Jeff Carr --- cmds/gui-demo/Makefile | 2 +- cmds/gui-example/Makefile | 2 +- entry.go | 1 + go.mod | 9 +++++---- go.sum | 8 +++++--- 5 files changed, 13 insertions(+), 9 deletions(-) (limited to 'cmds/gui-example') diff --git a/cmds/gui-demo/Makefile b/cmds/gui-demo/Makefile index 2dbc808..41fdd10 100644 --- a/cmds/gui-demo/Makefile +++ b/cmds/gui-demo/Makefile @@ -2,4 +2,4 @@ run: build ./gui-demo build: - GO111MODULE="off" go build + go build diff --git a/cmds/gui-example/Makefile b/cmds/gui-example/Makefile index 5028ebd..8718fd1 100644 --- a/cmds/gui-example/Makefile +++ b/cmds/gui-example/Makefile @@ -2,4 +2,4 @@ run: build ./gui-example build: - GO111MODULE="off" go build + go build diff --git a/entry.go b/entry.go index 539c2f7..524609f 100644 --- a/entry.go +++ b/entry.go @@ -5,6 +5,7 @@ import "errors" // import "fmt" import "github.com/andlabs/ui" +// import ui "git.wit.org/interesting/andlabs-ui" import _ "github.com/andlabs/ui/winmanifest" // import "github.com/davecgh/go-spew/spew" diff --git a/go.mod b/go.mod index c72bbca..18a5b64 100644 --- a/go.mod +++ b/go.mod @@ -1,9 +1,10 @@ module git.wit.org/wit/gui -go 1.17 +go 1.19 require ( - github.com/andlabs/ui v0.0.0-20200610043537-70a69d6ae31e - github.com/davecgh/go-spew v1.1.1 - golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d + git.wit.org/interesting/andlabs-ui v0.0.0-20200610043537-70a69d6ae31e // indirect + github.com/andlabs/ui v0.0.0-20200610043537-70a69d6ae31e // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + golang.org/x/image v0.0.0-20220902085622-e7cb96979f69 // indirect ) diff --git a/go.sum b/go.sum index 27ff5d2..dd2a245 100644 --- a/go.sum +++ b/go.sum @@ -1,8 +1,10 @@ +git.wit.org/interesting/andlabs-ui v0.0.0-20200610043537-70a69d6ae31e h1:CTg83RH/Poy/HCBbBkRFIqKsdBSsHkLeED6XbMmzZzk= +git.wit.org/interesting/andlabs-ui v0.0.0-20200610043537-70a69d6ae31e/go.mod h1:UuaKXIGj4crFE8XDWljgHTyKi8j4pSd9Vvn+zeHNjkQ= github.com/andlabs/ui v0.0.0-20200610043537-70a69d6ae31e h1:wSQCJiig/QkoUnpvelSPbLiZNWvh2yMqQTQvIQqSUkU= github.com/andlabs/ui v0.0.0-20200610043537-70a69d6ae31e/go.mod h1:5G2EjwzgZUPnnReoKvPWVneT8APYbyKkihDVAHUi0II= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d h1:RNPAfi2nHY7C2srAV8A49jpsYr0ADedCk1wq6fTMTvs= -golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/image v0.0.0-20220902085622-e7cb96979f69 h1:Lj6HJGCSn5AjxRAH2+r35Mir4icalbqku+CLUtjnvXY= +golang.org/x/image v0.0.0-20220902085622-e7cb96979f69/go.mod h1:doUCurBvlfPMKfmIpRIywoHmhN3VyhnoFDbvIEWF4hY= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -- cgit v1.2.3