feat(diffview): add support for mouse scrolling

Andrey Nering created

Change summary

internal/tui/components/dialogs/permissions/permissions.go | 45 ++++++-
internal/tui/tui.go                                        |  5 
2 files changed, 42 insertions(+), 8 deletions(-)

Detailed changes

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

@@ -134,26 +134,22 @@ func (p *permissionDialogCmp) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
 			}
 		case key.Matches(msg, p.keyMap.ScrollDown):
 			if p.supportsDiffView() {
-				p.diffYOffset += 1
-				p.contentDirty = true // Mark content as dirty when scrolling
+				p.scrollDown()
 				return p, nil
 			}
 		case key.Matches(msg, p.keyMap.ScrollUp):
 			if p.supportsDiffView() {
-				p.diffYOffset = max(0, p.diffYOffset-1)
-				p.contentDirty = true // Mark content as dirty when scrolling
+				p.scrollUp()
 				return p, nil
 			}
 		case key.Matches(msg, p.keyMap.ScrollLeft):
 			if p.supportsDiffView() {
-				p.diffXOffset = max(0, p.diffXOffset-5)
-				p.contentDirty = true // Mark content as dirty when scrolling
+				p.scrollLeft()
 				return p, nil
 			}
 		case key.Matches(msg, p.keyMap.ScrollRight):
 			if p.supportsDiffView() {
-				p.diffXOffset += 5
-				p.contentDirty = true // Mark content as dirty when scrolling
+				p.scrollRight()
 				return p, nil
 			}
 		default:
@@ -162,11 +158,44 @@ func (p *permissionDialogCmp) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
 			p.contentViewPort = viewPort
 			cmds = append(cmds, cmd)
 		}
+	case tea.MouseWheelMsg:
+		if p.supportsDiffView() {
+			switch msg.Button {
+			case tea.MouseWheelDown:
+				p.scrollDown()
+			case tea.MouseWheelUp:
+				p.scrollUp()
+			case tea.MouseWheelLeft:
+				p.scrollLeft()
+			case tea.MouseWheelRight:
+				p.scrollRight()
+			}
+		}
 	}
 
 	return p, tea.Batch(cmds...)
 }
 
+func (p *permissionDialogCmp) scrollDown() {
+	p.diffYOffset += 1
+	p.contentDirty = true
+}
+
+func (p *permissionDialogCmp) scrollUp() {
+	p.diffYOffset = max(0, p.diffYOffset-1)
+	p.contentDirty = true
+}
+
+func (p *permissionDialogCmp) scrollLeft() {
+	p.diffXOffset = max(0, p.diffXOffset-5)
+	p.contentDirty = true
+}
+
+func (p *permissionDialogCmp) scrollRight() {
+	p.diffXOffset += 5
+	p.contentDirty = true
+}
+
 func (p *permissionDialogCmp) selectCurrentOption() tea.Cmd {
 	var action PermissionAction
 

internal/tui/tui.go 🔗

@@ -264,6 +264,11 @@ func (a *appModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
 		return a, a.handleKeyPressMsg(msg)
 
 	case tea.MouseWheelMsg:
+		if a.dialog.HasDialogs() && a.dialog.ActiveDialogID() == permissions.PermissionsDialogID {
+			u, dialogCmd := a.dialog.Update(msg)
+			a.dialog = u.(dialogs.DialogCmp)
+			cmds = append(cmds, dialogCmd)
+		}
 		if !a.dialog.HasDialogs() {
 			updated, pageCmd := a.pages[a.currentPage].Update(msg)
 			a.pages[a.currentPage] = updated.(util.Model)