summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Goodman <wagoodman@gmail.com>2018-06-10 16:40:54 -0400
committerAlex Goodman <wagoodman@gmail.com>2018-06-10 16:40:54 -0400
commit3602d7de311e8fc3f21b5656b79d80ce66550e82 (patch)
tree28523b68829d669aaa44ec14838b4c9e3637b7c1
parent093f648cc20498055bd479b8e8cc710bdb9bce94 (diff)
ability to hide files based on difftype
-rw-r--r--filetree/node.go1
-rw-r--r--filetree/tree.go3
-rw-r--r--ui/filetreeview.go59
-rw-r--r--ui/layerview.go1
-rw-r--r--ui/statusview.go54
-rw-r--r--ui/ui.go32
-rw-r--r--ui/view.go10
7 files changed, 131 insertions, 29 deletions
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
-}