From 3602d7de311e8fc3f21b5656b79d80ce66550e82 Mon Sep 17 00:00:00 2001 From: Alex Goodman Date: Sun, 10 Jun 2018 16:40:54 -0400 Subject: ability to hide files based on difftype --- filetree/node.go | 1 + filetree/tree.go | 3 +++ ui/filetreeview.go | 59 +++++++++++++++++++++++++++++++++++++++++++----------- ui/layerview.go | 1 + ui/statusview.go | 54 +++++++++++++++++++++++++++++++++++++++++++++++++ ui/ui.go | 32 ++++++++++++++++++++++------- ui/view.go | 10 --------- 7 files changed, 131 insertions(+), 29 deletions(-) create mode 100644 ui/statusview.go delete mode 100644 ui/view.go diff --git a/filetree/node.go b/filetree/node.go index 394cf93..00ed5b6 100644 --- a/filetree/node.go +++ b/filetree/node.go @@ -10,6 +10,7 @@ type FileNode struct { Parent *FileNode Name string Collapsed bool + Hidden bool Data *FileChangeInfo Children map[string]*FileNode } diff --git a/filetree/tree.go b/filetree/tree.go index 83532d2..941200e 100644 --- a/filetree/tree.go +++ b/filetree/tree.go @@ -69,6 +69,9 @@ func (tree *FileTree) String() string { sort.Strings(keys) for idx, name := range keys { child := node.Children[name] + if child.Hidden { + continue + } last := idx == (len(node.Children) - 1) showCollapsed := child.Collapsed && len(child.Children) > 0 result += renderLine(child.String(), spaces, last, showCollapsed) diff --git a/ui/filetreeview.go b/ui/filetreeview.go index 2516acd..eebdcc9 100644 --- a/ui/filetreeview.go +++ b/ui/filetreeview.go @@ -1,6 +1,7 @@ package ui import ( + "errors" "fmt" "github.com/jroimartin/gocui" @@ -8,12 +9,13 @@ import ( ) type FileTreeView struct { - Name string - gui *gocui.Gui - view *gocui.View - TreeIndex int - Tree *filetree.FileTree - RefTrees []*filetree.FileTree + Name string + gui *gocui.Gui + view *gocui.View + TreeIndex int + Tree *filetree.FileTree + RefTrees []*filetree.FileTree + HiddenDiffTypes []bool } func NewFileTreeView(name string, gui *gocui.Gui, tree *filetree.FileTree, refTrees []*filetree.FileTree) (treeview *FileTreeView) { @@ -24,6 +26,7 @@ func NewFileTreeView(name string, gui *gocui.Gui, tree *filetree.FileTree, refTr treeview.gui = gui treeview.Tree = tree treeview.RefTrees = refTrees + treeview.HiddenDiffTypes = make([]bool, 4) return treeview } @@ -37,6 +40,7 @@ func (view *FileTreeView) Setup(v *gocui.View) error { view.view.Highlight = true view.view.SelBgColor = gocui.ColorGreen view.view.SelFgColor = gocui.ColorBlack + view.view.Frame = true // set keybindings if err := view.gui.SetKeybinding(view.Name, gocui.KeyArrowDown, gocui.ModNone, func(*gocui.Gui, *gocui.View) error { return view.CursorDown() }); err != nil { @@ -48,6 +52,18 @@ func (view *FileTreeView) Setup(v *gocui.View) error { if err := view.gui.SetKeybinding(view.Name, gocui.KeySpace, gocui.ModNone, func(*gocui.Gui, *gocui.View) error { return view.toggleCollapse() }); err != nil { return err } + if err := view.gui.SetKeybinding(view.Name, gocui.KeyCtrlA, gocui.ModNone, func(*gocui.Gui, *gocui.View) error { return view.toggleShowDiffType(filetree.Added) }); err != nil { + return err + } + if err := view.gui.SetKeybinding(view.Name, gocui.KeyCtrlR, gocui.ModNone, func(*gocui.Gui, *gocui.View) error { return view.toggleShowDiffType(filetree.Removed) }); err != nil { + return err + } + if err := view.gui.SetKeybinding(view.Name, gocui.KeyCtrlM, gocui.ModNone, func(*gocui.Gui, *gocui.View) error { return view.toggleShowDiffType(filetree.Changed) }); err != nil { + return err + } + if err := view.gui.SetKeybinding(view.Name, gocui.KeyCtrlU, gocui.ModNone, func(*gocui.Gui, *gocui.View) error { return view.toggleShowDiffType(filetree.Unchanged) }); err != nil { + return err + } view.Render() @@ -55,20 +71,25 @@ func (view *FileTreeView) Setup(v *gocui.View) error { } func (view *FileTreeView) setLayer(layerIndex int) error { + if layerIndex > len(view.RefTrees)-1 { + return errors.New(fmt.Sprintf("Invalid layer index given: %d of %d", layerIndex, len(view.RefTrees)-1)) + } newTree := filetree.StackRange(view.RefTrees, layerIndex-1) newTree.Compare(view.RefTrees[layerIndex]) + // preserve view state on copy visitor := func(node *filetree.FileNode) error { - if node.Collapsed { - newNode, err := newTree.GetNode(node.Path()) - if err == nil { - newNode.Collapsed = true - } + newNode, err := newTree.GetNode(node.Path()) + if err == nil { + newNode.Collapsed = node.Collapsed } return nil } view.Tree.Visit(visitor) + // now that the tree has been rebuilt, keep the view seleciton in parity with the previous selection + view.setHiddenFromDiffTypes() + // v, _ := view.gui.View("debug") // v.Clear() // _, _ = fmt.Fprintln(v, view.RefTrees[layerIndex]) @@ -108,7 +129,7 @@ func (view *FileTreeView) getAbsPositionNode() (node *filetree.FileNode) { } evaluator = func(curNode *filetree.FileNode) bool { - return !curNode.Collapsed + return !curNode.Collapsed && !curNode.Hidden } err := view.Tree.VisitDepthParentFirst(visiter, evaluator) @@ -125,6 +146,20 @@ func (view *FileTreeView) toggleCollapse() error { return view.Render() } +func (view *FileTreeView) setHiddenFromDiffTypes() error { + visitor := func(node *filetree.FileNode) error { + node.Hidden = view.HiddenDiffTypes[node.Data.DiffType] + return nil + } + view.Tree.Visit(visitor) + return view.Render() +} + +func (view *FileTreeView) toggleShowDiffType(diffType filetree.DiffType) error { + view.HiddenDiffTypes[diffType] = !view.HiddenDiffTypes[diffType] + return view.setHiddenFromDiffTypes() +} + func (view *FileTreeView) Render() error { renderString := view.Tree.String() view.gui.Update(func(g *gocui.Gui) error { diff --git a/ui/layerview.go b/ui/layerview.go index 33179a6..b211ba6 100644 --- a/ui/layerview.go +++ b/ui/layerview.go @@ -34,6 +34,7 @@ func (view *LayerView) Setup(v *gocui.View) error { view.view.Highlight = true view.view.SelBgColor = gocui.ColorGreen view.view.SelFgColor = gocui.ColorBlack + view.view.Frame = false // set keybindings if err := view.gui.SetKeybinding(view.Name, gocui.KeyArrowDown, gocui.ModNone, func(*gocui.Gui, *gocui.View) error { return view.CursorDown() }); err != nil { diff --git a/ui/statusview.go b/ui/statusview.go new file mode 100644 index 0000000..32dc86d --- /dev/null +++ b/ui/statusview.go @@ -0,0 +1,54 @@ +package ui + +import ( + "fmt" + + "github.com/jroimartin/gocui" +) + +type StatusView struct { + Name string + gui *gocui.Gui + view *gocui.View +} + +func NewStatusView(name string, gui *gocui.Gui) (statusview *StatusView) { + statusview = new(StatusView) + + // populate main fields + statusview.Name = name + statusview.gui = gui + + return statusview +} + +func (view *StatusView) Setup(v *gocui.View) error { + + // set view options + view.view = v + view.view.Frame = false + view.view.BgColor = gocui.ColorDefault + gocui.AttrReverse + + // set keybindings + // if err := view.gui.SetKeybinding(view.Name, gocui.KeyArrowDown, gocui.ModNone, func(*gocui.Gui, *gocui.View) error { return view.CursorDown() }); err != nil { + // return err + // } + // if err := view.gui.SetKeybinding(view.Name, gocui.KeyArrowUp, gocui.ModNone, func(*gocui.Gui, *gocui.View) error { return view.CursorUp() }); err != nil { + // return err + // } + + view.Render() + + return nil +} + +func (view *StatusView) Render() error { + view.gui.Update(func(g *gocui.Gui) error { + view.view.Clear() + fmt.Fprintln(view.view, "[Ctrl+C]: Quit [Ctrl+Space]: Switch View | [Space]: Toggle dir collapse [A]: Added files [R]: Removed files [M]: Modified files [U]: Unmodified files") + + return nil + }) + // todo: blerg + return nil +} diff --git a/ui/ui.go b/ui/ui.go index aba7c9f..53bc8dd 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -9,8 +9,16 @@ import ( ) var Views struct { - Tree *FileTreeView - Layer *LayerView + Tree *FileTreeView + Layer *LayerView + Status *StatusView +} + +type View interface { + Setup(*gocui.View) error + CursorDown() error + CursorUp() error + Render() error } func nextView(g *gocui.Gui, v *gocui.View) error { @@ -76,16 +84,17 @@ func keybindings(g *gocui.Gui) error { func layout(g *gocui.Gui) error { maxX, maxY := g.Size() - splitCol := maxX / 2 - debugCol := maxX - 0 - if view, err := g.SetView(Views.Layer.Name, -1, -1, splitCol, maxY); err != nil { + splitCols := maxX / 2 + debugCols := maxX - 0 + bottomRows := 1 + if view, err := g.SetView(Views.Layer.Name, -1, -1, splitCols, maxY-bottomRows); err != nil { if err != gocui.ErrUnknownView { return err } Views.Layer.Setup(view) } - if view, err := g.SetView(Views.Tree.Name, splitCol, -1, debugCol, maxY); err != nil { + if view, err := g.SetView(Views.Tree.Name, splitCols, -1, debugCols, maxY-bottomRows); err != nil { if err != gocui.ErrUnknownView { return err } @@ -96,7 +105,15 @@ func layout(g *gocui.Gui) error { return err } } - // if _, err := g.SetView("debug", debugCol, -1, maxX, maxY); err != nil { + if view, err := g.SetView(Views.Status.Name, -1, maxY-bottomRows-1, maxX, maxY); err != nil { + if err != gocui.ErrUnknownView { + return err + } + Views.Status.Setup(view) + + } + + // if _, err := g.SetView("debug", debugCol, -1, maxX, maxY-bottomRows); err != nil { // if err != gocui.ErrUnknownView { // return err // } @@ -115,6 +132,7 @@ func Run(layers []*image.Layer, refTrees []*filetree.FileTree) { Views.Layer = NewLayerView("side", g, layers) Views.Tree = NewFileTreeView("main", g, filetree.StackRange(refTrees, 0), refTrees) + Views.Status = NewStatusView("status", g) g.Cursor = false //g.Mouse = true diff --git a/ui/view.go b/ui/view.go deleted file mode 100644 index bac308c..0000000 --- a/ui/view.go +++ /dev/null @@ -1,10 +0,0 @@ -package ui - -import "github.com/jroimartin/gocui" - -type View interface { - Setup(*gocui.View) error - CursorDown() error - CursorUp() error - Render() error -} -- cgit v1.2.3