diff --git a/table/table.go b/table/table.go index 381544a..3f84d46 100644 --- a/table/table.go +++ b/table/table.go @@ -119,17 +119,19 @@ func DefaultStyles() Styles { } } -// TODO do we want this? // NewFromTemplate lets you create a table [Model] from Lip Gloss' [table.Table]. -func NewFromTemplate(t *table.Table, rows [][]string, headers []string) *Model { +func NewFromTemplate(t *table.Table, headers []string, rows [][]string) *Model { m := &Model{ - cursor: 0, - KeyMap: DefaultKeyMap(), - Help: help.New(), - table: t, + cursor: 0, + KeyMap: DefaultKeyMap(), + Help: help.New(), + table: t, + useStyleFunc: true, } - m.SetRows(rows...) - m.SetHeaders(headers...) + // We can't get the rows and headers from the table, so the user needs to + // provide them as arguments. + m.rows = rows + m.headers = headers return m } diff --git a/table/table_test.go b/table/table_test.go index 8cbdb9a..5045556 100644 --- a/table/table_test.go +++ b/table/table_test.go @@ -2,6 +2,7 @@ package table import ( "fmt" + "image/color" "reflect" "testing" @@ -256,6 +257,104 @@ func TestSetBorder(t *testing.T) { } } +func TestNewFromTemplate(t *testing.T) { + // Using Pokemon example from https://github.com/charmbracelet/lipgloss. + baseStyle := lipgloss.NewStyle().Padding(0, 1) + headerStyle := baseStyle.Foreground(lipgloss.Color("252")).Bold(true) + selectedStyle := baseStyle.Foreground(lipgloss.Color("#01BE85")).Background(lipgloss.Color("#00432F")) + typeColors := map[string]color.Color{ + "Bug": lipgloss.Color("#D7FF87"), + "Electric": lipgloss.Color("#FDFF90"), + "Fire": lipgloss.Color("#FF7698"), + "Flying": lipgloss.Color("#FF87D7"), + "Grass": lipgloss.Color("#75FBAB"), + "Ground": lipgloss.Color("#FF875F"), + "Normal": lipgloss.Color("#929292"), + "Poison": lipgloss.Color("#7D5AFC"), + "Water": lipgloss.Color("#00E2C7"), + } + dimTypeColors := map[string]color.Color{ + "Bug": lipgloss.Color("#97AD64"), + "Electric": lipgloss.Color("#FCFF5F"), + "Fire": lipgloss.Color("#BA5F75"), + "Flying": lipgloss.Color("#C97AB2"), + "Grass": lipgloss.Color("#59B980"), + "Ground": lipgloss.Color("#C77252"), + "Normal": lipgloss.Color("#727272"), + "Poison": lipgloss.Color("#634BD0"), + "Water": lipgloss.Color("#439F8E"), + } + + pokemonHeaders := []string{"#", "Name", "Type 1", "Type 2", "Japanese", "Official Rom."} + pokemonData := [][]string{ + {"1", "Bulbasaur", "Grass", "Poison", "フシギダネ", "Fushigidane"}, + {"2", "Ivysaur", "Grass", "Poison", "フシギソウ", "Fushigisou"}, + {"3", "Venusaur", "Grass", "Poison", "フシギバナ", "Fushigibana"}, + {"4", "Charmander", "Fire", "", "ヒトカゲ", "Hitokage"}, + {"5", "Charmeleon", "Fire", "", "リザード", "Lizardo"}, + {"6", "Charizard", "Fire", "Flying", "リザードン", "Lizardon"}, + {"7", "Squirtle", "Water", "", "ゼニガメ", "Zenigame"}, + {"8", "Wartortle", "Water", "", "カメール", "Kameil"}, + {"9", "Blastoise", "Water", "", "カメックス", "Kamex"}, + {"10", "Caterpie", "Bug", "", "キャタピー", "Caterpie"}, + {"11", "Metapod", "Bug", "", "トランセル", "Trancell"}, + {"12", "Butterfree", "Bug", "Flying", "バタフリー", "Butterfree"}, + {"13", "Weedle", "Bug", "Poison", "ビードル", "Beedle"}, + {"14", "Kakuna", "Bug", "Poison", "コクーン", "Cocoon"}, + {"15", "Beedrill", "Bug", "Poison", "スピアー", "Spear"}, + {"16", "Pidgey", "Normal", "Flying", "ポッポ", "Poppo"}, + {"17", "Pidgeotto", "Normal", "Flying", "ピジョン", "Pigeon"}, + {"18", "Pidgeot", "Normal", "Flying", "ピジョット", "Pigeot"}, + {"19", "Rattata", "Normal", "", "コラッタ", "Koratta"}, + {"20", "Raticate", "Normal", "", "ラッタ", "Ratta"}, + {"21", "Spearow", "Normal", "Flying", "オニスズメ", "Onisuzume"}, + {"22", "Fearow", "Normal", "Flying", "オニドリル", "Onidrill"}, + {"23", "Ekans", "Poison", "", "アーボ", "Arbo"}, + {"24", "Arbok", "Poison", "", "アーボック", "Arbok"}, + {"25", "Pikachu", "Electric", "", "ピカチュウ", "Pikachu"}, + {"26", "Raichu", "Electric", "", "ライチュウ", "Raichu"}, + {"27", "Sandshrew", "Ground", "", "サンド", "Sand"}, + {"28", "Sandslash", "Ground", "", "サンドパン", "Sandpan"}, + } + + lipglossTable := table.New(). + Border(lipgloss.NormalBorder()). + BorderStyle(lipgloss.NewStyle().Foreground(lipgloss.Color("238"))). + Headers(pokemonHeaders...). + Width(80). + Rows(pokemonData...). + StyleFunc(func(row, col int) lipgloss.Style { + if row == table.HeaderRow { + return headerStyle + } + + if pokemonData[row][1] == "Pikachu" { + return selectedStyle + } + + even := row%2 == 0 + + switch col { + case 2, 3: // Type 1 + 2 + c := typeColors + if even { + c = dimTypeColors + } + + color := c[fmt.Sprint(pokemonData[row][col])] + return baseStyle.Foreground(color) + } + + if even { + return baseStyle.Foreground(lipgloss.Color("245")) + } + return baseStyle.Foreground(lipgloss.Color("252")) + }) + + bubblesTable := NewFromTemplate(lipglossTable, headers, pokemonData) + golden.RequireEqual(t, []byte(bubblesTable.View())) +} + // Examples func ExampleOption() { @@ -295,7 +394,7 @@ func ExampleOption() { //│ 5   São Paulo   Brazil   22,429,800 │ //│ …   …   …   …  │ //└───────────────────────────────────────────┘ - } +} func ExampleModel_SetRows() { var niceMargins = lipgloss.NewStyle().Padding(0, 1) diff --git a/table/testdata/TestNewFromTemplate.golden b/table/testdata/TestNewFromTemplate.golden new file mode 100644 index 0000000..b300d75 --- /dev/null +++ b/table/testdata/TestNewFromTemplate.golden @@ -0,0 +1,32 @@ +┌────────────┬────────────┬───────────┬───────────┬────────────┬───────────────┐ +│ #  │ Name  │ Type 1  │ Type 2  │ Japanese  │ Official Rom. │ +├────────────┼────────────┼───────────┼───────────┼────────────┼───────────────┤ +│ 1  │ Bulbasaur  │ Grass  │ Poison  │ フシギダネ │ Fushigidane  │ +│ 2  │ Ivysaur  │ Grass  │ Poison  │ フシギソウ │ Fushigisou  │ +│ 3  │ Venusaur  │ Grass  │ Poison  │ フシギバナ │ Fushigibana  │ +│ 4  │ Charmander │ Fire  │   │ ヒトカゲ  │ Hitokage  │ +│ 5  │ Charmeleon │ Fire  │   │ リザード  │ Lizardo  │ +│ 6  │ Charizard  │ Fire  │ Flying  │ リザードン │ Lizardon  │ +│ 7  │ Squirtle  │ Water  │   │ ゼニガメ  │ Zenigame  │ +│ 8  │ Wartortle  │ Water  │   │ カメール  │ Kameil  │ +│ 9  │ Blastoise  │ Water  │   │ カメックス │ Kamex  │ +│ 10  │ Caterpie  │ Bug  │   │ キャタピー │ Caterpie  │ +│ 11  │ Metapod  │ Bug  │   │ トランセル │ Trancell  │ +│ 12  │ Butterfree │ Bug  │ Flying  │ バタフリー │ Butterfree  │ +│ 13  │ Weedle  │ Bug  │ Poison  │ ビードル  │ Beedle  │ +│ 14  │ Kakuna  │ Bug  │ Poison  │ コクーン  │ Cocoon  │ +│ 15  │ Beedrill  │ Bug  │ Poison  │ スピアー  │ Spear  │ +│ 16  │ Pidgey  │ Normal  │ Flying  │ ポッポ  │ Poppo  │ +│ 17  │ Pidgeotto  │ Normal  │ Flying  │ ピジョン  │ Pigeon  │ +│ 18  │ Pidgeot  │ Normal  │ Flying  │ ピジョット │ Pigeot  │ +│ 19  │ Rattata  │ Normal  │   │ コラッタ  │ Koratta  │ +│ 20  │ Raticate  │ Normal  │   │ ラッタ  │ Ratta  │ +│ 21  │ Spearow  │ Normal  │ Flying  │ オニスズメ │ Onisuzume  │ +│ 22  │ Fearow  │ Normal  │ Flying  │ オニドリル │ Onidrill  │ +│ 23  │ Ekans  │ Poison  │   │ アーボ  │ Arbo  │ +│ 24  │ Arbok  │ Poison  │   │ アーボック │ Arbok  │ +│ 25  │ Pikachu  │ Electric  │   │ ピカチュウ │ Pikachu  │ +│ 26  │ Raichu  │ Electric  │   │ ライチュウ │ Raichu  │ +│ 27  │ Sandshrew  │ Ground  │   │ サンド  │ Sand  │ +│ 28  │ Sandslash  │ Ground  │   │ サンドパン │ Sandpan  │ +└────────────┴────────────┴───────────┴───────────┴────────────┴───────────────┘ \ No newline at end of file