diff --git a/pkg/gui/gui.go b/pkg/gui/gui.go index 9e2143d7..abb52281 100644 --- a/pkg/gui/gui.go +++ b/pkg/gui/gui.go @@ -132,10 +132,6 @@ type guiState struct { // NewGui builds a new gui handler func NewGui(log *logrus.Entry, dockerCommand *commands.DockerCommand, oSCommand *commands.OSCommand, tr *i18n.TranslationSet, config *config.AppConfig, errorChan chan error) (*Gui, error) { - previousViews := stack.New() - // push dummy initial string - previousViews.Push("") - initialState := guiState{ Platform: *oSCommand.Platform, Panels: &panelStates{ @@ -150,9 +146,19 @@ func NewGui(log *logrus.Entry, dockerCommand *commands.DockerCommand, oSCommand Project: &projectState{ContextIndex: 0}, }, SessionIndex: 0, - PreviousViews: previousViews, + PreviousViews: stack.New(), } + /* + // debugging PreviousViews + go func() { + for { + <-time.After(time.Second * 2) + log.Println("HERE", initialState.PreviousViews.Len()) + } + }() + */ + cyclableViews := []string{"project", "containers", "images", "volumes"} if dockerCommand.InDockerComposeProject { cyclableViews = []string{"project", "services", "containers", "images", "volumes"} diff --git a/pkg/gui/layout.go b/pkg/gui/layout.go index aa90d771..727b45a9 100644 --- a/pkg/gui/layout.go +++ b/pkg/gui/layout.go @@ -94,7 +94,7 @@ func (gui *Gui) layout(g *gocui.Gui) error { } currView := gui.g.CurrentView() - currentCyclebleView := gui.State.PreviousViews.Peek().(string) + currentCyclebleView := gui.peekPreviousView() if currView != nil { viewName := currView.Name() usePreviouseView := true @@ -106,7 +106,7 @@ func (gui *Gui) layout(g *gocui.Gui) error { } } if usePreviouseView { - currentCyclebleView = gui.State.PreviousViews.Peek().(string) + currentCyclebleView = gui.peekPreviousView() } } @@ -273,7 +273,7 @@ func (gui *Gui) layout(g *gocui.Gui) error { } if gui.g.CurrentView() == nil { - v, err := gui.g.View(gui.State.PreviousViews.Peek().(string)) + v, err := gui.g.View(gui.peekPreviousView()) if err != nil { viewName := gui.initiallyFocusedViewName() v, err = gui.g.View(viewName) diff --git a/pkg/gui/subprocess.go b/pkg/gui/subprocess.go index 404c2b82..61d3e1e9 100644 --- a/pkg/gui/subprocess.go +++ b/pkg/gui/subprocess.go @@ -22,7 +22,7 @@ func (gui *Gui) RunWithSubprocesses() error { break } else if err == gui.Errors.ErrSubProcess { // preparing the state for when we return - gui.State.PreviousViews.Push(gui.currentViewName()) + gui.pushPreviousView(gui.currentViewName()) // giving goEvery goroutines time to finish gui.State.SessionIndex++ @@ -31,7 +31,7 @@ func (gui *Gui) RunWithSubprocesses() error { } // pop here so we don't stack up view names - gui.State.PreviousViews.Pop() + gui.popPreviousView() // ensuring we render e.g. the logs of the currently selected item upon return gui.State.Panels.Main.ObjectKey = "" } else { diff --git a/pkg/gui/view_helpers.go b/pkg/gui/view_helpers.go index eeb53fd0..d7a327d4 100644 --- a/pkg/gui/view_helpers.go +++ b/pkg/gui/view_helpers.go @@ -41,7 +41,7 @@ func (gui *Gui) nextView(g *gocui.Gui, v *gocui.View) error { panic(err) } gui.resetMainView() - gui.State.PreviousViews.Pop() + gui.popPreviousView() return gui.switchFocus(g, v, focusedView, false) } @@ -67,7 +67,7 @@ func (gui *Gui) previousView(g *gocui.Gui, v *gocui.View) error { panic(err) } gui.resetMainView() - gui.State.PreviousViews.Pop() + gui.popPreviousView() return gui.switchFocus(g, v, focusedView, false) } @@ -104,8 +104,28 @@ func (gui *Gui) newLineFocused(v *gocui.View) error { } } +func (gui *Gui) popPreviousView() string { + if gui.State.PreviousViews.Len() > 0 { + return gui.State.PreviousViews.Pop().(string) + } + + return "" +} + +func (gui *Gui) peekPreviousView() string { + if gui.State.PreviousViews.Len() > 0 { + return gui.State.PreviousViews.Peek().(string) + } + + return "" +} + +func (gui *Gui) pushPreviousView(name string) { + gui.State.PreviousViews.Push(name) +} + func (gui *Gui) returnFocus(g *gocui.Gui, v *gocui.View) error { - previousViewName := gui.State.PreviousViews.Pop().(string) + previousViewName := gui.popPreviousView() previousView, err := g.View(previousViewName) if err != nil { // always fall back to services view if there's no 'previous' view stored @@ -123,7 +143,7 @@ func (gui *Gui) switchFocus(g *gocui.Gui, oldView, newView *gocui.View, returnin // 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()) && !returning { - gui.State.PreviousViews.Push(oldView.Name()) + gui.pushPreviousView(oldView.Name()) } gui.Log.Info("setting highlight to true for view " + newView.Name())