feat(config): allow configure the default diff mode (#454)

bbrodriges created

Change summary

internal/config/config.go                                  |  3 
internal/tui/components/dialogs/permissions/permissions.go | 31 +++++++
internal/tui/tui.go                                        |  4 
schema.json                                                |  8 ++
4 files changed, 41 insertions(+), 5 deletions(-)

Detailed changes

internal/config/config.go 🔗

@@ -123,7 +123,8 @@ type LSPConfig struct {
 }
 
 type TUIOptions struct {
-	CompactMode bool `json:"compact_mode,omitempty" jsonschema:"description=Enable compact mode for the TUI interface,default=false"`
+	CompactMode bool   `json:"compact_mode,omitempty" jsonschema:"description=Enable compact mode for the TUI interface,default=false"`
+	DiffMode    string `json:"diff_mode,omitempty" jsonschema:"description=Diff mode for the TUI interface,enum=unified,enum=split"`
 	// Here we can add themes later or any TUI related options
 }
 

internal/tui/components/dialogs/permissions/permissions.go 🔗

@@ -69,13 +69,18 @@ type permissionDialogCmp struct {
 	keyMap KeyMap
 }
 
-func NewPermissionDialogCmp(permission permission.PermissionRequest) PermissionDialogCmp {
+func NewPermissionDialogCmp(permission permission.PermissionRequest, opts *Options) PermissionDialogCmp {
+	if opts == nil {
+		opts = &Options{}
+	}
+
 	// Create viewport for content
 	contentViewport := viewport.New()
 	return &permissionDialogCmp{
 		contentViewPort: contentViewport,
 		selectedOption:  0, // Default to "Allow"
 		permission:      permission,
+		diffSplitMode:   opts.isSplitMode(),
 		keyMap:          DefaultKeyMap(),
 		contentDirty:    true, // Mark as dirty initially
 	}
@@ -643,9 +648,8 @@ func (p *permissionDialogCmp) generateDefaultContent() string {
 func (p *permissionDialogCmp) useDiffSplitMode() bool {
 	if p.diffSplitMode != nil {
 		return *p.diffSplitMode
-	} else {
-		return p.defaultDiffSplitMode
 	}
+	return p.defaultDiffSplitMode
 }
 
 func (p *permissionDialogCmp) styleViewport() string {
@@ -789,3 +793,24 @@ func (p *permissionDialogCmp) ID() dialogs.DialogID {
 func (p *permissionDialogCmp) Position() (int, int) {
 	return p.positionRow, p.positionCol
 }
+
+// Options for create a new permission dialog
+type Options struct {
+	DiffMode string // split or unified, empty means use defaultDiffSplitMode
+}
+
+// isSplitMode returns internal representation of diff mode switch
+func (o Options) isSplitMode() *bool {
+	var split bool
+
+	switch o.DiffMode {
+	case "split":
+		split = true
+	case "unified":
+		split = false
+	default:
+		return nil
+	}
+
+	return &split
+}

internal/tui/tui.go 🔗

@@ -215,7 +215,9 @@ func (a *appModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
 		return a, cmd
 	case pubsub.Event[permission.PermissionRequest]:
 		return a, util.CmdHandler(dialogs.OpenDialogMsg{
-			Model: permissions.NewPermissionDialogCmp(msg.Payload),
+			Model: permissions.NewPermissionDialogCmp(msg.Payload, &permissions.Options{
+				DiffMode: config.Get().Options.TUI.DiffMode,
+			}),
 		})
 	case permissions.PermissionResponseMsg:
 		switch msg.Action {

schema.json 🔗

@@ -387,6 +387,14 @@
           "type": "boolean",
           "description": "Enable compact mode for the TUI interface",
           "default": false
+        },
+        "diff_mode": {
+          "type": "string",
+          "enum": [
+            "unified",
+            "split"
+          ],
+          "description": "Diff mode for the TUI interface"
         }
       },
       "additionalProperties": false,