Skip to content

Commit 68be6a5

Browse files
committed
chore: update to v2-exp and address comments
1 parent b9d1db8 commit 68be6a5

File tree

7 files changed

+75
-18
lines changed

7 files changed

+75
-18
lines changed

Taskfile.yaml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# https://taskfile.dev
22

3-
version: '3'
3+
version: "3"
44

55
tasks:
66
lint:
@@ -17,3 +17,8 @@ tasks:
1717
desc: Run table tests
1818
cmds:
1919
- go test ./table {{.CLI_ARGS}}
20+
21+
test:tree:
22+
desc: Run tree tests
23+
cmds:
24+
- go test ./tree {{.CLI_ARGS}}

examples/tree/selection/main.go

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import (
44
"fmt"
55
"path"
66

7-
"github.com/charmbracelet/lipgloss"
8-
"github.com/charmbracelet/lipgloss/tree"
7+
"github.com/charmbracelet/lipgloss/v2"
8+
"github.com/charmbracelet/lipgloss/v2/tree"
99
)
1010

1111
const selected = "/Users/bash/.config/doom-emacs"
@@ -21,8 +21,7 @@ type styles struct {
2121

2222
func defaultStyles() styles {
2323
var s styles
24-
s.base = lipgloss.NewStyle().
25-
Background(lipgloss.Color("235"))
24+
s.base = lipgloss.NewStyle()
2625
s.container = s.base.
2726
Margin(1, 2).
2827
Padding(1, 0)
@@ -77,6 +76,14 @@ func (s file) Value() string {
7776
return s.String()
7877
}
7978

79+
func (s file) SetValue(val any) {
80+
return
81+
}
82+
83+
func (s file) SetHidden(val bool) {
84+
return
85+
}
86+
8087
func isItemSelected(children tree.Children, index int) bool {
8188
child := children.At(index)
8289
if file, ok := child.(file); ok && file.name == selected {

examples/tree/styles/main.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package main
22

33
import (
4+
"fmt"
5+
46
"github.com/charmbracelet/lipgloss/v2"
57
"github.com/charmbracelet/lipgloss/v2/tree"
68
)

list/list.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,36 @@ func (l *List) EnumeratorStyleFunc(f StyleFunc) *List {
147147
return l
148148
}
149149

150+
// IndenterStyle sets the enumerator style for all enumerators.
151+
//
152+
// To set the enumerator style conditionally based on the item value or index,
153+
// use [IndenterStyleFunc].
154+
func (l *List) IndenterStyle(style lipgloss.Style) *List {
155+
l.tree.IndenterStyle(style)
156+
return l
157+
}
158+
159+
// IndenterStyleFunc sets the enumerator style function for the list items.
160+
//
161+
// Use this to conditionally set different styles based on the current items,
162+
// sibling items, or index values (i.e. even or odd).
163+
//
164+
// Example:
165+
//
166+
// l := list.New().
167+
// IndenterStyleFunc(func(_ list.Items, i int) lipgloss.Style {
168+
// if selected == i {
169+
// return lipgloss.NewStyle().Foreground(brightPink)
170+
// }
171+
// return lipgloss.NewStyle()
172+
// })
173+
func (l *List) IndenterStyleFunc(f StyleFunc) *List {
174+
l.tree.IndenterStyleFunc(func(children tree.Children, index int) lipgloss.Style {
175+
return f(children, index)
176+
})
177+
return l
178+
}
179+
150180
// Indenter sets the indenter implementation. This is used to change the way
151181
// the tree is indented. The default indentor places a border connecting sibling
152182
// elements and no border for the last child.

list/list_test.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@ import (
66
"unicode"
77

88
"github.com/aymanbagabas/go-udiff"
9+
"github.com/charmbracelet/x/exp/golden"
10+
911
"github.com/charmbracelet/lipgloss/v2"
1012
"github.com/charmbracelet/lipgloss/v2/list"
1113
"github.com/charmbracelet/lipgloss/v2/tree"
12-
"github.com/charmbracelet/x/exp/golden"
1314
)
1415

1516
// XXX: can't write multi-line examples if the underlying string uses
@@ -79,11 +80,13 @@ func TestComplexSublist(t *testing.T) {
7980
Item(
8081
list.New().
8182
EnumeratorStyle(style2).
83+
IndenterStyle(style2).
8284
Enumerator(list.Alphabet).
8385
Item("foo").
8486
Item("Deeper").
8587
Item(
8688
list.New().
89+
IndenterStyle(style1).
8790
EnumeratorStyle(style1).
8891
Enumerator(list.Arabic).
8992
Item("a").
@@ -92,13 +95,15 @@ func TestComplexSublist(t *testing.T) {
9295
Item(
9396
list.New().
9497
Enumerator(list.Asterisk).
98+
IndenterStyle(style2).
9599
EnumeratorStyle(style2).
96100
Item("sus").
97101
Item("d minor").
98102
Item("f#").
99103
Item("One ore level, with another renderer").
100104
Item(
101105
list.New().
106+
IndenterStyle(style1).
102107
EnumeratorStyle(style1).
103108
Enumerator(list.Dash).
104109
Item("a\nmultine\nstring").
@@ -108,12 +113,14 @@ func TestComplexSublist(t *testing.T) {
108113
Item(
109114

110115
tree.New().
116+
IndenterStyle(style2).
111117
EnumeratorStyle(style2).
112118
Child("another\nmultine\nstring").
113119
Child("something").
114120
Child("a subtree").
115121
Child(
116122
tree.New().
123+
IndenterStyle(style2).
117124
EnumeratorStyle(style2).
118125
Child("yup").
119126
Child("many itens").

tree/renderer.go

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ func newRenderer() *renderer {
2525
return lipgloss.NewStyle().PaddingRight(1)
2626
},
2727
indenterFunc: func(Children, int) lipgloss.Style {
28-
return lipgloss.NewStyle()
28+
return lipgloss.NewStyle().PaddingRight(1)
2929
},
3030
itemFunc: func(Children, int) lipgloss.Style {
3131
return lipgloss.NewStyle()
@@ -81,20 +81,22 @@ func (r *renderer) render(node Node, root bool, prefix string) string {
8181
}
8282
indentStyle := r.style.indenterFunc(children, i)
8383
enumStyle := r.style.enumeratorFunc(children, i)
84+
8485
itemStyle := r.style.itemFunc(children, i)
8586

86-
indent := indenter(children, i)
87-
nodeIndent := indentStyle.Render(indent)
87+
indent := indentStyle.Render(indenter(children, i))
8888
nodePrefix := enumStyle.Render(enumerator(children, i))
89+
90+
// Preserve the background color of the enumerator when adding the padding
91+
enumBgStyle := lipgloss.NewStyle().Background(enumStyle.GetBackground())
92+
93+
// Add padding to the left of the node to align it with the longest prefix of its siblings
8994
if l := maxLen - lipgloss.Width(nodePrefix); l > 0 {
90-
nodePrefix = enumStyle.Render(strings.Repeat(" ", l)) + nodePrefix
95+
nodePrefix = enumBgStyle.Render(strings.Repeat(" ", l)) + nodePrefix
9196
}
9297

9398
item := itemStyle.Render(child.Value())
94-
multineLinePrefix := prefix
95-
if multineLinePrefix != "" {
96-
multineLinePrefix = indentStyle.Render(multineLinePrefix)
97-
}
99+
multineLinePrefix := enumBgStyle.Render(prefix)
98100

99101
// This dance below is to account for multiline prefixes, e.g. "|\n|".
100102
// In that case, we need to make sure that both the parent prefix and
@@ -103,14 +105,14 @@ func (r *renderer) render(node Node, root bool, prefix string) string {
103105
nodePrefix = lipgloss.JoinVertical(
104106
lipgloss.Left,
105107
nodePrefix,
106-
nodeIndent,
108+
indent,
107109
)
108110
}
109111
for lipgloss.Height(nodePrefix) > lipgloss.Height(multineLinePrefix) {
110112
multineLinePrefix = lipgloss.JoinVertical(
111113
lipgloss.Left,
112114
multineLinePrefix,
113-
indentStyle.Render(prefix),
115+
prefix,
114116
)
115117
}
116118

tree/tree_test.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,13 @@ package tree_test
33
import (
44
"testing"
55

6+
"github.com/charmbracelet/x/ansi"
7+
"github.com/charmbracelet/x/exp/golden"
8+
69
"github.com/charmbracelet/lipgloss/v2"
710
"github.com/charmbracelet/lipgloss/v2/list"
811
"github.com/charmbracelet/lipgloss/v2/table"
912
"github.com/charmbracelet/lipgloss/v2/tree"
10-
"github.com/charmbracelet/x/ansi"
11-
"github.com/charmbracelet/x/exp/golden"
1213
)
1314

1415
func TestTree(t *testing.T) {
@@ -182,6 +183,9 @@ func TestTreeCustom(t *testing.T) {
182183
EnumeratorStyle(lipgloss.NewStyle().
183184
Foreground(lipgloss.Color("12")).
184185
PaddingRight(1)).
186+
IndenterStyle(lipgloss.NewStyle().
187+
Foreground(lipgloss.Color("12")).
188+
PaddingRight(1)).
185189
Enumerator(func(tree.Children, int) string {
186190
return "->"
187191
}).

0 commit comments

Comments
 (0)