integrate layer interactions

This commit is contained in:
Alex Goodman 2018-06-01 17:24:30 -04:00
parent 1e4ad0ce72
commit 71b36ea7c7
No known key found for this signature in database
GPG Key ID: 05328C611D8A520E
4 changed files with 104 additions and 45 deletions

View File

@ -209,3 +209,11 @@ func (tree *FileTree) MarkRemoved(path string) error {
} }
return node.AssignDiffType(Removed) return node.AssignDiffType(Removed)
} }
func StackRange(trees []*FileTree, index int) *FileTree {
tree := trees[0].Copy()
for idx := 1; idx < index; idx++ {
tree.Stack(trees[idx])
}
return tree
}

View File

@ -110,7 +110,7 @@ func TestStack(t *testing.T) {
err := tree1.Stack(tree2) err := tree1.Stack(tree2)
if err != nil { if err != nil {
t.Errorf("Could not stack trees: %v", err) t.Errorf("Could not stack refTrees: %v", err)
} }
expected := `. expected := `.

129
main.go
View File

@ -15,9 +15,11 @@ import (
) )
var data struct { var data struct {
tree *FileTree tree *FileTree
manifest *Manifest refTrees []*FileTree
absPosition uint manifest *Manifest
absDFSTreeIndex int
layerIndex int
} }
func check(e error) { func check(e error) {
@ -116,10 +118,10 @@ func demo() {
func getAbsPositionNode() (node *FileNode) { func getAbsPositionNode() (node *FileNode) {
var visiter func(*FileNode) error var visiter func(*FileNode) error
var evaluator func(*FileNode) bool var evaluator func(*FileNode) bool
var dfsCounter uint var dfsCounter int
visiter = func(curNode *FileNode) error { visiter = func(curNode *FileNode) error {
if dfsCounter == data.absPosition { if dfsCounter == data.absDFSTreeIndex {
node = curNode node = curNode
} }
dfsCounter++ dfsCounter++
@ -138,56 +140,96 @@ func getAbsPositionNode() (node *FileNode) {
return node return node
} }
func nextView(g *gocui.Gui, v *gocui.View) error {
if v == nil || v.Name() == "side" {
_, err := g.SetCurrentView("main")
return err
}
_, err := g.SetCurrentView("side")
return err
}
func showCurNodeInSideBar(g *gocui.Gui, v *gocui.View) error { func showCurNodeInSideBar(g *gocui.Gui, v *gocui.View) error {
g.Update(func(g *gocui.Gui) error { g.Update(func(g *gocui.Gui) error {
v, _ := g.View("side") v, _ := g.View("side")
// todo: handle above error. // todo: handle above error.
v.Clear() v.Clear()
_, err := fmt.Fprintf(v, "FileNode:\n%+v\n\n", getAbsPositionNode()) //_, err := fmt.Fprintf(v, "FileNode:\n%+v\n\n", getAbsPositionNode())
for ix, layerName := range data.manifest.Layers { for ix, layerName := range data.manifest.Layers {
fmt.Fprintf(v, "%d: %s\n", ix+1, layerName[0:25]) fmt.Fprintf(v, "%d: %s\n", ix+1, layerName[0:25])
} }
return err return nil
}) })
// todo: blerg // todo: blerg
return nil return nil
} }
func cursorDown(g *gocui.Gui, v *gocui.View) error { func cursorDown(g *gocui.Gui, v *gocui.View) error {
if v != nil { cx, cy := v.Cursor()
cx, cy := v.Cursor()
// if there isn't a next line // if there isn't a next line
line, err := v.Line(cy + 1) line, err := v.Line(cy + 1)
if err != nil { if err != nil {
// todo: handle error // todo: handle error
}
if len(line) == 0 {
return nil
}
if err := v.SetCursor(cx, cy+1); err != nil {
ox, oy := v.Origin()
if err := v.SetOrigin(ox, oy+1); err != nil {
return err
} }
if len(line) == 0 {
return nil
}
if err := v.SetCursor(cx, cy+1); err != nil {
ox, oy := v.Origin()
if err := v.SetOrigin(ox, oy+1); err != nil {
return err
}
}
data.absPosition++
showCurNodeInSideBar(g, v)
} }
return nil return nil
} }
func cursorUp(g *gocui.Gui, v *gocui.View) error { func cursorUp(g *gocui.Gui, v *gocui.View) error {
if v != nil { ox, oy := v.Origin()
ox, oy := v.Origin() cx, cy := v.Cursor()
cx, cy := v.Cursor() if err := v.SetCursor(cx, cy-1); err != nil && oy > 0 {
if err := v.SetCursor(cx, cy-1); err != nil && oy > 0 { if err := v.SetOrigin(ox, oy-1); err != nil {
if err := v.SetOrigin(ox, oy-1); err != nil { return err
return err
}
} }
data.absPosition-- }
return nil
}
func cursorDownLayers(g *gocui.Gui, v *gocui.View) error {
if v != nil {
cursorDown(g, v)
data.layerIndex++
showCurNodeInSideBar(g, v) showCurNodeInSideBar(g, v)
data.tree = StackRange(data.refTrees, data.layerIndex)
drawTree(g, v)
}
return nil
}
func cursorUpLayers(g *gocui.Gui, v *gocui.View) error {
if v != nil {
cursorUp(g, v)
data.layerIndex--
showCurNodeInSideBar(g, v)
data.tree = StackRange(data.refTrees, data.layerIndex)
drawTree(g, v)
}
return nil
}
func cursorDownTree(g *gocui.Gui, v *gocui.View) error {
if v != nil {
cursorDown(g, v)
data.absDFSTreeIndex++
}
return nil
}
func cursorUpTree(g *gocui.Gui, v *gocui.View) error {
if v != nil {
cursorUp(g, v)
data.absDFSTreeIndex--
} }
return nil return nil
} }
@ -220,10 +262,22 @@ func keybindings(g *gocui.Gui) error {
//if err := g.SetKeybinding("main", gocui.MouseLeft, gocui.ModNone, toggleCollapse); err != nil { //if err := g.SetKeybinding("main", gocui.MouseLeft, gocui.ModNone, toggleCollapse); err != nil {
// return err // return err
//} //}
if err := g.SetKeybinding("main", gocui.KeyArrowDown, gocui.ModNone, cursorDown); err != nil { if err := g.SetKeybinding("side", gocui.KeyCtrlSpace, gocui.ModNone, nextView); err != nil {
return err return err
} }
if err := g.SetKeybinding("main", gocui.KeyArrowUp, gocui.ModNone, cursorUp); err != nil { if err := g.SetKeybinding("main", gocui.KeyCtrlSpace, gocui.ModNone, nextView); err != nil {
return err
}
if err := g.SetKeybinding("side", gocui.KeyArrowDown, gocui.ModNone, cursorDownLayers); err != nil {
return err
}
if err := g.SetKeybinding("side", gocui.KeyArrowUp, gocui.ModNone, cursorUpLayers); err != nil {
return err
}
if err := g.SetKeybinding("main", gocui.KeyArrowDown, gocui.ModNone, cursorDownTree); err != nil {
return err
}
if err := g.SetKeybinding("main", gocui.KeyArrowUp, gocui.ModNone, cursorUpTree); err != nil {
return err return err
} }
if err := g.SetKeybinding("main", gocui.KeySpace, gocui.ModNone, toggleCollapse); err != nil { if err := g.SetKeybinding("main", gocui.KeySpace, gocui.ModNone, toggleCollapse); err != nil {
@ -240,7 +294,10 @@ func layout(g *gocui.Gui) error {
return err return err
} }
v.Wrap = true v.Wrap = true
v.Highlight = true
v.SelBgColor = gocui.ColorGreen
v.SelFgColor = gocui.ColorBlack
showCurNodeInSideBar(g, v)
} }
if v, err := g.SetView("main", splitCol, -1, maxX, maxY); err != nil { if v, err := g.SetView("main", splitCol, -1, maxX, maxY); err != nil {
if err != gocui.ErrUnknownView { if err != gocui.ErrUnknownView {
@ -260,7 +317,7 @@ func layout(g *gocui.Gui) error {
} }
func main() { func main() {
demo() //demo()
initialize() initialize()
g, err := gocui.NewGui(gocui.OutputNormal) g, err := gocui.NewGui(gocui.OutputNormal)

View File

@ -70,18 +70,12 @@ func initialize() {
var trees []*FileTree var trees []*FileTree
trees = make([]*FileTree, 0) trees = make([]*FileTree, 0)
for _, treeName := range manifest.Layers { for _, treeName := range manifest.Layers {
fmt.Printf("%s\n", treeName)
trees = append(trees, layerMap[treeName]) trees = append(trees, layerMap[treeName])
} }
for ix := range trees {
if ix > 0 {
trees[0].Stack(trees[ix])
}
}
fmt.Printf("Manifest is %+v\n\n", manifest)
data.manifest = &manifest data.manifest = &manifest
data.tree = trees[0] data.refTrees = trees
data.tree = StackRange(trees, 0)
} }
func getFileList(parentReader *tar.Reader, h *tar.Header) []FileChangeInfo { func getFileList(parentReader *tar.Reader, h *tar.Header) []FileChangeInfo {