summaryrefslogtreecommitdiffstats
path: root/main.go
diff options
context:
space:
mode:
authorAlex Goodman <wagoodman@gmail.com>2018-05-28 10:53:08 -0400
committerAlex Goodman <wagoodman@gmail.com>2018-05-31 17:11:52 -0400
commit8f3e4b42d7278c923042838edd2fa9e166454b62 (patch)
tree6b40da86ff8611cda023ba9e94eb41722b0b009c /main.go
parent0d2b6551b33e0f743ee38181ecefa728085a9abb (diff)
add tree browser concept
Diffstat (limited to 'main.go')
-rw-r--r--main.go200
1 files changed, 200 insertions, 0 deletions
diff --git a/main.go b/main.go
index 97138b3..6ddb9d5 100644
--- a/main.go
+++ b/main.go
@@ -9,8 +9,16 @@ import (
"github.com/docker/docker/client"
"golang.org/x/net/context"
+ "github.com/jroimartin/gocui"
+ "log"
)
+var data struct {
+ tree *FileTree
+ absPosition uint
+}
+
+
func check(e error) {
if e != nil {
panic(e)
@@ -101,3 +109,195 @@ func demo() {
}
fmt.Println("See './image' for the cached image tar")
}
+
+
+
+
+
+
+
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+
+
+
+
+func getAbsPositionNode() (node *Node) {
+ var visiter func(*Node) error
+ var evaluator func(*Node) bool
+ var dfsCounter uint
+
+ visiter = func(curNode *Node) error {
+ if dfsCounter == data.absPosition {
+ node = curNode
+ }
+ dfsCounter++
+ return nil
+ }
+
+ evaluator = func(curNode *Node) bool {
+ return !curNode.collapsed
+ }
+
+ err := data.tree.VisitDepthParentFirst(visiter, evaluator)
+ if err != nil {
+ // todo: you guessed it, check errors
+ }
+
+ return node
+}
+
+func showCurNodeInSideBar(g *gocui.Gui, v *gocui.View) error {
+ g.Update(func(g *gocui.Gui) error {
+ v, _ := g.View("side")
+ // todo: handle above error.
+ v.Clear()
+ _, err := fmt.Fprintf(v, "Node:\n%+v\n", getAbsPositionNode())
+ return err
+ })
+ // todo: blerg
+ return nil
+}
+
+func cursorDown(g *gocui.Gui, v *gocui.View) error {
+ if v != nil {
+ cx, cy := v.Cursor()
+
+ // if there isn't a next line
+ line, err := v.Line(cy+1)
+ if err != nil {
+ // 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
+ }
+ }
+ data.absPosition++
+ showCurNodeInSideBar(g, v)
+ }
+ return nil
+}
+
+func cursorUp(g *gocui.Gui, v *gocui.View) error {
+ if v != nil {
+ ox, oy := v.Origin()
+ cx, cy := v.Cursor()
+ if err := v.SetCursor(cx, cy-1); err != nil && oy > 0 {
+ if err := v.SetOrigin(ox, oy-1); err != nil {
+ return err
+ }
+ }
+ data.absPosition--
+ showCurNodeInSideBar(g, v)
+ }
+ return nil
+}
+
+
+func toggleCollapse(g *gocui.Gui, v *gocui.View) error {
+ node := getAbsPositionNode()
+ node.collapsed = !node.collapsed
+ return drawTree(g, v)
+}
+
+func drawTree(g *gocui.Gui, v *gocui.View) error {
+ g.Update(func(g *gocui.Gui) error {
+ v, _ := g.View("main")
+ // todo: handle above error.
+ v.Clear()
+ _, err := fmt.Fprintln(v, data.tree.String())
+ return err
+ })
+ return nil
+}
+
+
+func quit(g *gocui.Gui, v *gocui.View) error {
+ return gocui.ErrQuit
+}
+
+func keybindings(g *gocui.Gui) error {
+ if err := g.SetKeybinding("", gocui.KeyCtrlC, gocui.ModNone, quit); err != nil {
+ return err
+ }
+ //if err := g.SetKeybinding("main", gocui.MouseLeft, gocui.ModNone, toggleCollapse); err != nil {
+ // return err
+ //}
+ if err := g.SetKeybinding("main", gocui.KeyArrowDown, gocui.ModNone, cursorDown); err != nil {
+ return err
+ }
+ if err := g.SetKeybinding("main", gocui.KeyArrowUp, gocui.ModNone, cursorUp); err != nil {
+ return err
+ }
+ if err := g.SetKeybinding("main", gocui.KeySpace, gocui.ModNone, toggleCollapse); err != nil {
+ return err
+ }
+ return nil
+}
+
+
+func layout(g *gocui.Gui) error {
+ maxX, maxY := g.Size()
+ splitCol := 50
+ if v, err := g.SetView("side", -1, -1, splitCol, maxY); err != nil {
+ if err != gocui.ErrUnknownView {
+ return err
+ }
+ v.Wrap = true
+ }
+ if v, err := g.SetView("main", splitCol, -1, maxX, maxY); err != nil {
+ if err != gocui.ErrUnknownView {
+ return err
+ }
+ v.Editable = false
+ v.Wrap = false
+ v.Highlight = true
+ v.SelBgColor = gocui.ColorGreen
+ v.SelFgColor = gocui.ColorBlack
+ if _, err := g.SetCurrentView("main"); err != nil {
+ return err
+ }
+ drawTree(g, v)
+ }
+ return nil
+}
+
+
+func main() {
+ data.tree = NewTree()
+ data.tree.AddPath("/etc/nginx/nginx.conf", nil)
+ data.tree.AddPath("/etc/nginx/public", nil)
+ data.tree.AddPath("/var/run/systemd", nil)
+ data.tree.AddPath("/var/run/bashful", nil)
+ data.tree.AddPath("/tmp", nil)
+ data.tree.AddPath("/tmp/nonsense", nil)
+ data.tree.AddPath("/tmp/wifi/coffeeyo", nil)
+
+ g, err := gocui.NewGui(gocui.OutputNormal)
+ if err != nil {
+ log.Panicln(err)
+ }
+ defer g.Close()
+
+ g.Cursor = false
+ //g.Mouse = true
+ g.SetManagerFunc(layout)
+
+ if err := keybindings(g); err != nil {
+ log.Panicln(err)
+ }
+
+ if err := g.MainLoop(); err != nil && err != gocui.ErrQuit {
+ log.Panicln(err)
+ }
+
+}
+
+