on main help sign in
fix(tui): permissions: default to diff split mode when dialog is wide enough

This makes the diff view more readable in wider dialogs by default, while still allowing users to toggle between split and unified modes. If the user has previously set a preference, that will be respected. Otherwise, the dialog will start in split mode when wide enough.

commit4c278def930dbe21b6e4194c28ed09489c582bae authorAyman Bagabas <ayman.bagabas@gmail.com> dateTue 15 Jul 2025, 14:01 (1 year ago) parent833eede
1 file changed+23−6
internal/tui/components/dialogs/permissions/permissions.go+23−6
internal/tui/components/dialogs/permissions/permissions.go+23−6
@@ -52,9 +52,10 @@ type permissionDialogCmp struct {
5252 selectedOption int // 0: Allow, 1: Allow for session, 2: Deny
5353
5454 // Diff view state
55− diffSplitMode bool // true for split, false for unified
56− diffXOffset int // horizontal scroll offset
57− diffYOffset int // vertical scroll offset
55+ defaultDiffSplitMode bool // true for split, false for unified
56+ diffSplitMode *bool // nil means use defaultDiffSplitMode
57+ diffXOffset int // horizontal scroll offset
58+ diffYOffset int // vertical scroll offset
5859
5960 // Caching
6061 cachedContent string
@@ -122,7 +123,12 @@ func (p *permissionDialogCmp) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
122123 )
123124 case key.Matches(msg, p.keyMap.ToggleDiffMode):
124125 if p.supportsDiffView() {
125− p.diffSplitMode = !p.diffSplitMode
126+ if p.diffSplitMode == nil {
127+ diffSplitMode := !p.defaultDiffSplitMode
128+ p.diffSplitMode = &diffSplitMode
129+ } else {
130+ *p.diffSplitMode = !*p.diffSplitMode
131+ }
126132 p.contentDirty = true // Mark content as dirty when diff mode changes
127133 return p, nil
128134 }
@@ -354,7 +360,7 @@ func (p *permissionDialogCmp) generateEditContent() string {
354360 Width(p.contentViewPort.Width()).
355361 XOffset(p.diffXOffset).
356362 YOffset(p.diffYOffset)
357− if p.diffSplitMode {
363+ if p.useDiffSplitMode() {
358364 formatter = formatter.Split()
359365 } else {
360366 formatter = formatter.Unified()
@@ -376,7 +382,7 @@ func (p *permissionDialogCmp) generateWriteContent() string {
376382 Width(p.contentViewPort.Width()).
377383 XOffset(p.diffXOffset).
378384 YOffset(p.diffYOffset)
379− if p.diffSplitMode {
385+ if p.useDiffSplitMode() {
380386 formatter = formatter.Split()
381387 } else {
382388 formatter = formatter.Unified()
@@ -425,6 +431,14 @@ func (p *permissionDialogCmp) generateDefaultContent() string {
425431 return finalContent
426432}
427433
434+func (p *permissionDialogCmp) useDiffSplitMode() bool {
435+ if p.diffSplitMode != nil {
436+ return *p.diffSplitMode
437+ } else {
438+ return p.defaultDiffSplitMode
439+ }
440+}
441+
428442func (p *permissionDialogCmp) styleViewport() string {
429443 t := styles.CurrentTheme()
430444 return t.S().Base.Render(p.contentViewPort.View())
@@ -512,6 +526,9 @@ func (p *permissionDialogCmp) SetSize() tea.Cmd {
512526 p.height = int(float64(p.wHeight) * 0.5)
513527 }
514528
529+ // Default to diff split mode when dialog is wide enough.
530+ p.defaultDiffSplitMode = p.width >= 140
531+
515532 // Mark content as dirty if size changed
516533 if oldWidth != p.width || oldHeight != p.height {
517534 p.contentDirty = true