added layerview pgup/pgdown

This commit is contained in:
Alex Goodman 2019-02-17 13:25:14 -05:00
parent eb31a6290e
commit 184d3a2b0c
No known key found for this signature in database
GPG Key ID: 743640FAA11698A1
3 changed files with 91 additions and 26 deletions

View File

@ -15,8 +15,6 @@ import (
"github.com/wagoodman/dive/utils" "github.com/wagoodman/dive/utils"
) )
const pathSep = string(os.PathSeparator)
var cfgFile string var cfgFile string
var exportFile string var exportFile string
var ciConfigFile string var ciConfigFile string
@ -139,7 +137,7 @@ func getCfgFile(fromFlag string) string {
xdgHome := os.Getenv("XDG_CONFIG_HOME") xdgHome := os.Getenv("XDG_CONFIG_HOME")
xdgDirs := os.Getenv("XDG_CONFIG_DIRS") xdgDirs := os.Getenv("XDG_CONFIG_DIRS")
xdgPaths := append([]string{xdgHome}, strings.Split(xdgDirs, ":")...) xdgPaths := append([]string{xdgHome}, strings.Split(xdgDirs, ":")...)
allDirs := append(xdgPaths, home+pathSep+".config") allDirs := append(xdgPaths, path.Join(home, ".config"))
for _, val := range allDirs { for _, val := range allDirs {
file := findInPath(val) file := findInPath(val)
@ -147,13 +145,13 @@ func getCfgFile(fromFlag string) string {
return file return file
} }
} }
return home + pathSep + "dive.yaml" return path.Join(home, ".dive.yaml")
} }
// findInPath returns first "*.yaml" file in path's subdirectory "dive" // findInPath returns first "*.yaml" file in path's subdirectory "dive"
// if not found returns empty string // if not found returns empty string
func findInPath(pathTo string) string { func findInPath(pathTo string) string {
directory := pathTo + pathSep + "dive" directory := path.Join(pathTo, "dive")
files, err := ioutil.ReadDir(directory) files, err := ioutil.ReadDir(directory)
if err != nil { if err != nil {
return "" return ""
@ -162,7 +160,7 @@ func findInPath(pathTo string) string {
for _, file := range files { for _, file := range files {
filename := file.Name() filename := file.Name()
if path.Ext(filename) == ".yaml" { if path.Ext(filename) == ".yaml" {
return directory + pathSep + filename return path.Join(directory, filename)
} }
} }
return "" return ""

View File

@ -28,6 +28,8 @@ type LayerView struct {
keybindingCompareAll []keybinding.Key keybindingCompareAll []keybinding.Key
keybindingCompareLayer []keybinding.Key keybindingCompareLayer []keybinding.Key
keybindingPageDown []keybinding.Key
keybindingPageUp []keybinding.Key
} }
// NewDetailsView creates a new view object attached the the global [gocui] screen object. // NewDetailsView creates a new view object attached the the global [gocui] screen object.
@ -59,6 +61,16 @@ func NewLayerView(name string, gui *gocui.Gui, layers []image.Layer) (layerView
log.Panicln(err) log.Panicln(err)
} }
layerView.keybindingPageUp, err = keybinding.ParseAll(viper.GetString("keybinding.page-up"))
if err != nil {
log.Panicln(err)
}
layerView.keybindingPageDown, err = keybinding.ParseAll(viper.GetString("keybinding.page-down"))
if err != nil {
log.Panicln(err)
}
return layerView return layerView
} }
@ -84,6 +96,17 @@ func (view *LayerView) Setup(v *gocui.View, header *gocui.View) error {
return err return err
} }
for _, key := range view.keybindingPageUp {
if err := view.gui.SetKeybinding(view.Name, key.Value, key.Modifier, func(*gocui.Gui, *gocui.View) error { return view.PageUp() }); err != nil {
return err
}
}
for _, key := range view.keybindingPageDown {
if err := view.gui.SetKeybinding(view.Name, key.Value, key.Modifier, func(*gocui.Gui, *gocui.View) error { return view.PageDown() }); err != nil {
return err
}
}
for _, key := range view.keybindingCompareLayer { for _, key := range view.keybindingCompareLayer {
if err := view.gui.SetKeybinding(view.Name, key.Value, key.Modifier, func(*gocui.Gui, *gocui.View) error { return view.setCompareMode(CompareLayer) }); err != nil { if err := view.gui.SetKeybinding(view.Name, key.Value, key.Modifier, func(*gocui.Gui, *gocui.View) error { return view.setCompareMode(CompareLayer) }); err != nil {
return err return err
@ -99,6 +122,13 @@ func (view *LayerView) Setup(v *gocui.View, header *gocui.View) error {
return view.Render() return view.Render()
} }
// height obtains the height of the current pane (taking into account the lost space due to the header).
func (view *LayerView) height() uint {
_, height := view.view.Size()
return uint(height - 1)
}
// IsVisible indicates if the layer view pane is currently initialized. // IsVisible indicates if the layer view pane is currently initialized.
func (view *LayerView) IsVisible() bool { func (view *LayerView) IsVisible() bool {
if view == nil { if view == nil {
@ -107,6 +137,45 @@ func (view *LayerView) IsVisible() bool {
return true return true
} }
// PageDown moves to next page putting the cursor on top
func (view *LayerView) PageDown() error {
step := int(view.height())+1
targetLayerIndex := view.LayerIndex + step
if targetLayerIndex > len(view.Layers) {
step -= targetLayerIndex - (len(view.Layers) -1)
targetLayerIndex = view.LayerIndex + step
}
if step > 0 {
err := CursorStep(view.gui, view.view, step)
if err == nil {
view.SetCursor(view.LayerIndex + step)
}
}
return nil
}
// PageUp moves to previous page putting the cursor on top
func (view *LayerView) PageUp() error {
step := int(view.height())+1
targetLayerIndex := view.LayerIndex - step
if targetLayerIndex < 0 {
step += targetLayerIndex
targetLayerIndex = view.LayerIndex - step
}
if step > 0 {
err := CursorStep(view.gui, view.view, -step)
if err == nil {
view.SetCursor(view.LayerIndex - step)
}
}
return nil
}
// CursorDown moves the cursor down in the layer pane (selecting a higher layer). // CursorDown moves the cursor down in the layer pane (selecting a higher layer).
func (view *LayerView) CursorDown() error { func (view *LayerView) CursorDown() error {
if view.LayerIndex < len(view.Layers) { if view.LayerIndex < len(view.Layers) {

View File

@ -110,31 +110,29 @@ func toggleFilterView(g *gocui.Gui, v *gocui.View) error {
// CursorDown moves the cursor down in the currently selected gocui pane, scrolling the screen as needed. // CursorDown moves the cursor down in the currently selected gocui pane, scrolling the screen as needed.
func CursorDown(g *gocui.Gui, v *gocui.View) error { func CursorDown(g *gocui.Gui, v *gocui.View) error {
cx, cy := v.Cursor() return CursorStep(g, v,1)
// if there isn't a next line
line, err := v.Line(cy + 1)
if err != nil {
// todo: handle error
}
if len(line) == 0 {
return errors.New("unable to move cursor down, empty line")
}
if err := v.SetCursor(cx, cy+1); err != nil {
ox, oy := v.Origin()
if err := v.SetOrigin(ox, oy+1); err != nil {
return err
}
}
return nil
} }
// CursorUp moves the cursor up in the currently selected gocui pane, scrolling the screen as needed. // CursorUp moves the cursor up in the currently selected gocui pane, scrolling the screen as needed.
func CursorUp(g *gocui.Gui, v *gocui.View) error { func CursorUp(g *gocui.Gui, v *gocui.View) error {
ox, oy := v.Origin() return CursorStep(g, v,-1)
}
// Moves the cursor the given step distance, setting the origin to the new cursor line
func CursorStep(g *gocui.Gui, v *gocui.View, step int) error {
cx, cy := v.Cursor() cx, cy := v.Cursor()
if err := v.SetCursor(cx, cy-1); err != nil && oy > 0 {
if err := v.SetOrigin(ox, oy-1); err != nil { // if there isn't a next line
line, err := v.Line(cy+step)
if err != nil {
// todo: handle error
}
if len(line) == 0 {
return errors.New("unable to move the cursor, empty line")
}
if err := v.SetCursor(cx, cy+step); err != nil {
ox, oy := v.Origin()
if err := v.SetOrigin(ox, oy+step); err != nil {
return err return err
} }
} }