summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--LICENSE.md8
-rw-r--r--README.md14
-rw-r--r--addAccount.go74
-rw-r--r--gui.go68
-rw-r--r--mainCloudBox.go13
-rw-r--r--structs.go40
6 files changed, 135 insertions, 82 deletions
diff --git a/LICENSE.md b/LICENSE.md
new file mode 100644
index 0000000..63f8dce
--- /dev/null
+++ b/LICENSE.md
@@ -0,0 +1,8 @@
+GNU Lesser General Public License (LGPL)
+
+I don't want it to be possible to make closed source forks of this.
+If you need to use this in a proprietary GO application, then
+compile this as a plugin. The BSD license is bad for core GO libraries.
+
+(GO now supports plugins as of version 1.8)
+https://medium.com/@henvic/opensource-and-go-what-license-f6b36c201854
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..a2a5af4
--- /dev/null
+++ b/README.md
@@ -0,0 +1,14 @@
+This is an abstraction layer around the excellent
+cross platform UI toolkit from andlabs/ui
+
+This abstraction layer makes it easier to write
+simple interfaces for like our cloud control panel
+
+The cross platform UI has 'quirks' due to it being
+cross platform. Some of the abstraction layer here
+attemps to obfuscate the ui objects so that it is
+more difficult to trigger inconsistancies.
+
+In this regard, this is an attempt to restrict
+all andlabs/ui (and andlabs/libui) interaction to
+the calls within this library.
diff --git a/addAccount.go b/addAccount.go
index 99425b2..6a5a4ad 100644
--- a/addAccount.go
+++ b/addAccount.go
@@ -1,13 +1,12 @@
package gui
import "log"
-import "fmt"
+// import "fmt"
import "github.com/andlabs/ui"
import _ "github.com/andlabs/ui/winmanifest"
-import "github.com/davecgh/go-spew/spew"
-
+// import "github.com/davecgh/go-spew/spew"
// var subdomain *ui.Entry
func AddEntry(box *GuiBox, name string) *GuiEntry {
@@ -27,16 +26,16 @@ func AddEntry(box *GuiBox, name string) *GuiEntry {
return ge
}
-func AddAccountQuestionBox(wm *GuiWindow) *ui.Box {
+func AddAccountQuestionBox(gw *GuiWindow) *GuiBox {
var gb *GuiBox
gb = new(GuiBox)
- gb.EntryMap = make(map[string]*GuiEntry)
+ gb.EntryMap = make(map[string]*GuiEntry)
gb.EntryMap["test"] = nil
vbox := ui.NewVerticalBox()
vbox.SetPadded(true)
- wm.Box1 = vbox
+ gw.Box1 = vbox
gb.UiBox = vbox
hbox := ui.NewHorizontalBox()
@@ -45,7 +44,7 @@ func AddAccountQuestionBox(wm *GuiWindow) *ui.Box {
hbox.Append(ui.NewLabel("Enter your Subdomain or"), false)
- button1 := CreateButton(wm, nil, nil, "Generate", "SUBDOMAIN", generateSubdomain)
+ button1 := CreateButton(gw, nil, nil, "Generate", "SUBDOMAIN", generateSubdomain)
button1.Box = gb
hbox.Append(button1.B, false)
@@ -54,50 +53,11 @@ func AddAccountQuestionBox(wm *GuiWindow) *ui.Box {
vbox.Append(ui.NewHorizontalSeparator(), false)
- button2 := CreateButton(wm, nil, nil, "Create Subdomain Account", "ADD", nil)
+ button2 := CreateButton(gw, nil, nil, "Create Subdomain Account", "ADD", nil)
button2.Box = gb
vbox.Append(button2.B, false)
- return vbox
-}
-
-func GetText(box *GuiBox, name string) string {
- if (box == nil) {
- log.Println("gui.GetText() ERROR box == nil")
- return ""
- }
- if (box.EntryMap == nil) {
- log.Println("gui.GetText() ERROR b.Box.EntryMap == nil")
- return ""
- }
- spew.Dump(box.EntryMap)
- if (box.EntryMap[name] == nil) {
- log.Println("gui.GetText() ERROR box.EntryMap[", name, "] == nil ")
- return ""
- }
- e := box.EntryMap[name]
- log.Println("gui.GetText() box.EntryMap[", name, "] = ", e.E.Text())
- log.Println("gui.GetText() END")
- return e.E.Text()
-}
-
-func SetText(box *GuiBox, name string, value string) error {
- if (box == nil) {
- return fmt.Errorf("gui.SetText() ERROR box == nil")
- }
- if (box.EntryMap == nil) {
- return fmt.Errorf("gui.SetText() ERROR b.Box.EntryMap == nil")
- }
- spew.Dump(box.EntryMap)
- if (box.EntryMap[name] == nil) {
- return fmt.Errorf("gui.SetText() ERROR box.EntryMap[", name, "] == nil ")
- }
- e := box.EntryMap[name]
- log.Println("gui.SetText() box.EntryMap[", name, "] = ", e.E.Text())
- e.E.SetText(value)
- log.Println("gui.SetText() box.EntryMap[", name, "] = ", e.E.Text())
- log.Println("gui.SetText() END")
- return nil
+ return gb
}
func generateSubdomain(b *GuiButton) {
@@ -113,16 +73,26 @@ func generateSubdomain(b *GuiButton) {
log.Println("generateSubdomain END")
}
+/*
func addSubdomain(b *GuiButton) {
log.Println("addSubdomain START")
// sub := subdomain.Text()
// log.Println("generateSubdomain subdomain =", sub)
log.Println("addSubdomain END")
}
+*/
+
+func AddAccountBox(gw *GuiWindow) *GuiBox {
+ var gb *GuiBox
+ gb = new(GuiBox)
+
+ gb.EntryMap = make(map[string]*GuiEntry)
+ gb.EntryMap["test"] = nil
-func AddAccountBox(wm *GuiWindow) *ui.Box {
vbox := ui.NewVerticalBox()
vbox.SetPadded(true)
+ gw.Box1 = vbox
+ gb.UiBox = vbox
hboxAccount := ui.NewHorizontalBox()
hboxAccount.SetPadded(true)
@@ -219,11 +189,11 @@ func AddAccountBox(wm *GuiWindow) *ui.Box {
hboxButtons.SetPadded(true)
vbox.Append(hboxButtons, false)
- okButton := CreateButton(wm, nil, nil, "Add Account", "ADD", nil)
+ okButton := CreateButton(gw, nil, nil, "Add Account", "ADD", nil)
hboxButtons.Append(okButton.B, false)
- backButton := CreateButton(wm, nil, nil, "Back", "BACK", nil)
+ backButton := CreateButton(gw, nil, nil, "Back", "BACK", nil)
hboxButtons.Append(backButton.B, false)
- return vbox
+ return gb
}
diff --git a/gui.go b/gui.go
index 4aa9886..8f3019f 100644
--- a/gui.go
+++ b/gui.go
@@ -1,6 +1,7 @@
package gui
import "log"
+import "fmt"
import "github.com/andlabs/ui"
import _ "github.com/andlabs/ui/winmanifest"
@@ -41,7 +42,7 @@ func InitColumns(mh *TableData, parts []TableColumnData) {
}
}
-func AddTableTab(wm *GuiWindow, mytab *ui.Tab, junk int, name string, rowcount int, parts []TableColumnData, account *pb.Account) *TableData {
+func AddTableTab(gw *GuiWindow, mytab *ui.Tab, junk int, name string, rowcount int, parts []TableColumnData, account *pb.Account) *TableData {
mh := new(TableData)
mh.RowCount = rowcount
@@ -90,9 +91,9 @@ func AddTableTab(wm *GuiWindow, mytab *ui.Tab, junk int, name string, rowcount i
hbox := ui.NewHorizontalBox()
hbox.SetPadded(true)
- a := CreateButton(wm, account, nil, "Add Virtual Machine", "createAddVmBox", nil)
+ a := CreateButton(gw, account, nil, "Add Virtual Machine", "createAddVmBox", nil)
hbox.Append(a.B, false)
- b := CreateButton(wm, account, nil, "Add Virtual Machine", "createAddVmBox", nil)
+ b := CreateButton(gw, account, nil, "Add Virtual Machine", "createAddVmBox", nil)
hbox.Append(b.B, false)
vbox.Append(hbox, false)
@@ -100,18 +101,18 @@ func AddTableTab(wm *GuiWindow, mytab *ui.Tab, junk int, name string, rowcount i
return mh
}
-func SocketError(wm *GuiWindow) {
- ui.MsgBoxError(wm.W,
+func SocketError(gw *GuiWindow) {
+ ui.MsgBoxError(gw.W,
"There was a socket error",
"More detailed information can be shown here.")
}
-func MessageWindow(wm *GuiWindow, msg1 string, msg2 string) {
- ui.MsgBox(wm.W, msg1, msg2)
+func MessageWindow(gw *GuiWindow, msg1 string, msg2 string) {
+ ui.MsgBox(gw.W, msg1, msg2)
}
-func ErrorWindow(wm *GuiWindow, msg1 string, msg2 string) {
- ui.MsgBoxError(wm.W, msg1, msg2)
+func ErrorWindow(gw *GuiWindow, msg1 string, msg2 string) {
+ ui.MsgBoxError(gw.W, msg1, msg2)
}
// This is the default mouse click handler
@@ -211,7 +212,7 @@ func AddButton(b *GuiButton, name string) *ui.Button {
return newB
}
-func CreateButton(wm *GuiWindow, a *pb.Account, vm *pb.Event_VM,
+func CreateButton(gw *GuiWindow, a *pb.Account, vm *pb.Event_VM,
name string, action string, custom func(*GuiButton)) *GuiButton {
newUiB := ui.NewButton(name)
newUiB.OnClicked(defaultButtonClick)
@@ -219,10 +220,10 @@ func CreateButton(wm *GuiWindow, a *pb.Account, vm *pb.Event_VM,
var newB *GuiButton
newB = new(GuiButton)
newB.B = newUiB
- newB.T = wm.T
+ newB.T = gw.T
newB.Account = a
newB.VM = vm
- newB.WM = wm
+ newB.WM = gw
newB.Action = action
newB.custom = custom
Data.AllButtons = append(Data.AllButtons, newB)
@@ -230,14 +231,14 @@ func CreateButton(wm *GuiWindow, a *pb.Account, vm *pb.Event_VM,
return newB
}
-func CreateFontButton(wm *GuiWindow, action string) *GuiButton {
+func CreateFontButton(gw *GuiWindow, action string) *GuiButton {
newB := ui.NewFontButton()
// create a 'fake' button entry for the mouse clicks
var newBM GuiButton
newBM.Action = action
newBM.FB = newB
- newBM.Area = wm.Area
+ newBM.Area = gw.Area
Data.AllButtons = append(Data.AllButtons, &newBM)
newB.OnChanged(func (*ui.FontButton) {
@@ -246,3 +247,42 @@ func CreateFontButton(wm *GuiWindow, action string) *GuiButton {
})
return &newBM
}
+
+func GetText(box *GuiBox, name string) string {
+ if (box == nil) {
+ log.Println("gui.GetText() ERROR box == nil")
+ return ""
+ }
+ if (box.EntryMap == nil) {
+ log.Println("gui.GetText() ERROR b.Box.EntryMap == nil")
+ return ""
+ }
+ spew.Dump(box.EntryMap)
+ if (box.EntryMap[name] == nil) {
+ log.Println("gui.GetText() ERROR box.EntryMap[", name, "] == nil ")
+ return ""
+ }
+ e := box.EntryMap[name]
+ log.Println("gui.GetText() box.EntryMap[", name, "] = ", e.E.Text())
+ log.Println("gui.GetText() END")
+ return e.E.Text()
+}
+
+func SetText(box *GuiBox, name string, value string) error {
+ if (box == nil) {
+ return fmt.Errorf("gui.SetText() ERROR box == nil")
+ }
+ if (box.EntryMap == nil) {
+ return fmt.Errorf("gui.SetText() ERROR b.Box.EntryMap == nil")
+ }
+ spew.Dump(box.EntryMap)
+ if (box.EntryMap[name] == nil) {
+ return fmt.Errorf("gui.SetText() ERROR box.EntryMap[", name, "] == nil ")
+ }
+ e := box.EntryMap[name]
+ log.Println("gui.SetText() box.EntryMap[", name, "] = ", e.E.Text())
+ e.E.SetText(value)
+ log.Println("gui.SetText() box.EntryMap[", name, "] = ", e.E.Text())
+ log.Println("gui.SetText() END")
+ return nil
+}
diff --git a/mainCloudBox.go b/mainCloudBox.go
index 019e628..df85b0a 100644
--- a/mainCloudBox.go
+++ b/mainCloudBox.go
@@ -171,8 +171,10 @@ func ShowAccountQuestionTab(gw *GuiWindow) {
log.Println("Sleep(200)")
time.Sleep(200 * time.Millisecond)
- gw.Box2 = AddAccountQuestionBox(gw)
- gw.T.InsertAt("New Account?", 0, gw.Box2)
+ abox := AddAccountQuestionBox(gw)
+ gw.BoxMap["MAIN"] = abox
+ // gw.Box2 = AddAccountQuestionBox(gw)
+ gw.T.InsertAt("New Account?", 0, abox.UiBox)
gw.T.SetMargined(0, true)
}
@@ -193,12 +195,12 @@ func ShowAccountTab(gw *GuiWindow, i int) {
if (i >= 0) {
log.Println("ShowAccountTab() InsertAt i=", i)
gw.T.Delete(0)
- gw.T.InsertAt("Add Account", i, abox)
+ gw.T.InsertAt("Add Account", i, abox.UiBox)
gw.T.SetMargined(0, true)
} else {
// TODO: After append try to discover the tab index #
log.Println("ShowAccountTab() Append")
- AddBoxToTab("Create New Account", gw.T, abox)
+ AddBoxToTab("Create New Account", gw.T, abox.UiBox)
}
}
@@ -230,6 +232,9 @@ func StartNewWindow(c *pb.Config, bg bool, action string) {
newGuiWindow.Action = action
Data.Windows = append(Data.Windows, &newGuiWindow)
+ // make(newGuiWindow.BoxMap)
+ newGuiWindow.BoxMap = make(map[string]*GuiBox)
+
if (bg) {
log.Println("ShowWindow() IN NEW GOROUTINE")
go ui.Main(func() {
diff --git a/structs.go b/structs.go
index abd7707..16e0291 100644
--- a/structs.go
+++ b/structs.go
@@ -55,6 +55,34 @@ type GuiData struct {
EntryPass *ui.Entry
}
+// stores information on 'the' window
+
+// More than one Window is not supported in a cross platform
+// sense & may never be. On Windows and MacOS, you have to have
+// 'tabs'. Even under Linux, more than one Window is currently
+// unstable
+//
+// This code will keep track of if the windows is 'tabbed' or
+// not. You can draw one thing in the window, then destroy
+// that, then redraw the window with something else
+//
+// This struct keeps track of what is in the window so you
+// can destroy and replace it with something else
+//
+type GuiWindow struct {
+ Action string
+ Area *GuiArea // should be moved to GuiBox
+
+ C *pb.Config
+
+ W *ui.Window
+ T *ui.Tab // if this != nil, the window is 'tabbed'
+ BoxMap map[string]*GuiBox
+ Box1 *ui.Box
+ Box2 *ui.Box
+}
+
+
// Note: every mouse click is handled
// as a 'Button' regardless of where
// the user clicks it. You could probably
@@ -103,18 +131,6 @@ type GuiEntry struct {
}
-type GuiWindow struct {
- Action string
- Area *GuiArea // should be moved to GuiBox
-
- C *pb.Config
-
- W *ui.Window
- T *ui.Tab
- Box1 *ui.Box
- Box2 *ui.Box
-}
-
//
// AREA STRUCTURES START
// AREA STRUCTURES START