From 522581dbafc487a8b6a049e22522233504bdf829 Mon Sep 17 00:00:00 2001 From: Jeff Carr Date: Wed, 22 May 2019 18:35:00 -0700 Subject: [PATCH] I guess all GUI stuff must go in here. No other goroutine can ever interact with the GUI or Windows cross platform support breaks. Lame Signed-off-by: Jeff Carr --- addAccount.go | 65 +++++++++++++++++++++++++++ area.go | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++ examples.go | 20 ++------- gui.go | 15 ++++++- splash.go | 67 ++++++++++++++++++++++++++++ tabWindow.go | 83 ++++++++++++++++++++++++++++++++++ 6 files changed, 353 insertions(+), 17 deletions(-) create mode 100644 addAccount.go create mode 100644 area.go create mode 100644 splash.go create mode 100644 tabWindow.go diff --git a/addAccount.go b/addAccount.go new file mode 100644 index 0000000..e9799f6 --- /dev/null +++ b/addAccount.go @@ -0,0 +1,65 @@ +package gui + +import "log" + +import "github.com/andlabs/ui" +import _ "github.com/andlabs/ui/winmanifest" + +// import "github.com/davecgh/go-spew/spew" + +func AddAccountWindow() { + accounthWin := ui.NewWindow("Add Account", 400, 300, false) + accounthWin.OnClosing(func(*ui.Window) bool { + ui.Quit() + return true + }) + ui.OnShouldQuit(func() bool { + accounthWin.Destroy() + return true + }) + + vbox := ui.NewVerticalBox() + vbox.SetPadded(true) + accounthWin.SetChild(vbox) + accounthWin.SetMargined(true) + + // This displays the window + accounthWin.Show() + + // START create new account button + newAccountButton := ui.NewButton("Create New Account") + newAccountButton.OnClicked(func(*ui.Button) { + log.Println("OK. Closing window.") + accounthWin.Destroy() + ui.Quit() + }) + vbox.Append(newAccountButton, false) + // END create new account button + + vbox.Append(ui.NewHorizontalSeparator(), false) + + okButton := ui.NewButton("I Have an Account") + okButton.OnClicked(func(*ui.Button) { + log.Println("OK. Closing window.") + accounthWin.Destroy() + ui.Quit() + }) + vbox.Append(okButton, false) + // END add account hbox +} + +func AddAccountBox(junk *ui.Box, custom func(int, string)) *ui.Box { + newbox := ui.NewVerticalBox() + newbox.SetPadded(true) + + // create new account button + newButton := CreateButton("Create New Account", "CLOSE", custom) + newbox.Append(newButton, false) + + newbox.Append(ui.NewHorizontalSeparator(), false) + + okButton := CreateButton("I Have an Account", "CLOSE", custom) + newbox.Append(okButton, false) + + return newbox +} diff --git a/area.go b/area.go new file mode 100644 index 0000000..225cefb --- /dev/null +++ b/area.go @@ -0,0 +1,120 @@ +package gui + +import "log" + +import "github.com/andlabs/ui" +import _ "github.com/andlabs/ui/winmanifest" + +import "github.com/davecgh/go-spew/spew" + +var fontButton *ui.FontButton +var attrstr *ui.AttributedString +var splashArea *ui.Area + +func areaClick(a int, b string) { + log.Println("GOT areaClick(a,b) =", a, b) +} + +func makeSplashArea(custom func(int, string)) *ui.Area { + // make this button just to get the default font (but don't display the button) + // There should be another way to do this (?) + fontButton = CreateFontButton("SplashFont", "CLOSE", custom) + + makeAttributedString() + splashArea = ui.NewArea(myAH) + + spew.Dump(splashArea) + return splashArea +} + +func appendWithAttributes(what string, attrs ...ui.Attribute) { + start := len(attrstr.String()) + end := start + len(what) + attrstr.AppendUnattributed(what) + for _, a := range attrs { + attrstr.SetAttribute(a, start, end) + } +} + +func makeAttributedString() { + attrstr = ui.NewAttributedString("") + + appendWithAttributes("Welcome to the Cloud Control Panel\n", ui.TextSize(16), ui.TextColor{0.0, 0.0, 0.8, .8}) // "RGBT" + + appendWithAttributes("(alpha)\n\n", ui.TextSize(10)) + + appendWithAttributes("This control panel was designed to be an interface to your 'private' cloud. ", ui.TextWeightBold) + appendWithAttributes("The concept of a private cloud means that you can use a providers system, or, seemlessly, use your own hardware in your own datacenter. ", ui.TextWeightBold) + + attrstr.AppendUnattributed("\n") + attrstr.AppendUnattributed("\n") + appendWithAttributes("This control panel requires:\n") + attrstr.AppendUnattributed("\n") + appendWithAttributes("IPv6\n") + appendWithAttributes("Your hostname in DNS\n") + attrstr.AppendUnattributed("\n\n\n\n\n") + + appendWithAttributes("\n", ui.TextSize(10)) +} + +type areaHandler struct{ + buttonFunc func(int, int) + closeFunc func(int) +} + +var myAH areaHandler + +func (ah areaHandler) Draw(a *ui.Area, p *ui.AreaDrawParams) { + tl := ui.DrawNewTextLayout(&ui.DrawTextLayoutParams{ + String: attrstr, + DefaultFont: fontButton.Font(), + Width: p.AreaWidth, + Align: ui.DrawTextAlign(1), + }) + p.Context.Text(tl, 0, 0) + defer tl.Free() +} + +func (ah areaHandler) MouseEvent(a *ui.Area, me *ui.AreaMouseEvent) { + log.Println("GOT MouseEvent()") + spew.Dump(me) + if (me.Down == 1) { + log.Println("GOT MOUSE DOWN") + log.Println("GOT MOUSE DOWN") + log.Println("GOT MOUSE DOWN") + } + if (me.Up == 1) { + log.Println("GOT MOUSE UP") + log.Println("GOT MOUSE UP") + log.Println("GOT MOUSE UP") + // splashWin.Destroy() + // ui.Quit() + } + areaClick(1, "done") +} + +func (ah areaHandler) MouseCrossed(a *ui.Area, left bool) { + log.Println("GOT MouseCrossed()") +} + +func (ah areaHandler) DragBroken(a *ui.Area) { + log.Println("GOT DragBroken()") +} + +func (ah areaHandler) KeyEvent(a *ui.Area, ke *ui.AreaKeyEvent) (handled bool) { + log.Println("GOT KeyEvent()") + if (ke.Key == 10) { + log.Println("GOT ENTER") + log.Println("GOT ENTER") + log.Println("GOT ENTER") + } + if (ke.Key == 32) { + log.Println("GOT ENTER") + log.Println("GOT ENTER") + log.Println("GOT ENTER") + } + spew.Dump(ke) + // splashWin.Destroy() + // ui.Quit() + return false +} diff --git a/examples.go b/examples.go index df9c5b5..3d6c904 100644 --- a/examples.go +++ b/examples.go @@ -1,35 +1,23 @@ package gui -import "log" +// import "log" -import "github.com/gookit/config" +// import "github.com/gookit/config" 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 jcarrButton *ui.Button var jcarrEntry *ui.MultilineEntry -func buttonClick(button *ui.Button) { - log.Println("hostname =", config.String("hostname"), button) - spew.Dump(button) - if (jcarrButton == button) { - log.Println("This is the jcarrButton") - cur := jcarrEntry.Text() - jcarrEntry.SetText(cur + "THIS IS A GREAT IDEA\n") - } else { - log.Println("This is NOT the jcarrButton") - } -} - func hostnameButton(hostname string) ui.Control { tmpbox := ui.NewHorizontalBox() tmpbox.SetPadded(true) tmpButton := ui.NewButton(hostname) tmpbox.Append(tmpButton, false) - tmpButton.OnClicked(buttonClick) + tmpButton.OnClicked(defaultButtonClick) jcarrButton = tmpButton diff --git a/gui.go b/gui.go index 3218667..245749a 100644 --- a/gui.go +++ b/gui.go @@ -17,6 +17,19 @@ var Height int var allButtons []ButtonMap +var internalDS GuiDS + +func GetDataStructures() *GuiDS { + return &internalDS +} + +// All GUI Data Structures that are external +type GuiDS struct { + State string + MainWindow *ui.Window + ButtonClick func(int, string) +} + type TableColumnData struct { Index int CellType string @@ -219,7 +232,7 @@ func closeButtonClick(button *ui.Button) { func closeButton(name string, mytab *ui.Tab) ui.Control { tmpButton := ui.NewButton(name) - tmpButton.OnClicked(buttonClick) + tmpButton.OnClicked(defaultButtonClick) return tmpButton } diff --git a/splash.go b/splash.go new file mode 100644 index 0000000..a58cd72 --- /dev/null +++ b/splash.go @@ -0,0 +1,67 @@ +package gui + +// import "github.com/davecgh/go-spew/spew" +// import "time" +// import "fmt" + +// import "log" +import "runtime" + +import "github.com/andlabs/ui" +import _ "github.com/andlabs/ui/winmanifest" + +// var splashWin *ui.Window +var MyArea *ui.Area + +func ShowSplash() *ui.Window { + splashWin := ui.NewWindow("", 640, 480, true) + splashWin.SetBorderless(true) + splashWin.OnClosing(func(*ui.Window) bool { + ui.Quit() + return true + }) + ui.OnShouldQuit(func() bool { + splashWin.Destroy() + return true + }) + + vbox := ui.NewVerticalBox() + vbox.SetPadded(true) + splashWin.SetChild(vbox) + splashWin.SetMargined(true) + + // This displays the window + // splashWin.Show() + + ShowSplashBox(vbox, nil, nil) + + return splashWin +} + +func ShowSplashBox(vbox *ui.Box, atest chan int, custom func(int, string)) *ui.Box { + newbox := ui.NewVerticalBox() + newbox.SetPadded(true) + + makeAttributedString() + MyArea = makeSplashArea(custom) + + newbox.Append(MyArea, true) + + if runtime.GOOS == "linux" { + newbox.Append(ui.NewLabel("OS: Linux"), false) + } else if runtime.GOOS == "windows" { + newbox.Append(ui.NewLabel("OS: Windows"), false) + } else { + newbox.Append(ui.NewLabel("OS: " + runtime.GOOS), false) + } + + newbox.Append(ui.NewLabel("Version: v0.3"), false) + okButton := CreateButton("OK", "CLOSE", custom) + newbox.Append(okButton, false) + + if (vbox != nil) { + vbox.Append(newbox, true) + } + + return newbox +} diff --git a/tabWindow.go b/tabWindow.go new file mode 100644 index 0000000..250e247 --- /dev/null +++ b/tabWindow.go @@ -0,0 +1,83 @@ +package gui + +import "log" +import "time" + +import "github.com/andlabs/ui" +import _ "github.com/andlabs/ui/winmanifest" + +// import "github.com/davecgh/go-spew/spew" + +var cloudWindow *ui.Window +var cloudTab *ui.Tab +var cloudBox *ui.Box +var smallBox *ui.Box +var state string + +func splashClose(a int, b string) { + log.Println("GOT splashClose(a,b) =", a, b) + + log.Println("cloudBox Delete(0) START") + cloudBox.Delete(0) + log.Println("smallBox.Hide() START") + smallBox.Hide() + + state = "kill" +} + +func buttonClick(i int, s string) { + log.Println("test2 buttonClick() i, s =", i, s) + cloudTab.Delete(0) + + log.Println("Sleep(2000)") + time.Sleep(2000 * time.Millisecond) + + smallBox = AddAccountBox(nil, splashClose) + cloudTab.InsertAt("Intro", 0, smallBox) + cloudTab.SetMargined(0, true) +} + +func ShowAccountTab() { + cloudTab.Delete(0) + + log.Println("Sleep(1000)") + time.Sleep(1000 * time.Millisecond) + + smallBox = AddAccountBox(nil, splashClose) + cloudTab.InsertAt("Intro", 0, smallBox) + cloudTab.SetMargined(0, true) +} + +func GoMainWindow() { + ui.Main(makeCloudWindow) +} + +func makeCloudWindow() { + cloudWindow := ui.NewWindow("", 640, 480, true) + // cloudWindow.SetBorderless(true) + cloudWindow.OnClosing(func(*ui.Window) bool { + ui.Quit() + return true + }) + ui.OnShouldQuit(func() bool { + cloudWindow.Destroy() + return true + }) + +// cloudBox = ui.NewVerticalBox() +// cloudBox.SetPadded(true) +// cloudWindow.SetChild(cloudBox) +// cloudWindow.SetMargined(true) + + cloudTab = ui.NewTab() + cloudWindow.SetChild(cloudTab) + cloudWindow.SetMargined(true) + + cloudBox = ShowSplashBox(nil, nil, buttonClick) + + cloudTab.Append("WIT Splash", cloudBox) + cloudTab.SetMargined(0, true) + + cloudWindow.Show() + // state = "done" +}