dive/runtime/ui/view/layer_details.go
Alex Goodman d5e8a92968
Rework CI validation workflow and makefile (#460)
* rework CI validation workflow and makefile

* enable push

* fix job names

* fix license check

* fix snapshot builds

* fix acceptance tests

* fix linting

* disable pull request event

* rework windows runner caching

* disable release pipeline and add issue templates
2023-07-06 22:01:46 -04:00

143 lines
3.2 KiB
Go

package view
import (
"fmt"
"strings"
"github.com/awesome-gocui/gocui"
"github.com/sirupsen/logrus"
"github.com/wagoodman/dive/dive/image"
"github.com/wagoodman/dive/runtime/ui/format"
"github.com/wagoodman/dive/runtime/ui/key"
)
type LayerDetails struct {
gui *gocui.Gui
header *gocui.View
body *gocui.View
CurrentLayer *image.Layer
}
func (v *LayerDetails) Name() string {
return "layerDetails"
}
func (v *LayerDetails) Setup(body, header *gocui.View) error {
logrus.Tracef("LayerDetails setup()")
v.body = body
v.body.Editable = false
v.body.Wrap = true
v.body.Highlight = true
v.body.Frame = false
v.header = header
v.header.Editable = false
v.header.Wrap = true
v.header.Highlight = false
v.header.Frame = false
var infos = []key.BindingInfo{
{
Key: gocui.KeyArrowDown,
Modifier: gocui.ModNone,
OnAction: v.CursorDown,
},
{
Key: gocui.KeyArrowUp,
Modifier: gocui.ModNone,
OnAction: v.CursorUp,
},
}
_, err := key.GenerateBindings(v.gui, v.Name(), infos)
if err != nil {
return err
}
return nil
}
// Render flushes the state objects to the screen.
// The details pane reports the currently selected layer's:
// 1. tags
// 2. ID
// 3. digest
// 4. command
func (v *LayerDetails) Render() error {
v.gui.Update(func(g *gocui.Gui) error {
v.header.Clear()
width, _ := v.body.Size()
layerHeaderStr := format.RenderHeader("Layer Details", width, v.gui.CurrentView() == v.body)
_, err := fmt.Fprintln(v.header, layerHeaderStr)
if err != nil {
return err
}
// this is for layer details
var lines = make([]string, 0)
tags := "(none)"
if v.CurrentLayer.Names != nil && len(v.CurrentLayer.Names) > 0 {
tags = strings.Join(v.CurrentLayer.Names, ", ")
}
lines = append(lines, []string{
format.Header("Tags: ") + tags,
format.Header("Id: ") + v.CurrentLayer.Id,
format.Header("Digest: ") + v.CurrentLayer.Digest,
format.Header("Command:"),
v.CurrentLayer.Command,
}...)
v.body.Clear()
if _, err = fmt.Fprintln(v.body, strings.Join(lines, "\n")); err != nil {
logrus.Debug("unable to write to buffer: ", err)
}
return nil
})
return nil
}
func (v *LayerDetails) OnLayoutChange() error {
if err := v.Update(); err != nil {
return err
}
return v.Render()
}
// IsVisible indicates if the details view pane is currently initialized.
func (v *LayerDetails) IsVisible() bool {
return v.body != nil
}
// CursorUp moves the cursor up in the details pane
func (v *LayerDetails) CursorUp() error {
if err := CursorUp(v.gui, v.body); err != nil {
logrus.Debug("Couldn't move the cursor up")
}
return nil
}
// CursorDown moves the cursor up in the details pane
func (v *LayerDetails) CursorDown() error {
if err := CursorDown(v.gui, v.body); err != nil {
logrus.Debug("Couldn't move the cursor down")
}
return nil
}
// KeyHelp indicates all the possible actions a user can take while the current pane is selected (currently does nothing).
func (v *LayerDetails) KeyHelp() string {
return ""
}
// Update refreshes the state objects for future rendering.
func (v *LayerDetails) Update() error {
return nil
}
func (v *LayerDetails) SetCursor(x, y int) error {
return v.body.SetCursor(x, y)
}