abstracted layerview

This commit is contained in:
Alex Goodman 2018-06-03 23:18:41 -04:00
parent 0b86d01864
commit db1fb9452c
No known key found for this signature in database
GPG Key ID: 05328C611D8A520E
3 changed files with 93 additions and 65 deletions

View File

@ -35,50 +35,50 @@ func NewFileTreeView(name string, gui *gocui.Gui, view *gocui.View, tree *FileTr
return treeview return treeview
} }
func (treeview *FileTreeView) keybindings() error { func (view *FileTreeView) keybindings() error {
if err := treeview.gui.SetKeybinding(treeview.name, gocui.KeyArrowDown, gocui.ModNone, func(*gocui.Gui, *gocui.View) error { return treeview.cursorDown() }); err != nil { if err := view.gui.SetKeybinding(view.name, gocui.KeyArrowDown, gocui.ModNone, func(*gocui.Gui, *gocui.View) error { return view.cursorDown() }); err != nil {
return err return err
} }
if err := treeview.gui.SetKeybinding(treeview.name, gocui.KeyArrowUp, gocui.ModNone, func(*gocui.Gui, *gocui.View) error { return treeview.cursorUp() }); err != nil { if err := view.gui.SetKeybinding(view.name, gocui.KeyArrowUp, gocui.ModNone, func(*gocui.Gui, *gocui.View) error { return view.cursorUp() }); err != nil {
return err return err
} }
if err := treeview.gui.SetKeybinding(treeview.name, gocui.KeySpace, gocui.ModNone, func(*gocui.Gui, *gocui.View) error { return treeview.toggleCollapse() }); err != nil { if err := view.gui.SetKeybinding(view.name, gocui.KeySpace, gocui.ModNone, func(*gocui.Gui, *gocui.View) error { return view.toggleCollapse() }); err != nil {
return err return err
} }
return nil return nil
} }
// Mehh, this is just a bad method // Mehh, this is just a bad method
func (treeview *FileTreeView) reset(tree *FileTree) error { func (view *FileTreeView) reset(tree *FileTree) error {
treeview.tree = tree view.tree = tree
treeview.view.SetCursor(0, 0) view.view.SetCursor(0, 0)
treeview.absTreeIndex = 0 view.absTreeIndex = 0
return treeview.render() return view.render()
} }
func (treeview *FileTreeView) cursorDown() error { func (view *FileTreeView) cursorDown() error {
err := cursorDown(treeview.gui, treeview.view) err := cursorDown(view.gui, view.view)
if err == nil { if err == nil {
treeview.absTreeIndex++ view.absTreeIndex++
} }
return nil return nil
} }
func (treeview *FileTreeView) cursorUp() error { func (view *FileTreeView) cursorUp() error {
err := cursorUp(treeview.gui, treeview.view) err := cursorUp(view.gui, view.view)
if err == nil { if err == nil {
treeview.absTreeIndex-- view.absTreeIndex--
} }
return nil return nil
} }
func (treeview *FileTreeView) getAbsPositionNode() (node *FileNode) { func (view *FileTreeView) 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 uint
visiter = func(curNode *FileNode) error { visiter = func(curNode *FileNode) error {
if dfsCounter == treeview.absTreeIndex { if dfsCounter == view.absTreeIndex {
node = curNode node = curNode
} }
dfsCounter++ dfsCounter++
@ -89,7 +89,7 @@ func (treeview *FileTreeView) getAbsPositionNode() (node *FileNode) {
return !curNode.collapsed return !curNode.collapsed
} }
err := treeview.tree.VisitDepthParentFirst(visiter, evaluator) err := view.tree.VisitDepthParentFirst(visiter, evaluator)
if err != nil { if err != nil {
// todo: you guessed it, check errors // todo: you guessed it, check errors
} }
@ -97,17 +97,17 @@ func (treeview *FileTreeView) getAbsPositionNode() (node *FileNode) {
return node return node
} }
func (treeview *FileTreeView) toggleCollapse() error { func (view *FileTreeView) toggleCollapse() error {
node := treeview.getAbsPositionNode() node := view.getAbsPositionNode()
node.collapsed = !node.collapsed node.collapsed = !node.collapsed
return treeview.render() return view.render()
} }
func (treeview *FileTreeView) render() error { func (view *FileTreeView) render() error {
renderString := treeview.tree.String() renderString := view.tree.String()
treeview.gui.Update(func(g *gocui.Gui) error { view.gui.Update(func(g *gocui.Gui) error {
treeview.view.Clear() view.view.Clear()
_, err := fmt.Fprintln(treeview.view, renderString) _, err := fmt.Fprintln(view.view, renderString)
return err return err
}) })
return nil return nil

View File

@ -6,14 +6,51 @@ import (
"github.com/jroimartin/gocui" "github.com/jroimartin/gocui"
) )
func renderSideBar(g *gocui.Gui, v *gocui.View) error { type LayerView struct {
g.Update(func(g *gocui.Gui) error { name string
v, _ := g.View("side") gui *gocui.Gui
// todo: handle above error. view *gocui.View
v.Clear() layerIndex uint
//_, err := fmt.Fprintf(v, "FileNode:\n%+v\n\n", getAbsPositionNode()) manifest *Manifest
for ix, layerName := range data.manifest.Layers { }
fmt.Fprintf(v, "%d: %s\n", ix+1, layerName[0:25])
func NewLayerView(name string, gui *gocui.Gui, view *gocui.View, manifest *Manifest) (layerview *LayerView) {
layerview = new(LayerView)
// populate main fields
layerview.name = name
layerview.gui = gui
layerview.view = view
layerview.manifest = manifest
// set view options
layerview.view.Wrap = true
layerview.view.Highlight = true
layerview.view.SelBgColor = gocui.ColorGreen
layerview.view.SelFgColor = gocui.ColorBlack
layerview.render()
return layerview
}
func (view *LayerView) keybindings() error {
if err := view.gui.SetKeybinding("side", gocui.KeyArrowDown, gocui.ModNone, func(*gocui.Gui, *gocui.View) error { return view.cursorDown() }); err != nil {
return err
}
if err := view.gui.SetKeybinding("side", gocui.KeyArrowUp, gocui.ModNone, func(*gocui.Gui, *gocui.View) error { return view.cursorUp() }); err != nil {
return err
}
return nil
}
func (view *LayerView) render() error {
view.gui.Update(func(g *gocui.Gui) error {
view.view.Clear()
for ix, layerName := range view.manifest.Layers {
fmt.Fprintf(view.view, "%d: %s\n", ix+1, layerName[0:25])
} }
return nil return nil
}) })
@ -21,22 +58,22 @@ func renderSideBar(g *gocui.Gui, v *gocui.View) error {
return nil return nil
} }
func cursorDownLayers(g *gocui.Gui, v *gocui.View) error { func (view *LayerView) cursorDown() error {
if v != nil && int(view.layerIndex) < len(data.manifest.Layers) { if int(view.layerIndex) < len(data.manifest.Layers) {
cursorDown(g, v) cursorDown(view.gui, view.view)
view.layerIndex++ view.layerIndex++
renderSideBar(g, v) view.render()
view.treeView.reset(StackRange(data.refTrees, view.layerIndex)) views.treeView.reset(StackRange(data.refTrees, view.layerIndex))
} }
return nil return nil
} }
func cursorUpLayers(g *gocui.Gui, v *gocui.View) error { func (view *LayerView) cursorUp() error {
if v != nil && int(view.layerIndex) > 0 { if int(view.layerIndex) > 0 {
cursorUp(g, v) cursorUp(view.gui, view.view)
view.layerIndex-- view.layerIndex--
renderSideBar(g, v) view.render()
view.treeView.reset(StackRange(data.refTrees, view.layerIndex)) views.treeView.reset(StackRange(data.refTrees, view.layerIndex))
} }
return nil return nil
} }

33
main.go
View File

@ -19,10 +19,9 @@ var data struct {
manifest *Manifest manifest *Manifest
} }
var view struct { var views struct {
treeView *FileTreeView treeView *FileTreeView
// layerView *LayerView layerView *LayerView
layerIndex uint
} }
func check(e error) { func check(e error) {
@ -119,11 +118,11 @@ func demo() {
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
func nextView(g *gocui.Gui, v *gocui.View) error { func nextView(g *gocui.Gui, v *gocui.View) error {
if v == nil || v.Name() == "side" { if v == nil || v.Name() == views.layerView.name {
_, err := g.SetCurrentView("main") _, err := g.SetCurrentView(views.treeView.name)
return err return err
} }
_, err := g.SetCurrentView("side") _, err := g.SetCurrentView(views.layerView.name)
return err return err
} }
@ -175,12 +174,6 @@ func keybindings(g *gocui.Gui) error {
if err := g.SetKeybinding("main", gocui.KeyCtrlSpace, gocui.ModNone, nextView); err != nil { if err := g.SetKeybinding("main", gocui.KeyCtrlSpace, gocui.ModNone, nextView); err != nil {
return err 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
}
return nil return nil
} }
@ -192,21 +185,19 @@ func layout(g *gocui.Gui) error {
if err != gocui.ErrUnknownView { if err != gocui.ErrUnknownView {
return err return err
} }
v.Wrap = true views.layerView = NewLayerView("side", g, v, data.manifest)
v.Highlight = true views.layerView.keybindings()
v.SelBgColor = gocui.ColorGreen
v.SelFgColor = gocui.ColorBlack
renderSideBar(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 {
return err return err
} }
view.treeView = NewFileTreeView("main", g, v, StackRange(data.refTrees, 0)) views.treeView = NewFileTreeView("main", g, v, StackRange(data.refTrees, 0))
view.treeView.keybindings() views.treeView.keybindings()
if _, err := g.SetCurrentView("main"); err != nil { if _, err := g.SetCurrentView(views.treeView.name); err != nil {
return err return err
} }
} }