on main help sign in
Merge pull request #526 from charmbracelet/fix-rendering
caa13c1Kujtim Hoxha
internal/tui/components/dialogs/commands/commands.go+4−2
@@ -119,7 +119,10 @@ func (c *commandDialogCmp) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
119 case tea.WindowSizeMsg:
119 case tea.WindowSizeMsg:
120 c.wWidth = msg.Width
120 c.wWidth = msg.Width
121 c.wHeight = msg.Height
121 c.wHeight = msg.Height
122+ return c, tea.Batch(
123+ c.SetCommandType(c.commandType),
122− return c, c.commandList.SetSize(c.listWidth(), c.listHeight())
124+ c.commandList.SetSize(c.listWidth(), c.listHeight()),
125+ )
123 case tea.KeyPressMsg:
126 case tea.KeyPressMsg:
124 switch {
127 switch {
125 case key.Matches(msg, c.keyMap.Select):
128 case key.Matches(msg, c.keyMap.Select):
@@ -318,7 +321,6 @@ func (c *commandDialogCmp) defaultCommands() []Command {
318 })
321 })
319 }
322 }
320 }
323 }
321−
322 // Only show toggle compact mode command if window width is larger than compact breakpoint (90)
324 // Only show toggle compact mode command if window width is larger than compact breakpoint (90)
323 if c.wWidth > 120 && c.sessionID != "" {
325 if c.wWidth > 120 && c.sessionID != "" {
324 commands = append(commands, Command{
326 commands = append(commands, Command{
internal/tui/components/files/files.go+3
@@ -59,6 +59,9 @@ func RenderFileList(fileSlice []SessionFile, opts RenderOptions) []string {
59
59
60 // Sort files by the latest version's created time
60 // Sort files by the latest version's created time
61 sort.Slice(fileSlice, func(i, j int) bool {
61 sort.Slice(fileSlice, func(i, j int) bool {
62+ if fileSlice[i].History.LatestVersion.CreatedAt == fileSlice[j].History.LatestVersion.CreatedAt {
63+ return strings.Compare(fileSlice[i].FilePath, fileSlice[j].FilePath) < 0
64+ }
62 return fileSlice[i].History.LatestVersion.CreatedAt > fileSlice[j].History.LatestVersion.CreatedAt
65 return fileSlice[i].History.LatestVersion.CreatedAt > fileSlice[j].History.LatestVersion.CreatedAt
63 })
66 })
64
67
internal/tui/exp/list/list.go+9−2
@@ -3,6 +3,7 @@ package list
3import (
3import (
4 "slices"
4 "slices"
5 "strings"
5 "strings"
6+ "sync"
6
7
7 "github.com/charmbracelet/bubbles/v2/key"
8 "github.com/charmbracelet/bubbles/v2/key"
8 tea "github.com/charmbracelet/bubbletea/v2"
9 tea "github.com/charmbracelet/bubbletea/v2"
@@ -90,6 +91,7 @@ type list[T Item] struct {
90
91
91 renderedItems *csync.Map[string, renderedItem]
92 renderedItems *csync.Map[string, renderedItem]
92
93
94+ renderMu sync.Mutex
93 rendered string
95 rendered string
94
96
95 movingByItem bool
97 movingByItem bool
@@ -328,7 +330,9 @@ func (l *list[T]) render() tea.Cmd {
328 // we are not rendering the first time
330 // we are not rendering the first time
329 if l.rendered != "" {
331 if l.rendered != "" {
330 // rerender everything will mostly hit cache
332 // rerender everything will mostly hit cache
333+ l.renderMu.Lock()
331 l.rendered, _ = l.renderIterator(0, false, "")
334 l.rendered, _ = l.renderIterator(0, false, "")
335+ l.renderMu.Unlock()
332 if l.direction == DirectionBackward {
336 if l.direction == DirectionBackward {
333 l.recalculateItemPositions()
337 l.recalculateItemPositions()
334 }
338 }
@@ -338,9 +342,10 @@ func (l *list[T]) render() tea.Cmd {
338 }
342 }
339 return focusChangeCmd
343 return focusChangeCmd
340 }
344 }
345+ l.renderMu.Lock()
341 rendered, finishIndex := l.renderIterator(0, true, "")
346 rendered, finishIndex := l.renderIterator(0, true, "")
342 l.rendered = rendered
347 l.rendered = rendered
343−
348+ l.renderMu.Unlock()
344 // recalculate for the initial items
349 // recalculate for the initial items
345 if l.direction == DirectionBackward {
350 if l.direction == DirectionBackward {
346 l.recalculateItemPositions()
351 l.recalculateItemPositions()
@@ -348,7 +353,10 @@ func (l *list[T]) render() tea.Cmd {
348 renderCmd := func() tea.Msg {
353 renderCmd := func() tea.Msg {
349 l.offset = 0
354 l.offset = 0
350 // render the rest
355 // render the rest
356+
357+ l.renderMu.Lock()
351 l.rendered, _ = l.renderIterator(finishIndex, false, l.rendered)
358 l.rendered, _ = l.renderIterator(finishIndex, false, l.rendered)
359+ l.renderMu.Unlock()
352 // needed for backwards
360 // needed for backwards
353 if l.direction == DirectionBackward {
361 if l.direction == DirectionBackward {
354 l.recalculateItemPositions()
362 l.recalculateItemPositions()
@@ -357,7 +365,6 @@ func (l *list[T]) render() tea.Cmd {
357 if l.focused {
365 if l.focused {
358 l.scrollToSelection()
366 l.scrollToSelection()
359 }
367 }
360−
361 return nil
368 return nil
362 }
369 }
363 return tea.Batch(focusChangeCmd, renderCmd)
370 return tea.Batch(focusChangeCmd, renderCmd)