fix up click events on list panels

This commit is contained in:
Jesse Duffield 2019-06-29 10:22:37 +10:00
parent 8b99753ab8
commit dcb8b3329f
6 changed files with 65 additions and 104 deletions

View file

@ -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

View file

@ -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

View file

@ -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 {

View file

@ -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()

View file

@ -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)
}

View file

@ -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