diff --git a/pkg/gui/containers_panel.go b/pkg/gui/containers_panel.go index 9b810096..36d489db 100644 --- a/pkg/gui/containers_panel.go +++ b/pkg/gui/containers_panel.go @@ -33,28 +33,12 @@ func (gui *Gui) getSelectedContainer() (*commands.Container, error) { return gui.DockerCommand.DisplayContainers[selectedLine], nil } -func (gui *Gui) handleContainersFocus(g *gocui.Gui, v *gocui.View) error { - if gui.popupPanelFocused() { - return nil - } +func (gui *Gui) handleContainersClick(g *gocui.Gui, v *gocui.View) error { + itemCount := len(gui.DockerCommand.DisplayContainers) + handleSelect := gui.handleContainerSelect + selectedLine := &gui.State.Panels.Containers.SelectedLine - cx, cy := v.Cursor() - _, oy := v.Origin() - - prevSelectedLine := gui.State.Panels.Containers.SelectedLine - newSelectedLine := cy - oy - - if newSelectedLine > len(gui.DockerCommand.DisplayContainers)-1 || len(utils.Decolorise(gui.DockerCommand.DisplayContainers[newSelectedLine].Name)) < cx { - return gui.handleContainerSelect(gui.g, v) - } - - gui.State.Panels.Containers.SelectedLine = newSelectedLine - - if prevSelectedLine == newSelectedLine && gui.currentViewName() == v.Name() { - return nil - } - - return gui.handleContainerSelect(gui.g, v) + return gui.handleClick(v, itemCount, selectedLine, handleSelect) } func (gui *Gui) handleContainerSelect(g *gocui.Gui, v *gocui.View) error { @@ -70,15 +54,15 @@ func (gui *Gui) handleContainerSelect(g *gocui.Gui, v *gocui.View) error { return nil } + if err := gui.focusPoint(0, gui.State.Panels.Containers.SelectedLine, len(gui.DockerCommand.DisplayContainers), v); err != nil { + return err + } + key := "containers-" + container.ID + "-" + gui.getContainerContexts()[gui.State.Panels.Containers.ContextIndex] if !gui.shouldRefresh(key) { return nil } - if err := gui.focusPoint(0, gui.State.Panels.Containers.SelectedLine, len(gui.DockerCommand.DisplayContainers), v); err != nil { - return err - } - mainView := gui.getMainView() mainView.Tabs = gui.getContainerContextTitles() mainView.TabIndex = gui.State.Panels.Containers.ContextIndex diff --git a/pkg/gui/images_panel.go b/pkg/gui/images_panel.go index 82a38177..c1e8d317 100644 --- a/pkg/gui/images_panel.go +++ b/pkg/gui/images_panel.go @@ -32,28 +32,12 @@ func (gui *Gui) getSelectedImage(g *gocui.Gui) (*commands.Image, error) { return gui.DockerCommand.Images[selectedLine], nil } -func (gui *Gui) handleImagesFocus(g *gocui.Gui, v *gocui.View) error { - if gui.popupPanelFocused() { - return nil - } +func (gui *Gui) handleImagesClick(g *gocui.Gui, v *gocui.View) error { + itemCount := len(gui.DockerCommand.Images) + handleSelect := gui.handleImageSelect + selectedLine := &gui.State.Panels.Images.SelectedLine - cx, cy := v.Cursor() - _, oy := v.Origin() - - prevSelectedLine := gui.State.Panels.Images.SelectedLine - newSelectedLine := cy - oy - - if newSelectedLine > len(gui.DockerCommand.Images)-1 || len(utils.Decolorise(gui.DockerCommand.Images[newSelectedLine].Name)) < cx { - return gui.handleImageSelect(gui.g, v) - } - - gui.State.Panels.Images.SelectedLine = newSelectedLine - - if !(prevSelectedLine == newSelectedLine && gui.currentViewName() == v.Name()) { - return gui.handleImageSelect(gui.g, v) - } - - return nil + return gui.handleClick(v, itemCount, selectedLine, handleSelect) } func (gui *Gui) handleImageSelect(g *gocui.Gui, v *gocui.View) error { @@ -69,15 +53,15 @@ func (gui *Gui) handleImageSelect(g *gocui.Gui, v *gocui.View) error { return gui.renderString(g, "main", gui.Tr.NoImages) } + if err := gui.focusPoint(0, gui.State.Panels.Images.SelectedLine, len(gui.DockerCommand.Images), v); err != nil { + return err + } + key := "images-" + Image.ID + "-" + gui.getImageContexts()[gui.State.Panels.Images.ContextIndex] if !gui.shouldRefresh(key) { return nil } - if err := gui.focusPoint(0, gui.State.Panels.Images.SelectedLine, len(gui.DockerCommand.Images), v); err != nil { - return err - } - mainView := gui.getMainView() mainView.Tabs = gui.getImageContextTitles() mainView.TabIndex = gui.State.Panels.Images.ContextIndex diff --git a/pkg/gui/keybindings.go b/pkg/gui/keybindings.go index f23bbd93..584283bb 100644 --- a/pkg/gui/keybindings.go +++ b/pkg/gui/keybindings.go @@ -160,6 +160,12 @@ func (gui *Gui) GetInitialKeybindings() []*Binding { Handler: gui.handleViewAllLogs, Description: gui.Tr.ViewLogs, }, + { + ViewName: "status", + Key: gocui.MouseLeft, + Modifier: gocui.ModNone, + Handler: gui.handleStatusSelect, + }, { ViewName: "menu", Key: gocui.KeyEsc, @@ -379,10 +385,10 @@ func (gui *Gui) GetInitialKeybindings() []*Binding { focus func(*gocui.Gui, *gocui.View) error }{ "menu": {prevLine: gui.handleMenuPrevLine, nextLine: gui.handleMenuNextLine, focus: gui.handleMenuSelect}, - "services": {prevLine: gui.handleServicesPrevLine, nextLine: gui.handleServicesNextLine, focus: gui.handleServicesFocus}, - "containers": {prevLine: gui.handleContainersPrevLine, nextLine: gui.handleContainersNextLine, focus: gui.handleContainersFocus}, - "images": {prevLine: gui.handleImagesPrevLine, nextLine: gui.handleImagesNextLine, focus: gui.handleImagesFocus}, - "volumes": {prevLine: gui.handleVolumesPrevLine, nextLine: gui.handleVolumesNextLine, focus: gui.handleVolumesFocus}, + "services": {prevLine: gui.handleServicesPrevLine, nextLine: gui.handleServicesNextLine, focus: gui.handleServicesClick}, + "containers": {prevLine: gui.handleContainersPrevLine, nextLine: gui.handleContainersNextLine, focus: gui.handleContainersClick}, + "images": {prevLine: gui.handleImagesPrevLine, nextLine: gui.handleImagesNextLine, focus: gui.handleImagesClick}, + "volumes": {prevLine: gui.handleVolumesPrevLine, nextLine: gui.handleVolumesNextLine, focus: gui.handleVolumesClick}, } for viewName, functions := range listPanelMap { diff --git a/pkg/gui/services_panel.go b/pkg/gui/services_panel.go index fc83d178..09d90326 100644 --- a/pkg/gui/services_panel.go +++ b/pkg/gui/services_panel.go @@ -30,28 +30,12 @@ func (gui *Gui) getSelectedService() (*commands.Service, error) { return gui.DockerCommand.Services[selectedLine], nil } -func (gui *Gui) handleServicesFocus(g *gocui.Gui, v *gocui.View) error { - if gui.popupPanelFocused() { - return nil - } +func (gui *Gui) handleServicesClick(g *gocui.Gui, v *gocui.View) error { + itemCount := len(gui.DockerCommand.Services) + handleSelect := gui.handleServiceSelect + selectedLine := &gui.State.Panels.Services.SelectedLine - cx, cy := v.Cursor() - _, oy := v.Origin() - - prevSelectedLine := gui.State.Panels.Services.SelectedLine - newSelectedLine := cy - oy - - if newSelectedLine > len(gui.DockerCommand.Services)-1 || len(utils.Decolorise(gui.DockerCommand.Services[newSelectedLine].Name)) < cx { - return gui.handleServiceSelect(gui.g, v) - } - - gui.State.Panels.Services.SelectedLine = newSelectedLine - - if prevSelectedLine == newSelectedLine && gui.currentViewName() == v.Name() { - return nil - } - - return gui.handleServiceSelect(gui.g, v) + return gui.handleClick(v, itemCount, selectedLine, handleSelect) } func (gui *Gui) handleServiceSelect(g *gocui.Gui, v *gocui.View) error { @@ -69,15 +53,15 @@ func (gui *Gui) handleServiceSelect(g *gocui.Gui, v *gocui.View) error { containerID = service.Container.ID } + if err := gui.focusPoint(0, gui.State.Panels.Services.SelectedLine, len(gui.DockerCommand.Services), v); err != nil { + return err + } + key := "services-" + service.ID + "-" + containerID + "-" + gui.getServiceContexts()[gui.State.Panels.Services.ContextIndex] if !gui.shouldRefresh(key) { return nil } - if err := gui.focusPoint(0, gui.State.Panels.Services.SelectedLine, len(gui.DockerCommand.Services), v); err != nil { - return err - } - mainView := gui.getMainView() mainView.Tabs = gui.getServiceContextTitles() diff --git a/pkg/gui/view_helpers.go b/pkg/gui/view_helpers.go index f42e13be..98ffd266 100644 --- a/pkg/gui/view_helpers.go +++ b/pkg/gui/view_helpers.go @@ -383,3 +383,22 @@ func (gui *Gui) clearMainView() { mainView.SetOrigin(0, 0) mainView.SetCursor(0, 0) } + +func (gui *Gui) handleClick(v *gocui.View, itemCount int, selectedLine *int, handleSelect func(*gocui.Gui, *gocui.View) error) error { + if gui.popupPanelFocused() { + return nil + } + + _, cy := v.Cursor() + _, oy := v.Origin() + + newSelectedLine := cy - oy + + if newSelectedLine > itemCount-1 { + newSelectedLine = itemCount - 1 + } + + *selectedLine = newSelectedLine + + return handleSelect(gui.g, v) +} diff --git a/pkg/gui/volumes_panel.go b/pkg/gui/volumes_panel.go index bc9d6594..63a11de4 100644 --- a/pkg/gui/volumes_panel.go +++ b/pkg/gui/volumes_panel.go @@ -29,28 +29,12 @@ func (gui *Gui) getSelectedVolume() (*commands.Volume, error) { return gui.DockerCommand.Volumes[selectedLine], nil } -func (gui *Gui) handleVolumesFocus(g *gocui.Gui, v *gocui.View) error { - if gui.popupPanelFocused() { - return nil - } +func (gui *Gui) handleVolumesClick(g *gocui.Gui, v *gocui.View) error { + itemCount := len(gui.DockerCommand.Volumes) + handleSelect := gui.handleVolumeSelect + selectedLine := &gui.State.Panels.Volumes.SelectedLine - cx, cy := v.Cursor() - _, oy := v.Origin() - - prevSelectedLine := gui.State.Panels.Volumes.SelectedLine - newSelectedLine := cy - oy - - if newSelectedLine > len(gui.DockerCommand.Volumes)-1 || len(utils.Decolorise(gui.DockerCommand.Volumes[newSelectedLine].Name)) < cx { - return gui.handleVolumeSelect(gui.g, v) - } - - gui.State.Panels.Volumes.SelectedLine = newSelectedLine - - if !(prevSelectedLine == newSelectedLine && gui.currentViewName() == v.Name()) { - return gui.handleVolumeSelect(gui.g, v) - } - - return nil + return gui.handleClick(v, itemCount, selectedLine, handleSelect) } func (gui *Gui) handleVolumeSelect(g *gocui.Gui, v *gocui.View) error { @@ -66,15 +50,15 @@ func (gui *Gui) handleVolumeSelect(g *gocui.Gui, v *gocui.View) error { return gui.renderString(g, "main", gui.Tr.NoVolumes) } + if err := gui.focusPoint(0, gui.State.Panels.Volumes.SelectedLine, len(gui.DockerCommand.Volumes), v); err != nil { + return err + } + key := "volumes-" + volume.Name + "-" + gui.getVolumeContexts()[gui.State.Panels.Volumes.ContextIndex] if !gui.shouldRefresh(key) { return nil } - if err := gui.focusPoint(0, gui.State.Panels.Volumes.SelectedLine, len(gui.DockerCommand.Volumes), v); err != nil { - return err - } - mainView := gui.getMainView() mainView.Tabs = gui.getVolumeContextTitles() mainView.TabIndex = gui.State.Panels.Volumes.ContextIndex