You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
lazydocker/pkg/gui/containers_panel.go

137 lines
3.4 KiB
Go

package gui
import (
"fmt"
"github.com/jesseduffield/gocui"
"github.com/jesseduffield/lazydocker/pkg/commands"
"github.com/jesseduffield/lazydocker/pkg/utils"
)
// list panel functions
func (gui *Gui) getSelectedContainer(g *gocui.Gui) (*commands.Container, error) {
selectedLine := gui.State.Panels.Containers.SelectedLine
if selectedLine == -1 {
return &commands.Container{}, gui.Errors.ErrNoContainers
}
return gui.State.Containers[selectedLine], nil
}
func (gui *Gui) handleContainersFocus(g *gocui.Gui, v *gocui.View) error {
if gui.popupPanelFocused() {
return nil
}
cx, cy := v.Cursor()
_, oy := v.Origin()
prevSelectedLine := gui.State.Panels.Containers.SelectedLine
newSelectedLine := cy - oy
if newSelectedLine > len(gui.State.Containers)-1 || len(utils.Decolorise(gui.State.Containers[newSelectedLine].Name)) < cx {
return gui.handleContainerSelect(gui.g, v, false)
}
gui.State.Panels.Containers.SelectedLine = newSelectedLine
if prevSelectedLine == newSelectedLine && gui.currentViewName() == v.Name() {
return gui.handleContainerPress(gui.g, v)
} else {
return gui.handleContainerSelect(gui.g, v, true)
}
}
func (gui *Gui) handleContainerSelect(g *gocui.Gui, v *gocui.View, alreadySelected bool) error {
if _, err := gui.g.SetCurrentView(v.Name()); err != nil {
return err
}
// container, err := gui.getSelectedContainer(g)
// if err != nil {
// if err != gui.Errors.ErrNoContainers {
// return err
// }
// return gui.renderString(g, "main", gui.Tr.SLocalize("NoChangedContainers"))
// }
if err := gui.focusPoint(0, gui.State.Panels.Containers.SelectedLine, len(gui.State.Containers), v); err != nil {
return err
}
// TODO: render logs
return gui.renderString(g, "main", "haha")
}
func (gui *Gui) refreshContainers() error {
selectedContainer, _ := gui.getSelectedContainer(gui.g)
containersView := gui.getContainersView()
if containersView == nil {
// if the containersView hasn't been instantiated yet we just return
return nil
}
if err := gui.refreshStateContainers(); err != nil {
return err
}
gui.g.Update(func(g *gocui.Gui) error {
containersView.Clear()
isFocused := gui.g.CurrentView().Name() == "containers"
list, err := utils.RenderList(gui.State.Containers, isFocused)
if err != nil {
return err
}
fmt.Fprint(containersView, list)
if containersView == g.CurrentView() {
newSelectedContainer, _ := gui.getSelectedContainer(gui.g)
alreadySelected := newSelectedContainer.Name == selectedContainer.Name
return gui.handleContainerSelect(g, containersView, alreadySelected)
}
return nil
})
return nil
}
func (gui *Gui) refreshStateContainers() error {
containers, err := gui.DockerCommand.GetContainers()
if err != nil {
return err
}
gui.State.Containers = containers
return nil
}
func (gui *Gui) handleContainersNextLine(g *gocui.Gui, v *gocui.View) error {
if gui.popupPanelFocused() {
return nil
}
panelState := gui.State.Panels.Containers
gui.changeSelectedLine(&panelState.SelectedLine, len(gui.State.Containers), false)
return gui.handleContainerSelect(gui.g, v, false)
}
func (gui *Gui) handleContainersPrevLine(g *gocui.Gui, v *gocui.View) error {
if gui.popupPanelFocused() {
return nil
}
panelState := gui.State.Panels.Containers
gui.changeSelectedLine(&panelState.SelectedLine, len(gui.State.Containers), true)
return gui.handleContainerSelect(gui.g, v, false)
}
func (gui *Gui) handleContainerPress(g *gocui.Gui, v *gocui.View) error {
return nil
}