package main import ( "strings" "sync" "go.wit.com/lib/gadgets" "go.wit.com/lib/protobuf/forgepb" "go.wit.com/log" "go.wit.com/gui" ) type patchesWindow struct { once sync.Once // only init() the window once win *gadgets.BasicWindow // the patches window stack *gui.Node // the top box set as vertical shelf *gui.Node // the first box in the stack, set as horizontal grid *gui.Node // the list of available patches summary *patchSummary // summary of current patches setgrid *gui.Node // the list of each patchset setlist map[string]*forgepb.Patchset // a map of the patch names to the protobuf } func (r *patchesWindow) Hidden() bool { return r.win.Hidden() } func (r *patchesWindow) Toggle() { if r.Hidden() { r.Show() } else { r.Hide() } } func (r *patchesWindow) Show() { r.win.Show() } func (r *patchesWindow) Hide() { r.win.Hide() } func (r *patchesWindow) Disable() { r.stack.Disable() } func (r *patchesWindow) Enable() { r.stack.Enable() } // you can only have one of these func (r *patchesWindow) initWindow() { // sync.Once() r.win = gadgets.RawBasicWindow("Forge Patchesets") r.win.Make() r.stack = r.win.Box().NewBox("bw vbox", false) // me.reposwin.Draw() r.win.Custom = func() { log.Warn("Patchset Window close. setting hidden=true") // sets the hidden flag to false so Toggle() works r.win.Hide() } r.grid = r.stack.NewGrid("", 0, 0) r.shelf = r.initGroup() r.summary = r.submitPatchesBox(r.stack) r.initSetList() } func (r *patchesWindow) initGroup() *gui.Node { group1 := r.stack.NewGroup("stuff") vbox := group1.Box() vbox.Vertical() hbox := vbox.Box().Horizontal() dirty := hbox.NewCheckbox("dirty") dirty.Custom = func() { log.Info("filter dirty =", dirty.Checked()) } hbox.NewButton("update patch summary", func() { r.summary.Update() }) hbox.NewButton("test add", func() { me.patchWin.initGroup() }) hbox.NewButton("Get Patchsets", func() { psets, err := me.forge.GetPatchesets() if err != nil { log.Info(err) return } all := psets.All() for all.Scan() { pset := all.Next() log.Info(pset) } }) return vbox } func (r *patchesWindow) initSetList() *gui.Node { r.setgrid = r.stack.NewGrid("", 0, 0) r.setlist = make(map[string]*forgepb.Patchset) return nil } func (r *patchesWindow) addPatchset(line string) { parts := strings.Split(line, "Author:") author := parts[1] parts = strings.Fields(parts[0]) name := parts[0] subject := strings.Join(parts[1:], " ") r.setgrid.NewLabel(name) r.setgrid.NewLabel(subject) r.setgrid.NewLabel(author) r.setgrid.NewButton("Download", func() { pset, err := getPatch(name) if err != nil { log.Info(name, "failed to download", err) return } r.setlist[name] = pset }) r.setgrid.NewButton("Dump", func() { pset := r.setlist[name] if pset == nil { log.Info(name, "was nil") return } if !dumpPatchset(pset) { log.Info("Dump: some patches are bad", name) return } }) r.setgrid.NewButton("Save", func() { pset := r.setlist[name] if pset == nil { log.Info(name, "was nil") return } if !savePatchset(pset) { log.Info("Save: some patches are bad", name) return } }) r.setgrid.NextRow() }