package main import ( "sync" "go.wit.com/lib/gadgets" "go.wit.com/lib/protobuf/forgepb" "go.wit.com/lib/protobuf/gitpb" "go.wit.com/log" "go.wit.com/gui" ) type repoPatchWindow 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 pset *forgepb.Patchset // the patchset in question } // todo: autogenerate these or make them standared 'gui' package functions // make this an go interface somehow // is the window hidden right now? func (w *repoPatchWindow) Hidden() bool { return w.win.Hidden() } // switches between the window being visable or hidden on the desktop func (w *repoPatchWindow) Toggle() { if w.Hidden() { w.Show() } else { w.Hide() } } // hides the window completely func (w *repoPatchWindow) Show() { w.win.Show() } func (w *repoPatchWindow) Hide() { w.win.Hide() } // should be the first box/widget in the window // greys out the window to the user func (w *repoPatchWindow) Disable() { w.stack.Disable() } func (w *repoPatchWindow) Enable() { w.stack.Enable() } // you can only have one of these func makeRepoPatchWindow(repo *gitpb.Repo, fset []*forgepb.Patch) *repoPatchWindow { pw := new(repoPatchWindow) // sync.Once() pw.win = gadgets.RawBasicWindow("Patcheset for " + repo.GetGoPath()) pw.win.Make() pw.stack = pw.win.Box().NewBox("bw vbox", false) // me.reposwin.Draw() pw.win.Custom = func() { // sets the hidden flag to false so Toggle() works pw.win.Hide() } grid := pw.stack.NewGrid("", 0, 0) grid.NewLabel(repo.GetGoPath()) grid.NewLabel(repo.GetCurrentBranchName()) g := pw.stack.NewGroup("PatchSet List") // make a grid and a header filegrid := g.NewGrid("", 0, 0) filegrid.NewLabel("patch name") filegrid.NewLabel("Applied in current branch?") filegrid.NewLabel("original hash") filegrid.NewLabel("new hash") filegrid.NewButton("git squash", func() { }) filegrid.NewButton("git am", func() { }) filegrid.NextRow() for _, p := range fset { filegrid.NewLabel(p.Comment) filegrid.NewLabel("yes?") filegrid.NewLabel(p.CommitHash) filegrid.NewLabel(p.NewHash) filegrid.NewCheckbox("").SetChecked(true) filegrid.NewCheckbox("").SetChecked(true) filegrid.NextRow() } // add the patches to the grid // pw.addPatchset(filegrid, pset) return pw } func (r *repoPatchWindow) addPatchset(grid *gui.Node, pset *forgepb.Patchset) { repomap := make(map[*gitpb.Repo][]*forgepb.Patch) repohash := make(map[*gitpb.Repo]string) // sort patches by repo namespace all := pset.Patches.SortByFilename() for all.Scan() { p := all.Next() s := p.RepoNamespace repo := me.forge.FindByGoPath(s) if repo == nil { log.Info("COULD NOT FIND", s) continue } repomap[repo] = append(repomap[repo], p) repohash[repo] = p.StartHash } for repo, patches := range repomap { log.Info(repo.GetGoPath()) grid.NewLabel(repo.GetGoPath()) for i, p := range patches { log.Info(i, p.Filename) grid.NewLabel(p.Comment) grid.NewLabel("in current branch?") break } hash := repohash[repo] grid.NewLabel(hash) grid.NewButton("View", func() { log.Info("todo: show patches for repo", repo.GetGoPath()) }) grid.NextRow() } }