@@ -65,11 +65,11 @@ class FileSelectorViewController<T>: UIViewController, AlertPresenter, UITableVi
65
65
tableView. registerCellNib ( cell: FileTableViewCell . self)
66
66
tableView. registerCellClass ( cell: NordicActionTableViewCell . self)
67
67
68
- NotificationCenter . default. addObserver ( self , selector: #selector( reloadList ) , name: UIApplication . willEnterForegroundNotification, object: nil )
68
+ NotificationCenter . default. addObserver ( self , selector: #selector( reloadData ) , name: UIApplication . willEnterForegroundNotification, object: nil )
69
69
70
70
selectButton. style = . mainAction
71
71
72
- navigationItem. rightBarButtonItem = UIBarButtonItem ( barButtonSystemItem: . refresh, target: self , action: #selector( reloadList ) )
72
+ navigationItem. rightBarButtonItem = UIBarButtonItem ( barButtonSystemItem: . refresh, target: self , action: #selector( reloadData ) )
73
73
74
74
if #available( iOS 13 , * ) {
75
75
UIImage ( systemName: " doc " ) . map { self . docImage. image = $0 }
@@ -82,18 +82,22 @@ class FileSelectorViewController<T>: UIViewController, AlertPresenter, UITableVi
82
82
83
83
override func viewWillAppear( _ animated: Bool ) {
84
84
super. viewWillAppear ( animated)
85
- reloadList ( )
85
+ reloadData ( )
86
86
}
87
87
88
- @objc
89
- func reloadList( ) {
88
+ private func reloadItemList( ) {
90
89
do {
91
90
let directory = try documentFileManager. buildDocumentDir ( )
92
91
dataSource. updateItems ( directory)
93
92
} catch let error {
94
93
displayErrorAlert ( error: error)
95
94
return
96
95
}
96
+ }
97
+
98
+ @objc
99
+ func reloadData( ) {
100
+ reloadItemList ( )
97
101
98
102
if !dataSource. items. isEmpty {
99
103
view = tableView
@@ -158,12 +162,78 @@ class FileSelectorViewController<T>: UIViewController, AlertPresenter, UITableVi
158
162
} else if let file = dataSource. items [ indexPath. row] . node as? File , dataSource. items [ indexPath. row] . valid {
159
163
fileWasSelected ( file: file)
160
164
}
165
+
166
+ tableView. deselectRow ( at: indexPath, animated: true )
161
167
}
162
168
163
169
func tableView( _ tableView: UITableView , titleForHeaderInSection section: Int ) -> String ? {
164
170
section == 0 ? " Documents Directory " : " "
165
171
}
166
172
173
+ func tableView( _ tableView: UITableView , canEditRowAt indexPath: IndexPath ) -> Bool {
174
+ indexPath. section == 0
175
+ }
176
+
177
+ func tableView( _ tableView: UITableView , commit editingStyle: UITableViewCell . EditingStyle , forRowAt indexPath: IndexPath ) {
178
+ guard editingStyle == . delete else { return }
179
+ let item = self . dataSource. items [ indexPath. row]
180
+
181
+ let deleteItem : ( FSNode ) -> ( Error ? ) = { [ weak self] node in
182
+ guard let `self` = self else { return QuickError ( message: " Unknown Error " ) }
183
+
184
+ do {
185
+ try self . documentFileManager. deleteNode ( node)
186
+ } catch let error {
187
+ return error
188
+ }
189
+ return nil
190
+ }
191
+
192
+ if let directory = item. node as? Directory {
193
+ let alert = UIAlertController ( title: " Remove Directory " , message: " Do you want to delete entire directory with all nested items? " , preferredStyle: . alert)
194
+ let delete = UIAlertAction ( title: " Delete " , style: . destructive, handler: { _ in
195
+ self . removeDirectory ( directory, rootItem: item, deleteAction: deleteItem)
196
+ } )
197
+ let cancel = UIAlertAction ( title: " Cancel " , style: . cancel, handler: nil )
198
+
199
+ alert. addAction ( delete)
200
+ alert. addAction ( cancel)
201
+
202
+ self . present ( alert, animated: true , completion: nil )
203
+ } else {
204
+ deleteFile ( item. node, deleteAction: deleteItem)
205
+ }
206
+
207
+ }
208
+
209
+ private func removeDirectory( _ dir: Directory , rootItem: FSNodeRepresentation , deleteAction: ( FSNode ) -> ( Error ? ) ) {
210
+ let indexPaths = ( [ rootItem] + dataSource. items ( dir) )
211
+ . compactMap { item in
212
+ self . dataSource. items. firstIndex { item. node. url == $0. node. url }
213
+ }
214
+ . map { IndexPath ( row: $0, section: 0 ) }
215
+ if let error = deleteAction ( rootItem. node) {
216
+ displayErrorAlert ( error: error)
217
+ return
218
+ }
219
+ self . reloadItemList ( )
220
+ tableView. deleteRows ( at: indexPaths, with: . automatic)
221
+ }
222
+
223
+ private func deleteFile( _ item: FSNode , deleteAction: ( FSNode ) -> ( Error ? ) ) {
224
+ guard let ip = self . dataSource. items
225
+ . firstIndex ( where: { item. url == $0. node. url } )
226
+ . map ( { IndexPath ( row: $0, section: 0 ) } ) else {
227
+ return
228
+ }
229
+
230
+ if let error = deleteAction ( item) {
231
+ displayErrorAlert ( error: error)
232
+ return
233
+ }
234
+ self . reloadItemList ( )
235
+ tableView. deleteRows ( at: [ ip] , with: . automatic)
236
+ }
167
237
}
168
238
169
239
class DFUFileSelectorViewController : FileSelectorViewController < DFUFirmware > {
0 commit comments