From 983a60903badac53d1418065843e0d814eb2cb67 Mon Sep 17 00:00:00 2001 From: Jeff Carr Date: Thu, 28 Oct 2021 04:10:48 -0500 Subject: NODE: almost out of the rabbit hole Signed-off-by: Jeff Carr --- cmds/gui-demo/Makefile | 5 ++++ cmds/gui-demo/demo-window.go | 17 +++++++++++ cmds/gui-demo/main.go | 68 ++++++++++++++++++++++++++++++++++++++++++++ cmds/gui-example/Makefile | 5 ++++ cmds/gui-example/main.go | 68 ++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 163 insertions(+) create mode 100644 cmds/gui-demo/Makefile create mode 100644 cmds/gui-demo/demo-window.go create mode 100644 cmds/gui-demo/main.go create mode 100644 cmds/gui-example/Makefile create mode 100644 cmds/gui-example/main.go (limited to 'cmds') diff --git a/cmds/gui-demo/Makefile b/cmds/gui-demo/Makefile new file mode 100644 index 0000000..2dbc808 --- /dev/null +++ b/cmds/gui-demo/Makefile @@ -0,0 +1,5 @@ +run: build + ./gui-demo + +build: + GO111MODULE="off" go build diff --git a/cmds/gui-demo/demo-window.go b/cmds/gui-demo/demo-window.go new file mode 100644 index 0000000..f0cfcce --- /dev/null +++ b/cmds/gui-demo/demo-window.go @@ -0,0 +1,17 @@ +package main + +import "git.wit.org/wit/gui" + +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") + groupNode1.AddComboBox("demoCombo1", "foo", "bar", "stuff") + + groupNode2 := newNode.AddGroup("group 2") + groupNode2.AddComboBox("demoCombo2", "more 1", "more 2", "more 3") +} diff --git a/cmds/gui-demo/main.go b/cmds/gui-demo/main.go new file mode 100644 index 0000000..372f2e2 --- /dev/null +++ b/cmds/gui-demo/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.AddDemoAndlabsUiTab("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/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/main.go b/cmds/gui-example/main.go new file mode 100644 index 0000000..9fcb971 --- /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() + node1.AddDemoTab("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.AddDemoAndlabsUiTab("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()") +} -- cgit v1.2.3 From 5cff6a1acef806e263191fcb58bd68ac4a7287ea Mon Sep 17 00:00:00 2001 From: Jeff Carr Date: Thu, 28 Oct 2021 19:11:37 -0500 Subject: CLEAN: rename some functions for consistancy Signed-off-by: Jeff Carr --- cmds/gui-demo/main.go | 2 +- debug-window.go | 29 ++++------------------------- demo-window-andlabs-ui.go | 2 +- 3 files changed, 6 insertions(+), 27 deletions(-) (limited to 'cmds') diff --git a/cmds/gui-demo/main.go b/cmds/gui-demo/main.go index 372f2e2..8eae878 100644 --- a/cmds/gui-demo/main.go +++ b/cmds/gui-demo/main.go @@ -34,7 +34,7 @@ func initGUI() { gui.Config.Height = 240 gui.Config.Exit = myExit node2 := gui.NewWindow() - node2.AddDemoAndlabsUiTab("A Simple andlabs/ui Tab Demo") + node2.DemoAndlabsUiTab("A Simple andlabs/ui Tab Demo") } // This demonstrates how to properly interact with the GUI diff --git a/debug-window.go b/debug-window.go index 756ebac..19f276d 100644 --- a/debug-window.go +++ b/debug-window.go @@ -16,7 +16,7 @@ var nodeNames = make([]string, 100) func DebugWindow() { Config.Title = "DebugWindow()" node := NewWindow() - node.AddDebugTab("WIT GUI Debug Tab") + node.DebugTab("WIT GUI Debug Tab") } // TODO: remove this crap @@ -236,23 +236,10 @@ func makeWindowDebug() *ui.Box { log.Println("nodeNames[y] =", nodeNames[y]) node := Data.findId(nodeNames[y]) if (node != nil) { - node.AddDebugTab("added this DebugTab") + node.DebugTab("added this DebugTab") } }) - /* - n1 = addButton(vbox, "Node.DemoTab") - n1.OnClicked(func(*ui.Button) { - y := nodeCombo.Selected() - log.Println("y =", y) - log.Println("nodeNames[y] =", nodeNames[y]) - node := Data.findId(nodeNames[y]) - if (node != nil) { - node.AddDemoTab("ran gui.AddDemoTab() " + strconv.Itoa(Config.counter)) - } - }) - */ - n1 = addButton(vbox, "Node.DemoAndlabsUiTab") n1.OnClicked(func(*ui.Button) { y := nodeCombo.Selected() @@ -260,18 +247,10 @@ func makeWindowDebug() *ui.Box { log.Println("nodeNames[y] =", nodeNames[y]) node := Data.findId(nodeNames[y]) if (node != nil) { - node.AddDemoAndlabsUiTab("ran gui.AddDemoAndlabsUiTab() " + strconv.Itoa(Config.counter)) + node.DemoAndlabsUiTab("ran gui.AddDemoAndlabsUiTab() " + strconv.Itoa(Config.counter)) } }) -/* - ///////////////////////////////////////////////////// - vbox = addGroup(hbox, "Numbers") - pbar := ui.NewProgressBar() - vbox.Append(pbar, false) -*/ - - return hbox } @@ -351,7 +330,7 @@ func addButton(box *ui.Box, name string) *ui.Button { return button } -func (n *Node) AddDebugTab(title string) { +func (n *Node) DebugTab(title string) { newNode := n.AddTab(title, makeWindowDebug()) if (Config.DebugNode) { newNode.Dump() diff --git a/demo-window-andlabs-ui.go b/demo-window-andlabs-ui.go index 806dc14..e11ffe9 100644 --- a/demo-window-andlabs-ui.go +++ b/demo-window-andlabs-ui.go @@ -8,7 +8,7 @@ import _ "github.com/andlabs/ui/winmanifest" // calls to andlabs/ui. This can be used to bypass // the obvuscation added in this package if it is desired // or needed. -func (n *Node) AddDemoAndlabsUiTab(title string) { +func (n *Node) DemoAndlabsUiTab(title string) { newNode := n.AddTab(title, makeAndlabsUiTab()) if (Config.DebugNode) { newNode.Dump() -- cgit v1.2.3 From e5638b8079728e66b09071ec8af1d2b423b9eb76 Mon Sep 17 00:00:00 2001 From: Jeff Carr Date: Sun, 31 Oct 2021 03:50:22 -0500 Subject: NODE: add a button in the hole that doesn't use the other hole Signed-off-by: Jeff Carr --- area.go | 10 +++--- box.go | 8 ++--- cmds/gui-demo/demo-window.go | 73 ++++++++++++++++++++++++++++++++++++++++++++ entry.go | 14 +++------ new-structs.go | 24 ++++++++++++++- structs.go | 10 +++--- table.go | 9 +++--- 7 files changed, 120 insertions(+), 28 deletions(-) (limited to 'cmds') diff --git a/area.go b/area.go index 0cc7531..7c42c6c 100644 --- a/area.go +++ b/area.go @@ -107,10 +107,10 @@ func (ah GuiArea) KeyEvent(a *ui.Area, ke *ui.AreaKeyEvent) (handled bool) { return false } -func ShowTextBox(box *GuiBox, newText *ui.AttributedString, custom func(*GuiButton), name string) { +func (b *GuiBox) ShowTextBox(newText *ui.AttributedString, custom func(*GuiButton), name string) { log.Println("ShowTextBox() START") - gw := box.Window + gw := b.Window if (gw == nil) { log.Println("ShowTextBox() ERROR gw = nil") return @@ -127,10 +127,10 @@ func ShowTextBox(box *GuiBox, newText *ui.AttributedString, custom func(*GuiButt */ // TODO: allow padded & axis here - box.UiBox.SetPadded(true) + b.UiBox.SetPadded(true) // add(gw.BoxMap["MAINBOX"], newbox) - makeGenericArea(box, newText, custom) - box.UiBox.Append(box.Window.Area.UiArea, true) + makeGenericArea(b, newText, custom) + b.UiBox.Append(b.Window.Area.UiArea, true) } diff --git a/box.go b/box.go index 9d9833d..61ee2e7 100644 --- a/box.go +++ b/box.go @@ -102,9 +102,9 @@ func (n *Node) AddBox(axis int, name string) *Node { return newNode } -func NewBox(box *GuiBox, axis int, name string) *GuiBox { +func (b *GuiBox) NewBox(axis int, name string) *GuiBox { log.Println("gui.NewBox() START") - n := box.FindNode() + n := b.FindNode() if (n == nil) { log.Println("gui.NewBox() SERIOUS ERROR. CAN NOT FIND NODE") os.Exit(0) @@ -113,7 +113,7 @@ func NewBox(box *GuiBox, axis int, name string) *GuiBox { } var newbox *GuiBox newbox = new(GuiBox) - newbox.Window = box.Window + newbox.Window = b.Window newbox.Name = name var uiBox *ui.Box @@ -124,7 +124,7 @@ func NewBox(box *GuiBox, axis int, name string) *GuiBox { } uiBox.SetPadded(true) newbox.UiBox = uiBox - add(box, newbox) + add(b, newbox) // panic("gui.NewBox") return newbox } diff --git a/cmds/gui-demo/demo-window.go b/cmds/gui-demo/demo-window.go index f0cfcce..c0e426d 100644 --- a/cmds/gui-demo/demo-window.go +++ b/cmds/gui-demo/demo-window.go @@ -1,7 +1,14 @@ package main +import "log" + import "git.wit.org/wit/gui" +/* +import "github.com/andlabs/ui" +import _ "github.com/andlabs/ui/winmanifest" +*/ + func addDemoTab(n *gui.Node, title string) { newNode := n.AddTab(title, nil) if (gui.Config.Debug) { @@ -11,7 +18,73 @@ func addDemoTab(n *gui.Node, title string) { groupNode1 := newNode.AddGroup("group 1") groupNode1.AddComboBox("demoCombo1", "foo", "bar", "stuff") + groupNode1.AddComboBox("demoCombo3", "foo 3", "bar", "stuff") + + groupNode1.Dump() + /* + b := groupNode1.FindBox() + b.Dump() + */ + // n1, b1 := addButton(groupNode1, "Data.ListChildren(false)") +/* + b1.OnClicked(func(*ui.Button) { + gui.Data.ListChildren(false) + }) +*/ + + //n2, b2 := addButton(groupNode1, "dumpBox(window)") + newNode2 := groupNode1.AppendButton("foo 3 " + "AppendButton()", func(groupNode1 *gui.Node) { + log.Println("Dumping groupNode1") + groupNode1.Dump() + }) + newNode2.Dump() +/* + b2.OnClicked(func(*ui.Button) { + x := cbox.Selected() + log.Println("x =", x) + log.Println("names[x] =", names[x]) + x.Dump(names[x]) + }) + n2.Dump() +*/ groupNode2 := newNode.AddGroup("group 2") groupNode2.AddComboBox("demoCombo2", "more 1", "more 2", "more 3") } + +/* +func addButton(n *gui.Node, name string) (*gui.Node, *ui.Button) { + // val := &myButtonInfo{} + button := ui.NewButton(name) + // val.uiC = button + + button.OnClicked(func(*ui.Button) { + log.Println("Should do something here") + }) + + // n.Append(button, false) + newNode := n.AppendButton(name + "AppendButton", func() { + log.Println("Should do something here also") + }) + return newNode, button +} +*/ + +/* +type myButtonInfo struct { + Custom func (*gui.GuiButton) + ADD func (*gui.GuiButton) + Name string + Action string + Node *gui.Node +} + +func newMakeButton(n *gui.Node, name string, action string, custom func(*gui.GuiButton)) *gui.Node { + val := &myButtonInfo{} + val.Custom = custom + val.Name = name + val.Node = n + // val.Action = action + return n.CreateButton(custom, name, val) +} +*/ diff --git a/entry.go b/entry.go index 12fc835..b2ef8f4 100644 --- a/entry.go +++ b/entry.go @@ -24,21 +24,17 @@ func (n *Node) NewLabel(text string) *Node { return newNode } -func GetText(box *GuiBox, name string) string { - if (box == nil) { - log.Println("gui.GetText() ERROR box == nil") - return "" - } - if (box.Window.EntryMap == nil) { +func (b *GuiBox) GetText(name string) string { + if (b.Window.EntryMap == nil) { log.Println("gui.GetText() ERROR b.Box.Window.EntryMap == nil") return "" } - spew.Dump(box.Window.EntryMap) - if (box.Window.EntryMap[name] == nil) { + spew.Dump(b.Window.EntryMap) + if (b.Window.EntryMap[name] == nil) { log.Println("gui.GetText() ERROR box.Window.EntryMap[", name, "] == nil ") return "" } - e := box.Window.EntryMap[name] + e := b.Window.EntryMap[name] log.Println("gui.GetText() box.Window.EntryMap[", name, "] = ", e.UiEntry.Text()) log.Println("gui.GetText() END") return e.UiEntry.Text() diff --git a/new-structs.go b/new-structs.go index 5ef3309..915f881 100644 --- a/new-structs.go +++ b/new-structs.go @@ -3,6 +3,7 @@ package gui import ( "log" "fmt" + "reflect" // "github.com/davecgh/go-spew/spew" @@ -50,7 +51,8 @@ type Node struct { window *GuiWindow box *GuiBox - uiControl *ui.Control + uiControl *ui.Control + uiButton *ui.Button uiWindow *ui.Window uiTab *ui.Tab uiBox *ui.Box @@ -85,6 +87,7 @@ func (n *Node) Dump() { log.Println("gui.Node.Dump() uiTab = ", n.uiTab) log.Println("gui.Node.Dump() uiBox = ", n.uiBox) log.Println("gui.Node.Dump() uiControl = ", n.uiControl) + log.Println("gui.Node.Dump() uiButton = ", n.uiButton) if (n.id == "") { panic("gui.Node.Dump() id == nil") } @@ -120,6 +123,25 @@ func (n *Node) Append(child *Node) { // time.Sleep(3 * time.Second) } +func (n *Node) AppendButton(name string, custom func(*Node)) *Node { + if (n.uiBox == nil) { + log.Println("gui.Node.AppendButton() filed node.UiBox == nil") + return n + } + button := ui.NewButton(name) + log.Println("reflect.TypeOF(uiBox) =", reflect.TypeOf(n.uiBox)) + log.Println("reflect.TypeOF(uiButton) =", reflect.TypeOf(button)) + n.uiBox.Append(button, false) + n.uiButton = button + button.OnClicked(func(*ui.Button) { + log.Println("gui.AppendButton() Button Clicked. Running custom()") + custom(n) + }) + // panic("AppendButton") + // time.Sleep(3 * time.Second) + return n +} + func (n *Node) List() { findByIdDFS(n, "test") } diff --git a/structs.go b/structs.go index 13dc2ea..c15f4b7 100644 --- a/structs.go +++ b/structs.go @@ -105,11 +105,11 @@ type GuiWindow struct { UiTab *ui.Tab // if this != nil, the window is 'tabbed' } -func (gw *GuiWindow) Dump() { - log.Println("gui.GuiWindow.Dump() Name = ", gw.Name) - log.Println("gui.GuiWindow.Dump() node = ", gw.node) - log.Println("gui.GuiWindow.Dump() Width = ", gw.Width) - log.Println("gui.GuiWindow.Dump() Height = ", gw.Height) +func (w *GuiWindow) Dump() { + log.Println("gui.GuiWindow.Dump() Name = ", w.Name) + log.Println("gui.GuiWindow.Dump() node = ", w.node) + log.Println("gui.GuiWindow.Dump() Width = ", w.Width) + log.Println("gui.GuiWindow.Dump() Height = ", w.Height) } // GuiBox is any type of ui.Hbox or ui.Vbox diff --git a/table.go b/table.go index 3ed8c6a..92ae871 100644 --- a/table.go +++ b/table.go @@ -99,10 +99,11 @@ func InitColumns(mh *TableData, parts []TableColumnData) { func AddTableTab(gw *GuiWindow, name string, rowcount int, parts []TableColumnData) *TableData { node := NewWindow() - return AddTableBox(node.box, name, rowcount, parts) + b := node.box + return b.AddTableBox(name, rowcount, parts) } -func AddTableBox(box *GuiBox, name string, rowcount int, parts []TableColumnData) *TableData { +func (b *GuiBox) AddTableBox(name string, rowcount int, parts []TableColumnData) *TableData { mh := new(TableData) mh.RowCount = rowcount @@ -141,9 +142,9 @@ func AddTableBox(box *GuiBox, name string, rowcount int, parts []TableColumnData // is this needed? // gw.BoxMap[name] = box - mh.Box = box + mh.Box = b - box.UiBox.Append(table, true) + b.UiBox.Append(table, true) return mh } -- cgit v1.2.3 From c446acf4d1b831b7858c6d658bcd87678d579cfb Mon Sep 17 00:00:00 2001 From: Jeff Carr Date: Sun, 31 Oct 2021 04:06:46 -0500 Subject: NODE: make node entries for the buttons Signed-off-by: Jeff Carr --- cmds/gui-demo/demo-window.go | 75 ++++++-------------------------------------- new-structs.go | 12 +++++-- 2 files changed, 18 insertions(+), 69 deletions(-) (limited to 'cmds') diff --git a/cmds/gui-demo/demo-window.go b/cmds/gui-demo/demo-window.go index c0e426d..fd8e8f4 100644 --- a/cmds/gui-demo/demo-window.go +++ b/cmds/gui-demo/demo-window.go @@ -4,10 +4,10 @@ import "log" import "git.wit.org/wit/gui" -/* -import "github.com/andlabs/ui" -import _ "github.com/andlabs/ui/winmanifest" -*/ +func demoClick (n *gui.Node) { + log.Println("demoClick() Dumping node:") + n.Dump() +} func addDemoTab(n *gui.Node, title string) { newNode := n.AddTab(title, nil) @@ -21,70 +21,13 @@ func addDemoTab(n *gui.Node, title string) { groupNode1.AddComboBox("demoCombo3", "foo 3", "bar", "stuff") groupNode1.Dump() - /* - b := groupNode1.FindBox() - b.Dump() - */ - // n1, b1 := addButton(groupNode1, "Data.ListChildren(false)") -/* - b1.OnClicked(func(*ui.Button) { - gui.Data.ListChildren(false) - }) -*/ - //n2, b2 := addButton(groupNode1, "dumpBox(window)") - newNode2 := groupNode1.AppendButton("foo 3 " + "AppendButton()", func(groupNode1 *gui.Node) { - log.Println("Dumping groupNode1") - groupNode1.Dump() - }) - newNode2.Dump() -/* - b2.OnClicked(func(*ui.Button) { - x := cbox.Selected() - log.Println("x =", x) - log.Println("names[x] =", names[x]) - x.Dump(names[x]) - }) - n2.Dump() -*/ + butNode1 := groupNode1.AddButton("button1", demoClick) + butNode1.Dump() + + butNode2 := groupNode1.AddButton("button2", demoClick) + butNode2.Dump() groupNode2 := newNode.AddGroup("group 2") groupNode2.AddComboBox("demoCombo2", "more 1", "more 2", "more 3") } - -/* -func addButton(n *gui.Node, name string) (*gui.Node, *ui.Button) { - // val := &myButtonInfo{} - button := ui.NewButton(name) - // val.uiC = button - - button.OnClicked(func(*ui.Button) { - log.Println("Should do something here") - }) - - // n.Append(button, false) - newNode := n.AppendButton(name + "AppendButton", func() { - log.Println("Should do something here also") - }) - return newNode, button -} -*/ - -/* -type myButtonInfo struct { - Custom func (*gui.GuiButton) - ADD func (*gui.GuiButton) - Name string - Action string - Node *gui.Node -} - -func newMakeButton(n *gui.Node, name string, action string, custom func(*gui.GuiButton)) *gui.Node { - val := &myButtonInfo{} - val.Custom = custom - val.Name = name - val.Node = n - // val.Action = action - return n.CreateButton(custom, name, val) -} -*/ diff --git a/new-structs.go b/new-structs.go index 915f881..9e1ae3d 100644 --- a/new-structs.go +++ b/new-structs.go @@ -50,6 +50,7 @@ type Node struct { window *GuiWindow box *GuiBox + custom func(*Node) uiControl *ui.Control uiButton *ui.Button @@ -123,7 +124,7 @@ func (n *Node) Append(child *Node) { // time.Sleep(3 * time.Second) } -func (n *Node) AppendButton(name string, custom func(*Node)) *Node { +func (n *Node) AddButton(name string, custom func(*Node)) *Node { if (n.uiBox == nil) { log.Println("gui.Node.AppendButton() filed node.UiBox == nil") return n @@ -133,13 +134,18 @@ func (n *Node) AppendButton(name string, custom func(*Node)) *Node { log.Println("reflect.TypeOF(uiButton) =", reflect.TypeOf(button)) n.uiBox.Append(button, false) n.uiButton = button + + newNode := n.makeNode(name, 888, 888 + Config.counter) + newNode.uiButton = button + newNode.custom = custom + button.OnClicked(func(*ui.Button) { log.Println("gui.AppendButton() Button Clicked. Running custom()") - custom(n) + custom(newNode) }) // panic("AppendButton") // time.Sleep(3 * time.Second) - return n + return newNode } func (n *Node) List() { -- cgit v1.2.3 From 9675bc19a65dd7cd00e05983ea72c35c2753026b Mon Sep 17 00:00:00 2001 From: Jeff Carr Date: Sun, 31 Oct 2021 07:06:10 -0500 Subject: NODE: migrate more of my personal gui app Signed-off-by: Jeff Carr --- box.go | 37 ++++++++++++++ cmds/gui-example/demo-window.go | 105 ++++++++++++++++++++++++++++++++++++++++ cmds/gui-example/main.go | 4 +- cmds/gui-example/os.go | 99 +++++++++++++++++++++++++++++++++++++ demo-window.go | 34 +------------ 5 files changed, 244 insertions(+), 35 deletions(-) create mode 100644 cmds/gui-example/demo-window.go create mode 100644 cmds/gui-example/os.go (limited to 'cmds') diff --git a/box.go b/box.go index 61ee2e7..7a61f55 100644 --- a/box.go +++ b/box.go @@ -185,3 +185,40 @@ func VerticalBreak(box *GuiBox) { tmp := ui.NewVerticalSeparator() box.UiBox.Append(tmp, false) } + +func (n *Node) AddComboBox(title string, s ...string) *Node { + box := n.uiBox + if (box == nil) { + return n + } + + ecbox := ui.NewEditableCombobox() + + for id, name := range s { + log.Println("Adding Combobox Entry:", id, name) + ecbox.Append(name) + } + + ecbox.OnChanged(func(*ui.EditableCombobox) { + test := ecbox.Text() + log.Println("node.Name = '" + n.Name + "' text for '" + title + "' is now: '" + test + "'") + }) + + box.Append(ecbox, false) + + newNode := n.AddNode(title) + newNode.uiText = ecbox + return newNode +} + +func (n *Node) OnChanged(f func()) { + f() +} + +func (n *Node) GetText() string { + if (n.uiText == nil) { + return "" + } + ecbox := n.uiText + return ecbox.Text() +} 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 index 9fcb971..8eae878 100644 --- a/cmds/gui-example/main.go +++ b/cmds/gui-example/main.go @@ -27,14 +27,14 @@ func initGUI() { gui.Config.Height = 480 gui.Config.Exit = myExit node1 := gui.NewWindow() - node1.AddDemoTab("A Simple Tab Demo") + 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.AddDemoAndlabsUiTab("A Simple andlabs/ui Tab Demo") + node2.DemoAndlabsUiTab("A Simple andlabs/ui Tab Demo") } // This demonstrates how to properly interact with the GUI 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 +} diff --git a/demo-window.go b/demo-window.go index 918b75b..751a3cc 100644 --- a/demo-window.go +++ b/demo-window.go @@ -1,6 +1,6 @@ package gui -import "log" +// import "log" import "github.com/andlabs/ui" import _ "github.com/andlabs/ui/winmanifest" @@ -23,35 +23,3 @@ func (n *Node) AddGroup(title string) *Node { newNode.uiBox = vbox return newNode } - -func (n *Node) GetText(name string) string { - if (n.uiText != nil) { - return n.uiText.Text() - } - return n.Name -} - -func (n *Node) AddComboBox(title string, s ...string) *Node { - box := n.uiBox - if (box == nil) { - return n - } - - ecbox := ui.NewEditableCombobox() - - for id, name := range s { - log.Println("Adding Combobox Entry:", id, name) - ecbox.Append(name) - } - - ecbox.OnChanged(func(*ui.EditableCombobox) { - test := ecbox.Text() - log.Println("node.Name = '" + n.Name + "' text for '" + title + "' is now: '" + test + "'") - }) - - box.Append(ecbox, false) - - newNode := n.AddNode(title) - newNode.uiText = ecbox - return newNode -} -- cgit v1.2.3 From 632d0cb63f54c3b133265d3a4ae6c47c375f1869 Mon Sep 17 00:00:00 2001 From: Jeff Carr Date: Sat, 8 Oct 2022 19:31:35 -0500 Subject: use the old way to ignore go.mod? Signed-off-by: Jeff Carr --- cmds/gui-example/Makefile | 1 + 1 file changed, 1 insertion(+) (limited to 'cmds') diff --git a/cmds/gui-example/Makefile b/cmds/gui-example/Makefile index 5028ebd..638cffc 100644 --- a/cmds/gui-example/Makefile +++ b/cmds/gui-example/Makefile @@ -2,4 +2,5 @@ run: build ./gui-example build: + GO111MODULE="off" go -v get . GO111MODULE="off" go build -- cgit v1.2.3