summaryrefslogtreecommitdiff
path: root/window.go
diff options
context:
space:
mode:
Diffstat (limited to 'window.go')
-rw-r--r--window.go250
1 files changed, 110 insertions, 140 deletions
diff --git a/window.go b/window.go
index 2b615b5..403638e 100644
--- a/window.go
+++ b/window.go
@@ -2,40 +2,13 @@ package gui
import (
"log"
+ "fmt"
"strconv"
- "time"
"github.com/andlabs/ui"
-
- // import "regexp"
-
_ "github.com/andlabs/ui/winmanifest"
)
-func initUI(name string, callback func(*GuiBox) *GuiBox) {
- ui.Main(func() {
- log.Println("gui.initUI() inside ui.Main()")
-
- box := InitWindow(nil, "StartNewWindow"+name, 0)
- box = callback(box)
- window := box.Window
- log.Println("StartNewWindow() box =", box)
-
- window.UiWindow.Show()
- })
-}
-
-func StartNewWindow(bg bool, name string, axis int, callback func(*GuiBox) *GuiBox) {
- log.Println("StartNewWindow() ui.Main() Create a new window")
-
- if bg {
- go initUI(name, callback)
- time.Sleep(500 * time.Millisecond) // this might make it more stable on windows?
- } else {
- initUI(name, callback)
- }
-}
-
func MessageWindow(gw *GuiWindow, msg1 string, msg2 string) {
ui.MsgBox(gw.UiWindow, msg1, msg2)
}
@@ -44,71 +17,6 @@ func ErrorWindow(gw *GuiWindow, msg1 string, msg2 string) {
ui.MsgBoxError(gw.UiWindow, msg1, msg2)
}
-//
-// This creates a new 'window' (which is just a tab in the window)
-// This is this way because on Linux you can have more than one
-// actual window but that does not appear to work on the MacOS or Windows
-//
-func InitWindow(gw *GuiWindow, name string, axis int) *GuiBox {
- log.Println("InitGuiWindow() START")
-
- var box *GuiBox
- if gw == nil {
- box = mapWindow(nil, name, Config.Height, Config.Width)
- } else {
- box = mapWindow(gw.UiWindow, name, Config.Height, Config.Width)
- }
-
- // box.Window = &newGuiWindow
- newGuiWindow := box.Window
-
- // This is the first window. One must create it here
- if gw == nil {
- log.Println("initWindow() ADDING ui.NewWindow()")
- newGuiWindow.UiWindow = ui.NewWindow(name, int(newGuiWindow.Height), int(newGuiWindow.Width), true)
- newGuiWindow.UiWindow.SetBorderless(false)
-
- // newGuiWindow.UiWindow.SetTitle("test")
- newGuiWindow.UiWindow.OnClosing(func(*ui.Window) bool {
- log.Println("initTabWindow() OnClosing() THIS WINDOW IS CLOSING newGuiWindow=", newGuiWindow)
- // newGuiWindow.UiWindow.Destroy()
- if Config.Exit == nil {
- ui.Quit()
- } else {
- // allow a custom exit function
- Config.Exit(newGuiWindow)
- }
- return true
- })
-
- newGuiWindow.UiTab = ui.NewTab()
- newGuiWindow.UiWindow.SetChild(newGuiWindow.UiTab)
- newGuiWindow.UiWindow.SetMargined(true)
- tmp := 0
- newGuiWindow.TabNumber = &tmp
- } else {
- newGuiWindow.UiWindow = gw.UiWindow
- newGuiWindow.UiTab = gw.UiTab
- }
-
- newGuiWindow.BoxMap = make(map[string]*GuiBox)
- newGuiWindow.EntryMap = make(map[string]*GuiEntry)
- // Data.Windows = append(Data.Windows, &newGuiWindow)
-
- if newGuiWindow.UiTab == nil {
- tabnum := 0
- newGuiWindow.TabNumber = &tabnum
- } else {
- tabnum := newGuiWindow.UiTab.NumPages()
- newGuiWindow.TabNumber = &tabnum
- }
-
- Data.WindowMap[newGuiWindow.Name] = newGuiWindow
-
- log.Println("InitGuiWindow() END *GuiWindow =", newGuiWindow)
- return box
-}
-
func DeleteWindow(name string) {
log.Println("gui.DeleteWindow() START name =", name)
window := Data.WindowMap[name]
@@ -144,57 +52,102 @@ func DeleteWindow(name string) {
}
}
-func CreateWindow(title string, tabname string, x int, y int, custom func() ui.Control) *GuiBox {
- box := CreateBlankWindow(title, x, y)
- box.InitTab(title, custom)
- return box
-}
+func makeNode(parent *Node, title string, x int, y int) *Node {
+ var node Node
+ node.Name = title
+ node.Width = x
+ node.Height = y
-func CreateBlankWindow(title string, x int, y int) *GuiBox {
- box := mapWindow(nil, title, x, y)
- log.Println("gui.CreateBlankWindow() title = box.Name =", box.Name)
+ id := Config.prefix + strconv.Itoa(Config.counter)
+ Config.counter += 1
+ node.id = id
- window := ui.NewWindow(box.Name, x, y, false)
- window.SetBorderless(false)
- window.OnClosing(func(*ui.Window) bool {
- log.Println("createWindow().OnClosing()", box.Name)
- return true
- })
- ui.OnShouldQuit(func() bool {
- log.Println("createWindow().Destroy()", box.Name)
- window.Destroy()
- return true
- })
+ // panic("gui.makeNode() START")
+ if (parent == nil) {
+ if (Data.NodeMap[title] != nil) {
+ log.Println("Duplicate window name =", title)
+ // TODO: just change the 'title' to something unique
+ panic(fmt.Sprintf("Duplicate window name = %s\n", title))
+ return nil
+ }
+ // panic("gui.makeNode() before NodeMap()")
+ Data.NodeMap[title] = &node
+ Data.NodeArray = append(Data.NodeArray, &node)
+ Data.NodeSlice = append(Data.NodeSlice, &node)
+ // panic("gui.makeNode() after NodeMap()")
+ return &node
+ } else {
+ // panic("gui.makeNode() before Append()")
+ parent.Append(&node)
+ // panic("gui.makeNode() after Append()")
+ }
+ node.parent = parent
+ return &node
+}
- window.SetMargined(true)
- window.Show()
+func (parent *Node) makeNode(title string, x int, y int) *Node {
+ var node Node
+ node.Name = title
+ node.Width = x
+ node.Height = y
- box.Window.UiWindow = window
- return box
+ id := Config.prefix + strconv.Itoa(Config.counter)
+ Config.counter += 1
+ node.id = id
+
+ parent.Append(&node)
+ node.parent = parent
+ return &node
}
-func InitBlankWindow() ui.Control {
- hbox := ui.NewHorizontalBox()
- hbox.SetPadded(true)
+func (n *Node) AddNode(title string) *Node {
+ var node Node
+ node.Name = title
+ node.Width = n.Width
+ node.Height = n.Height
- return hbox
+ id := Config.prefix + strconv.Itoa(Config.counter)
+ Config.counter += 1
+ node.id = id
+
+ n.Append(&node)
+ node.parent = n
+ return &node
}
-var master = 0
+func (n *Node) uiNewWindow(title string, x int, y int) {
+ w := ui.NewWindow(title, x, y, false)
+ w.SetBorderless(false)
+ f := Config.Exit
+ w.OnClosing(func(*ui.Window) bool {
+ if (Config.Debug) {
+ log.Println("ui.Window().OnClosing()")
+ }
+ if (f != nil) {
+ f(n)
+ }
+ return true
+ })
+ w.SetMargined(true)
+ w.Show()
+ n.uiWindow = w
+ // w.node = &node
+ return
+}
-func mapWindow(window *ui.Window, title string, x int, y int) *GuiBox {
+func mapWindow(parent *Node, window *ui.Window, title string, x int, y int) *Node {
log.Println("gui.WindowMap START title =", title)
if Data.WindowMap[title] != nil {
log.Println("Data.WindowMap[title] already exists title =", title)
- master = master + 1
- title = title + " jcarr " + strconv.Itoa(master)
+ title = title + Config.prefix + strconv.Itoa(Config.counter)
+ Config.counter += 1
}
if Data.WindowMap[title] != nil {
log.Println("Data.WindowMap[title] already exists title =", title)
panic("Data.WindowMap[newGuiWindow.Name] already exists")
return nil
}
- log.Println("gui.WindowMap START title =", title)
+
var newGuiWindow GuiWindow
newGuiWindow.Width = x
newGuiWindow.Height = y
@@ -210,30 +163,47 @@ func mapWindow(window *ui.Window, title string, x int, y int) *GuiBox {
box.Window = &newGuiWindow
box.Name = title
+ node := makeNode(parent, title, x, y)
+ node.box = &box
+ node.uiWindow = window
+ box.node = node
+
newGuiWindow.BoxMap["jcarrInitTest"] = &box
- return &box
+ return node
}
-func NewWindow(title string, x int, y int) *GuiBox {
- box := mapWindow(nil, title, x, y)
+// This routine creates a blank window with a Title and size (W x H)
+//
+// This routine can not have any arguements due to the nature of how
+// it can be passed via the 'andlabs/ui' queue which, because it is
+// cross platform, must pass UI changes into the OS threads (that is
+// my guess).
+func NewWindow() *Node {
+ title := Config.Title
+ w := Config.Width
+ h := Config.Height
+
+ var n *Node
+ n = mapWindow(nil, nil, title, w, h)
+ box := n.box
log.Println("gui.NewWindow() title = box.Name =", box.Name)
- window := ui.NewWindow(box.Name, x, y, false)
- window.SetBorderless(false)
- window.OnClosing(func(*ui.Window) bool {
- log.Println("createWindow().OnClosing()", box.Name)
- return true
- })
+ n.uiNewWindow(box.Name, w, h)
+ window := n.uiWindow
+
+ f := Config.Exit
ui.OnShouldQuit(func() bool {
- log.Println("createWindow().Destroy()", box.Name)
- window.Destroy()
+ log.Println("createWindow().Destroy() on node.Name =", n.Name)
+ if (f != nil) {
+ f(n)
+ }
return true
})
- window.SetMargined(true)
- window.Show()
-
box.Window.UiWindow = window
- return box
+ if(n.uiWindow == nil) {
+ panic("node.uiWindow == nil. This should never happen")
+ }
+ return n
}