@@ -65,11 +65,11 @@ class FileSelectorViewController<T>: UIViewController, AlertPresenter, UITableVi
6565 tableView. registerCellNib ( cell: FileTableViewCell . self)
6666 tableView. registerCellClass ( cell: NordicActionTableViewCell . self)
6767
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 )
6969
7070 selectButton. style = . mainAction
7171
72- navigationItem. rightBarButtonItem = UIBarButtonItem ( barButtonSystemItem: . refresh, target: self , action: #selector( reloadList ) )
72+ navigationItem. rightBarButtonItem = UIBarButtonItem ( barButtonSystemItem: . refresh, target: self , action: #selector( reloadData ) )
7373
7474 if #available( iOS 13 , * ) {
7575 UIImage ( systemName: " doc " ) . map { self . docImage. image = $0 }
@@ -82,18 +82,22 @@ class FileSelectorViewController<T>: UIViewController, AlertPresenter, UITableVi
8282
8383 override func viewWillAppear( _ animated: Bool ) {
8484 super. viewWillAppear ( animated)
85- reloadList ( )
85+ reloadData ( )
8686 }
8787
88- @objc
89- func reloadList( ) {
88+ private func reloadItemList( ) {
9089 do {
9190 let directory = try documentFileManager. buildDocumentDir ( )
9291 dataSource. updateItems ( directory)
9392 } catch let error {
9493 displayErrorAlert ( error: error)
9594 return
9695 }
96+ }
97+
98+ @objc
99+ func reloadData( ) {
100+ reloadItemList ( )
97101
98102 if !dataSource. items. isEmpty {
99103 view = tableView
@@ -158,12 +162,78 @@ class FileSelectorViewController<T>: UIViewController, AlertPresenter, UITableVi
158162 } else if let file = dataSource. items [ indexPath. row] . node as? File , dataSource. items [ indexPath. row] . valid {
159163 fileWasSelected ( file: file)
160164 }
165+
166+ tableView. deselectRow ( at: indexPath, animated: true )
161167 }
162168
163169 func tableView( _ tableView: UITableView , titleForHeaderInSection section: Int ) -> String ? {
164170 section == 0 ? " Documents Directory " : " "
165171 }
166172
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+ }
167237}
168238
169239class DFUFileSelectorViewController : FileSelectorViewController < DFUFirmware > {
0 commit comments