func InsertOnlineMenu(ui gui.WidgetParent) error { var sm OnlineMenu datadir := base.GetDataDir() err := base.LoadAndProcessObject(filepath.Join(datadir, "ui", "start", "online", "layout.json"), "json", &sm.layout) if err != nil { return err } sm.buttons = []ButtonLike{ &sm.layout.Back, &sm.layout.Unstarted.Up, &sm.layout.Unstarted.Down, &sm.layout.Active.Up, &sm.layout.Active.Down, &sm.layout.User, &sm.layout.NewGame, } sm.control.in = make(chan struct{}) sm.control.out = make(chan struct{}) sm.layout.Back.f = func(interface{}) { ui.RemoveChild(&sm) InsertStartMenu(ui) } sm.ui = ui var net_id mrgnet.NetId fmt.Sscanf(base.GetStoreVal("netid"), "%d", &net_id) if net_id == 0 { net_id = mrgnet.NetId(mrgnet.RandomId()) base.SetStoreVal("netid", fmt.Sprintf("%d", net_id)) } in_newgame := false sm.layout.NewGame.f = func(interface{}) { if in_newgame { return } in_newgame = true go func() { var req mrgnet.NewGameRequest req.Id = net_id var resp mrgnet.NewGameResponse done := make(chan bool, 1) go func() { mrgnet.DoAction("new", req, &resp) done <- true }() select { case <-done: case <-time.After(10 * time.Second): resp.Err = "Couldn't connect to server." } <-sm.control.in defer func() { in_newgame = false sm.control.out <- struct{}{} }() if resp.Err != "" { sm.layout.Error.err = resp.Err base.Error().Printf("Couldn't make new game: %v", resp.Err) return } ui.RemoveChild(&sm) err := InsertMapChooser( ui, func(name string) { ui.AddChild(MakeGamePanel(name, nil, nil, resp.Game_key)) }, InsertOnlineMenu, ) if err != nil { base.Error().Printf("Error making Map Chooser: %v", err) } }() } for _, _glb := range []*gameListBox{&sm.layout.Active, &sm.layout.Unstarted} { glb := _glb glb.Up.f = func(interface{}) { glb.Scroll.Up() } glb.Down.f = func(interface{}) { glb.Scroll.Down() } glb.update = make(chan mrgnet.ListGamesResponse) } go func() { var resp mrgnet.ListGamesResponse mrgnet.DoAction("list", mrgnet.ListGamesRequest{Id: net_id, Unstarted: true}, &resp) sm.layout.Unstarted.update <- resp }() go func() { var resp mrgnet.ListGamesResponse mrgnet.DoAction("list", mrgnet.ListGamesRequest{Id: net_id, Unstarted: false}, &resp) sm.layout.Active.update <- resp }() sm.layout.User.Button.f = func(interface{}) { var req mrgnet.UpdateUserRequest req.Name = sm.layout.User.Entry.text req.Id = net_id var resp mrgnet.UpdateUserResponse go func() { mrgnet.DoAction("user", req, &resp) <-sm.control.in sm.layout.User.SetText(resp.Name) sm.update_alpha = 1.0 sm.update_time = time.Now() sm.control.out <- struct{}{} }() } go func() { var resp mrgnet.UpdateUserResponse mrgnet.DoAction("user", mrgnet.UpdateUserRequest{Id: net_id}, &resp) <-sm.control.in sm.layout.User.SetText(resp.Name) sm.update_alpha = 1.0 sm.update_time = time.Now() sm.control.out <- struct{}{} }() ui.AddChild(&sm) return nil }
func InsertOnlineMenu(ui gui.WidgetParent) error { var sm OnlineMenu datadir := base.GetDataDir() err := base.LoadAndProcessObject(filepath.Join(datadir, "ui", "start", "online", "layout.json"), "json", &sm.layout) if err != nil { return err } sm.buttons = []ButtonLike{ &sm.layout.Back, &sm.layout.Unstarted.Up, &sm.layout.Unstarted.Down, &sm.layout.Active.Up, &sm.layout.Active.Down, &sm.layout.User, } sm.layout.Back.f = func(interface{}) { ui.RemoveChild(&sm) InsertStartMenu(ui) } var net_id mrgnet.NetId fmt.Sscanf(base.GetStoreVal("netid"), "%d", &net_id) if net_id == 0 { net_id = mrgnet.NetId(mrgnet.RandomId()) base.SetStoreVal("netid", fmt.Sprintf("%d", net_id)) } for _, _glb := range []*gameListBox{&sm.layout.Active, &sm.layout.Unstarted} { glb := _glb glb.Up.f = func(interface{}) { glb.Scroll.Up() } glb.Down.f = func(interface{}) { glb.Scroll.Down() } glb.update = make(chan mrgnet.ListGamesResponse) } go func() { var resp mrgnet.ListGamesResponse mrgnet.DoAction("list", mrgnet.ListGamesRequest{Id: net_id, Unstarted: true}, &resp) sm.layout.Unstarted.update <- resp }() go func() { var resp mrgnet.ListGamesResponse mrgnet.DoAction("list", mrgnet.ListGamesRequest{Id: net_id, Unstarted: false}, &resp) sm.layout.Active.update <- resp }() sm.update_user = make(chan mrgnet.UpdateUserResponse) sm.layout.User.Button.f = func(interface{}) { var req mrgnet.UpdateUserRequest req.Name = sm.layout.User.Entry.text req.Id = net_id var resp mrgnet.UpdateUserResponse go func() { mrgnet.DoAction("user", req, &resp) sm.update_user <- resp }() } go func() { var resp mrgnet.UpdateUserResponse mrgnet.DoAction("user", mrgnet.UpdateUserRequest{Id: net_id}, &resp) sm.update_user <- resp }() ui.AddChild(&sm) return nil }