on main help sign in
Merge pull request #526 from charmbracelet/fix-rendering

Fix a few issues with rendering

commitcaa13c1d65d8ecb5a69c2cfc616581eb1942e668 authorKujtim Hoxha <kujtimii.h@gmail.com> dateMon 4 Aug 2025, 23:18 (1 year ago) parentfac2d43df83063
3 files changed+16−4
internal/tui/components/dialogs/commands/commands.go+4−2 internal/tui/components/files/files.go+3 internal/tui/exp/list/list.go+9−2
internal/tui/components/dialogs/commands/commands.go+4−2
@@ -119,7 +119,10 @@ func (c *commandDialogCmp) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
119119 case tea.WindowSizeMsg:
120120 c.wWidth = msg.Width
121121 c.wHeight = msg.Height
122− return c, c.commandList.SetSize(c.listWidth(), c.listHeight())
122+ return c, tea.Batch(
123+ c.SetCommandType(c.commandType),
124+ c.commandList.SetSize(c.listWidth(), c.listHeight()),
125+ )
123126 case tea.KeyPressMsg:
124127 switch {
125128 case key.Matches(msg, c.keyMap.Select):
@@ -318,7 +321,6 @@ func (c *commandDialogCmp) defaultCommands() []Command {
318321 })
319322 }
320323 }
321−
322324 // Only show toggle compact mode command if window width is larger than compact breakpoint (90)
323325 if c.wWidth > 120 && c.sessionID != "" {
324326 commands = append(commands, Command{
internal/tui/components/files/files.go+3
@@ -59,6 +59,9 @@ func RenderFileList(fileSlice []SessionFile, opts RenderOptions) []string {
5959
6060 // Sort files by the latest version's created time
6161 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+ }
6265 return fileSlice[i].History.LatestVersion.CreatedAt > fileSlice[j].History.LatestVersion.CreatedAt
6366 })
6467
internal/tui/exp/list/list.go+9−2
@@ -3,6 +3,7 @@ package list
33import (
44 "slices"
55 "strings"
6+ "sync"
67
78 "github.com/charmbracelet/bubbles/v2/key"
89 tea "github.com/charmbracelet/bubbletea/v2"
@@ -90,6 +91,7 @@ type list[T Item] struct {
9091
9192 renderedItems *csync.Map[string, renderedItem]
9293
94+ renderMu sync.Mutex
9395 rendered string
9496
9597 movingByItem bool
@@ -328,7 +330,9 @@ func (l *list[T]) render() tea.Cmd {
328330 // we are not rendering the first time
329331 if l.rendered != "" {
330332 // rerender everything will mostly hit cache
333+ l.renderMu.Lock()
331334 l.rendered, _ = l.renderIterator(0, false, "")
335+ l.renderMu.Unlock()
332336 if l.direction == DirectionBackward {
333337 l.recalculateItemPositions()
334338 }
@@ -338,9 +342,10 @@ func (l *list[T]) render() tea.Cmd {
338342 }
339343 return focusChangeCmd
340344 }
345+ l.renderMu.Lock()
341346 rendered, finishIndex := l.renderIterator(0, true, "")
342347 l.rendered = rendered
343−
348+ l.renderMu.Unlock()
344349 // recalculate for the initial items
345350 if l.direction == DirectionBackward {
346351 l.recalculateItemPositions()
@@ -348,7 +353,10 @@ func (l *list[T]) render() tea.Cmd {
348353 renderCmd := func() tea.Msg {
349354 l.offset = 0
350355 // render the rest
356+
357+ l.renderMu.Lock()
351358 l.rendered, _ = l.renderIterator(finishIndex, false, l.rendered)
359+ l.renderMu.Unlock()
352360 // needed for backwards
353361 if l.direction == DirectionBackward {
354362 l.recalculateItemPositions()
@@ -357,7 +365,6 @@ func (l *list[T]) render() tea.Cmd {
357365 if l.focused {
358366 l.scrollToSelection()
359367 }
360−
361368 return nil
362369 }
363370 return tea.Batch(focusChangeCmd, renderCmd)