77
88import SwiftUI
99
10+ enum NavigationDirection {
11+ case up, down
12+ }
13+
1014struct PaneFileBrowserView : View {
1115 @EnvironmentObject var browserModel : BrowserModel
1216 @Binding var selectedImage : FileItem ?
@@ -41,6 +45,14 @@ struct PaneFileBrowserView: View {
4145 }
4246 }
4347 . focused ( $isListFocused)
48+ . onKeyPress ( . upArrow) {
49+ navigateToNextImage ( direction: . up)
50+ return . handled
51+ }
52+ . onKeyPress ( . downArrow) {
53+ navigateToNextImage ( direction: . down)
54+ return . handled
55+ }
4456 . onAppear {
4557 isListFocused = true
4658 }
@@ -65,6 +77,36 @@ struct PaneFileBrowserView: View {
6577 }
6678 }
6779 }
80+
81+ private func navigateToNextImage( direction: NavigationDirection ) {
82+ // Get only viewable media files (staticImage, animatedGif, and video)
83+ let mediaFiles = browserModel. items. filter { item in
84+ item. mediaType == . staticImage || item. mediaType == . animatedGif || item. mediaType == . video
85+ }
86+
87+ guard !mediaFiles. isEmpty else { return }
88+
89+ // If no media is currently selected, select the first or last media based on direction
90+ guard let currentSelection = selectedImage,
91+ let currentIndex = mediaFiles. firstIndex ( of: currentSelection) else {
92+ selectedImage = direction == . down ? mediaFiles. first : mediaFiles. last
93+ return
94+ }
95+
96+ // Navigate to next/previous media file
97+ switch direction {
98+ case . down:
99+ if currentIndex < mediaFiles. count - 1 {
100+ selectedImage = mediaFiles [ currentIndex + 1 ]
101+ }
102+ // If at the end, do nothing (don't wrap around)
103+ case . up:
104+ if currentIndex > 0 {
105+ selectedImage = mediaFiles [ currentIndex - 1 ]
106+ }
107+ // If at the beginning, do nothing (don't wrap around)
108+ }
109+ }
68110}
69111
70112struct NavigationHeader : View {
0 commit comments