Add collapse all directory keybinding (#162)
* collapse all dir feature (closes #151) * render single title for keybindings
This commit is contained in:
parent
9943096f6a
commit
327814f589
@ -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
|
||||||
|
|
||||||
|
@ -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")
|
||||||
|
@ -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])
|
||||||
}
|
}
|
||||||
|
@ -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())
|
||||||
}
|
}
|
||||||
|
4
ui/ui.go
4
ui/ui.go
@ -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+" ")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user