Compare commits
No commits in common. "guimaster" and "v0.18.0" have entirely different histories.
|
@ -1,5 +1,3 @@
|
|||
*.swp
|
||||
*.so
|
||||
go.mod
|
||||
go.sum
|
||||
andlabs
|
||||
|
|
23
Makefile
23
Makefile
|
@ -1,19 +1,7 @@
|
|||
VERSION = $(shell git describe --tags)
|
||||
BUILDTIME = $(shell date +%Y.%m.%d)
|
||||
all: plugin
|
||||
|
||||
all: clean goimports vet andlabs.so
|
||||
|
||||
andlabs.so:
|
||||
GO111MODULE=off go build -v -x -buildmode=plugin -o andlabs.so \
|
||||
-ldflags "-X main.VERSION=${VERSION} -X main.BUILDTIME=${BUILDTIME} -X gui.GUIVERSION=${VERSION}"
|
||||
|
||||
install: clean
|
||||
go build -v -buildmode=plugin -o ~/go/lib/andlabs-${VERSION}.so \
|
||||
-ldflags "-X main.VERSION=${VERSION} -X main.BUILDTIME=${BUILDTIME} -X gui.GUIVERSION=${VERSION}"
|
||||
cd ~/go/lib && ln -f -s andlabs-${VERSION}.so andlabs.so
|
||||
|
||||
clean:
|
||||
rm -f andlabs andlabs.*so
|
||||
plugin:
|
||||
GO111MODULE="off" go build -v -x -buildmode=plugin -o ../andlabs.so
|
||||
|
||||
goget:
|
||||
GO111MODULE="off" go get -v -t -u
|
||||
|
@ -21,11 +9,6 @@ goget:
|
|||
goimports:
|
||||
goimports -w *.go
|
||||
|
||||
vet:
|
||||
@GO111MODULE=off go vet
|
||||
@echo this go plugin builds okay
|
||||
|
||||
|
||||
redomod:
|
||||
rm -f go.*
|
||||
goimports -w *.go
|
||||
|
|
|
@ -1,3 +0,0 @@
|
|||
// TODO: make a fake 'plugin' channel of communication to andlabs for mswindows
|
||||
// Windows doesn't support plugins. How can I keep andlabs and only compile it on windows?
|
||||
// https://forum.heroiclabs.com/t/setting-up-goland-to-compile-plugins-on-windows/594/5
|
138
action.go
138
action.go
|
@ -1,6 +1,8 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"errors"
|
||||
|
||||
"go.wit.com/log"
|
||||
"go.wit.com/toolkits/tree"
|
||||
"go.wit.com/widget"
|
||||
|
@ -80,6 +82,7 @@ func ready(n *tree.Node) bool {
|
|||
|
||||
func hide(n *tree.Node) {
|
||||
show(n, false)
|
||||
n.State.Hidden = true
|
||||
}
|
||||
|
||||
func show(n *tree.Node, b bool) {
|
||||
|
@ -103,7 +106,7 @@ func show(n *tree.Node, b bool) {
|
|||
}
|
||||
}
|
||||
|
||||
func realEnable(n *tree.Node, b bool) {
|
||||
func enable(n *tree.Node, b bool) {
|
||||
if !ready(n) {
|
||||
return
|
||||
}
|
||||
|
@ -148,15 +151,6 @@ func pad(n *tree.Node, b bool) {
|
|||
}
|
||||
}
|
||||
|
||||
func showWidget(n *tree.Node) {
|
||||
log.Info("not implemented in andlabs yet")
|
||||
// widgetDelete(n)
|
||||
}
|
||||
|
||||
func hideWidget(n *tree.Node) {
|
||||
widgetDelete(n)
|
||||
}
|
||||
|
||||
func widgetDelete(n *tree.Node) {
|
||||
log.Log(ANDLABS, "widgetDelete()", n.WidgetId, n.WidgetType)
|
||||
var tk *guiWidget
|
||||
|
@ -169,44 +163,116 @@ func widgetDelete(n *tree.Node) {
|
|||
tk.uiWindow.Destroy()
|
||||
tk.uiWindow = nil
|
||||
}
|
||||
// n.DeleteNode()
|
||||
n.DeleteNode()
|
||||
} else {
|
||||
log.Log(ANDLABS, "DESTROY can't destroy TODO:", n.WidgetId, n.WidgetType)
|
||||
}
|
||||
}
|
||||
|
||||
func SetTitle(n *tree.Node, s string) {
|
||||
SetText(n, s)
|
||||
}
|
||||
func processAction(a *widget.Action) {
|
||||
log.Log(ANDLABS, "processAction() START a.ActionType =", a.ActionType, "a.Value", a.Value)
|
||||
|
||||
func SetLabel(n *tree.Node, s string) {
|
||||
SetText(n, s)
|
||||
}
|
||||
if a.ActionType == widget.ToolkitInit {
|
||||
Init()
|
||||
return
|
||||
}
|
||||
switch a.WidgetType {
|
||||
case widget.Root:
|
||||
if me.treeRoot == nil {
|
||||
log.Log(INFO, "processAction() found the treeRoot")
|
||||
me.treeRoot = me.myTree.AddNode(a)
|
||||
} else {
|
||||
log.Log(ERROR, "processAction() Something terrible has happened")
|
||||
log.Log(ERROR, "processAction() treeNode was sent an action", a.ActionType, a)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func SetText(n *tree.Node, s string) {
|
||||
log.Log(ANDLABS, "andlabs processAction() START a.WidgetId =", a.WidgetId, "a.ParentId =", a.ParentId, a.ActionType)
|
||||
switch a.WidgetType {
|
||||
case widget.Flag:
|
||||
log.Log(ERROR, "processAction() RE-IMPLEMENT LOG FLAGS")
|
||||
return
|
||||
}
|
||||
|
||||
if me.treeRoot == nil {
|
||||
panic("me.treeRoot == nil")
|
||||
}
|
||||
|
||||
if a.ActionType == widget.Add {
|
||||
n := add(a)
|
||||
// show(n, !a.State.Hidden)
|
||||
if a.State.Hidden {
|
||||
hide(n)
|
||||
} else {
|
||||
if a.State.Enable {
|
||||
// nothing to do
|
||||
} else {
|
||||
enable(n, false)
|
||||
}
|
||||
}
|
||||
// pad(n, n.State.Pad)
|
||||
// expand(n, a.State.Expand)
|
||||
return
|
||||
}
|
||||
|
||||
n := me.treeRoot.FindWidgetId(a.WidgetId)
|
||||
if n == nil {
|
||||
log.Log(WARN, "Tree Error: Add() sent n == nil")
|
||||
if a.ActionType == widget.Delete {
|
||||
// this is normal. the widget is aleady deleted
|
||||
return
|
||||
}
|
||||
if a.WidgetType == widget.Window {
|
||||
// this could happen maybe someday
|
||||
log.Log(ANDLABS, "processAction() trying on nonexistant window", a.WidgetId, a.ActionType)
|
||||
return
|
||||
}
|
||||
log.Error(errors.New("andlabs processAction() ERROR findWidgetId found nil"), a.ActionType, a.WidgetType)
|
||||
log.Log(WARN, "processAction() ERROR findWidgetId found nil for id =", a.WidgetId)
|
||||
log.Log(WARN, "processAction() ERROR findWidgetId found nil", a.ActionType, a.WidgetType)
|
||||
log.Log(WARN, "processAction() ERROR findWidgetId found nil for id =", a.WidgetId)
|
||||
if WARN.Bool() {
|
||||
me.treeRoot.ListWidgets()
|
||||
}
|
||||
return
|
||||
panic("findWidgetId found nil for id = " + string(a.WidgetId))
|
||||
}
|
||||
if n.TK == nil {
|
||||
log.Log(WARN, "SetText() Tree sent an action on a widget we didn't seem to have.", n.WidgetId)
|
||||
return
|
||||
}
|
||||
setText(n, s)
|
||||
log.Log(ANDLABS, "SetText() (new)", n.WidgetType, n.String(), s)
|
||||
}
|
||||
|
||||
func AddText(n *tree.Node, s string) {
|
||||
if n == nil {
|
||||
log.Log(WARN, "Tree Error: Add() sent n == nil")
|
||||
if a.ActionType == widget.Dump {
|
||||
log.Log(NOW, "processAction() Dump =", a.ActionType, a.WidgetType, n.State.ProgName)
|
||||
return
|
||||
}
|
||||
if n.TK == nil {
|
||||
log.Log(WARN, "AddText() Tree sent an action on a widget we didn't seem to have.", n.WidgetId)
|
||||
return
|
||||
|
||||
switch a.ActionType {
|
||||
case widget.Delete:
|
||||
widgetDelete(n)
|
||||
case widget.Show:
|
||||
show(n, true)
|
||||
case widget.Hide:
|
||||
hide(n)
|
||||
case widget.Enable:
|
||||
enable(n, true)
|
||||
case widget.Disable:
|
||||
log.Log(ANDLABS, "andlabs got disable for", n.WidgetId, n.State.ProgName)
|
||||
enable(n, false)
|
||||
case widget.Checked:
|
||||
setChecked(n, a.State.Checked)
|
||||
case widget.Get:
|
||||
setText(n, a)
|
||||
case widget.GetText:
|
||||
switch a.WidgetType {
|
||||
case widget.Textbox:
|
||||
a.Value = n.State.Value
|
||||
}
|
||||
case widget.Set:
|
||||
setText(n, a)
|
||||
case widget.SetText:
|
||||
log.Log(ANDLABS, "andlabs SetText wid =", n.WidgetId, n.State.Value, a.State.Value)
|
||||
setText(n, a)
|
||||
case widget.AddText:
|
||||
addText(n, a)
|
||||
default:
|
||||
log.Log(ERROR, "processAction() Unknown =", a.ActionType, a.WidgetType)
|
||||
}
|
||||
log.Log(ANDLABS, "AddText()", n.WidgetType, n.String())
|
||||
// w := n.TK.(*guiWidget)
|
||||
// w.AddText(s)
|
||||
addText(n, s)
|
||||
log.Log(INFO, "processAction() END =", a.ActionType, a.WidgetType)
|
||||
}
|
||||
|
|
56
add.go
56
add.go
|
@ -6,7 +6,16 @@ import (
|
|||
"go.wit.com/widget"
|
||||
)
|
||||
|
||||
func add(n *tree.Node) {
|
||||
func add(a *widget.Action) *tree.Node {
|
||||
log.Log(ANDLABS, "add()", a.WidgetId, a.WidgetType, a.State.ProgName)
|
||||
if a.WidgetType == widget.Root {
|
||||
if me.treeRoot == nil {
|
||||
me.treeRoot = me.myTree.AddNode(a)
|
||||
}
|
||||
return me.treeRoot
|
||||
}
|
||||
n := me.myTree.AddNode(a)
|
||||
|
||||
p := n.Parent
|
||||
switch n.WidgetType {
|
||||
case widget.Window:
|
||||
|
@ -23,60 +32,27 @@ func add(n *tree.Node) {
|
|||
newButton(p, n)
|
||||
case widget.Checkbox:
|
||||
newCheckbox(p, n)
|
||||
setChecked(n, n.State.Checked)
|
||||
setChecked(n, a.State.Checked)
|
||||
case widget.Spinner:
|
||||
newSpinner(p, n)
|
||||
case widget.Slider:
|
||||
newSlider(p, n)
|
||||
case widget.Dropdown:
|
||||
newDropdown(p, n)
|
||||
// setText(n, n.State.DefaultS)
|
||||
setText(n, a)
|
||||
case widget.Combobox:
|
||||
newCombobox(p, n)
|
||||
// setText(n, n.State.DefaultS)
|
||||
setText(n, a)
|
||||
case widget.Textbox:
|
||||
newTextbox(p, n)
|
||||
// setText(n, n.State.DefaultS)
|
||||
setText(n, a)
|
||||
/*
|
||||
case widget.Image:
|
||||
newImage(p, n)
|
||||
*/
|
||||
default:
|
||||
log.Log(ERROR, "add() error TODO: ", n.WidgetType, n.ProgName())
|
||||
log.Log(ERROR, "add() error TODO: ", n.WidgetType, n.State.ProgName)
|
||||
}
|
||||
}
|
||||
|
||||
func newAdd(n *tree.Node) {
|
||||
if n == nil {
|
||||
log.Log(WARN, "Tree Error: Add() sent n == nil")
|
||||
return
|
||||
}
|
||||
if n.WidgetType == widget.Root {
|
||||
me.treeRoot = n
|
||||
return
|
||||
}
|
||||
if me.treeRoot == nil {
|
||||
panic("test")
|
||||
}
|
||||
add(n)
|
||||
if n.TK == nil {
|
||||
if n.WidgetId == 1 || n.WidgetId == 2 {
|
||||
// this is normal at plugin init() time
|
||||
} else {
|
||||
// this probably shouldn't be happening
|
||||
log.Log(WARN, "newAdd() Tree sent an action on a widget we didn't seem to have.", n.WidgetId, n.WidgetType, n.ProgName())
|
||||
}
|
||||
// Probably something went wrong and we should reset / redraw everything?
|
||||
n.TK = initWidget(n)
|
||||
}
|
||||
// show(n, !a.State.Hidden)
|
||||
if n.Hidden() {
|
||||
hide(n)
|
||||
} else {
|
||||
if n.State.Enable {
|
||||
// nothing to do
|
||||
} else {
|
||||
realEnable(n, false)
|
||||
}
|
||||
}
|
||||
return n
|
||||
}
|
||||
|
|
29
addText.go
29
addText.go
|
@ -6,23 +6,38 @@ import (
|
|||
"go.wit.com/widget"
|
||||
)
|
||||
|
||||
func realAddText(n *tree.Node, s string) {
|
||||
func compareStrings(n *tree.Node, ss []string) {
|
||||
}
|
||||
|
||||
func addText(n *tree.Node, a *widget.Action) {
|
||||
var tk *guiWidget
|
||||
tk = n.TK.(*guiWidget)
|
||||
log.Log(ANDLABS, "addText() START with s =", s)
|
||||
log.Log(ANDLABS, "addText() START with a.Value =", a.Value)
|
||||
if tk == nil {
|
||||
log.Log(ERROR, "addText error. tk == nil", n.State.ProgName, n.WidgetId)
|
||||
return
|
||||
}
|
||||
log.Log(ANDLABS, "addText() Attempt on", n.WidgetType, "with", s)
|
||||
log.Log(ANDLABS, "addText() Attempt on", n.WidgetType, "with", a.Value)
|
||||
|
||||
switch n.WidgetType {
|
||||
case widget.Dropdown:
|
||||
addDropdownName(n, s)
|
||||
for i, s := range a.State.Strings {
|
||||
log.Log(ANDLABS, "a.State.Strings =", i, s)
|
||||
_, ok := n.Strings[s]
|
||||
// If the key exists
|
||||
if ok {
|
||||
log.Log(ANDLABS, "string is already in the dropdown", i, s)
|
||||
} else {
|
||||
log.Log(ANDLABS, "adding new string to dropdown", i, s)
|
||||
addDropdownName(n, s)
|
||||
// TODO: make numbers
|
||||
n.Strings[s] = 21
|
||||
}
|
||||
}
|
||||
case widget.Combobox:
|
||||
addComboboxName(n, s)
|
||||
addComboboxName(n, widget.GetString(a.Value))
|
||||
default:
|
||||
log.Log(ERROR, "addText() doesn't work on", n.WidgetType)
|
||||
log.Log(ERROR, "plugin Send() Don't know how to addText on", n.WidgetType, "yet", a.ActionType)
|
||||
}
|
||||
log.Log(ANDLABS, "addText() END with =", s)
|
||||
log.Log(ANDLABS, "addText() END with a.Value =", a.Value)
|
||||
}
|
||||
|
|
32
box.go
32
box.go
|
@ -31,24 +31,24 @@ func newBox(n *tree.Node) {
|
|||
}
|
||||
|
||||
/*
|
||||
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" 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
|
||||
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" 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
|
||||
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
|
||||
TODO: handle user killing/closing a window using the OS
|
||||
*/
|
||||
func rawBox(n *tree.Node) *ui.Box {
|
||||
var box *ui.Box
|
||||
|
|
|
@ -21,7 +21,7 @@ func newCheckbox(p *tree.Node, n *tree.Node) {
|
|||
newt.uiCheckbox.OnToggled(func(spin *ui.Checkbox) {
|
||||
var b bool
|
||||
b = newt.checked()
|
||||
n.State.Checked = b
|
||||
n.SetValue(b)
|
||||
log.Log(ANDLABS, "Checkbox is now =", b)
|
||||
me.myTree.SendUserEvent(n)
|
||||
})
|
||||
|
@ -34,7 +34,7 @@ func (t *guiWidget) checked() bool {
|
|||
return t.uiCheckbox.Checked()
|
||||
}
|
||||
|
||||
func realSetChecked(n *tree.Node, b bool) {
|
||||
func setChecked(n *tree.Node, b bool) {
|
||||
if n.WidgetType != widget.Checkbox {
|
||||
}
|
||||
var tk *guiWidget
|
||||
|
|
14
combobox.go
14
combobox.go
|
@ -23,7 +23,7 @@ func newCombobox(p, n *tree.Node) {
|
|||
newt.val = make(map[int]string)
|
||||
|
||||
cb.OnChanged(func(spin *ui.EditableCombobox) {
|
||||
n.State.CurrentS = spin.Text()
|
||||
n.SetValue(spin.Text())
|
||||
log.Log(ANDLABS, "combobox changed ="+spin.Text()+".")
|
||||
me.myTree.SendUserEvent(n)
|
||||
})
|
||||
|
@ -34,11 +34,11 @@ func newCombobox(p, n *tree.Node) {
|
|||
log.Log(ANDLABS, "add combobox entries on create:", n.State.Strings)
|
||||
// add the initial combobox entries
|
||||
for i, s := range n.State.Strings {
|
||||
log.Log(ANDLABS, "add combobox entries on create progname:", n.GetProgName(), "State.Strings =", i, s)
|
||||
log.Log(ANDLABS, "add combobox entries on create", n.GetProgName(), i, s)
|
||||
addComboboxName(n, s)
|
||||
}
|
||||
cur := n.CurrentS()
|
||||
log.Log(ANDLABS, "add combobox: set default value on create to", cur)
|
||||
cur := n.String()
|
||||
log.Log(ANDLABS, "add combobox: set default value on create to", n.GetProgName(), cur)
|
||||
setComboboxName(n, cur)
|
||||
}
|
||||
|
||||
|
@ -48,7 +48,7 @@ func addComboboxName(n *tree.Node, s string) {
|
|||
}
|
||||
var tk *guiWidget
|
||||
tk = n.TK.(*guiWidget)
|
||||
log.Log(ANDLABS, "addComboboxName()", n.WidgetId, "add:", s)
|
||||
log.Log(INFO, "addComboboxName()", n.WidgetId, "add:", s)
|
||||
|
||||
tk.uiEditableCombobox.Append(s)
|
||||
if tk.val == nil {
|
||||
|
@ -59,7 +59,7 @@ func addComboboxName(n *tree.Node, s string) {
|
|||
|
||||
// If this is the first menu added, set the dropdown to it
|
||||
if tk.c == 0 {
|
||||
log.Log(ANDLABS, "addComboboxName() first string:", s)
|
||||
log.Log(INFO, "THIS IS THE FIRST combobox", s)
|
||||
tk.uiEditableCombobox.SetText(s)
|
||||
}
|
||||
tk.c = tk.c + 1
|
||||
|
@ -71,7 +71,7 @@ func setComboboxName(n *tree.Node, s string) bool {
|
|||
}
|
||||
var tk *guiWidget
|
||||
tk = n.TK.(*guiWidget)
|
||||
log.Log(ANDLABS, "SetComboboxName()", n.WidgetId, ",", s)
|
||||
log.Log(INFO, "SetComboboxName()", n.WidgetId, ",", s)
|
||||
tk.uiEditableCombobox.SetText(s)
|
||||
return false
|
||||
}
|
||||
|
|
|
@ -27,9 +27,9 @@ func newDropdown(p, n *tree.Node) {
|
|||
i := spin.Selected()
|
||||
if newt.val == nil {
|
||||
log.Log(ERROR, "make map didn't work")
|
||||
n.State.CurrentS = "map did not work. ui.Combobox error"
|
||||
n.SetValue("map did not work. ui.Combobox error")
|
||||
} else {
|
||||
n.State.CurrentS = newt.val[i]
|
||||
n.SetValue(newt.val[i])
|
||||
}
|
||||
me.myTree.SendUserEvent(n)
|
||||
})
|
||||
|
@ -93,12 +93,12 @@ func setDropdownName(n *tree.Node, s string) bool {
|
|||
|
||||
for i, tmp := range tk.val {
|
||||
if s == tmp {
|
||||
n.State.CurrentS = s
|
||||
n.SetValue(s)
|
||||
setDropdownInt(n, i)
|
||||
log.Log(ANDLABS, "SetDropdownInt() worked", tmp, i)
|
||||
return true
|
||||
}
|
||||
}
|
||||
log.Log(WARN, "SetDropdownName() failed", s, n.WidgetId, n.GetProgName())
|
||||
log.Warn("SetDropdownName() failed", s, n.WidgetId, n.GetProgName())
|
||||
return false
|
||||
}
|
||||
|
|
7
flags.go
7
flags.go
|
@ -11,9 +11,11 @@ import (
|
|||
var NOW *log.LogFlag
|
||||
var INFO *log.LogFlag
|
||||
|
||||
var SPEW *log.LogFlag
|
||||
var WARN *log.LogFlag
|
||||
|
||||
var ERROR *log.LogFlag
|
||||
var CHANGE *log.LogFlag
|
||||
var ANDLABS *log.LogFlag
|
||||
|
||||
func init() {
|
||||
|
@ -23,7 +25,10 @@ func init() {
|
|||
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")
|
||||
WARN = log.NewFlag("WARN", false, full, short, "bad things")
|
||||
SPEW = log.NewFlag("SPEW", false, full, short, "spew stuff")
|
||||
|
||||
CHANGE = log.NewFlag("CHANGE", false, full, short, "show when the user does things")
|
||||
|
||||
full = "go.wit.com/gui"
|
||||
short = "andlabs"
|
||||
|
|
191
init.go
191
init.go
|
@ -1,191 +0,0 @@
|
|||
// plugin
|
||||
package main
|
||||
|
||||
import (
|
||||
"runtime/debug"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"go.wit.com/log"
|
||||
"go.wit.com/toolkits/tree"
|
||||
|
||||
"go.wit.com/dev/andlabs/ui"
|
||||
// the _ means we only need this for the init()
|
||||
_ "go.wit.com/dev/andlabs/ui/winmanifest"
|
||||
)
|
||||
|
||||
// sent via -ldflags
|
||||
var VERSION string
|
||||
var BUILDTIME string
|
||||
|
||||
var PLUGIN string = "andlabs"
|
||||
|
||||
var uiMainUndef bool = true
|
||||
var uiMain sync.Once
|
||||
var muAction sync.Mutex
|
||||
|
||||
/*
|
||||
func newaction(n *tree.Node, atype widget.ActionType) {
|
||||
ui.QueueMain(func() {
|
||||
newAction(n, atype)
|
||||
})
|
||||
}
|
||||
*/
|
||||
|
||||
func queueAdd(n *tree.Node) {
|
||||
ui.QueueMain(func() {
|
||||
newAdd(n)
|
||||
})
|
||||
}
|
||||
|
||||
func enableWidget(n *tree.Node) {
|
||||
ui.QueueMain(func() {
|
||||
realEnable(n, true)
|
||||
})
|
||||
}
|
||||
|
||||
func disableWidget(n *tree.Node) {
|
||||
ui.QueueMain(func() {
|
||||
realEnable(n, false)
|
||||
})
|
||||
}
|
||||
|
||||
func setTitle(n *tree.Node, s string) {
|
||||
ui.QueueMain(func() {
|
||||
SetText(n, s)
|
||||
})
|
||||
}
|
||||
|
||||
func setLabel(n *tree.Node, s string) {
|
||||
ui.QueueMain(func() {
|
||||
realSetText(n, s)
|
||||
})
|
||||
}
|
||||
|
||||
func setText(n *tree.Node, s string) {
|
||||
ui.QueueMain(func() {
|
||||
realSetText(n, s)
|
||||
})
|
||||
}
|
||||
|
||||
func addText(n *tree.Node, s string) {
|
||||
ui.QueueMain(func() {
|
||||
realAddText(n, s)
|
||||
})
|
||||
}
|
||||
|
||||
func setChecked(n *tree.Node, b bool) {
|
||||
ui.QueueMain(func() {
|
||||
realSetChecked(n, b)
|
||||
})
|
||||
}
|
||||
|
||||
func toolkitClose() {
|
||||
ui.QueueMain(func() {
|
||||
ui.Quit()
|
||||
})
|
||||
}
|
||||
|
||||
/*
|
||||
func queueMain(currentA widget.Action) {
|
||||
// this never happends
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
log.Log("YAHOOOO Recovered in queueMain() application:", r)
|
||||
log.Println("Recovered from panic:", r)
|
||||
log.Println("Stack trace:")
|
||||
debug.PrintStack()
|
||||
me.myTree.SendToolkitPanic()
|
||||
}
|
||||
}()
|
||||
// andlabs puts this inside the gofunction over there
|
||||
// probably this should be changed around here
|
||||
// and only andlabs stuff should be sent there?
|
||||
// it's easier to code it this way however
|
||||
// also, if it dies here, it get's caught
|
||||
// usually, this is where it dies
|
||||
log.Log(ANDLABS, "about to send action into the andlabs ui.QueueMain()")
|
||||
ui.QueueMain(func() {
|
||||
processAction(¤tA)
|
||||
})
|
||||
}
|
||||
*/
|
||||
|
||||
func guiMain() {
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
log.Log(WARN, "YAHOO andlabs GUI recovered in guiMain()")
|
||||
log.Log(WARN, "Stack trace:")
|
||||
debug.PrintStack()
|
||||
log.Log(WARN, "Recovered from panic:", r)
|
||||
log.Log(WARN, "andlabs GUI recovered in guiMain()")
|
||||
log.Log(WARN, "YAHOO andlabs GUI recovered in guiMain()")
|
||||
me.myTree.SendToolkitPanic()
|
||||
return
|
||||
}
|
||||
}()
|
||||
|
||||
// TODO: THIS IS THE PROBLEM
|
||||
ui.Main(func() {
|
||||
// this is a bad hack for now.
|
||||
// a better way would be to spawn ui.Main on the first actual window
|
||||
// that is supposed to be displayed
|
||||
if r := recover(); r != nil {
|
||||
log.Log(WARN, "YAHOO andlabs GUI recovered in guiMain()")
|
||||
log.Log(WARN, "Stack trace:")
|
||||
debug.PrintStack()
|
||||
log.Log(WARN, "Recovered from panic:", r)
|
||||
log.Log(WARN, "andlabs GUI recovered in guiMain()")
|
||||
log.Log(WARN, "YAHOO andlabs GUI recovered in guiMain()")
|
||||
me.myTree.SendToolkitPanic()
|
||||
return
|
||||
}
|
||||
time.Sleep(time.Second)
|
||||
placeholderUI()
|
||||
|
||||
me.myTree.InitOK()
|
||||
|
||||
// if nothing is working, run this instead to make
|
||||
// sure you have something
|
||||
// demoUI()
|
||||
})
|
||||
}
|
||||
|
||||
func Init() {
|
||||
log.Log(WARN, "Init() TODO: move init() to here")
|
||||
}
|
||||
|
||||
// This is important. This sets the defaults for the gui. Without this, there isn't correct padding, etc
|
||||
func initPlugin() {
|
||||
log.Log(INFO, "Init() START")
|
||||
log.Log(INFO, "Init()")
|
||||
// Can you pass values to a plugin init() ? Otherwise, there is no way to safely print
|
||||
// log.Log(INFO, "init() Setting defaultBehavior = true")
|
||||
// setDefaultBehavior(true)
|
||||
|
||||
me.myTree = initTree()
|
||||
|
||||
// me.ok = true // this tells init() it's okay to work with gocui
|
||||
/*
|
||||
me.myTree = tree.New()
|
||||
me.myTree.PluginName = "andlabs"
|
||||
// me.myTree.ActionFromChannel = queueMain
|
||||
|
||||
me.myTree.NodeAction = queueAction
|
||||
me.myTree.Add = queueAdd
|
||||
me.myTree.SetTitle = queueSetTitle
|
||||
me.myTree.SetLabel = queueSetLabel
|
||||
me.myTree.SetText = queueSetText
|
||||
me.myTree.AddText = queueAddText
|
||||
me.myTree.SetChecked = queueSetChecked
|
||||
me.myTree.ToolkitClose = queueToolkitClose
|
||||
*/
|
||||
|
||||
// TODO: this is messed up. run ui.Main() from the first add? Initialize it with an empty thing first?
|
||||
// fake out the OS toolkit by making a fake window. This is probably needed for macos & windows
|
||||
// actually, this probably breaks the macos build
|
||||
go guiMain()
|
||||
}
|
||||
|
||||
func main() {
|
||||
}
|
|
@ -0,0 +1,91 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"runtime/debug"
|
||||
"sync"
|
||||
|
||||
"go.wit.com/log"
|
||||
"go.wit.com/toolkits/tree"
|
||||
"go.wit.com/widget"
|
||||
|
||||
"go.wit.com/dev/andlabs/ui"
|
||||
// the _ means we only need this for the init()
|
||||
_ "go.wit.com/dev/andlabs/ui/winmanifest"
|
||||
)
|
||||
|
||||
var uiMainUndef bool = true
|
||||
var uiMain sync.Once
|
||||
var muAction sync.Mutex
|
||||
|
||||
func queueMain(currentA widget.Action) {
|
||||
/*
|
||||
// this never happends
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
log.Warn("YAHOOOO Recovered in queueMain() application:", r)
|
||||
log.Println("Recovered from panic:", r)
|
||||
log.Println("Stack trace:")
|
||||
debug.PrintStack()
|
||||
me.myTree.SendToolkitPanic()
|
||||
}
|
||||
}()
|
||||
*/
|
||||
// andlabs puts this inside the gofunction over there
|
||||
// probably this should be changed around here
|
||||
// and only andlabs stuff should be sent there?
|
||||
// it's easier to code it this way however
|
||||
// also, if it dies here, it get's caught
|
||||
// usually, this is where it dies
|
||||
log.Log(ANDLABS, "about to send action into the andlabs ui.QueueMain()")
|
||||
ui.QueueMain(func() {
|
||||
processAction(¤tA)
|
||||
})
|
||||
}
|
||||
|
||||
func guiMain() {
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
log.Warn("YAHOOOO Recovered in guiMain application:", r)
|
||||
log.Warn("Recovered from panic:", r)
|
||||
log.Warn("Stack trace:")
|
||||
debug.PrintStack()
|
||||
me.myTree.SendToolkitPanic()
|
||||
return
|
||||
}
|
||||
}()
|
||||
ui.Main(func() {
|
||||
// this is a bad hack for now.
|
||||
// a better way would be to spawn ui.Main on the first actual window
|
||||
// that is supposed to be displayed
|
||||
placeholderUI()
|
||||
|
||||
// if nothing is working, run this instead to make
|
||||
// sure you have something
|
||||
// demoUI()
|
||||
})
|
||||
}
|
||||
|
||||
func Init() {
|
||||
log.Warn("Init() TODO: move init() to here")
|
||||
}
|
||||
|
||||
// This is important. This sets the defaults for the gui. Without this, there isn't correct padding, etc
|
||||
func init() {
|
||||
log.Log(INFO, "Init() START")
|
||||
log.Log(INFO, "Init()")
|
||||
// Can you pass values to a plugin init() ? Otherwise, there is no way to safely print
|
||||
// log.Log(INFO, "init() Setting defaultBehavior = true")
|
||||
// setDefaultBehavior(true)
|
||||
|
||||
me.myTree = tree.New()
|
||||
me.myTree.PluginName = "andlabs"
|
||||
me.myTree.ActionFromChannel = queueMain
|
||||
|
||||
// TODO: this is messed up. run ui.Main() from the first add? Initialize it with an empty thing first?
|
||||
// fake out the OS toolkit by making a fake window. This is probably needed for macos & windows
|
||||
// actually, this probably breaks the macos build
|
||||
go guiMain()
|
||||
}
|
||||
|
||||
func main() {
|
||||
}
|
25
place.go
25
place.go
|
@ -2,9 +2,6 @@ package main
|
|||
|
||||
import (
|
||||
// "os"
|
||||
|
||||
"os"
|
||||
|
||||
"go.wit.com/dev/andlabs/ui"
|
||||
_ "go.wit.com/dev/andlabs/ui/winmanifest"
|
||||
|
||||
|
@ -41,16 +38,6 @@ import (
|
|||
|
||||
func place(p *tree.Node, n *tree.Node) bool {
|
||||
log.Log(INFO, "place() 1 START", n.WidgetType, n.GetProgName(), n.GetLabel())
|
||||
if p == nil {
|
||||
log.Log(WARN, "place() parent == nil")
|
||||
os.Exit(-1)
|
||||
return false
|
||||
}
|
||||
if n == nil {
|
||||
log.Log(WARN, "place() node == nil")
|
||||
os.Exit(-1)
|
||||
return false
|
||||
}
|
||||
if !ready(n) {
|
||||
if n.WidgetType == widget.Window {
|
||||
// TODO: figure out window in window placement
|
||||
|
@ -70,15 +57,13 @@ func place(p *tree.Node, n *tree.Node) bool {
|
|||
log.Sleep(1)
|
||||
panic("ptk == nil")
|
||||
}
|
||||
// p.DumpWidget("parent: ")
|
||||
// n.DumpWidget("child: ")
|
||||
|
||||
// log.Log(WARN, "place() switch", p.WidgetType, n.WidgetId, n.GetProgName())
|
||||
log.Log(INFO, "place() switch", p.WidgetType, n.WidgetId, n.GetProgName())
|
||||
switch p.WidgetType {
|
||||
case widget.Grid:
|
||||
tk.gridX = n.State.GridOffset.X - 1
|
||||
tk.gridY = n.State.GridOffset.Y - 1
|
||||
// log.Log(WARN, "place() on Grid at gridX,gridY", tk.gridX, tk.gridY)
|
||||
log.Log(INFO, "place() on Grid at gridX,gridY", tk.gridX, tk.gridY)
|
||||
ptk.uiGrid.Append(tk.uiControl,
|
||||
tk.gridX, tk.gridY, 1, 1,
|
||||
false, ui.AlignFill, false, ui.AlignFill)
|
||||
|
@ -106,7 +91,7 @@ func place(p *tree.Node, n *tree.Node) bool {
|
|||
panic("tk.uiControl == nil")
|
||||
}
|
||||
log.Log(ERROR, "CHECK LOGIC ON THIS. APPENDING directly into a window without a tab")
|
||||
ptk.uiTab.Append(n.State.Label, tk.uiControl)
|
||||
ptk.uiTab.Append(widget.GetString(n.State.Value), tk.uiControl)
|
||||
ptk.boxC += 1
|
||||
return true
|
||||
case widget.Box:
|
||||
|
@ -121,10 +106,6 @@ func place(p *tree.Node, n *tree.Node) bool {
|
|||
return true
|
||||
case widget.Window:
|
||||
log.Log(INFO, "Adding Something to Window", n.WidgetId, n.GetProgName())
|
||||
if n.WidgetType == widget.Window {
|
||||
log.Log(INFO, "TODO: make window in a window a tab", n.WidgetId, n.GetProgName())
|
||||
return true
|
||||
}
|
||||
ptk.uiWindow.SetChild(tk.uiControl)
|
||||
return true
|
||||
default:
|
||||
|
|
34
setText.go
34
setText.go
|
@ -6,28 +6,28 @@ import (
|
|||
"go.wit.com/widget"
|
||||
)
|
||||
|
||||
func realSetText(n *tree.Node, name string) {
|
||||
// name := widget.GetString(a.Value)
|
||||
func setText(n *tree.Node, a *widget.Action) {
|
||||
name := widget.GetString(a.Value)
|
||||
var tk *guiWidget
|
||||
tk = n.TK.(*guiWidget)
|
||||
|
||||
log.Log(ANDLABS, "setText() START with text =", name, n.WidgetType)
|
||||
log.Log(CHANGE, "setText() START with text =", name)
|
||||
if tk == nil {
|
||||
log.Log(ERROR, "setText error. tk == nil", n.GetProgName(), n.WidgetId)
|
||||
return
|
||||
}
|
||||
log.Log(CHANGE, "setText() Attempt on", n.WidgetType, "with", name)
|
||||
|
||||
switch n.WidgetType {
|
||||
case widget.Window:
|
||||
log.Log(ANDLABS, "setText() Attempt to set the title to", name)
|
||||
tk.uiWindow.SetTitle(name)
|
||||
log.Log(CHANGE, "setText() Attempt to set the title to", name)
|
||||
tk.uiWindow.SetTitle(a.State.Label)
|
||||
case widget.Tab:
|
||||
case widget.Group:
|
||||
tk.uiGroup.SetTitle(name)
|
||||
tk.uiGroup.SetTitle(a.State.Label)
|
||||
case widget.Checkbox:
|
||||
tk.uiCheckbox.SetText(name)
|
||||
tk.uiCheckbox.SetText(a.State.Label)
|
||||
case widget.Textbox:
|
||||
log.Log(ANDLABS, "setText() on Textbox START with text =", name)
|
||||
if tk.uiEntry != nil {
|
||||
tk.uiEntry.SetText(name)
|
||||
}
|
||||
|
@ -35,25 +35,25 @@ func realSetText(n *tree.Node, name string) {
|
|||
tk.uiMultilineEntry.SetText(name)
|
||||
}
|
||||
case widget.Label:
|
||||
tk.uiLabel.SetText(name)
|
||||
tk.uiLabel.SetText(a.State.Label)
|
||||
case widget.Button:
|
||||
tk.uiButton.SetText(name)
|
||||
tk.uiButton.SetText(a.State.Label)
|
||||
case widget.Slider:
|
||||
log.Log(ERROR, "setText() on slider unknown", n.GetProgName())
|
||||
log.Log(ERROR, "setText() on slider unknown", a.ActionType, "on checkbox", n.GetProgName())
|
||||
case widget.Spinner:
|
||||
log.Log(ERROR, "setText() on spinner unknown", n.GetProgName())
|
||||
log.Log(ERROR, "setText() on spinner unknown", a.ActionType, "on checkbox", n.GetProgName())
|
||||
case widget.Dropdown:
|
||||
var orig int
|
||||
var i int = -1
|
||||
var s string
|
||||
orig = tk.uiCombobox.Selected()
|
||||
log.Log(ANDLABS, "try to set the Dropdown to", name, "from", orig)
|
||||
log.Log(CHANGE, "try to set the Dropdown to", name, "from", orig)
|
||||
// try to find the string
|
||||
for i, s = range tk.val {
|
||||
log.Log(ANDLABS, "i, s", i, s)
|
||||
log.Log(CHANGE, "i, s", i, s)
|
||||
if name == s {
|
||||
tk.uiCombobox.SetSelected(i)
|
||||
log.Log(ANDLABS, "setText() Dropdown worked.", name)
|
||||
log.Log(CHANGE, "setText() Dropdown worked.", name)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
@ -69,7 +69,7 @@ func realSetText(n *tree.Node, name string) {
|
|||
case widget.Combobox:
|
||||
tk.uiEditableCombobox.SetText(name)
|
||||
default:
|
||||
log.Log(ERROR, "plugin Send() Don't know how to setText on", n.WidgetType, "yet")
|
||||
log.Log(ERROR, "plugin Send() Don't know how to setText on", n.WidgetType, "yet", a.ActionType)
|
||||
}
|
||||
log.Log(ANDLABS, "setText() END with name =")
|
||||
log.Log(CHANGE, "setText() END with name =")
|
||||
}
|
||||
|
|
|
@ -22,7 +22,7 @@ func newSlider(p, n *tree.Node) {
|
|||
newt.uiControl = s
|
||||
|
||||
s.OnChanged(func(spin *ui.Slider) {
|
||||
n.State.CurrentI = newt.uiSlider.Value()
|
||||
n.SetValue(newt.uiSlider.Value())
|
||||
me.myTree.SendUserEvent(n)
|
||||
})
|
||||
|
||||
|
|
|
@ -18,7 +18,7 @@ func newSpinner(p, n *tree.Node) {
|
|||
newt.uiControl = s
|
||||
|
||||
s.OnChanged(func(s *ui.Spinbox) {
|
||||
n.State.CurrentI = newt.uiSpinbox.Value()
|
||||
n.SetValue(newt.uiSpinbox.Value())
|
||||
me.myTree.SendUserEvent(n)
|
||||
})
|
||||
|
||||
|
|
|
@ -1,16 +1,12 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"sync"
|
||||
|
||||
"go.wit.com/toolkits/tree"
|
||||
|
||||
"go.wit.com/dev/andlabs/ui"
|
||||
_ "go.wit.com/dev/andlabs/ui/winmanifest"
|
||||
)
|
||||
|
||||
var initOnce sync.Once // run initPlugin() only once
|
||||
|
||||
// It's probably a terrible idea to call this 'me'
|
||||
var me config
|
||||
|
||||
|
|
13
table.go
13
table.go
|
@ -1,13 +0,0 @@
|
|||
// Copyright 2017-2025 WIT.COM Inc. All rights reserved.
|
||||
// Use of this source code is governed by the GPL 3.0
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"go.wit.com/lib/protobuf/guipb"
|
||||
"go.wit.com/log"
|
||||
)
|
||||
|
||||
func showTable(t *guipb.Table) {
|
||||
log.Info("should show table here")
|
||||
}
|
|
@ -17,20 +17,18 @@ func newTextbox(p, n *tree.Node) {
|
|||
e := ui.NewEntry()
|
||||
newt.uiEntry = e
|
||||
newt.uiControl = e
|
||||
newt.uiEntry.SetText(n.State.DefaultS)
|
||||
|
||||
e.OnChanged(func(spin *ui.Entry) {
|
||||
n.State.CurrentS = spin.Text()
|
||||
n.SetValue(spin.Text())
|
||||
me.myTree.SendUserEvent(n)
|
||||
})
|
||||
} else {
|
||||
e := ui.NewNonWrappingMultilineEntry()
|
||||
newt.uiMultilineEntry = e
|
||||
newt.uiControl = e
|
||||
newt.uiMultilineEntry.SetText(n.State.DefaultS)
|
||||
|
||||
e.OnChanged(func(spin *ui.MultilineEntry) {
|
||||
n.State.CurrentS = spin.Text()
|
||||
n.SetValue(spin.Text())
|
||||
me.myTree.SendUserEvent(n)
|
||||
})
|
||||
}
|
||||
|
|
|
@ -0,0 +1,31 @@
|
|||
package main
|
||||
|
||||
/*
|
||||
This code should be common to all gui plugins
|
||||
|
||||
There are some helper functions that are probably going to be
|
||||
the same everywhere. Mostly due to handling the binary tree structure
|
||||
and the channel communication
|
||||
|
||||
For now, it's just a symlink to the 'master' version in
|
||||
./toolkit/nocui/common.go
|
||||
*/
|
||||
|
||||
import (
|
||||
"go.wit.com/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()
|
||||
}
|
79
treeInit.go
79
treeInit.go
|
@ -1,79 +0,0 @@
|
|||
// Copyright 2017-2025 WIT.COM Inc. All rights reserved.
|
||||
// Use of this source code is governed by the GPL 3.0
|
||||
|
||||
/*
|
||||
DO NOT EDIT THIS FILE
|
||||
|
||||
this file is the same for every GUI toolkit plugin
|
||||
when you are making a new GUI toolkit plugin for
|
||||
a specific toolkit, you just need to define these
|
||||
functions.
|
||||
|
||||
for example, in the "gocui" toolkit, the functions
|
||||
below are what triggers the "gocui" GO package
|
||||
to draw labels, buttons, windows, etc
|
||||
|
||||
If you are starting out trying to make a new GUI toolkit,
|
||||
all you have to do is copy this file over. Then
|
||||
work on making these functions. addWidget(), setText(), etc.
|
||||
|
||||
That's it!
|
||||
*/
|
||||
|
||||
package main
|
||||
|
||||
/*
|
||||
This is reference code for toolkit developers
|
||||
|
||||
This is how information is passed in GO back to the application
|
||||
via the GO 'plugin' concept
|
||||
|
||||
TODO: switch this to protocol buffers
|
||||
*/
|
||||
|
||||
import (
|
||||
"go.wit.com/toolkits/tree"
|
||||
"go.wit.com/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 {
|
||||
initOnce.Do(initPlugin)
|
||||
return me.myTree.PluginChannel()
|
||||
}
|
||||
|
||||
func FrozenChannel() chan widget.Action {
|
||||
return me.myTree.FrozenChannel()
|
||||
}
|
||||
|
||||
func initTree() *tree.TreeInfo {
|
||||
t := tree.New()
|
||||
t.PluginName = PLUGIN
|
||||
t.Add = newAdd
|
||||
t.SetTitle = setTitle
|
||||
t.SetLabel = setLabel
|
||||
t.SetText = setText
|
||||
t.AddText = addText
|
||||
|
||||
t.Enable = enableWidget
|
||||
t.Disable = disableWidget
|
||||
|
||||
t.Show = showWidget
|
||||
t.Hide = hideWidget
|
||||
|
||||
t.SetChecked = setChecked
|
||||
t.ToolkitClose = toolkitClose
|
||||
t.ShowTable = showTable
|
||||
|
||||
return t
|
||||
}
|
12
window.go
12
window.go
|
@ -3,8 +3,6 @@ package main
|
|||
import (
|
||||
"go.wit.com/dev/andlabs/ui"
|
||||
_ "go.wit.com/dev/andlabs/ui/winmanifest"
|
||||
"go.wit.com/log"
|
||||
"go.wit.com/widget"
|
||||
|
||||
"go.wit.com/toolkits/tree"
|
||||
)
|
||||
|
@ -26,20 +24,16 @@ func newWindow(p, n *tree.Node) {
|
|||
win.SetBorderless(n.State.Borderless)
|
||||
win.SetMargined(n.State.Pad)
|
||||
win.OnClosing(func(*ui.Window) bool {
|
||||
newt.uiWindow = nil // delete the local reference to the window
|
||||
// show(n, false)
|
||||
me.myTree.SendWindowCloseEvent(n)
|
||||
// n.DeleteNode()
|
||||
n.DeleteNode()
|
||||
return true
|
||||
})
|
||||
newt.uiWindow = win
|
||||
newt.uiControl = win
|
||||
|
||||
n.TK = newt
|
||||
if p.WidgetType == widget.Window {
|
||||
log.Log(WARN, "newWindow() TODO: make this window a tab")
|
||||
} else {
|
||||
place(p, n)
|
||||
}
|
||||
place(p, n)
|
||||
win.Show()
|
||||
return
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue