make a common.go for the toolkits

Signed-off-by: Jeff Carr <jcarr@wit.com>
This commit is contained in:
Jeff Carr 2023-12-15 17:18:48 -06:00
parent de771dbe98
commit 90c020369a
33 changed files with 419 additions and 464 deletions

View File

@ -19,3 +19,6 @@ log:
gocui: build gocui: build
./cloudflare -gui gocui >/tmp/witgui.log.stderr 2>&1 ./cloudflare -gui gocui >/tmp/witgui.log.stderr 2>&1
quiet:
./cloudflare >/tmp/witgui.log.stderr 2>&1

View File

@ -195,7 +195,7 @@ func rawAction(a toolkit.Action) {
return return
} }
n := rootNode.findWidgetId(a.WidgetId) n := me.rootNode.findWidgetId(a.WidgetId)
if (a.ActionType == toolkit.Add) { if (a.ActionType == toolkit.Add) {
ui.QueueMain(func() { ui.QueueMain(func() {
@ -208,12 +208,12 @@ func rawAction(a toolkit.Action) {
if (a.ActionType == toolkit.Dump) { if (a.ActionType == toolkit.Dump) {
log(debugNow, "rawAction() Dump =", a.ActionType, a.WidgetType, n.Name) log(debugNow, "rawAction() Dump =", a.ActionType, a.WidgetType, n.Name)
rootNode.listChildren(true) me.rootNode.listChildren(true)
return return
} }
if (n == nil) { if (n == nil) {
rootNode.listChildren(true) me.rootNode.listChildren(true)
log(true, "rawAction() ERROR findWidgetId found nil", a.ActionType, a.WidgetType) log(true, "rawAction() ERROR findWidgetId found nil", a.ActionType, a.WidgetType)
log(true, "rawAction() ERROR findWidgetId found nil for id =", a.WidgetId) log(true, "rawAction() ERROR findWidgetId found nil for id =", a.WidgetId)
log(true, "rawAction() ERROR findWidgetId found nil", a.ActionType, a.WidgetType) log(true, "rawAction() ERROR findWidgetId found nil", a.ActionType, a.WidgetType)
@ -256,7 +256,7 @@ func rawAction(a toolkit.Action) {
n.Delete() n.Delete()
case toolkit.Move: case toolkit.Move:
log(debugNow, "rawAction() attempt to move() =", a.ActionType, a.WidgetType) log(debugNow, "rawAction() attempt to move() =", a.ActionType, a.WidgetType)
newParent := rootNode.findWidgetId(a.ParentId) newParent := me.rootNode.findWidgetId(a.ParentId)
n.move(newParent) n.move(newParent)
default: default:
log(debugError, "rawAction() Unknown =", a.ActionType, a.WidgetType) log(debugError, "rawAction() Unknown =", a.ActionType, a.WidgetType)

View File

@ -17,10 +17,10 @@ func actionDump(b bool, a *toolkit.Action) {
func add(a toolkit.Action) { func add(a toolkit.Action) {
if (a.WidgetType == toolkit.Root) { if (a.WidgetType == toolkit.Root) {
rootNode = addWidget(&a, nil) me.rootNode = addWidget(&a)
return return
} }
n := addWidget(&a, nil) n := addWidget(&a)
p := n.parent p := n.parent
switch n.WidgetType { switch n.WidgetType {

View File

@ -9,7 +9,7 @@ import (
func (p *node) newBox(n *node) { func (p *node) newBox(n *node) {
log(debugToolkit, "newBox()", n.Name) log(debugToolkit, "newBox()", n.Name)
newt := new(andlabsT) newt := new(guiWidget)
var box *ui.Box var box *ui.Box
log(debugToolkit, "rawBox() create", n.Name) log(debugToolkit, "rawBox() create", n.Name)

View File

@ -14,7 +14,7 @@ func (p *node) newButton(n *node) {
return return
} }
newt := new(andlabsT) newt := new(guiWidget)
b := ui.NewButton(n.Text) b := ui.NewButton(n.Text)
newt.uiButton = b newt.uiButton = b

View File

@ -6,7 +6,7 @@ import (
) )
func (p *node) newCheckbox(n *node) { func (p *node) newCheckbox(n *node) {
newt := new(andlabsT) newt := new(guiWidget)
log(debugToolkit, "newCheckbox()", n.Name, n.WidgetType) log(debugToolkit, "newCheckbox()", n.Name, n.WidgetType)
newt.uiCheckbox = ui.NewCheckbox(n.Text) newt.uiCheckbox = ui.NewCheckbox(n.Text)
@ -22,6 +22,6 @@ func (p *node) newCheckbox(n *node) {
p.place(n) p.place(n)
} }
func (t *andlabsT) checked() bool { func (t *guiWidget) checked() bool {
return t.uiCheckbox.Checked() return t.uiCheckbox.Checked()
} }

View File

@ -6,7 +6,7 @@ import (
) )
func (p *node) newCombobox(n *node) { func (p *node) newCombobox(n *node) {
newt := new(andlabsT) newt := new(guiWidget)
log(debugToolkit, "newCombobox() START", n.Name) log(debugToolkit, "newCombobox() START", n.Name)
cb := ui.NewEditableCombobox() cb := ui.NewEditableCombobox()
@ -26,7 +26,7 @@ func (p *node) newCombobox(n *node) {
p.place(n) p.place(n)
} }
func (t *andlabsT) AddComboboxName(title string) { func (t *guiWidget) AddComboboxName(title string) {
t.uiEditableCombobox.Append(title) t.uiEditableCombobox.Append(title)
if (t.val == nil) { if (t.val == nil) {
log(debugToolkit, "make map didn't work") log(debugToolkit, "make map didn't work")

View File

@ -1,84 +0,0 @@
package main
import (
"git.wit.org/wit/gui/toolkit"
)
// searches the binary tree for a WidgetId
func (n *node) findWidgetId(id int) *node {
if (n == nil) {
return nil
}
if n.WidgetId == id {
return n
}
for _, child := range n.children {
newN := child.findWidgetId(id)
if (newN != nil) {
return newN
}
}
return nil
}
func addWidget(a *toolkit.Action, tk *andlabsT) *node {
n := new(node)
n.WidgetType = a.WidgetType
n.WidgetId = a.WidgetId
n.ParentId = a.ParentId
// copy the data from the action message
n.Name = a.Name
n.Text = a.Text
n.I = a.I
n.S = a.S
n.B = a.B
n.X = a.X
n.Y = a.Y
n.W = a.W
n.H = a.H
n.AtW = a.AtW
n.AtH = a.AtH
// store the internal toolkit information
n.tk = tk
if (a.WidgetType == toolkit.Root) {
log(logInfo, "addWidget() Root")
return n
}
if (rootNode.findWidgetId(a.WidgetId) != nil) {
log(logError, "addWidget() WidgetId already exists", a.WidgetId)
return rootNode.findWidgetId(a.WidgetId)
}
// add this new widget on the binary tree
n.parent = rootNode.findWidgetId(a.ParentId)
if n.parent != nil {
n.parent.children = append(n.parent.children, n)
}
return n
}
func (n *node) doUserEvent() {
if (callback == nil) {
log(debugError, "doUserEvent() callback == nil", n.WidgetId)
return
}
var a toolkit.Action
a.WidgetId = n.WidgetId
a.Name = n.Name
a.Text = n.Text
a.S = n.S
a.I = n.I
a.B = n.B
a.ActionType = toolkit.User
log(logInfo, "doUserEvent() START: send a user event to the callback channel")
callback <- a
log(logInfo, "doUserEvent() END: sent a user event to the callback channel")
return
}

1
toolkit/andlabs/common.go Symbolic link
View File

@ -0,0 +1 @@
../nocui/common.go

View File

@ -49,7 +49,7 @@ func ShowDebug () {
log(true, "debugError =", debugError) log(true, "debugError =", debugError)
} }
func (t *andlabsT) Dump(b bool) { func (t *guiWidget) Dump(b bool) {
if ! b { if ! b {
return return
} }

View File

@ -17,7 +17,7 @@ func BlankWindow(w *ui.Window) *ui.Box {
return hbox return hbox
} }
func (t *andlabsT) DemoNumbersPage() { func (t *guiWidget) DemoNumbersPage() {
var w *ui.Window var w *ui.Window
log(debugToolkit, "Starting wit/gui toolkit andlabs/ui DemoNumbersPage()") log(debugToolkit, "Starting wit/gui toolkit andlabs/ui DemoNumbersPage()")

View File

@ -8,7 +8,7 @@ import (
) )
func (p *node) newDropdown(n *node) { func (p *node) newDropdown(n *node) {
newt := new(andlabsT) newt := new(guiWidget)
log(debugToolkit, "gui.Toolbox.newDropdown() START", n.Name) log(debugToolkit, "gui.Toolbox.newDropdown() START", n.Name)
cb := ui.NewCombobox() cb := ui.NewCombobox()
@ -34,7 +34,7 @@ func (p *node) newDropdown(n *node) {
p.place(n) p.place(n)
} }
func (t *andlabsT) addDropdownName(title string) { func (t *guiWidget) addDropdownName(title string) {
t.uiCombobox.Append(title) t.uiCombobox.Append(title)
if (t.val == nil) { if (t.val == nil) {
log(debugToolkit, "make map didn't work") log(debugToolkit, "make map didn't work")
@ -50,7 +50,7 @@ func (t *andlabsT) addDropdownName(title string) {
t.c = t.c + 1 t.c = t.c + 1
} }
func (t *andlabsT) SetDropdown(i int) { func (t *guiWidget) SetDropdown(i int) {
t.uiCombobox.SetSelected(i) t.uiCombobox.SetSelected(i)
} }

View File

@ -11,10 +11,10 @@ import (
// -- (1,2) -- (2,1) -- (3,1) -- // -- (1,2) -- (2,1) -- (3,1) --
// ----------------------------- // -----------------------------
func (p *node) newGrid(n *node) { func (p *node) newGrid(n *node) {
var newt *andlabsT var newt *guiWidget
log(debugToolkit, "newGrid()", n.WidgetId, "to", n.ParentId) log(debugToolkit, "newGrid()", n.WidgetId, "to", n.ParentId)
newt = new(andlabsT) newt = new(guiWidget)
c := ui.NewGrid() c := ui.NewGrid()
newt.uiGrid = c newt.uiGrid = c

View File

@ -8,7 +8,7 @@ import (
func (p *node) newGroup(n *node) { func (p *node) newGroup(n *node) {
log(debugToolkit, "NewGroup()", n.Name) log(debugToolkit, "NewGroup()", n.Name)
newt := new(andlabsT) newt := new(guiWidget)
log(debugToolkit, "NewGroup() create", n.Name) log(debugToolkit, "NewGroup() create", n.Name)

View File

@ -7,7 +7,7 @@ import (
// make new Image using andlabs/ui // make new Image using andlabs/ui
func (p *node) newImage(n *node) { func (p *node) newImage(n *node) {
newt := new(andlabsT) newt := new(guiWidget)
var img *ui.Image var img *ui.Image
log(debugToolkit, "rawImage() create", n.Name) log(debugToolkit, "rawImage() create", n.Name)

View File

@ -8,7 +8,7 @@ import (
func (p *node) newLabel(n *node) { func (p *node) newLabel(n *node) {
log(logInfo, "NewLabel()", n.Name) log(logInfo, "NewLabel()", n.Name)
newt := new(andlabsT) newt := new(guiWidget)
c := ui.NewLabel(n.Name) c := ui.NewLabel(n.Name)
newt.uiLabel = c newt.uiLabel = c
newt.uiControl = c newt.uiControl = c

View File

@ -13,7 +13,7 @@ import (
var pluginChan chan toolkit.Action var pluginChan chan toolkit.Action
// the starting point of the binary tree // the starting point of the binary tree
var rootNode *node // var rootNode *node
var uiMainUndef bool = true var uiMainUndef bool = true
var uiMain sync.Once var uiMain sync.Once

View File

@ -6,7 +6,7 @@ import (
) )
func (p *node) newSlider(n *node) { func (p *node) newSlider(n *node) {
newt := new(andlabsT) newt := new(guiWidget)
s := ui.NewSlider(n.X, n.Y) s := ui.NewSlider(n.X, n.Y)
newt.uiSlider = s newt.uiSlider = s

View File

@ -6,7 +6,7 @@ import (
) )
func (p *node) newSpinner(n *node) { func (p *node) newSpinner(n *node) {
newt := new(andlabsT) newt := new(guiWidget)
s := ui.NewSpinbox(n.X, n.Y) s := ui.NewSpinbox(n.X, n.Y)
newt.uiSpinbox = s newt.uiSpinbox = s

View File

@ -1,14 +1,22 @@
package main package main
import "git.wit.org/wit/gui/toolkit" // import "git.wit.org/wit/gui/toolkit"
import "github.com/andlabs/ui" import "github.com/andlabs/ui"
import _ "github.com/andlabs/ui/winmanifest" import _ "github.com/andlabs/ui/winmanifest"
// var andlabs map[int]*andlabsT // var andlabs map[int]*andlabsT
// var callback func(int) bool // var callback func(int) bool
var callback chan toolkit.Action // var callback chan toolkit.Action
// It's probably a terrible idea to call this 'me'
var me config
type config struct {
rootNode *node // the base of the binary tree. it should have id == 0
}
/*
type node struct { type node struct {
parent *node parent *node
children []*node children []*node
@ -41,15 +49,16 @@ type node struct {
// the internal plugin toolkit structure // the internal plugin toolkit structure
tk *andlabsT tk *andlabsT
} }
*/
// stores the raw toolkit internals // stores the raw toolkit internals
type andlabsT struct { type guiWidget struct {
Width int Width int
Height int Height int
// tw *toolkit.Widget // tw *toolkit.Widget
parent *andlabsT parent *guiWidget
children []*andlabsT children []*guiWidget
// used to track if a tab has a child widget yet // used to track if a tab has a child widget yet
child bool child bool

View File

@ -20,8 +20,11 @@ import (
any existing tabs rather than adding a new one any existing tabs rather than adding a new one
*/ */
func (p *node) newTab(n *node) { func (p *node) newTab(n *node) {
var newt *andlabsT var newt *guiWidget
if (p == nil) {
log(debugError, "newTab() p == nil. how the fuck does this happen?", n.WidgetId, n.ParentId)
}
if (p.WidgetType != toolkit.Window) { if (p.WidgetType != toolkit.Window) {
log(debugError, "newTab() uiWindow == nil. I can't add a toolbar without window", n.WidgetId, n.ParentId) log(debugError, "newTab() uiWindow == nil. I can't add a toolbar without window", n.WidgetId, n.ParentId)
return return
@ -40,8 +43,8 @@ func (p *node) newTab(n *node) {
log(debugToolkit, "newTab() GOOD. This should be an additional tab:", n.WidgetId, n.ParentId) log(debugToolkit, "newTab() GOOD. This should be an additional tab:", n.WidgetId, n.ParentId)
if (n.WidgetType == toolkit.Tab) { if (n.WidgetType == toolkit.Tab) {
// andlabs doesn't have multiple tab widgets so make a fake one? // andlabs doesn't have multiple tab widgets so make a fake one?
// this makes a andlabsT internal structure with the parent values // this makes a guiWidget internal structure with the parent values
newt = new(andlabsT) newt = new(guiWidget)
newt.uiWindow = t.uiWindow newt.uiWindow = t.uiWindow
newt.uiTab = t.uiTab newt.uiTab = t.uiTab
} else { } else {
@ -63,8 +66,8 @@ func tabSetMargined(tab *ui.Tab, b bool) {
} }
} }
func rawTab(w *ui.Window, name string) *andlabsT { func rawTab(w *ui.Window, name string) *guiWidget {
var newt andlabsT var newt guiWidget
log(debugToolkit, "rawTab() START", name) log(debugToolkit, "rawTab() START", name)
if (w == nil) { if (w == nil) {
@ -83,8 +86,8 @@ func rawTab(w *ui.Window, name string) *andlabsT {
return &newt return &newt
} }
func (t *andlabsT) appendTab(name string) *andlabsT { func (t *guiWidget) appendTab(name string) *guiWidget {
var newT andlabsT var newT guiWidget
log(debugToolkit, "appendTab() ADD", name) log(debugToolkit, "appendTab() ADD", name)
if (t.uiTab == nil) { if (t.uiTab == nil) {

View File

@ -6,7 +6,7 @@ import (
) )
func (p *node) newTextbox(n *node) { func (p *node) newTextbox(n *node) {
newt := new(andlabsT) newt := new(guiWidget)
if (n.X == 1) { if (n.X == 1) {
e := ui.NewEntry() e := ui.NewEntry()

29
toolkit/andlabs/widget.go Normal file
View File

@ -0,0 +1,29 @@
package main
import (
"git.wit.org/wit/gui/toolkit"
)
// this is specific to the nocui toolkit
func initWidget(n *node) *guiWidget {
var w *guiWidget
w = new(guiWidget)
// Set(w, "default")
if n.WidgetType == toolkit.Root {
log(logInfo, "setupWidget() FOUND ROOT w.id =", n.WidgetId)
n.WidgetId = 0
me.rootNode = n
return w
}
if (n.WidgetType == toolkit.Box) {
if (n.B) {
n.horizontal = true
} else {
n.horizontal = false
}
}
return w
}

View File

@ -5,18 +5,18 @@ import (
_ "github.com/andlabs/ui/winmanifest" _ "github.com/andlabs/ui/winmanifest"
) )
func (t *andlabsT) MessageWindow(msg1 string, msg2 string) { func (t *guiWidget) MessageWindow(msg1 string, msg2 string) {
ui.MsgBox(t.uiWindow, msg1, msg2) ui.MsgBox(t.uiWindow, msg1, msg2)
} }
func (t *andlabsT) ErrorWindow(msg1 string, msg2 string) { func (t *guiWidget) ErrorWindow(msg1 string, msg2 string) {
ui.MsgBoxError(t.uiWindow, msg1, msg2) ui.MsgBoxError(t.uiWindow, msg1, msg2)
} }
func newWindow(n *node) { func newWindow(n *node) {
var newt *andlabsT var newt *guiWidget
newt = new(andlabsT) newt = new(guiWidget)
// menubar bool is if the OS defined border on the window should be used // menubar bool is if the OS defined border on the window should be used
win := ui.NewWindow(n.Name, n.X, n.Y, menubar) win := ui.NewWindow(n.Name, n.X, n.Y, menubar)

View File

@ -1,211 +0,0 @@
package main
import (
"strconv"
"git.wit.org/wit/gui/toolkit"
)
func makeWidget(n *node) *cuiWidget {
var w *cuiWidget
w = new(cuiWidget)
// Set(w, "default")
w.frame = true
// set the name used by gocui to the id
w.cuiName = strconv.Itoa(n.WidgetId)
if n.WidgetType == toolkit.Root {
log(logInfo, "setupWidget() FOUND ROOT w.id =", n.WidgetId)
n.WidgetId = 0
me.rootNode = n
return w
}
if (n.WidgetType == toolkit.Box) {
if (n.B) {
n.horizontal = true
} else {
n.horizontal = false
}
}
if (n.WidgetType == toolkit.Grid) {
w.widths = make(map[int]int) // how tall each row in the grid is
w.heights = make(map[int]int) // how wide each column in the grid is
}
return w
}
func setupCtrlDownWidget() {
a := new(toolkit.Action)
a.Name = "ctrlDown"
a.WidgetType = toolkit.Dialog
a.WidgetId = -1
a.ParentId = 0
n := addNode(a)
me.ctrlDown = n
}
func (n *node) deleteView() {
w := n.tk
if (w.v != nil) {
w.v.Visible = false
return
}
// make sure the view isn't really there
me.baseGui.DeleteView(w.cuiName)
w.v = nil
}
// searches the binary tree for a WidgetId
func (n *node) findWidgetId(id int) *node {
if (n == nil) {
return nil
}
if n.WidgetId == id {
return n
}
for _, child := range n.children {
newN := child.findWidgetId(id)
if (newN != nil) {
return newN
}
}
return nil
}
// searches the binary tree for a WidgetId
func (n *node) findWidgetName(name string) *node {
if (n == nil) {
return nil
}
if n.tk.cuiName == name {
return n
}
for _, child := range n.children {
newN := child.findWidgetName(name)
if (newN != nil) {
return newN
}
}
return nil
}
func (n *node) IsCurrent() bool {
w := n.tk
if (n.WidgetType == toolkit.Tab) {
return w.isCurrent
}
if (n.WidgetType == toolkit.Window) {
return w.isCurrent
}
if (n.WidgetType == toolkit.Root) {
return false
}
return n.parent.IsCurrent()
}
func (n *node) Visible() bool {
if (n == nil) {
return false
}
if (n.tk == nil) {
return false
}
if (n.tk.v == nil) {
return false
}
return n.tk.v.Visible
}
func (n *node) SetVisible(b bool) {
if (n == nil) {
return
}
if (n.tk == nil) {
return
}
if (n.tk.v == nil) {
return
}
n.tk.v.Visible = b
}
func addNode(a *toolkit.Action) *node {
n := new(node)
n.WidgetType = a.WidgetType
n.WidgetId = a.WidgetId
n.ParentId = a.ParentId
// copy the data from the action message
n.Name = a.Name
n.Text = a.Text
n.I = a.I
n.S = a.S
n.B = a.B
n.X = a.X
n.Y = a.Y
n.W = a.W
n.H = a.H
n.AtW = a.AtW
n.AtH = a.AtH
// store the internal toolkit information
n.tk = makeWidget(n)
if (a.WidgetType == toolkit.Root) {
log(logInfo, "addNode() Root")
return n
}
if (me.rootNode.findWidgetId(a.WidgetId) != nil) {
log(logError, "addNode() WidgetId already exists", a.WidgetId)
return me.rootNode.findWidgetId(a.WidgetId)
}
// add this new widget on the binary tree
n.parent = me.rootNode.findWidgetId(a.ParentId)
if n.parent != nil {
n.parent.children = append(n.parent.children, n)
//w := n.tk
//w.parent = n.parent.tk
//w.parent.children = append(w.parent.children, w)
}
return n
}
func addDropdown() *node {
n := new(node)
n.WidgetType = toolkit.Flag
n.WidgetId = -2
n.ParentId = 0
// copy the data from the action message
n.Name = "DropBox"
n.Text = "DropBox text"
// store the internal toolkit information
n.tk = new(cuiWidget)
n.tk.frame = true
// set the name used by gocui to the id
n.tk.cuiName = "-1 dropbox"
n.tk.color = &colorFlag
// add this new widget on the binary tree
n.parent = me.rootNode
if n.parent != nil {
n.parent.children = append(n.parent.children, n)
}
return n
}

1
toolkit/gocui/common.go Symbolic link
View File

@ -0,0 +1 @@
../nocui/common.go

View File

@ -63,9 +63,11 @@ func mouseUp(g *gocui.Gui, v *gocui.View) error {
w, h := g.MousePosition() w, h := g.MousePosition()
log(true, "mouseUp() view msgMouseDown (check here for dropdown menu click) (w,h) =", w, h) log(true, "mouseUp() view msgMouseDown (check here for dropdown menu click) (w,h) =", w, h)
if (me.ddClicked) { if (me.ddClicked) {
me.ddClicked = false
log(true, "mouseUp() ddview is the thing that was clicked", w, h) log(true, "mouseUp() ddview is the thing that was clicked", w, h)
log(true, "mouseUp() find out what the string is here", w, h, me.ddview.tk.gocuiSize.h1) log(true, "mouseUp() find out what the string is here", w, h, me.ddview.tk.gocuiSize.h1)
var newZone string = ""
if (me.ddNode != nil) { if (me.ddNode != nil) {
value := h - me.ddview.tk.gocuiSize.h0 - 1 value := h - me.ddview.tk.gocuiSize.h0 - 1
log(true, "mouseUp() me.ddview.tk.gocuiSize.h1 =", me.ddview.tk.gocuiSize.h1) log(true, "mouseUp() me.ddview.tk.gocuiSize.h1 =", me.ddview.tk.gocuiSize.h1)
@ -74,10 +76,19 @@ func mouseUp(g *gocui.Gui, v *gocui.View) error {
log(true, "mouseUp() value =", value, "valsLen =", valsLen) log(true, "mouseUp() value =", value, "valsLen =", valsLen)
log(true, "mouseUp() me.ddNode.vals =", me.ddNode.vals) log(true, "mouseUp() me.ddNode.vals =", me.ddNode.vals)
if ((value >= 0) && (value < valsLen)) { if ((value >= 0) && (value < valsLen)) {
str := me.ddNode.vals[value] newZone = me.ddNode.vals[value]
log(true, "mouseUp() value =", value, "str =", str) log(true, "mouseUp() value =", value, "newZone =", newZone)
} }
} }
hideDDview()
if (newZone != "") {
if (me.ddNode != nil) {
me.ddNode.SetText(newZone)
me.ddNode.S = newZone
me.ddNode.doUserEvent()
}
}
return nil
} }
/* /*
// if there is a drop down view active, treat it like a dialog box and close it // if there is a drop down view active, treat it like a dialog box and close it

View File

@ -9,7 +9,7 @@ import (
func action(a *toolkit.Action) { func action(a *toolkit.Action) {
log(logInfo, "action() START", a.WidgetId, a.ActionType, a.WidgetType, a.Name) log(logInfo, "action() START", a.WidgetId, a.ActionType, a.WidgetType, a.Name)
n := me.rootNode.findWidgetId(a.WidgetId) n := me.rootNode.findWidgetId(a.WidgetId)
var w *cuiWidget var w *guiWidget
if (n != nil) { if (n != nil) {
w = n.tk w = n.tk
} }
@ -98,20 +98,3 @@ func (n *node) Set(val any) {
log(logError, "Set() unknown type =", val, v) log(logError, "Set() unknown type =", val, v)
} }
} }
// this passes the user event back from the plugin
func (n *node) doUserEvent() {
if (me.callback == nil) {
log(logError, "doUserEvent() no callback channel was configured")
return
}
var a toolkit.Action
a.WidgetId = n.WidgetId
a.Name = n.Name
a.Text = n.Text
a.B = n.B
a.ActionType = toolkit.User
log(logInfo, "doUserEvent() START: send a button click callback()", a.WidgetId, a.Name)
me.callback <- a
log(logInfo, "doUserEvent() END: sent a button click callback()", a.WidgetId, a.Name)
}

View File

@ -96,49 +96,6 @@ var (
globalMouseDown, msgMouseDown, movingMsg bool globalMouseDown, msgMouseDown, movingMsg bool
) )
// this is the standard binary tree structure for toolkits
type node struct {
parent *node
children []*node
WidgetId int // widget ID
WidgetType toolkit.WidgetType
ParentId int // parent ID
Name string
Text string
// This is how the values are passed back and forth
// values from things like checkboxes & dropdown's
B bool
I int
S string
A any // switch to this or deprecate this? pros/cons?
// This is used for things like a slider(0,100)
X int
Y int
// This is for the grid size & widget position
W int
H int
AtW int
AtH int
vals []string // dropdown menu items
// horizontal=true means layout widgets like books on a bookshelf
// horizontal=false means layout widgets like books in a stack
horizontal bool `default:false`
hasTabs bool // does the window have tabs?
currentTab bool // the visible tab
// the internal plugin toolkit structure
tk *cuiWidget
}
// this is the gocui way // this is the gocui way
// corner starts at in the upper left corner // corner starts at in the upper left corner
type rectType struct { type rectType struct {
@ -153,7 +110,7 @@ func (r *rectType) Height() int {
return r.h1 - r.h0 return r.h1 - r.h0
} }
type cuiWidget struct { type guiWidget struct {
// the gocui package variables // the gocui package variables
v *gocui.View // this is nil if the widget is not displayed v *gocui.View // this is nil if the widget is not displayed
cuiName string // what gocui uses to reference the widget cuiName string // what gocui uses to reference the widget
@ -189,7 +146,7 @@ type cuiWidget struct {
// of functions like fmt.Fprintf, fmt.Fprintln, io.Copy, etc. Clear must // of functions like fmt.Fprintf, fmt.Fprintln, io.Copy, etc. Clear must
// be called to clear the view's buffer. // be called to clear the view's buffer.
func (w *cuiWidget) Write(p []byte) (n int, err error) { func (w *guiWidget) Write(p []byte) (n int, err error) {
w.tainted = true w.tainted = true
me.writeMutex.Lock() me.writeMutex.Lock()
defer me.writeMutex.Unlock() defer me.writeMutex.Unlock()

View File

@ -7,14 +7,14 @@ import (
"git.wit.org/wit/gui/toolkit" "git.wit.org/wit/gui/toolkit"
) )
func (w *cuiWidget) Width() int { func (w *guiWidget) Width() int {
if w.frame { if w.frame {
return w.gocuiSize.w1 - w.gocuiSize.w0 return w.gocuiSize.w1 - w.gocuiSize.w0
} }
return w.gocuiSize.w1 - w.gocuiSize.w0 - 1 return w.gocuiSize.w1 - w.gocuiSize.w0 - 1
} }
func (w *cuiWidget) Height() int { func (w *guiWidget) Height() int {
if w.frame { if w.frame {
return w.gocuiSize.h1 - w.gocuiSize.h0 return w.gocuiSize.h1 - w.gocuiSize.h0
} }

147
toolkit/gocui/widget.go Normal file
View File

@ -0,0 +1,147 @@
package main
import (
"strconv"
"git.wit.org/wit/gui/toolkit"
)
func initWidget(n *node) *guiWidget {
var w *guiWidget
w = new(guiWidget)
// Set(w, "default")
w.frame = true
// set the name used by gocui to the id
w.cuiName = strconv.Itoa(n.WidgetId)
if n.WidgetType == toolkit.Root {
log(logInfo, "setupWidget() FOUND ROOT w.id =", n.WidgetId)
n.WidgetId = 0
me.rootNode = n
return w
}
if (n.WidgetType == toolkit.Box) {
if (n.B) {
n.horizontal = true
} else {
n.horizontal = false
}
}
if (n.WidgetType == toolkit.Grid) {
w.widths = make(map[int]int) // how tall each row in the grid is
w.heights = make(map[int]int) // how wide each column in the grid is
}
return w
}
func setupCtrlDownWidget() {
a := new(toolkit.Action)
a.Name = "ctrlDown"
a.WidgetType = toolkit.Dialog
a.WidgetId = -1
a.ParentId = 0
n := addNode(a)
me.ctrlDown = n
}
func (n *node) deleteView() {
w := n.tk
if (w.v != nil) {
w.v.Visible = false
return
}
// make sure the view isn't really there
me.baseGui.DeleteView(w.cuiName)
w.v = nil
}
// searches the binary tree for a WidgetId
func (n *node) findWidgetName(name string) *node {
if (n == nil) {
return nil
}
if n.tk.cuiName == name {
return n
}
for _, child := range n.children {
newN := child.findWidgetName(name)
if (newN != nil) {
return newN
}
}
return nil
}
func (n *node) IsCurrent() bool {
w := n.tk
if (n.WidgetType == toolkit.Tab) {
return w.isCurrent
}
if (n.WidgetType == toolkit.Window) {
return w.isCurrent
}
if (n.WidgetType == toolkit.Root) {
return false
}
return n.parent.IsCurrent()
}
func (n *node) Visible() bool {
if (n == nil) {
return false
}
if (n.tk == nil) {
return false
}
if (n.tk.v == nil) {
return false
}
return n.tk.v.Visible
}
func (n *node) SetVisible(b bool) {
if (n == nil) {
return
}
if (n.tk == nil) {
return
}
if (n.tk.v == nil) {
return
}
n.tk.v.Visible = b
}
func addDropdown() *node {
n := new(node)
n.WidgetType = toolkit.Flag
n.WidgetId = -2
n.ParentId = 0
// copy the data from the action message
n.Name = "DropBox"
n.Text = "DropBox text"
// store the internal toolkit information
n.tk = new(guiWidget)
n.tk.frame = true
// set the name used by gocui to the id
n.tk.cuiName = "-1 dropbox"
n.tk.color = &colorFlag
// add this new widget on the binary tree
n.parent = me.rootNode
if n.parent != nil {
n.parent.children = append(n.parent.children, n)
}
return n
}

View File

@ -1,9 +1,68 @@
package main package main
/*
These 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 ( import (
"git.wit.org/wit/gui/toolkit" "git.wit.org/wit/gui/toolkit"
) )
// this is the channel that sends the events from the user clicking or typing
// back to the program using this golang package
var callback chan toolkit.Action
type node struct {
parent *node
children []*node
WidgetId int // widget ID
WidgetType toolkit.WidgetType
ParentId int // parent ID
Name string
Text string
// This is how the values are passed back and forth
// values from things like checkboxes & dropdown's
B bool
I int
S string
A any // switch to this or deprecate this? pros/cons?
// This is used for things like a slider(0,100)
X int
Y int
// This is for the grid size & widget position
W int
H int
AtW int
AtH int
vals []string // dropdown menu items
// horizontal=true means layout widgets like books on a bookshelf
// horizontal=false means layout widgets like books in a stack
horizontal bool `default:false`
hasTabs bool // does the window have tabs?
currentTab bool // the visible tab
// the internal plugin toolkit structure
// in the gtk plugin, it has gtk things like margin & border settings
// in the text console one, it has text console things like colors for menus & buttons
tk *guiWidget
}
// searches the binary tree for a WidgetId // searches the binary tree for a WidgetId
func (n *node) findWidgetId(id int) *node { func (n *node) findWidgetId(id int) *node {
if (n == nil) { if (n == nil) {
@ -45,22 +104,87 @@ func addWidget(a *toolkit.Action) *node {
n.AtH = a.AtH n.AtH = a.AtH
// store the internal toolkit information // store the internal toolkit information
n.tk = new(nocuiT) n.tk = new(guiWidget)
if (a.WidgetType == toolkit.Root) { if (a.WidgetType == toolkit.Root) {
log(logInfo, "addWidget() Root") log(logInfo, "addWidget() Root")
return n return n
} }
if (rootNode.findWidgetId(a.WidgetId) != nil) { if (me.rootNode.findWidgetId(a.WidgetId) != nil) {
log(logError, "addWidget() WidgetId already exists", a.WidgetId) log(logError, "addWidget() WidgetId already exists", a.WidgetId)
return rootNode.findWidgetId(a.WidgetId) return me.rootNode.findWidgetId(a.WidgetId)
} }
// add this new widget on the binary tree // add this new widget on the binary tree
n.parent = rootNode.findWidgetId(a.ParentId) n.parent = me.rootNode.findWidgetId(a.ParentId)
if n.parent != nil { if n.parent != nil {
n.parent.children = append(n.parent.children, n) n.parent.children = append(n.parent.children, n)
} }
return n return n
} }
func (n *node) doUserEvent() {
if (callback == nil) {
log(logError, "doUserEvent() callback == nil", n.WidgetId)
return
}
var a toolkit.Action
a.WidgetId = n.WidgetId
a.Name = n.Name
a.Text = n.Text
a.S = n.S
a.I = n.I
a.B = n.B
a.ActionType = toolkit.User
log(logInfo, "doUserEvent() START: send a user event to the callback channel")
callback <- a
log(logInfo, "doUserEvent() END: sent a user event to the callback channel")
return
}
func addNode(a *toolkit.Action) *node {
n := new(node)
n.WidgetType = a.WidgetType
n.WidgetId = a.WidgetId
n.ParentId = a.ParentId
// copy the data from the action message
n.Name = a.Name
n.Text = a.Text
n.I = a.I
n.S = a.S
n.B = a.B
n.X = a.X
n.Y = a.Y
n.W = a.W
n.H = a.H
n.AtW = a.AtW
n.AtH = a.AtH
// store the internal toolkit information
n.tk = initWidget(n)
// n.tk = new(guiWidget)
if (a.WidgetType == toolkit.Root) {
log(logInfo, "addNode() Root")
return n
}
if (me.rootNode.findWidgetId(a.WidgetId) != nil) {
log(logError, "addNode() WidgetId already exists", a.WidgetId)
return me.rootNode.findWidgetId(a.WidgetId)
}
// add this new widget on the binary tree
n.parent = me.rootNode.findWidgetId(a.ParentId)
if n.parent != nil {
n.parent.children = append(n.parent.children, n)
//w := n.tk
//w.parent = n.parent.tk
//w.parent.children = append(w.parent.children, w)
}
return n
}

View File

@ -45,22 +45,3 @@ func (n *node) doWidgetClick() {
default: default:
} }
} }
func (n *node) doUserEvent() {
if (callback == nil) {
log(logError, "doUserEvent() callback == nil", n.WidgetId)
return
}
var a toolkit.Action
a.WidgetId = n.WidgetId
a.Name = n.Name
a.Text = n.Text
a.S = n.S
a.I = n.I
a.B = n.B
a.ActionType = toolkit.User
log(logInfo, "doUserEvent() START: send a user event to the callback channel")
callback <- a
log(logInfo, "doUserEvent() END: sent a user event to the callback channel")
return
}

View File

@ -1,47 +1,19 @@
package main package main
import "git.wit.org/wit/gui/toolkit" // import "git.wit.org/wit/gui/toolkit"
var callback chan toolkit.Action
type node struct {
parent *node
children []*node
WidgetId int // widget ID
WidgetType toolkit.WidgetType
ParentId int // parent ID
Name string
Text string
// This is how the values are passed back and forth
// values from things like checkboxes & dropdown's
B bool
I int
S string
A any // switch to this or deprecate this? pros/cons?
// This is used for things like a slider(0,100)
X int
Y int
// This is for the grid size & widget position
W int
H int
AtW int
AtH int
// the internal plugin toolkit structure
tk *nocuiT
}
// stores the raw toolkit internals // stores the raw toolkit internals
type nocuiT struct { type guiWidget struct {
Width int Width int
Height int Height int
c int c int
val map[int]string val map[int]string
} }
// It's probably a terrible idea to call this 'me'
var me config
type config struct {
rootNode *node // the base of the binary tree. it should have id == 0
}

29
toolkit/nocui/widget.go Normal file
View File

@ -0,0 +1,29 @@
package main
import (
"git.wit.org/wit/gui/toolkit"
)
// this is specific to the nocui toolkit
func initWidget(n *node) *guiWidget {
var w *guiWidget
w = new(guiWidget)
// Set(w, "default")
if n.WidgetType == toolkit.Root {
log(logInfo, "setupWidget() FOUND ROOT w.id =", n.WidgetId)
n.WidgetId = 0
me.rootNode = n
return w
}
if (n.WidgetType == toolkit.Box) {
if (n.B) {
n.horizontal = true
} else {
n.horizontal = false
}
}
return w
}