Skip to content

Commit 84b8598

Browse files
committed
feat: add option to recursively list all files in a branch (fixes #362)
Signed-off-by: Tommy van der Vorst <tommy@pixelspark.nl>
1 parent 6c7fc90 commit 84b8598

File tree

4 files changed

+77
-8
lines changed

4 files changed

+77
-8
lines changed

Localizable.xcstrings

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31292,6 +31292,52 @@
3129231292
}
3129331293
}
3129431294
},
31295+
"Show files in subdirectories" : {
31296+
"localizations" : {
31297+
"de" : {
31298+
"stringUnit" : {
31299+
"state" : "translated",
31300+
"value" : "Dateien in Unterverzeichnissen anzeigen"
31301+
}
31302+
},
31303+
"es" : {
31304+
"stringUnit" : {
31305+
"state" : "translated",
31306+
"value" : "Mostrar archivos en subdirectorios"
31307+
}
31308+
},
31309+
"it" : {
31310+
"stringUnit" : {
31311+
"state" : "translated",
31312+
"value" : "Mostra file nelle sottodirectory"
31313+
}
31314+
},
31315+
"ja" : {
31316+
"stringUnit" : {
31317+
"state" : "translated",
31318+
"value" : "サブディレクトリのファイルを表示"
31319+
}
31320+
},
31321+
"nl" : {
31322+
"stringUnit" : {
31323+
"state" : "translated",
31324+
"value" : "Bestanden in submappen tonen"
31325+
}
31326+
},
31327+
"uk" : {
31328+
"stringUnit" : {
31329+
"state" : "translated",
31330+
"value" : "Показати файли в підкаталогах"
31331+
}
31332+
},
31333+
"zh-Hans" : {
31334+
"stringUnit" : {
31335+
"state" : "translated",
31336+
"value" : "显示子目录中的文件"
31337+
}
31338+
}
31339+
}
31340+
},
3129531341
"Show folder in the app" : {
3129631342
"localizations" : {
3129731343
"de" : {

Sushitrain/BrowserView.swift

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ struct BrowserView: View {
124124
@State private var isWorking = false
125125
@State private var isBookmarked = false
126126
@State private var showNewBookmarkInfo = false
127+
@State private var recursive = false
127128

128129
#if os(macOS)
129130
@State private var showIgnores = false
@@ -173,6 +174,7 @@ struct BrowserView: View {
173174
viewStyle: $viewStyle,
174175
filterAvailability: currentFilterAvailability,
175176
sortOrder: currentSort,
177+
recursive: recursive,
176178
searchText: $searchText,
177179
showSettings: $showSettings
178180
)
@@ -454,6 +456,8 @@ struct BrowserView: View {
454456
Divider()
455457

456458
Toggle("Hide dotfiles", systemImage: "eye.slash", isOn: userSettings.$dotFilesHidden)
459+
460+
Toggle("Show files in subdirectories", systemImage: "text.insert", isOn: $recursive)
457461

458462
} label: {
459463
Label("Filter and sort", systemImage: "line.3.horizontal.decrease")
@@ -517,7 +521,7 @@ struct BrowserView: View {
517521
})
518522

519523
// Check for presence of index.html to enable web view
520-
if folderExists, let entry = try? folder.getFileInformation(self.prefix + "index.html"),
524+
if folderExists, !recursive, let entry = try? folder.getFileInformation(self.prefix + "index.html"),
521525
!entry.isDirectory() && !entry.isDeleted()
522526
{
523527
self.webViewAvailable = true
@@ -921,6 +925,7 @@ private struct BrowserItemsView: View {
921925
@Binding var viewStyle: BrowserViewStyle?
922926
let filterAvailability: BrowserViewFilterAvailability
923927
let sortOrder: BrowserViewSort
928+
let recursive: Bool
924929

925930
@Binding var searchText: String
926931
@Binding var showSettings: Bool
@@ -1024,6 +1029,11 @@ private struct BrowserItemsView: View {
10241029
await self.updateExtraneousFiles()
10251030
}
10261031
}
1032+
.onChange(of: recursive) {
1033+
Task {
1034+
await self.reload()
1035+
}
1036+
}
10271037
}
10281038

10291039
private var isEmpty: Bool {
@@ -1275,7 +1285,7 @@ private struct BrowserItemsView: View {
12751285
return []
12761286
}
12771287
do {
1278-
var entries = try folder.listEntries(prefix: self.prefix, directories: false, hideDotFiles: dotFilesHidden)
1288+
var entries = try folder.listEntries(prefix: self.prefix, directories: false, hideDotFiles: dotFilesHidden, recursive: self.recursive)
12791289
entries.sort(by: sortSpec.isOrderedBefore)
12801290
return entries
12811291
}
@@ -1325,7 +1335,7 @@ private struct BrowserItemsView: View {
13251335

13261336
if self.viewStyle == nil {
13271337
// Do we have an index.html? If so switch to web view
1328-
if appState.userSettings.automaticallyShowWebpages && self.files.contains(where: { $0.fileName() == "index.html" }) {
1338+
if appState.userSettings.automaticallyShowWebpages && !recursive && self.files.contains(where: { $0.fileName() == "index.html" }) {
13291339
self.viewStyle = .web
13301340
}
13311341
else if appState.userSettings.automaticallySwitchViewStyle {

Sushitrain/Utils.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -213,8 +213,8 @@ extension SushitrainFolder {
213213
try self.unlink()
214214
}
215215

216-
func listEntries(prefix: String, directories: Bool, hideDotFiles: Bool) throws -> [SushitrainEntry] {
217-
let list = try self.list(prefix, directories: directories, recurse: false)
216+
func listEntries(prefix: String, directories: Bool, hideDotFiles: Bool, recursive: Bool) throws -> [SushitrainEntry] {
217+
let list = try self.list(prefix, directories: directories, recurse: recursive)
218218
var entries: [SushitrainEntry] = []
219219
for i in 0..<list.count() {
220220
let path = list.item(at: i)

SushitrainCore/src/folder.go

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -274,14 +274,27 @@ func (fld *Folder) listEntries(prefix string, directories bool, recurse bool) ([
274274
return fld.client.app.Internals.GlobalTree(fld.FolderID, prefix, levels, directories)
275275
}
276276

277+
func flatten(entries []*model.TreeEntry, recurse bool, prefix string) []string {
278+
newEntries := make([]string, 0)
279+
for e := range entries {
280+
entry := entries[e]
281+
newEntries = append(newEntries, prefix+entry.Name)
282+
if recurse {
283+
newEntries = append(newEntries, flatten(entry.Children, recurse, prefix+entry.Name+"/")...)
284+
}
285+
}
286+
return newEntries
287+
}
288+
277289
func (fld *Folder) List(prefix string, directories bool, recurse bool) (*ListOfStrings, error) {
278290
entries, err := fld.listEntries(prefix, directories, recurse)
279291
if err != nil {
280292
return nil, err
281293
}
282-
return List(Map(entries, func(entry *model.TreeEntry) string {
283-
return entry.Name
284-
})), nil
294+
295+
// Flatten the tree
296+
names := flatten(entries, recurse, "")
297+
return List(names), nil
285298
}
286299

287300
func (fld *Folder) ShareWithDevice(deviceID string, toggle bool, encryptionPassword string) error {

0 commit comments

Comments
 (0)