Add collapse all directory keybinding (#162)

* collapse all dir feature (closes #151)

* render single title for keybindings
This commit is contained in:
Alex Goodman 2019-02-18 16:59:32 -05:00 committed by GitHub
parent 9943096f6a
commit 327814f589
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 59 additions and 19 deletions

View File

@ -176,17 +176,18 @@ You can override the CI config path with the `--ci-config` option.
Key Binding | Description Key Binding | Description
-------------------------------------------|--------------------------------------------------------- -------------------------------------------|---------------------------------------------------------
<kbd>Ctrl + C</kbd> | Exit <kbd>Ctrl + C</kbd> | Exit
<kbd>Tab</kbd> or <kbd>Ctrl + Space</kbd> | Switch between the layer and filetree views <kbd>Tab</kbd> | Switch between the layer and filetree views
<kbd>Ctrl + F</kbd> | Filter files <kbd>Ctrl + F</kbd> | Filter files
<kbd>PageUp</kbd> | Scroll up a page
<kbd>PageDown</kbd> | Scroll down a page
<kbd>Ctrl + A</kbd> | Layer view: see aggregated image modifications <kbd>Ctrl + A</kbd> | Layer view: see aggregated image modifications
<kbd>Ctrl + L</kbd> | Layer view: see current layer modifications <kbd>Ctrl + L</kbd> | Layer view: see current layer modifications
<kbd>Space</kbd> | Filetree view: collapse/uncollapse a directory <kbd>Space</kbd> | Filetree view: collapse/uncollapse a directory
<kbd>Ctrl + Space</kbd> | Filetree view: collapse/uncollapse all directories
<kbd>Ctrl + A</kbd> | Filetree view: show/hide added files <kbd>Ctrl + A</kbd> | Filetree view: show/hide added files
<kbd>Ctrl + R</kbd> | Filetree view: show/hide removed files <kbd>Ctrl + R</kbd> | Filetree view: show/hide removed files
<kbd>Ctrl + M</kbd> | Filetree view: show/hide modified files <kbd>Ctrl + M</kbd> | Filetree view: show/hide modified files
<kbd>Ctrl + U</kbd> | Filetree view: show/hide unmodified files <kbd>Ctrl + U</kbd> | Filetree view: show/hide unmodified files
<kbd>PageUp</kbd> | Filetree view: scroll up a page
<kbd>PageDown</kbd> | Filetree view: scroll down a page
## UI Configuration ## UI Configuration

View File

@ -59,13 +59,14 @@ func initConfig() {
viper.SetDefault("log.enabled", true) viper.SetDefault("log.enabled", true)
// keybindings: status view / global // keybindings: status view / global
viper.SetDefault("keybinding.quit", "ctrl+c") viper.SetDefault("keybinding.quit", "ctrl+c")
viper.SetDefault("keybinding.toggle-view", "tab, ctrl+space") viper.SetDefault("keybinding.toggle-view", "tab")
viper.SetDefault("keybinding.filter-files", "ctrl+f, ctrl+slash") viper.SetDefault("keybinding.filter-files", "ctrl+f, ctrl+slash")
// keybindings: layer view // keybindings: layer view
viper.SetDefault("keybinding.compare-all", "ctrl+a") viper.SetDefault("keybinding.compare-all", "ctrl+a")
viper.SetDefault("keybinding.compare-layer", "ctrl+l") viper.SetDefault("keybinding.compare-layer", "ctrl+l")
// keybindings: filetree view // keybindings: filetree view
viper.SetDefault("keybinding.toggle-collapse-dir", "space") viper.SetDefault("keybinding.toggle-collapse-dir", "space")
viper.SetDefault("keybinding.toggle-collapse-all-dir", "ctrl+space")
viper.SetDefault("keybinding.toggle-added-files", "ctrl+a") viper.SetDefault("keybinding.toggle-added-files", "ctrl+a")
viper.SetDefault("keybinding.toggle-removed-files", "ctrl+r") viper.SetDefault("keybinding.toggle-removed-files", "ctrl+r")
viper.SetDefault("keybinding.toggle-modified-files", "ctrl+m") viper.SetDefault("keybinding.toggle-modified-files", "ctrl+m")

View File

@ -39,13 +39,14 @@ type FileTreeView struct {
bufferIndexUpperBound uint bufferIndexUpperBound uint
bufferIndexLowerBound uint bufferIndexLowerBound uint
keybindingToggleCollapse []keybinding.Key keybindingToggleCollapse []keybinding.Key
keybindingToggleAdded []keybinding.Key keybindingToggleCollapseAll []keybinding.Key
keybindingToggleRemoved []keybinding.Key keybindingToggleAdded []keybinding.Key
keybindingToggleModified []keybinding.Key keybindingToggleRemoved []keybinding.Key
keybindingToggleUnchanged []keybinding.Key keybindingToggleModified []keybinding.Key
keybindingPageDown []keybinding.Key keybindingToggleUnchanged []keybinding.Key
keybindingPageUp []keybinding.Key keybindingPageDown []keybinding.Key
keybindingPageUp []keybinding.Key
} }
// NewFileTreeView creates a new view object attached the the global [gocui] screen object. // NewFileTreeView creates a new view object attached the the global [gocui] screen object.
@ -82,6 +83,11 @@ func NewFileTreeView(name string, gui *gocui.Gui, tree *filetree.FileTree, refTr
log.Panicln(err) log.Panicln(err)
} }
treeView.keybindingToggleCollapseAll, err = keybinding.ParseAll(viper.GetString("keybinding.toggle-collapse-all-dir"))
if err != nil {
log.Panicln(err)
}
treeView.keybindingToggleAdded, err = keybinding.ParseAll(viper.GetString("keybinding.toggle-added-files")) treeView.keybindingToggleAdded, err = keybinding.ParseAll(viper.GetString("keybinding.toggle-added-files"))
if err != nil { if err != nil {
log.Panicln(err) log.Panicln(err)
@ -158,6 +164,11 @@ func (view *FileTreeView) Setup(v *gocui.View, header *gocui.View) error {
return err return err
} }
} }
for _, key := range view.keybindingToggleCollapseAll {
if err := view.gui.SetKeybinding(view.Name, key.Value, key.Modifier, func(*gocui.Gui, *gocui.View) error { return view.toggleCollapseAll() }); err != nil {
return err
}
}
for _, key := range view.keybindingToggleAdded { for _, key := range view.keybindingToggleAdded {
if err := view.gui.SetKeybinding(view.Name, key.Value, key.Modifier, func(*gocui.Gui, *gocui.View) error { return view.toggleShowDiffType(filetree.Added) }); err != nil { if err := view.gui.SetKeybinding(view.Name, key.Value, key.Modifier, func(*gocui.Gui, *gocui.View) error { return view.toggleShowDiffType(filetree.Added) }); err != nil {
return err return err
@ -466,13 +477,39 @@ func (view *FileTreeView) getAbsPositionNode() (node *filetree.FileNode) {
// toggleCollapse will collapse/expand the selected FileNode. // toggleCollapse will collapse/expand the selected FileNode.
func (view *FileTreeView) toggleCollapse() error { func (view *FileTreeView) toggleCollapse() error {
node := view.getAbsPositionNode() node := view.getAbsPositionNode()
if node != nil { if node != nil && node.Data.FileInfo.IsDir {
node.Data.ViewInfo.Collapsed = !node.Data.ViewInfo.Collapsed node.Data.ViewInfo.Collapsed = !node.Data.ViewInfo.Collapsed
} }
view.Update() view.Update()
return view.Render() return view.Render()
} }
// toggleCollapseAll will collapse/expand the all directories.
func (view *FileTreeView) toggleCollapseAll() error {
node := view.getAbsPositionNode()
var collapseTargetState bool
if node != nil && node.Data.FileInfo.IsDir {
collapseTargetState = !node.Data.ViewInfo.Collapsed
}
visitor := func(curNode *filetree.FileNode) error {
curNode.Data.ViewInfo.Collapsed = collapseTargetState
return nil
}
evaluator := func(curNode *filetree.FileNode) bool {
return curNode.Data.FileInfo.IsDir
}
err := view.ModelTree.VisitDepthChildFirst(visitor, evaluator)
if err != nil {
logrus.Panic(err)
}
view.Update()
return view.Render()
}
// toggleShowDiffType will show/hide the selected DiffType in the filetree pane. // toggleShowDiffType will show/hide the selected DiffType in the filetree pane.
func (view *FileTreeView) toggleShowDiffType(diffType filetree.DiffType) error { func (view *FileTreeView) toggleShowDiffType(diffType filetree.DiffType) error {
view.HiddenDiffTypes[diffType] = !view.HiddenDiffTypes[diffType] view.HiddenDiffTypes[diffType] = !view.HiddenDiffTypes[diffType]
@ -589,8 +626,9 @@ func (view *FileTreeView) Render() error {
// KeyHelp indicates all the possible actions a user can take while the current pane is selected. // KeyHelp indicates all the possible actions a user can take while the current pane is selected.
func (view *FileTreeView) KeyHelp() string { func (view *FileTreeView) KeyHelp() string {
return renderStatusOption(view.keybindingToggleCollapse[0].String(), "Collapse dir", false) + return renderStatusOption(view.keybindingToggleCollapse[0].String(), "Collapse dir", false) +
renderStatusOption(view.keybindingToggleAdded[0].String(), "Added files", !view.HiddenDiffTypes[filetree.Added]) + renderStatusOption(view.keybindingToggleCollapseAll[0].String(), "Collapse all dir", false) +
renderStatusOption(view.keybindingToggleRemoved[0].String(), "Removed files", !view.HiddenDiffTypes[filetree.Removed]) + renderStatusOption(view.keybindingToggleAdded[0].String(), "Added", !view.HiddenDiffTypes[filetree.Added]) +
renderStatusOption(view.keybindingToggleModified[0].String(), "Modified files", !view.HiddenDiffTypes[filetree.Changed]) + renderStatusOption(view.keybindingToggleRemoved[0].String(), "Removed", !view.HiddenDiffTypes[filetree.Removed]) +
renderStatusOption(view.keybindingToggleUnchanged[0].String(), "Unmodified files", !view.HiddenDiffTypes[filetree.Unchanged]) renderStatusOption(view.keybindingToggleModified[0].String(), "Modified", !view.HiddenDiffTypes[filetree.Changed]) +
renderStatusOption(view.keybindingToggleUnchanged[0].String(), "Unmodified", !view.HiddenDiffTypes[filetree.Unchanged])
} }

View File

@ -77,5 +77,5 @@ func (view *StatusView) Render() error {
func (view *StatusView) KeyHelp() string { func (view *StatusView) KeyHelp() string {
return renderStatusOption(GlobalKeybindings.quit[0].String(), "Quit", false) + return renderStatusOption(GlobalKeybindings.quit[0].String(), "Quit", false) +
renderStatusOption(GlobalKeybindings.toggleView[0].String(), "Switch view", false) + renderStatusOption(GlobalKeybindings.toggleView[0].String(), "Switch view", false) +
renderStatusOption(GlobalKeybindings.filterView[0].String(), "Filter files", Views.Filter.IsVisible()) renderStatusOption(GlobalKeybindings.filterView[0].String(), "Filter", Views.Filter.IsVisible())
} }

View File

@ -295,9 +295,9 @@ func Render() {
// renderStatusOption formats key help bindings-to-title pairs. // renderStatusOption formats key help bindings-to-title pairs.
func renderStatusOption(control, title string, selected bool) string { func renderStatusOption(control, title string, selected bool) string {
if selected { if selected {
return Formatting.StatusSelected("▏") + Formatting.StatusControlSelected(control) + Formatting.StatusSelected(" "+title+" ") return Formatting.StatusSelected("▏") + Formatting.StatusControlSelected(control) + Formatting.StatusSelected(" "+title+" ")
} else { } else {
return Formatting.StatusNormal("▏") + Formatting.StatusControlNormal(control) + Formatting.StatusNormal(" "+title+" ") return Formatting.StatusNormal("▏") + Formatting.StatusControlNormal(control) + Formatting.StatusNormal(" "+title+" ")
} }
} }