lazydocker/pkg/gui/status_panel.go
2019-06-09 12:00:53 +10:00

165 lines
3.7 KiB
Go

package gui
import (
"fmt"
"strings"
"syscall"
"github.com/go-errors/errors"
"github.com/jesseduffield/gocui"
)
func (gui *Gui) getStatusContexts() []string {
return []string{"logs", "credits"}
}
func (gui *Gui) getStatusContextTitles() []string {
return []string{gui.Tr.LogsTitle, gui.Tr.CreditsTitle}
}
func (gui *Gui) refreshStatus() error {
v := gui.getStatusView()
gui.g.Update(func(*gocui.Gui) error {
v.Clear()
fmt.Fprint(v, "lazydocker")
return nil
})
return nil
}
func (gui *Gui) handleStatusSelect(g *gocui.Gui, v *gocui.View) error {
if gui.popupPanelFocused() {
return nil
}
if _, err := gui.g.SetCurrentView(v.Name()); err != nil {
return err
}
key := gui.getStatusContexts()[gui.State.Panels.Status.ContextIndex]
if gui.State.Panels.Main.ObjectKey == key {
return nil
} else {
gui.State.Panels.Main.ObjectKey = key
}
gui.clearMainView()
mainView := gui.getMainView()
mainView.Tabs = gui.getStatusContextTitles()
mainView.TabIndex = gui.State.Panels.Status.ContextIndex
switch gui.getStatusContexts()[gui.State.Panels.Status.ContextIndex] {
case "credits":
if err := gui.renderCredits(); err != nil {
return err
}
case "logs":
if err := gui.renderAllLogs(); err != nil {
return err
}
default:
return errors.New("Unknown context for status panel")
}
return nil
}
func (gui *Gui) renderCredits() error {
mainView := gui.getMainView()
mainView.Autoscroll = false
mainView.Wrap = true
dashboardString := strings.Join(
[]string{
lazydockerTitle(),
"Copyright (c) 2019 Jesse Duffield",
"Keybindings: https://github.com/jesseduffield/lazydocker/blob/master/docs/keybindings",
"Config Options: https://github.com/jesseduffield/lazydocker/blob/master/docs/Config.md",
"Raise an Issue: https://github.com/jesseduffield/lazydocker/issues",
}, "\n\n")
go gui.T.NewTask(func(stop chan struct{}) {
gui.renderString(gui.g, "main", dashboardString)
})
return nil
}
func (gui *Gui) renderAllLogs() error {
mainView := gui.getMainView()
mainView.Autoscroll = true
mainView.Wrap = true
go gui.T.NewTask(func(stop chan struct{}) {
gui.clearMainView()
cmd := gui.OSCommand.RunCustomCommand(gui.Config.UserConfig.CommandTemplates.AllLogs)
cmd.Stdout = mainView
cmd.Stderr = mainView
cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
cmd.Start()
go func() {
<-stop
if err := gui.OSCommand.Kill(cmd); err != nil {
gui.Log.Error(err)
}
}()
cmd.Wait()
})
return nil
}
func (gui *Gui) handleOpenConfig(g *gocui.Gui, v *gocui.View) error {
return gui.openFile(gui.Config.ConfigFilename())
}
func (gui *Gui) handleEditConfig(g *gocui.Gui, v *gocui.View) error {
return gui.editFile(gui.Config.ConfigFilename())
}
func lazydockerTitle() string {
return `
_ _ _
| | | | | |
| | __ _ _____ _ __| | ___ ___| | _____ _ __
| |/ _` + "`" + ` |_ / | | |/ _` + "`" + ` |/ _ \ / __| |/ / _ \ '__|
| | (_| |/ /| |_| | (_| | (_) | (__| < __/ |
|_|\__,_/___|\__, |\__,_|\___/ \___|_|\_\___|_|
__/ |
|___/
`
}
func (gui *Gui) handleStatusNextContext(g *gocui.Gui, v *gocui.View) error {
contexts := gui.getStatusContexts()
if gui.State.Panels.Status.ContextIndex >= len(contexts)-1 {
gui.State.Panels.Status.ContextIndex = 0
} else {
gui.State.Panels.Status.ContextIndex++
}
gui.handleStatusSelect(gui.g, v)
return nil
}
func (gui *Gui) handleStatusPrevContext(g *gocui.Gui, v *gocui.View) error {
contexts := gui.getStatusContexts()
if gui.State.Panels.Status.ContextIndex <= 0 {
gui.State.Panels.Status.ContextIndex = len(contexts) - 1
} else {
gui.State.Panels.Status.ContextIndex--
}
gui.handleStatusSelect(gui.g, v)
return nil
}