hide tarballs view when there's nothing there

This commit is contained in:
Jesse Duffield 2020-04-13 11:11:00 +10:00
parent f6fd4e536c
commit c803e7d080
15 changed files with 69 additions and 53 deletions

2
go.mod
View File

@ -10,7 +10,7 @@ require (
github.com/go-errors/errors v1.0.1
github.com/golang/protobuf v1.3.2 // indirect
github.com/integrii/flaggy v1.4.0
github.com/jesseduffield/gocui v0.3.1-0.20200413000446-b3ab1240f59e
github.com/jesseduffield/gocui v0.3.1-0.20200413011022-782bc212753a
github.com/jesseduffield/semver/v3 v3.0.4-0.20200411092651-8f1f2b3d1bc1
github.com/jesseduffield/termbox-go v0.0.0-20200405031649-4dc645f7e8ba // indirect
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0

2
go.sum
View File

@ -67,6 +67,8 @@ github.com/jesseduffield/gocui v0.3.1-0.20200411093505-aaa030344787 h1:c2+NmVOLs
github.com/jesseduffield/gocui v0.3.1-0.20200411093505-aaa030344787/go.mod h1:2RtZznzYKt8RLRwvFiSkXjU0Ei8WwHdubgnlaYH47dw=
github.com/jesseduffield/gocui v0.3.1-0.20200413000446-b3ab1240f59e h1:VbSini2EPChm0p4jJDC/xec2IlZKsdmhV9Ki3MYV434=
github.com/jesseduffield/gocui v0.3.1-0.20200413000446-b3ab1240f59e/go.mod h1:2RtZznzYKt8RLRwvFiSkXjU0Ei8WwHdubgnlaYH47dw=
github.com/jesseduffield/gocui v0.3.1-0.20200413011022-782bc212753a h1:9GBaTx6DOEmeqxpB1xnCeqduSF7gzIw/OTxGTIMMv9c=
github.com/jesseduffield/gocui v0.3.1-0.20200413011022-782bc212753a/go.mod h1:2RtZznzYKt8RLRwvFiSkXjU0Ei8WwHdubgnlaYH47dw=
github.com/jesseduffield/semver/v3 v3.0.4-0.20200411092651-8f1f2b3d1bc1 h1:dYbhdQfMw+9HmcPw53EffJusPOHRRzVuFgt1Q4TQ1OQ=
github.com/jesseduffield/semver/v3 v3.0.4-0.20200411092651-8f1f2b3d1bc1/go.mod h1:ACtpq+KxLwZY+fsQbSoKzlXIR10Xs4epLdg5Y8f1DfM=
github.com/jesseduffield/termbox-go v0.0.0-20200405031649-4dc645f7e8ba h1:hWBdYchM9nZ2+GldroQQ627ISOC83iRDdpfwY+uyJeI=

View File

@ -210,7 +210,7 @@ func (m *NpmManager) EditDepConstraint(dep *Dependency, packageJsonPath string,
return err
}
updatedConfig, err := jsonparser.Set(config, []byte(fmt.Sprintf("\"%s\"", constraint)), dep.kindKey(), dep.Name)
updatedConfig, err := jsonparser.Set(config, jsonStringValue(constraint), dep.kindKey(), dep.Name)
if err != nil {
return err
}
@ -218,6 +218,10 @@ func (m *NpmManager) EditDepConstraint(dep *Dependency, packageJsonPath string,
return ioutil.WriteFile(packageJsonPath, updatedConfig, 0644)
}
func jsonStringValue(str string) []byte {
return []byte(fmt.Sprintf("\"%s\"", strings.Replace(str, "\"", "\\\"", -1)))
}
func (m *NpmManager) EditOrAddScript(scriptName string, packageJsonPath string, newName string, newCommand string) error {
// TODO: ensure there is a 'scripts' key
@ -228,7 +232,7 @@ func (m *NpmManager) EditOrAddScript(scriptName string, packageJsonPath string,
updatedConfig := jsonparser.Delete(config, "scripts", scriptName)
updatedConfig, err = jsonparser.Set(updatedConfig, []byte(fmt.Sprintf("\"%s\"", newCommand)), "scripts", newName)
updatedConfig, err = jsonparser.Set(updatedConfig, jsonStringValue(newCommand), "scripts", newName)
if err != nil {
return err
}

View File

@ -100,7 +100,7 @@ func (gui *Gui) prepareConfirmationPanel(currentView *gocui.View, title, prompt
confirmationView.FgColor = theme.GocuiDefaultTextColor
}
gui.g.Update(func(g *gocui.Gui) error {
return gui.switchFocus(gui.g, currentView, confirmationView)
return gui.switchFocus(currentView, confirmationView)
})
return confirmationView, nil
}
@ -224,7 +224,7 @@ func (gui *Gui) createErrorPanel(message string) error {
colorFunction := color.New(color.FgRed).SprintFunc()
coloredMessage := colorFunction(strings.TrimSpace(message))
if err := gui.refreshSidePanels(refreshOptions{mode: ASYNC}); err != nil {
if err := gui.refreshPackages(); err != nil {
return err
}

View File

@ -96,7 +96,7 @@ func (gui *Gui) scrollDownConfirmationPanel(g *gocui.Gui, v *gocui.View) error {
}
func (gui *Gui) handleRefresh(g *gocui.Gui, v *gocui.View) error {
return gui.refreshSidePanels(refreshOptions{mode: ASYNC})
return gui.refreshPackages()
}
func (gui *Gui) handleMouseDownMain(g *gocui.Gui, v *gocui.View) error {
@ -110,7 +110,7 @@ func (gui *Gui) handleMouseDownMain(g *gocui.Gui, v *gocui.View) error {
return nil
}
return gui.switchFocus(gui.g, gui.g.CurrentView(), view)
return gui.switchFocus(gui.g.CurrentView(), view)
}
func (gui *Gui) handleInfoClick(g *gocui.Gui, v *gocui.View) error {
@ -185,5 +185,5 @@ func (gui *Gui) enterMainView() error {
if err != nil {
return nil
}
return gui.switchFocus(gui.g, gui.g.CurrentView(), view)
return gui.switchFocus(gui.g.CurrentView(), view)
}

View File

@ -76,13 +76,16 @@ func (gui *Gui) getViewHeights() map[string]int {
return vHeights
}
usableSpace := height - 4
extraSpace := usableSpace - (usableSpace/3)*3
mainSideViewCount := 3
if gui.showTarballsView() {
mainSideViewCount = 4
}
mainSideViewCount := 4
usableSpace := height - 4
extraSpace := usableSpace - (usableSpace/mainSideViewCount)*mainSideViewCount
if height >= 28 {
return map[string]int{
vHeights := map[string]int{
"status": 3,
"packages": (usableSpace / mainSideViewCount) + extraSpace,
"deps": usableSpace / mainSideViewCount,
@ -90,6 +93,10 @@ func (gui *Gui) getViewHeights() map[string]int {
"tarballs": usableSpace / mainSideViewCount,
"options": 1,
}
if gui.showTarballsView() {
vHeights["tarballs"] = usableSpace / mainSideViewCount
}
return vHeights
}
defaultHeight := 3
@ -103,6 +110,9 @@ func (gui *Gui) getViewHeights() map[string]int {
"scripts": defaultHeight,
"options": defaultHeight,
}
if gui.showTarballsView() {
vHeights["tarballs"] = defaultHeight
}
vHeights[currentCyclebleView] = height - defaultHeight*mainSideViewCount - 1
return vHeights
@ -262,6 +272,7 @@ func (gui *Gui) layout(g *gocui.Gui) error {
tarballsView.FgColor = textColor
tarballsView.ContainsList = true
}
tarballsView.Visible = gui.showTarballsView()
if v, err := g.SetView("options", appStatusOptionsBoundary-1, height-2, optionsVersionBoundary-1, height, 0); err != nil {
if err.Error() != "unknown view" {
@ -338,7 +349,7 @@ func (gui *Gui) layout(g *gocui.Gui) error {
return err
}
if err := gui.switchFocus(gui.g, nil, initialView); err != nil {
if err := gui.switchFocus(nil, initialView); err != nil {
return err
}
}

View File

@ -91,7 +91,7 @@ func (lv *listView) handleClick(g *gocui.Gui, v *gocui.View) error {
newSelectedLineIdx := v.SelectedLineIdx()
// we need to focus the view
if err := lv.gui.switchFocus(lv.gui.g, nil, v); err != nil {
if err := lv.gui.switchFocus(nil, v); err != nil {
return err
}

View File

@ -6,5 +6,5 @@ func (gui *Gui) handleEscapeMain() error {
if err != nil {
return nil
}
return gui.switchFocus(gui.g, nil, view)
return gui.switchFocus(nil, view)
}

View File

@ -114,7 +114,7 @@ func (gui *Gui) createMenu(title string, items []*menuItem, createMenuOptions cr
}
}
currentView := gui.g.CurrentView()
return gui.switchFocus(gui.g, currentView, menuView)
return gui.switchFocus(currentView, menuView)
})
return nil
}

View File

@ -12,7 +12,7 @@ func (gui *Gui) handleOpenSearch(g *gocui.Gui, v *gocui.View) error {
gui.State.Searching.isSearching = true
gui.State.Searching.view = v
gui.renderString("search", "")
if err := gui.switchFocus(gui.g, v, gui.getSearchView()); err != nil {
if err := gui.switchFocus(v, gui.getSearchView()); err != nil {
return err
}
@ -21,7 +21,7 @@ func (gui *Gui) handleOpenSearch(g *gocui.Gui, v *gocui.View) error {
func (gui *Gui) handleSearch(g *gocui.Gui, v *gocui.View) error {
gui.State.Searching.searchString = gui.getSearchView().Buffer()
if err := gui.switchFocus(gui.g, nil, gui.State.Searching.view); err != nil {
if err := gui.switchFocus(nil, gui.State.Searching.view); err != nil {
return err
}
@ -84,7 +84,7 @@ func (gui *Gui) onSearchEscape() error {
}
func (gui *Gui) handleSearchEscape(g *gocui.Gui, v *gocui.View) error {
if err := gui.switchFocus(gui.g, nil, gui.State.Searching.view); err != nil {
if err := gui.switchFocus(nil, gui.State.Searching.view); err != nil {
return err
}

View File

@ -19,6 +19,13 @@ func (gui *Gui) getSelectedTarball() *commands.Tarball {
}
func (gui *Gui) handleTarballSelect(g *gocui.Gui, v *gocui.View) error {
if !gui.showTarballsView() {
// we hide the tarball view when there are no tarballs
if err := gui.switchFocus(nil, gui.getScriptsView()); err != nil {
return err
}
}
tarball := gui.getSelectedTarball()
if tarball == nil {
return nil
@ -71,3 +78,7 @@ func (gui *Gui) handlePublishTarball(tarball *commands.Tarball) error {
// the name because the @ is missing
return gui.handlePublish(tarball.Name, true, tarball.ID())
}
func (gui *Gui) showTarballsView() bool {
return len(gui.State.Tarballs) > 0
}

View File

@ -10,33 +10,17 @@ import (
"github.com/spkg/bom"
)
var cyclableViews = []string{"status", "packages", "deps", "scripts", "tarballs"}
func intArrToMap(arr []int) map[int]bool {
output := map[int]bool{}
for _, el := range arr {
output[el] = true
func (gui *Gui) cyclableViews() []string {
viewNames := []string{"status", "packages", "deps", "scripts"}
if len(gui.State.Tarballs) > 0 {
viewNames = append(viewNames, "tarballs")
}
return output
}
const (
ASYNC = iota
SYNC
BLOCK_UI
)
type refreshOptions struct {
mode int
}
func (gui *Gui) refreshSidePanels(options refreshOptions) error {
// refresh status, refresh dependencies, refresh
return nil
return viewNames
}
func (gui *Gui) nextView(g *gocui.Gui, v *gocui.View) error {
var focusedViewName string
cyclableViews := gui.cyclableViews()
if v == nil || v.Name() == cyclableViews[len(cyclableViews)-1] {
focusedViewName = cyclableViews[0]
} else {
@ -59,11 +43,12 @@ func (gui *Gui) nextView(g *gocui.Gui, v *gocui.View) error {
if err := gui.resetOrigin(gui.getMainView()); err != nil {
return err
}
return gui.switchFocus(g, v, focusedView)
return gui.switchFocus(v, focusedView)
}
func (gui *Gui) previousView(g *gocui.Gui, v *gocui.View) error {
var focusedViewName string
cyclableViews := gui.cyclableViews()
if v == nil || v.Name() == cyclableViews[0] {
focusedViewName = cyclableViews[len(cyclableViews)-1]
} else {
@ -85,7 +70,7 @@ func (gui *Gui) previousView(g *gocui.Gui, v *gocui.View) error {
if err := gui.resetOrigin(gui.getMainView()); err != nil {
return err
}
return gui.switchFocus(g, v, focusedView)
return gui.switchFocus(v, focusedView)
}
func (gui *Gui) newLineFocused(g *gocui.Gui, v *gocui.View) error {
@ -121,7 +106,7 @@ func (gui *Gui) returnFocus(g *gocui.Gui, v *gocui.View) error {
gui.Log.Error(err)
}
}
return gui.switchFocus(g, v, previousView)
return gui.switchFocus(v, previousView)
}
func (gui *Gui) goToSideView(sideViewName string) func(g *gocui.Gui, v *gocui.View) error {
@ -136,7 +121,7 @@ func (gui *Gui) goToSideView(sideViewName string) func(g *gocui.Gui, v *gocui.Vi
gui.Log.Error(err)
return nil
}
return gui.switchFocus(g, nil, view)
return gui.switchFocus(nil, view)
}
}
@ -152,31 +137,31 @@ func (gui *Gui) closePopupPanels() error {
// pass in oldView = nil if you don't want to be able to return to your old view
// TODO: move some of this logic into our onFocusLost and onFocus hooks
func (gui *Gui) switchFocus(g *gocui.Gui, oldView, newView *gocui.View) error {
func (gui *Gui) switchFocus(oldView, newView *gocui.View) error {
// we assume we'll never want to return focus to a popup panel i.e.
// we should never stack popup panels
if oldView != nil && !gui.isPopupPanel(oldView.Name()) {
gui.State.PreviousView = oldView.Name()
}
if utils.IncludesString(cyclableViews, newView.Name()) {
if utils.IncludesString(gui.cyclableViews(), newView.Name()) {
gui.State.CurrentSideView = newView.Name()
}
if _, err := g.SetCurrentView(newView.Name()); err != nil {
if _, err := gui.g.SetCurrentView(newView.Name()); err != nil {
return err
}
if _, err := g.SetViewOnTop(newView.Name()); err != nil {
if _, err := gui.g.SetViewOnTop(newView.Name()); err != nil {
return err
}
g.Cursor = newView.Editable
gui.g.Cursor = newView.Editable
if err := gui.renderPanelOptions(); err != nil {
return err
}
return gui.newLineFocused(g, newView)
return gui.newLineFocused(gui.g, newView)
}
func (gui *Gui) resetOrigin(v *gocui.View) error {

View File

@ -538,7 +538,7 @@ func (g *Gui) flush() error {
}
}
for _, v := range g.views {
if v.y1 < v.y0 {
if v.y1 < v.y0 || !v.Visible {
continue
}
if v.Frame {

View File

@ -147,6 +147,8 @@ type View struct {
// IgnoreClickPosition determines whether we set the cursor upon clicking a view
IgnoreClickPosition bool
Visible bool
}
type searcher struct {
@ -315,6 +317,7 @@ func newView(name string, x0, y0, x1, y1 int, mode OutputMode, log *logrus.Entry
log: log,
topMargin: 1,
bottomMargin: y1 - y0, // TODO: this might be off by one
Visible: true,
}
return v
}

2
vendor/modules.txt vendored
View File

@ -33,7 +33,7 @@ github.com/hashicorp/hcl/json/token
# github.com/integrii/flaggy v1.4.0
## explicit
github.com/integrii/flaggy
# github.com/jesseduffield/gocui v0.3.1-0.20200413000446-b3ab1240f59e
# github.com/jesseduffield/gocui v0.3.1-0.20200413011022-782bc212753a
## explicit
github.com/jesseduffield/gocui
# github.com/jesseduffield/semver/v3 v3.0.4-0.20200411092651-8f1f2b3d1bc1