Added some colours
This commit is contained in:
parent
9204947d5e
commit
0fb641cdfd
|
@ -13,6 +13,10 @@ func (sr *ListRenderer) TypeName() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (sr *ListRenderer) StringValue() string {
|
func (sr *ListRenderer) StringValue() string {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sr *ListRenderer) MetaInfo() string {
|
||||||
if len(sr.Value) == 1 {
|
if len(sr.Value) == 1 {
|
||||||
return fmt.Sprintf("(1 item)")
|
return fmt.Sprintf("(1 item)")
|
||||||
}
|
}
|
||||||
|
@ -34,6 +38,10 @@ func (sr *MapRenderer) TypeName() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (sr *MapRenderer) StringValue() string {
|
func (sr *MapRenderer) StringValue() string {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sr *MapRenderer) MetaInfo() string {
|
||||||
if len(sr.Value) == 1 {
|
if len(sr.Value) == 1 {
|
||||||
return fmt.Sprintf("(1 item)")
|
return fmt.Sprintf("(1 item)")
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ import "github.com/aws/aws-sdk-go-v2/service/dynamodb/types"
|
||||||
type Renderer interface {
|
type Renderer interface {
|
||||||
TypeName() string
|
TypeName() string
|
||||||
StringValue() string
|
StringValue() string
|
||||||
|
MetaInfo() string
|
||||||
SubItems() []SubItem
|
SubItems() []SubItem
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,11 +3,15 @@ package itemrender
|
||||||
type OtherRenderer struct{}
|
type OtherRenderer struct{}
|
||||||
|
|
||||||
func (u OtherRenderer) TypeName() string {
|
func (u OtherRenderer) TypeName() string {
|
||||||
return "(other)"
|
return "??"
|
||||||
}
|
}
|
||||||
|
|
||||||
func (u OtherRenderer) StringValue() string {
|
func (sr OtherRenderer) StringValue() string {
|
||||||
return "(other)"
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u OtherRenderer) MetaInfo() string {
|
||||||
|
return "(unrecognised)"
|
||||||
}
|
}
|
||||||
|
|
||||||
func (u OtherRenderer) SubItems() []SubItem {
|
func (u OtherRenderer) SubItems() []SubItem {
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package itemrender
|
package itemrender
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"github.com/aws/aws-sdk-go-v2/service/dynamodb/types"
|
"github.com/aws/aws-sdk-go-v2/service/dynamodb/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -15,6 +14,10 @@ func (sr *StringRenderer) StringValue() string {
|
||||||
return sr.Value
|
return sr.Value
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (sr *StringRenderer) MetaInfo() string {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
func (sr *StringRenderer) SubItems() []SubItem {
|
func (sr *StringRenderer) SubItems() []SubItem {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -29,6 +32,10 @@ func (sr *NumberRenderer) StringValue() string {
|
||||||
return sr.Value
|
return sr.Value
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (sr *NumberRenderer) MetaInfo() string {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
func (sr *NumberRenderer) SubItems() []SubItem {
|
func (sr *NumberRenderer) SubItems() []SubItem {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -46,6 +53,10 @@ func (sr *BoolRenderer) StringValue() string {
|
||||||
return "False"
|
return "False"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (sr *BoolRenderer) MetaInfo() string {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
func (sr *BoolRenderer) SubItems() []SubItem {
|
func (sr *BoolRenderer) SubItems() []SubItem {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -57,10 +68,11 @@ func (sr *BinaryRenderer) TypeName() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (sr *BinaryRenderer) StringValue() string {
|
func (sr *BinaryRenderer) StringValue() string {
|
||||||
if len(sr.Value) == 1 {
|
return ""
|
||||||
return fmt.Sprintf("(1 byte)")
|
}
|
||||||
}
|
|
||||||
return fmt.Sprintf("(%d bytes)", len(sr.Value))
|
func (sr *BinaryRenderer) MetaInfo() string {
|
||||||
|
return cardinality(len(sr.Value), "byte", "bytes")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (sr *BinaryRenderer) SubItems() []SubItem {
|
func (sr *BinaryRenderer) SubItems() []SubItem {
|
||||||
|
@ -73,6 +85,10 @@ func (sr *NullRenderer) TypeName() string {
|
||||||
return "NULL"
|
return "NULL"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (sr *NullRenderer) MetaInfo() string {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
func (sr *NullRenderer) StringValue() string {
|
func (sr *NullRenderer) StringValue() string {
|
||||||
return "null"
|
return "null"
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,10 @@ func (sr *GenericRenderer) TypeName() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (sr *GenericRenderer) StringValue() string {
|
func (sr *GenericRenderer) StringValue() string {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sr *GenericRenderer) MetaInfo() string {
|
||||||
return cardinality(len(sr.subitemValue), "item", "items")
|
return cardinality(len(sr.subitemValue), "item", "items")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,9 +17,14 @@ import (
|
||||||
|
|
||||||
var (
|
var (
|
||||||
activeHeaderStyle = lipgloss.NewStyle().
|
activeHeaderStyle = lipgloss.NewStyle().
|
||||||
Bold(true).
|
Bold(true).
|
||||||
Foreground(lipgloss.Color("#ffffff")).
|
Foreground(lipgloss.Color("#ffffff")).
|
||||||
Background(lipgloss.Color("#4479ff"))
|
Background(lipgloss.Color("#4479ff"))
|
||||||
|
|
||||||
|
fieldTypeStyle = lipgloss.NewStyle().
|
||||||
|
Foreground(lipgloss.Color("#31e131"))
|
||||||
|
metaInfoStyle = lipgloss.NewStyle().
|
||||||
|
Foreground(lipgloss.Color("#888888"))
|
||||||
)
|
)
|
||||||
|
|
||||||
type Model struct {
|
type Model struct {
|
||||||
|
@ -96,7 +101,8 @@ func (m *Model) updateViewportToSelectedMessage() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Model) renderItem(w io.Writer, prefix string, name string, r itemrender.Renderer) {
|
func (m *Model) renderItem(w io.Writer, prefix string, name string, r itemrender.Renderer) {
|
||||||
fmt.Fprintf(w, "%s%v\t%s\t%s\n", prefix, name, r.TypeName(), r.StringValue())
|
fmt.Fprintf(w, "%s%v\t%s\t%s%s\n",
|
||||||
|
prefix, name, fieldTypeStyle.Render(r.TypeName()), r.StringValue(), metaInfoStyle.Render(r.MetaInfo()))
|
||||||
if subitems := r.SubItems(); len(subitems) > 0 {
|
if subitems := r.SubItems(); len(subitems) > 0 {
|
||||||
for _, si := range subitems {
|
for _, si := range subitems {
|
||||||
m.renderItem(w, prefix+" ", si.Key, si.Value)
|
m.renderItem(w, prefix+" ", si.Key, si.Value)
|
||||||
|
|
|
@ -24,6 +24,7 @@ type Model struct {
|
||||||
w, h int
|
w, h int
|
||||||
|
|
||||||
// model state
|
// model state
|
||||||
|
colOffset int
|
||||||
rows []table.Row
|
rows []table.Row
|
||||||
resultSet *models.ResultSet
|
resultSet *models.ResultSet
|
||||||
}
|
}
|
||||||
|
@ -60,6 +61,12 @@ func (m *Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
|
||||||
case "k", "down":
|
case "k", "down":
|
||||||
m.table.GoDown()
|
m.table.GoDown()
|
||||||
return m, m.postSelectedItemChanged
|
return m, m.postSelectedItemChanged
|
||||||
|
case "j":
|
||||||
|
m.setLeftmostDisplayedColumn(m.colOffset - 1)
|
||||||
|
return m, nil
|
||||||
|
case "l":
|
||||||
|
m.setLeftmostDisplayedColumn(m.colOffset + 1)
|
||||||
|
return m, nil
|
||||||
case "I", "pgup":
|
case "I", "pgup":
|
||||||
m.table.GoPageUp()
|
m.table.GoPageUp()
|
||||||
return m, m.postSelectedItemChanged
|
return m, m.postSelectedItemChanged
|
||||||
|
@ -72,6 +79,17 @@ func (m *Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
|
||||||
return m, nil
|
return m, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *Model) setLeftmostDisplayedColumn(newCol int) {
|
||||||
|
if newCol < 0 {
|
||||||
|
m.colOffset = 0
|
||||||
|
} else if newCol >= len(m.resultSet.Columns) {
|
||||||
|
m.colOffset = len(m.resultSet.Columns) - 1
|
||||||
|
} else {
|
||||||
|
m.colOffset = newCol
|
||||||
|
}
|
||||||
|
m.rebuildTable()
|
||||||
|
}
|
||||||
|
|
||||||
func (m *Model) View() string {
|
func (m *Model) View() string {
|
||||||
return lipgloss.JoinVertical(lipgloss.Top, m.frameTitle.View(), m.table.View())
|
return lipgloss.JoinVertical(lipgloss.Top, m.frameTitle.View(), m.table.View())
|
||||||
}
|
}
|
||||||
|
@ -85,23 +103,39 @@ func (m *Model) Resize(w, h int) layout.ResizingModel {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Model) updateTable() {
|
func (m *Model) updateTable() {
|
||||||
|
m.colOffset = 0
|
||||||
|
|
||||||
|
m.frameTitle.SetTitle("Table: " + m.resultSet.TableInfo.Name)
|
||||||
|
m.rebuildTable()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *Model) rebuildTable() {
|
||||||
resultSet := m.resultSet
|
resultSet := m.resultSet
|
||||||
|
|
||||||
m.frameTitle.SetTitle("Table: " + resultSet.TableInfo.Name)
|
newTbl := table.New(resultSet.Columns[m.colOffset:], m.w, m.h-m.frameTitle.HeaderHeight())
|
||||||
|
|
||||||
newTbl := table.New(resultSet.Columns, m.w, m.h-m.frameTitle.HeaderHeight())
|
|
||||||
newRows := make([]table.Row, 0)
|
newRows := make([]table.Row, 0)
|
||||||
for i, r := range resultSet.Items() {
|
for i, r := range resultSet.Items() {
|
||||||
if resultSet.Hidden(i) {
|
if resultSet.Hidden(i) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
newRows = append(newRows, itemTableRow{resultSet: resultSet, itemIndex: i, item: r})
|
newRows = append(newRows, itemTableRow{
|
||||||
|
resultSet: resultSet,
|
||||||
|
itemIndex: i,
|
||||||
|
colOffset: m.colOffset,
|
||||||
|
item: r,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
m.rows = newRows
|
m.rows = newRows
|
||||||
newTbl.SetRows(newRows)
|
newTbl.SetRows(newRows)
|
||||||
|
for newTbl.Cursor() != m.table.Cursor() {
|
||||||
|
if newTbl.Cursor() < m.table.Cursor() {
|
||||||
|
newTbl.GoDown()
|
||||||
|
} else if newTbl.Cursor() > m.table.Cursor() {
|
||||||
|
newTbl.GoUp()
|
||||||
|
}
|
||||||
|
}
|
||||||
m.table = newTbl
|
m.table = newTbl
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,11 +17,15 @@ var (
|
||||||
Foreground(lipgloss.Color("#e13131"))
|
Foreground(lipgloss.Color("#e13131"))
|
||||||
newRowStyle = lipgloss.NewStyle().
|
newRowStyle = lipgloss.NewStyle().
|
||||||
Foreground(lipgloss.Color("#31e131"))
|
Foreground(lipgloss.Color("#31e131"))
|
||||||
|
|
||||||
|
metaInfoStyle = lipgloss.NewStyle().
|
||||||
|
Foreground(lipgloss.Color("#888888"))
|
||||||
)
|
)
|
||||||
|
|
||||||
type itemTableRow struct {
|
type itemTableRow struct {
|
||||||
resultSet *models.ResultSet
|
resultSet *models.ResultSet
|
||||||
itemIndex int
|
itemIndex int
|
||||||
|
colOffset int
|
||||||
item models.Item
|
item models.Item
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,17 +34,6 @@ func (mtr itemTableRow) Render(w io.Writer, model table.Model, index int) {
|
||||||
isDirty := mtr.resultSet.IsDirty(mtr.itemIndex)
|
isDirty := mtr.resultSet.IsDirty(mtr.itemIndex)
|
||||||
isNew := mtr.resultSet.IsNew(mtr.itemIndex)
|
isNew := mtr.resultSet.IsNew(mtr.itemIndex)
|
||||||
|
|
||||||
sb := strings.Builder{}
|
|
||||||
for i, colName := range mtr.resultSet.Columns {
|
|
||||||
if i > 0 {
|
|
||||||
sb.WriteString("\t")
|
|
||||||
}
|
|
||||||
|
|
||||||
if r := mtr.item.Renderer(colName); r != nil {
|
|
||||||
sb.WriteString(r.StringValue())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var style lipgloss.Style
|
var style lipgloss.Style
|
||||||
|
|
||||||
if index == model.Cursor() {
|
if index == model.Cursor() {
|
||||||
|
@ -54,6 +47,21 @@ func (mtr itemTableRow) Render(w io.Writer, model table.Model, index int) {
|
||||||
} else if isDirty {
|
} else if isDirty {
|
||||||
style = style.Copy().Inherit(dirtyRowStyle)
|
style = style.Copy().Inherit(dirtyRowStyle)
|
||||||
}
|
}
|
||||||
|
metaInfoStyle := style.Copy().Inherit(metaInfoStyle)
|
||||||
|
|
||||||
fmt.Fprintln(w, style.Render(sb.String()))
|
sb := strings.Builder{}
|
||||||
|
for i, colName := range mtr.resultSet.Columns[mtr.colOffset:] {
|
||||||
|
if i > 0 {
|
||||||
|
sb.WriteString(style.Render("\t"))
|
||||||
|
}
|
||||||
|
|
||||||
|
if r := mtr.item.Renderer(colName); r != nil {
|
||||||
|
sb.WriteString(style.Render(r.StringValue()))
|
||||||
|
if mi := r.MetaInfo(); mi != "" {
|
||||||
|
sb.WriteString(metaInfoStyle.Render(mi))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Fprintln(w, sb.String())
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue