package main import "log" import "fmt" import "time" // import "runtime" // import "runtime/debug" import "git.wit.com/wit/gui" import pb "git.wit.com/wit/witProtobuf" // import "github.com/davecgh/go-spew/spew" // // This was the default handler for all mouse clicks (buttons, areas, etc)) // // Most mouse clicks are now moved to custom functions // // stores the fields we want to map into our private structure 'values' func makeGuiButtonValues(box *gui.GuiBox, a *pb.Account, vm *pb.Event_VM, name string, action string, custom func(*gui.GuiButton)) *myButtonInfo { val := &myButtonInfo{} val.Account = a val.Accounts = config.Accounts val.VM = vm val.Custom = custom val.Name = name // val.Action = action return val } func makeButton(box *gui.GuiBox, a *pb.Account, vm *pb.Event_VM, name string, action string, custom func(*gui.GuiButton)) *gui.GuiButton { val := makeGuiButtonValues(box, a, vm, name, action, custom) return gui.CreateButton(box, custom, name, val) } func makeColorButton(box *gui.GuiBox, a *pb.Account, vm *pb.Event_VM, name string, action string, custom func(*gui.GuiButton)) *gui.GuiButton { val := makeGuiButtonValues(box, a, vm, name, action, custom) return gui.CreateColorButton(box, custom, name, val) } func mainMouseClick(b *gui.GuiButton) { defer r() // a golang trick to try to not crash on certain errors if (b == nil) { log.Println("mainMouseClick() BACK IN MAIN CONTROL PANEL CODE (button is nil) WHY DID THIS HAPPEN?") log.Println("THIS IS PROBABLY A BUG IN git.wit.com/gui") // gui.ErrorWindow(gw, // "Unknown Mouse Event", // "Error in mainMouseClick()") onExit(fmt.Errorf("mainMouseClick() got b = nil")) } log.Println("mainMouseClick() BACK IN CONTROL PANEL CODE") gw := b.Box.Window if (gw == nil) { log.Println("\tTHIS BUTTON IS BROKEN gw = nil") gui.ErrorWindow(gw, "Unknown Mouse Event", "Error in mainMouseClick()") // panic("something") return } if tmp, ok := b.Values.(*myButtonInfo); ! ok { log.Println("\tmainMouseClick() values.Accounts error =", ok) log.Println("\tmainMouseClick() values.Accounts tmp =", tmp) } else { var values *myButtonInfo values = tmp log.Println("\tmainMouseClick() values.Accounts =", values.Accounts) log.Println("\tmainMouseClick() values.Name = ", values.Name) log.Println("\tmainMouseClick() values.Action =", values.Action) } log.Println("mainMouseClick() END") } func showAccountClick(b *gui.GuiButton) { log.Println("\tTRIGGER DISPLAY ACCOUNT") State = "SEND WEBSOCKET" var values *myButtonInfo if tmp, ok := b.Values.(*myButtonInfo); ! ok { log.Println("\tshowAccountClick() values.Accounts error =", ok) log.Println("\tshowAccountClick() values.Accounts tmp =", tmp) } else { values = tmp } log.Println("\tshowAccountClick() values.Accounts =", values.Accounts) log.Println("\tshowAccountClick() values.Name = ", values.Name) gw := b.Box.Window makeAccountWindow(gw, values.Account) log.Println("\tshowAccountClick() END") } func makeAccountWindow(gw *gui.GuiWindow, account *pb.Account) { log.Println("\tmakeAccountWindow() START") name := "Virtual Machines (" + account.Nick + ")" // TODO: make this text i18n box := gui.InitWindow(gw, name, gui.Yaxis) if (box == nil) { log.Println("gui.InitWindow() FAILED") return } gw = box.Window event := pb.MakeGetEvent() event.Account = account websocketSendProtobuf(event) count := 0 for { log.Println("\tSleep() in buttonClick() State =", State) time.Sleep(200 * time.Millisecond) if (State == "NEW PROTOBUF") { if (currentMessage == nil) { gui.ErrorWindow(gw, "There was a socket error", "More detailed information can be shown here.") State = "done" } else { count := countVMS(currentMessage) log.Println("\tSHOW VMS currentMessage =", currentMessage) log.Println("\tSHOW VMS count =", count) // TODO: make sure login worked & the account really has zero VMs // if (count != 0) { mh := addVmsTab(box, name, count, account) // ReadReceivedData(currentMessage, mh, b.Box) ReadReceivedData(currentMessage, mh, box) // } currentMessage = nil State = "done" } return } count += 1 if (count > 10) { log.Println("\tERROR: waited too long for a resposne") currentMessage = nil State = "done" return } } } func createVmClick(b *gui.GuiButton) { log.Println("createVmClick()") var values *myButtonInfo if tmp, ok := b.Values.(*myButtonInfo); ! ok { log.Println("\tcreateVmClick() values.Accounts error =", ok) log.Println("\tcreateVmClick() values.Accounts tmp =", tmp) } else { values = tmp } log.Println("\tcreateVmClick() values.Accounts =", values.Accounts) log.Println("\tcreateVmClick() values.Name = ", values.Name) log.Println("\tTRIGGER CREATE VM") State = "CREATE" event := pb.MakeAddVmEvent() for key, entry := range gui.Data.AllEntries { log.Println("\tdefaultEntryChange() Data.AllEntries =", key, entry) log.Println("\tdefaultEntryChange() Data.AllEntries[key].Name =", entry.Name) if (entry.Name == "Hostname") { event.Vms[0].Hostname = entry.UiEntry.Text() } if (entry.Name == "Memory") { event.Vms[0].Memory = pint64(entry.UiEntry.Text()) } log.Println("\tdefaultEntryChange() Data.AllEntries[key].E =", entry.UiEntry.Text()) log.Println("\tdefaultEntryChange() Data.AllEntries[key].B =", entry.B) if entry.B == b { log.Println("defaultEntryChange() FOUND. Entry assigned to Button", b) } } event.Account = values.Account log.Println("\tTRIGGERING CREATE event=", event) log.Println("\tTRIGGERING CREATE event.Account=", event.Account) websocketSendProtobuf(event) }