parent
d73ae31eb2
commit
c3ad3ce793
|
@ -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
|
|
@ -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.
|
|
@ -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
|
||||
}
|
||||
|
|
68
gui.go
68
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
|
||||
}
|
||||
|
|
|
@ -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() {
|
||||
|
|
40
structs.go
40
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
|
||||
|
|
Loading…
Reference in New Issue