summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Carr <[email protected]>2024-01-10 15:35:42 -0600
committerJeff Carr <[email protected]>2024-01-10 15:35:42 -0600
commitba5ce49e7aea4b05645d0aac1e5d93049c1344df (patch)
tree20e006cbd5f702754bb81b535d3a562de59a4c85
parentfc9be41013773950f946bef6f3271c5d761a027a (diff)
fix dropdown.Set() and place() on group
Signed-off-by: Jeff Carr <[email protected]>
-rw-r--r--andlabs/action.go2
-rw-r--r--andlabs/add.go88
-rw-r--r--andlabs/addText.go27
-rw-r--r--andlabs/box.go35
-rw-r--r--andlabs/combobox.go5
-rw-r--r--andlabs/place.go94
-rw-r--r--andlabs/setText.go51
-rw-r--r--andlabs/window.go3
-rw-r--r--nocui/common.go1
9 files changed, 183 insertions, 123 deletions
diff --git a/andlabs/action.go b/andlabs/action.go
index 7a723b1..35f4f7b 100644
--- a/andlabs/action.go
+++ b/andlabs/action.go
@@ -245,7 +245,7 @@ func rawAction(a *widget.Action) {
case widget.SetText:
n.setText(a)
case widget.AddText:
- n.setText(a)
+ n.addText(a)
case widget.Margin:
n.pad(widget.Unmargin)
case widget.Unmargin:
diff --git a/andlabs/add.go b/andlabs/add.go
index 589ecc6..c09ddf1 100644
--- a/andlabs/add.go
+++ b/andlabs/add.go
@@ -1,9 +1,6 @@
package main
import (
- "github.com/andlabs/ui"
- _ "github.com/andlabs/ui/winmanifest"
-
"go.wit.com/log"
"go.wit.com/gui/widget"
)
@@ -71,88 +68,3 @@ func add(a *widget.Action) {
log.Log(ERROR, "add() error TODO: ", n.WidgetType, n.Name)
}
}
-
-// This routine is very specific to this toolkit
-// It's annoying and has to be copied to each widget when there are changes
-// it could be 'simplfied' maybe or made to be more generic, but this is as far as I've gotten
-// it's probably not worth working much more on this toolkit, the andlabs/ui has been great and got me here!
-// but it's time to write direct GTK, QT, macos and windows toolkit plugins
-// -- jcarr 2023/03/09
-
-// Grid numbering examples by (X,Y)
-// ---------
-// -- (1) --
-// -- (2) --
-// ---------
-//
-// -----------------------------
-// -- (1,1) -- (1,2) -- (1,3) --
-// -- (2,1) -- (2,2) -- (2,3) --
-// -----------------------------
-
-// internally for andlabs/ui
-// (x&y flipped and start at zero)
-// -----------------------------
-// -- (0,0) -- (1,0) -- (1,0) --
-// -- (0,1) -- (1,1) -- (1,1) --
-// -----------------------------
-func (p *node) place(n *node) bool {
- log.Log(INFO, "place() START", n.WidgetType, n.Name)
-
- if (p.tk == nil) {
- log.Log(ERROR, "p.tk == nil", p.Name, p.ParentId, p.WidgetType, p.tk)
- log.Log(ERROR, "n = ", n.Name, n.ParentId, n.WidgetType, n.tk)
- panic("p.tk == nil")
- }
-
- log.Log(INFO, "place() switch", p.WidgetType)
- switch p.WidgetType {
- case widget.Grid:
- log.Log(INFO, "place() Grid try at Parent X,Y =", n.X, n.Y)
- n.tk.gridX = n.AtW - 1
- n.tk.gridY = n.AtH - 1
- log.Log(INFO, "place() Grid try at gridX,gridY", n.tk.gridX, n.tk.gridY)
- // at the very end, subtract 1 from X & Y since andlabs/ui starts counting at zero
- p.tk.uiGrid.Append(n.tk.uiControl,
- n.tk.gridX, n.tk.gridY, 1, 1,
- false, ui.AlignFill, false, ui.AlignFill)
- return true
- case widget.Group:
- if (p.tk.uiBox == nil) {
- p.tk.uiGroup.SetChild(n.tk.uiControl)
- log.Log(INFO, "place() hack Group to use this as the box?", n.Name, n.WidgetType)
- p.tk.uiBox = n.tk.uiBox
- } else {
- p.tk.uiBox.Append(n.tk.uiControl, stretchy)
- }
- return true
- case widget.Tab:
- if (p.tk.uiTab == nil) {
- log.Log(ERROR, "p.tk.uiTab == nil for n.WidgetId =", n.WidgetId, "p.tk =", p.tk)
- panic("p.tk.uiTab == nil")
- }
- if (n.tk.uiControl == nil) {
- log.Log(ERROR, "n.tk.uiControl == nil for n.WidgetId =", n.WidgetId, "n.tk =", n.tk)
- panic("n.tk.uiControl == nil")
- }
- log.Log(ERROR, "CHECK LOGIC ON THIS. APPENDING directly into a window without a tab")
- // log.Log(ERROR, "THIS SHOULD NEVER HAPPEN ??????? trying to place() node=", n.WidgetId, n.Name, n.Text, n.WidgetType)
- // log.Log(ERROR, "THIS SHOULD NEVER HAPPEN ??????? trying to place() on parent=", p.WidgetId, p.Name, p.Text, p.WidgetType)
- // panic("n.tk.uiControl == nil")
- p.tk.uiTab.Append(n.Text, n.tk.uiControl)
- p.tk.boxC += 1
- return true
- case widget.Box:
- log.Log(INFO, "place() uiBox =", p.tk.uiBox)
- log.Log(INFO, "place() uiControl =", n.tk.uiControl)
- p.tk.uiBox.Append(n.tk.uiControl, stretchy)
- p.tk.boxC += 1
- return true
- case widget.Window:
- p.tk.uiWindow.SetChild(n.tk.uiControl)
- return true
- default:
- log.Log(ERROR, "place() how? Parent =", p.WidgetId, p.WidgetType)
- }
- return false
-}
diff --git a/andlabs/addText.go b/andlabs/addText.go
new file mode 100644
index 0000000..291dca3
--- /dev/null
+++ b/andlabs/addText.go
@@ -0,0 +1,27 @@
+package main
+
+import (
+ "go.wit.com/log"
+ "go.wit.com/gui/widget"
+)
+
+func (n *node) addText(a *widget.Action) {
+ log.Log(CHANGE, "addText() START with a.S =", a.S)
+ t := n.tk
+ if (t == nil) {
+ log.Log(ERROR, "addText error. tk == nil", n.Name, n.WidgetId)
+ actionDump(debugError, a)
+ return
+ }
+ log.Log(CHANGE, "addText() Attempt on", n.WidgetType, "with", a.S)
+
+ switch n.WidgetType {
+ case widget.Dropdown:
+ n.AddDropdownName(a.S)
+ case widget.Combobox:
+ t.AddComboboxName(a.S)
+ default:
+ log.Log(ERROR, "plugin Send() Don't know how to addText on", n.WidgetType, "yet", a.ActionType)
+ }
+ log.Log(CHANGE, "addText() END with a.S =", a.S)
+}
diff --git a/andlabs/box.go b/andlabs/box.go
index 06f8a13..93a4fef 100644
--- a/andlabs/box.go
+++ b/andlabs/box.go
@@ -10,7 +10,7 @@ func (p *node) newBox(n *node) {
newt := new(guiWidget)
var box *ui.Box
- if (n.B) {
+ if (n.horizontal) {
box = ui.NewHorizontalBox()
} else {
box = ui.NewVerticalBox()
@@ -23,3 +23,36 @@ func (p *node) newBox(n *node) {
n.tk = newt
p.place(n)
}
+
+/*
+ rawBox -- hack to arbitrarily add a box in andlabs to work
+ around the problem that a "group" can not have one entry in it
+ TODO: fix this so that a box is "added on demand" that is,
+ if "go.wit.com/gui/gui" sends you a 2nd thing to add to a group,
+ automatically add a box then. The problem with this, is the macos, windows and linux gtk
+ will panic on a move when an chind object is disasociated from the group
+ I haven't had time to try to debug this, so, instead, it's just probably better to always
+ add a box here. There doesn't seem to be any real issue with forcing a box to be inserted
+ into the toolkits that is "outside" the binary tree of widgets. This only means, that on
+ a destroy of the tree, this box must be checked
+
+ even that is a probably not senario however since clicking on the close box in the toolkit
+ has the operating system destroy everything in the window. it may or may not be possible
+ to control that behavior. at this time, it's "undetermined" and the best course of action
+ is to detect the window is destroyed and then remove all the toolkit information
+ from all the nodes in the binary tree
+
+ TODO: handle user killing/closing a window using the OS
+*/
+func (n *node) rawBox() *ui.Box {
+ var box *ui.Box
+
+ if (n.horizontal) {
+ box = ui.NewHorizontalBox()
+ } else {
+ box = ui.NewVerticalBox()
+ }
+ box.SetPadded(true)
+
+ return box
+}
diff --git a/andlabs/combobox.go b/andlabs/combobox.go
index 369b7da..6339f62 100644
--- a/andlabs/combobox.go
+++ b/andlabs/combobox.go
@@ -3,6 +3,8 @@ package main
import (
"github.com/andlabs/ui"
_ "github.com/andlabs/ui/winmanifest"
+
+ "go.wit.com/log"
)
func (p *node) newCombobox(n *node) {
@@ -17,7 +19,8 @@ func (p *node) newCombobox(n *node) {
newt.val = make(map[int]string)
cb.OnChanged(func(spin *ui.EditableCombobox) {
- n.S = spin.Text()
+ n.A = spin.Text()
+ log.Warn("combobox changed =" + spin.Text() + ".")
n.doUserEvent()
})
diff --git a/andlabs/place.go b/andlabs/place.go
new file mode 100644
index 0000000..59a55d9
--- /dev/null
+++ b/andlabs/place.go
@@ -0,0 +1,94 @@
+package main
+
+import (
+ "github.com/andlabs/ui"
+ _ "github.com/andlabs/ui/winmanifest"
+
+
+ "go.wit.com/log"
+ "go.wit.com/gui/widget"
+)
+
+// This routine is very specific to this toolkit
+// It's annoying and has to be copied to each widget when there are changes
+// it could be 'simplfied' maybe or made to be more generic, but this is as far as I've gotten
+// it's probably not worth working much more on this toolkit, the andlabs/ui has been great and got me here!
+// but it's time to write direct GTK, QT, macos and windows toolkit plugins
+// -- jcarr 2023/03/09
+
+// Grid numbering examples by (X,Y)
+// ---------
+// -- (1) --
+// -- (2) --
+// ---------
+//
+// -----------------------------
+// -- (1,1) -- (1,2) -- (1,3) --
+// -- (2,1) -- (2,2) -- (2,3) --
+// -----------------------------
+
+// internally for andlabs/ui
+// (x&y flipped and start at zero)
+// -----------------------------
+// -- (0,0) -- (1,0) -- (1,0) --
+// -- (0,1) -- (1,1) -- (1,1) --
+// -----------------------------
+func (p *node) place(n *node) bool {
+ log.Log(INFO, "place() START", n.WidgetType, n.Name)
+
+ if (p.tk == nil) {
+ log.Log(ERROR, "p.tk == nil", p.Name, p.ParentId, p.WidgetType, p.tk)
+ log.Log(ERROR, "n = ", n.Name, n.ParentId, n.WidgetType, n.tk)
+ panic("p.tk == nil")
+ }
+
+ log.Log(INFO, "place() switch", p.WidgetType)
+ switch p.WidgetType {
+ case widget.Grid:
+ log.Log(INFO, "place() Grid try at Parent X,Y =", n.X, n.Y)
+ n.tk.gridX = n.AtW - 1
+ n.tk.gridY = n.AtH - 1
+ log.Log(INFO, "place() Grid try at gridX,gridY", n.tk.gridX, n.tk.gridY)
+ // at the very end, subtract 1 from X & Y since andlabs/ui starts counting at zero
+ p.tk.uiGrid.Append(n.tk.uiControl,
+ n.tk.gridX, n.tk.gridY, 1, 1,
+ false, ui.AlignFill, false, ui.AlignFill)
+ return true
+ case widget.Group:
+ if (p.tk.uiBox == nil) {
+ log.Log(WARN, "place() andlabs hack group to use add a box", n.Name, n.WidgetType, "horizontal =", n.horizontal)
+ p.tk.uiBox = n.rawBox()
+ p.tk.uiGroup.SetChild(p.tk.uiBox)
+ }
+ p.tk.uiBox.Append(n.tk.uiControl, stretchy)
+ return true
+ case widget.Tab:
+ if (p.tk.uiTab == nil) {
+ log.Log(ERROR, "p.tk.uiTab == nil for n.WidgetId =", n.WidgetId, "p.tk =", p.tk)
+ panic("p.tk.uiTab == nil")
+ }
+ if (n.tk.uiControl == nil) {
+ log.Log(ERROR, "n.tk.uiControl == nil for n.WidgetId =", n.WidgetId, "n.tk =", n.tk)
+ panic("n.tk.uiControl == nil")
+ }
+ log.Log(ERROR, "CHECK LOGIC ON THIS. APPENDING directly into a window without a tab")
+ // log.Log(ERROR, "THIS SHOULD NEVER HAPPEN ??????? trying to place() node=", n.WidgetId, n.Name, n.Text, n.WidgetType)
+ // log.Log(ERROR, "THIS SHOULD NEVER HAPPEN ??????? trying to place() on parent=", p.WidgetId, p.Name, p.Text, p.WidgetType)
+ // panic("n.tk.uiControl == nil")
+ p.tk.uiTab.Append(n.Text, n.tk.uiControl)
+ p.tk.boxC += 1
+ return true
+ case widget.Box:
+ log.Log(INFO, "place() uiBox =", p.tk.uiBox)
+ log.Log(INFO, "place() uiControl =", n.tk.uiControl)
+ p.tk.uiBox.Append(n.tk.uiControl, stretchy)
+ p.tk.boxC += 1
+ return true
+ case widget.Window:
+ p.tk.uiWindow.SetChild(n.tk.uiControl)
+ return true
+ default:
+ log.Log(ERROR, "place() how? Parent =", p.WidgetId, p.WidgetType)
+ }
+ return false
+}
diff --git a/andlabs/setText.go b/andlabs/setText.go
index 1dcb2f2..b89787d 100644
--- a/andlabs/setText.go
+++ b/andlabs/setText.go
@@ -75,39 +75,28 @@ func (n *node) setText(a *widget.Action) {
log.Log(ERROR, "setText() unknown", a.ActionType, "on checkbox", n.Name)
}
case widget.Dropdown:
- switch a.ActionType {
- case widget.AddText:
- n.AddDropdownName(a.S)
- case widget.Set:
- var orig int
- var i int = -1
- var s string
- orig = t.uiCombobox.Selected()
- log.Log(CHANGE, "try to set the Dropdown to", a.S, "from", orig)
- // try to find the string
- for i, s = range t.val {
- log.Log(CHANGE, "i, s", i, s)
- if (a.S == s) {
- t.uiCombobox.SetSelected(i)
- log.Log(CHANGE, "setText() Dropdown worked.", n.S)
- return
- }
- }
- log.Log(ERROR, "setText() Dropdown did not find:", a.S)
- // if i == -1, then there are not any things in the menu to select
- if (i == -1) {
- return
- }
- // if the string was never set, then set the dropdown to the last thing added to the menu
- if (orig == -1) {
+ var orig int
+ var i int = -1
+ var s string
+ orig = t.uiCombobox.Selected()
+ log.Log(CHANGE, "try to set the Dropdown to", a.S, "from", orig)
+ // try to find the string
+ for i, s = range t.val {
+ log.Log(CHANGE, "i, s", i, s)
+ if (a.S == s) {
t.uiCombobox.SetSelected(i)
+ log.Log(CHANGE, "setText() Dropdown worked.", n.S)
+ return
}
- case widget.Get:
- // t.S = t.s
- case widget.GetText:
- // t.S = t.s
- default:
- log.Log(ERROR, "setText() unknown", a.ActionType, "on checkbox", n.Name)
+ }
+ log.Log(ERROR, "setText() Dropdown did not find:", a.S)
+ // if i == -1, then there are not any things in the menu to select
+ if (i == -1) {
+ return
+ }
+ // if the string was never set, then set the dropdown to the last thing added to the menu
+ if (orig == -1) {
+ t.uiCombobox.SetSelected(i)
}
case widget.Combobox:
switch a.ActionType {
diff --git a/andlabs/window.go b/andlabs/window.go
index d45ca63..68fe921 100644
--- a/andlabs/window.go
+++ b/andlabs/window.go
@@ -25,8 +25,9 @@ func newWindow(n *node) {
win.SetBorderless(canvas)
win.SetMargined(margin)
win.OnClosing(func(*ui.Window) bool {
+ n.show(false)
n.doUserEvent()
- return true
+ return false
})
newt.uiWindow = win
newt.uiControl = win
diff --git a/nocui/common.go b/nocui/common.go
index ff3e4bb..bfb76c8 100644
--- a/nocui/common.go
+++ b/nocui/common.go
@@ -98,6 +98,7 @@ func (n *node) doUserEvent() {
a.S = n.S
a.I = n.I
a.B = n.B
+ a.A = n.A
a.ActionType = widget.User
log.Log(INFO, "doUserEvent() START: send a user event to the callback channel")
callback <- a