Skip to content

Commit 0875099

Browse files
committed
add subdir
1 parent 81fe07c commit 0875099

File tree

4 files changed

+18
-58
lines changed

4 files changed

+18
-58
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
.*.swp
22
.DS_Store
3+
.idea/
34
build/
45
xcuserdata/
56
CattleGrid.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/

CattleGrid/ContentView.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ struct MainScreen: View {
5959
NavigationView {
6060
if (tagStore.amiibos.count > 0) {
6161
List(tagStore.amiibos, id:\.path) { amiibo in
62-
Text(amiibo.lastPathComponent).onTapGesture {
62+
Text(amiibo.relativePath).onTapGesture {
6363
self.tagStore.load(amiibo)
6464
}
6565
.foregroundColor(self.selected(amiibo) ? .primary : .secondary)

CattleGrid/DirectoryWatcher.swift

+3-38
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,16 @@ public class DirectoryWatcher: NSObject {
1515
var watchedUrl: URL
1616

1717
private var source: DispatchSourceFileSystemObject?
18-
private var previousContents: Set<URL>
1918
private var queue: DispatchQueue?
2019
private var retriesLeft: Int!
2120
private var directoryChanging = false
2221

2322
public var ignoreDirectories = true
24-
public var onNewFiles: (([URL]) -> Void)?
25-
public var onDeletedFiles: (([URL]) -> Void)?
23+
public var onFilesChanged: (() -> Void)?
2624

2725
//init
2826
init(watchedUrl: URL) {
2927
self.watchedUrl = watchedUrl
30-
let contentsArray = (try? FileManager.default.contentsOfDirectory(at: watchedUrl, includingPropertiesForKeys: [.isDirectoryKey], options: .skipsHiddenFiles)) ?? []
31-
self.previousContents = Set(contentsArray)
3228
}
3329

3430
public class func watch(_ url: URL) -> DirectoryWatcher? {
@@ -79,8 +75,7 @@ public class DirectoryWatcher: NSObject {
7975

8076
deinit {
8177
let _ = self.stopWatching()
82-
self.onNewFiles = nil
83-
self.onDeletedFiles = nil
78+
self.onFilesChanged = nil
8479
}
8580
}
8681

@@ -141,37 +136,7 @@ extension DirectoryWatcher {
141136
// Changes appear to be completed
142137
// Post a notification informing that the directory did change
143138
DispatchQueue.main.async {
144-
let contentsArray = (try? FileManager.default.contentsOfDirectory(at: self.watchedUrl, includingPropertiesForKeys: [.isDirectoryKey], options: .skipsHiddenFiles)) ?? []
145-
let newContents = Set(contentsArray)
146-
147-
let newElements = newContents.subtracting(self.previousContents)
148-
let deletedElements = self.previousContents.subtracting(newContents)
149-
150-
self.previousContents = newContents
151-
152-
if !deletedElements.isEmpty {
153-
let elements = deletedElements.compactMap({ (element) -> URL? in
154-
let isDirectory = (try? element.resourceValues(forKeys: [.isDirectoryKey]))?.isDirectory ?? false
155-
156-
guard (!isDirectory || !self.ignoreDirectories) else {
157-
return nil
158-
}
159-
return element
160-
})
161-
self.onDeletedFiles?(elements)
162-
}
163-
164-
if !newElements.isEmpty {
165-
let elements = newElements.compactMap({ (element) -> URL? in
166-
let isDirectory = (try? element.resourceValues(forKeys: [.isDirectoryKey]))?.isDirectory ?? false
167-
168-
guard (!isDirectory || !self.ignoreDirectories) else {
169-
return nil
170-
}
171-
return element
172-
})
173-
self.onNewFiles?(elements)
174-
}
139+
self.onFilesChanged?()
175140
}
176141
}
177142
}

CattleGrid/TagStore.swift

+13-19
Original file line numberDiff line numberDiff line change
@@ -94,11 +94,7 @@ class TagStore : NSObject, ObservableObject, NFCTagReaderSessionDelegate {
9494
return
9595
}
9696

97-
watcher.onNewFiles = { newFiles in
98-
self.loadList()
99-
}
100-
101-
watcher.onDeletedFiles = { deletedFiles in
97+
watcher.onFilesChanged = {
10298
self.loadList()
10399
}
104100
}
@@ -122,21 +118,19 @@ class TagStore : NSObject, ObservableObject, NFCTagReaderSessionDelegate {
122118
}
123119

124120
func loadList() {
125-
do {
126-
let items = try fm.contentsOfDirectory(at: getDocumentsDirectory(), includingPropertiesForKeys: [], options: [.skipsHiddenFiles, .skipsPackageDescendants, .skipsSubdirectoryDescendants])
127-
let sortedItems = items.sorted(by: { $0.lastPathComponent < $1.lastPathComponent})
128-
amiibos = sortedItems.filter({ (item) -> Bool in
129-
do {
130-
let isDir = (try item.resourceValues(forKeys: [.isDirectoryKey])).isDirectory ?? false
131-
let isKeyRetail = item.lastPathComponent == KEY_RETAIL
132-
return !isDir && !isKeyRetail
133-
} catch {
134-
return false
135-
}
136-
})
137-
} catch {
138-
// failed to read directory – bad permissions, perhaps?
121+
let dirEnumerator = fm.enumerator(at: getDocumentsDirectory(), includingPropertiesForKeys: nil, options: [.includesDirectoriesPostOrder, .producesRelativePathURLs])!
122+
var fileURLs: [URL] = []
123+
for case let fileURL as URL in dirEnumerator {
124+
guard let resourceValues = try? fileURL.resourceValues(forKeys: [.isDirectoryKey]),
125+
let isDirectory = resourceValues.isDirectory
126+
else {
127+
continue
128+
}
129+
if (!isDirectory) {
130+
fileURLs.append(fileURL)
131+
}
139132
}
133+
amiibos = fileURLs.sorted(by: { $0.relativePath < $1.relativePath})
140134
}
141135

142136
func getDocumentsDirectory() -> URL {

0 commit comments

Comments
 (0)