support paging and jumping in main view

This commit is contained in:
Jesse Duffield 2020-04-13 12:02:49 +10:00
parent c803e7d080
commit 885c32589a
4 changed files with 72 additions and 12 deletions

View File

@ -51,8 +51,7 @@ func (gui *Gui) scrollDownView(viewName string) error {
}
func (gui *Gui) currentContextViewID() string {
currentView := gui.g.CurrentView()
switch currentView.Name() {
switch gui.State.CurrentSideView {
case "packages":
return gui.selectedPackageID()
case "deps":

View File

@ -539,6 +539,13 @@ func (gui *Gui) GetInitialKeybindings() []*Binding {
{ViewName: listView.viewName, Contexts: []string{listView.context}, Key: gui.getKey("universal.prevPage"), Handler: listView.handlePrevPage, Description: gui.Tr.SLocalize("prevPage")},
{ViewName: listView.viewName, Contexts: []string{listView.context}, Key: gui.getKey("universal.nextPage"), Handler: listView.handleNextPage, Description: gui.Tr.SLocalize("nextPage")},
{ViewName: listView.viewName, Contexts: []string{listView.context}, Key: gui.getKey("universal.gotoTop"), Handler: listView.handleGotoTop, Description: gui.Tr.SLocalize("gotoTop")},
{
ViewName: listView.viewName,
Contexts: []string{listView.context},
Key: gui.getKey("universal.gotoBottom"),
Handler: listView.handleGotoBottom,
Description: gui.Tr.SLocalize("gotoBottom"),
},
{ViewName: listView.viewName, Contexts: []string{listView.context}, Key: gocui.MouseWheelDown, Handler: listView.handleNextLine},
{ViewName: listView.viewName, Contexts: []string{listView.context}, Key: gocui.MouseLeft, Handler: listView.handleClick},
{
@ -548,13 +555,6 @@ func (gui *Gui) GetInitialKeybindings() []*Binding {
Handler: gui.handleOpenSearch,
Description: gui.Tr.SLocalize("startSearch"),
},
{
ViewName: listView.viewName,
Contexts: []string{listView.context},
Key: gui.getKey("universal.gotoBottom"),
Handler: listView.handleGotoBottom,
Description: gui.Tr.SLocalize("gotoBottom"),
},
}...)
}

View File

@ -44,7 +44,10 @@ func (lv *listView) handleLineChange(change int) error {
}
}
return lv.handleItemSelect(lv.gui.g, view)
if lv.handleItemSelect != nil {
return lv.handleItemSelect(lv.gui.g, view)
}
return nil
}
func (lv *listView) handleNextPage(g *gocui.Gui, v *gocui.View) error {
@ -114,7 +117,10 @@ func (lv *listView) handleClick(g *gocui.Gui, v *gocui.View) error {
if prevSelectedLineIdx == newSelectedLineIdx && prevViewName == lv.viewName && lv.handleClickSelectedItem != nil {
return lv.handleClickSelectedItem(lv.gui.g, v)
}
return lv.handleItemSelect(lv.gui.g, v)
if lv.handleItemSelect != nil {
return lv.handleItemSelect(lv.gui.g, v)
}
return nil
}
func (lv *listView) onSearchSelect(selectedLineIdx int) error {
@ -124,7 +130,10 @@ func (lv *listView) onSearchSelect(selectedLineIdx int) error {
}
*lv.getSelectedLineIdxPtr() = selectedLineIdx
return lv.handleItemSelect(lv.gui.g, view)
if lv.handleItemSelect != nil {
return lv.handleItemSelect(lv.gui.g, view)
}
return nil
}
func (gui *Gui) menuListView() *listView {

View File

@ -30,6 +30,22 @@ func (gui *Gui) newMainCommand(cmdStr string, contextKey string) error {
v.Wrap = true
v.FgColor = theme.GocuiDefaultTextColor
selectedLine := 0
lv := &listView{
viewName: contextKey,
getItemsLength: func() int { return len(v.BufferLines()) },
getSelectedLineIdxPtr: func() *int { return &selectedLine },
handleItemSelect: gui.wrappedHandler(func() error {
if selectedLine >= len(v.BufferLines())-1 {
v.Autoscroll = true
}
return nil
}),
gui: gui,
rendersToMainView: false,
}
bindings := []*Binding{
{
ViewName: contextKey,
@ -59,6 +75,30 @@ func (gui *Gui) newMainCommand(cmdStr string, contextKey string) error {
Modifier: gocui.ModNone,
Handler: gui.wrappedHandler(gui.handleEscapeMain),
},
{
ViewName: contextKey,
Key: gui.getKey("universal.return"),
Handler: gui.handleSearchEscape,
},
{
ViewName: contextKey,
Key: gui.getKey("universal.startSearch"),
Handler: gui.handleOpenSearch,
Description: gui.Tr.SLocalize("startSearch"),
},
{ViewName: contextKey, Key: gui.getKey("universal.prevItem-alt"), Handler: gui.unsetAutoScrollWrapper(gui.scrollUpMain)},
{ViewName: contextKey, Key: gui.getKey("universal.prevItem"), Handler: gui.unsetAutoScrollWrapper(gui.scrollUpMain)},
{ViewName: contextKey, Key: gui.getKey("universal.nextItem-alt"), Handler: gui.scrollDownMain},
{ViewName: contextKey, Key: gui.getKey("universal.nextItem"), Handler: gui.scrollDownMain},
{ViewName: contextKey, Key: gui.getKey("universal.prevPage"), Handler: gui.unsetAutoScrollWrapper(lv.handlePrevPage), Description: gui.Tr.SLocalize("prevPage")},
{ViewName: contextKey, Key: gui.getKey("universal.nextPage"), Handler: lv.handleNextPage, Description: gui.Tr.SLocalize("nextPage")},
{ViewName: contextKey, Key: gui.getKey("universal.gotoTop"), Handler: gui.unsetAutoScrollWrapper(lv.handleGotoTop), Description: gui.Tr.SLocalize("gotoTop")},
{
ViewName: contextKey,
Key: gui.getKey("universal.gotoBottom"),
Handler: lv.handleGotoBottom,
Description: gui.Tr.SLocalize("gotoBottom"),
},
}
for _, binding := range bindings {
@ -68,6 +108,11 @@ func (gui *Gui) newMainCommand(cmdStr string, contextKey string) error {
}
}
v.SetOnSelectItem(gui.onSelectItemWrapper(func(selectedLineIdx int) error {
v.FocusPoint(0, selectedLineIdx)
return nil
}))
if _, err := gui.g.SetViewOnTop(contextKey); err != nil {
return err
}
@ -87,6 +132,13 @@ func (gui *Gui) newMainCommand(cmdStr string, contextKey string) error {
return gui.refreshPackages()
}
func (gui *Gui) unsetAutoScrollWrapper(f func(g *gocui.Gui, v *gocui.View) error) func(g *gocui.Gui, v *gocui.View) error {
return func(g *gocui.Gui, v *gocui.View) error {
v.Autoscroll = false
return f(g, v)
}
}
func (gui *Gui) onResize() error {
if gui.State.Ptmx == nil {
return nil