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