Ver código fonte

Handle file deletion

Steven Silvester 9 anos atrás
pai
commit
87d8447a4e

+ 4 - 0
examples/filebrowser/src/index.ts

@@ -84,6 +84,10 @@ function main(): void {
     dock.insertTabAfter(editor);
   });
 
+  fbModel.fileChanged.connect((fbModel, args) => {
+    docManager.rename(args.oldValue, args.newValue);
+  });
+
   let keymapManager = new KeymapManager();
   keymapManager.add([{
     sequence: ['Enter'],

+ 5 - 0
src/docmanager/handler.ts

@@ -171,6 +171,11 @@ abstract class AbstractFileHandler<T extends Widget> implements IMessageFilter {
     for (let w of this._widgets) {
       let model = this._getModel(w);
       if (model.path === oldPath) {
+        if (newPath === void 0) {
+          this.clearDirty(w);
+          w.close();
+          return;
+        }
         model.path = newPath;
         let parts = newPath.split('/');
         model.name = parts[parts.length - 1];

+ 34 - 9
src/filebrowser/listing.ts

@@ -413,22 +413,33 @@ class DirListing extends Widget {
    * Delete the currently selected item(s).
    */
   delete(): Promise<void> {
-    let promises: Promise<void>[] = [];
-    let items = this._model.sortedItems;
+    let names: string[] = [];
     if (this._softSelection) {
-      promises.push(this._model.delete(this._softSelection));
+      names.push(this._softSelection);
     } else {
+      let items = this._model.sortedItems;
       for (let item of items) {
         if (this._model.isSelected(item.name)) {
-          promises.push(this._model.delete(item.name));
+          names.push(item.name);
         }
       }
     }
-
-    return Promise.all(promises).then(
-      () => this._model.refresh(),
-      error => utils.showErrorMessage(this, 'Delete file', error)
-    );
+    let message = `Permanantly delete these ${names.length} files?`;
+    if (names.length === 1) {
+      message = `Permanently delete file "${names[0]}"?`;
+    }
+    if (names.length) {
+      return showDialog({
+        title: 'Delete file?',
+        body: message,
+        host: this.node.parentElement
+      }).then(result => {
+        if (result.text === 'OK') {
+          return this._delete(names);
+        }
+      });
+    }
+    return Promise.resolve(void 0);
   }
 
   /**
@@ -1148,6 +1159,20 @@ class DirListing extends Widget {
     this.update();
   }
 
+  /**
+   * Delete the files with the given names.
+   */
+  private _delete(names: string[]): Promise<void> {
+    let promises: Promise<void>[] = [];
+    for (let name of names) {
+      promises.push(this._model.delete(name));
+    }
+    return Promise.all(promises).then(
+      () => this._model.refresh(),
+      error => utils.showErrorMessage(this, 'Delete file', error)
+    );
+  }
+
   /**
    * Allow the user to rename item on a given row.
    */

+ 24 - 3
src/filebrowser/model.ts

@@ -269,7 +269,14 @@ class FileBrowserModel implements IDisposable {
     let normalizePath = Private.normalizePath;
     fromFile = normalizePath(this._model.path, fromFile);
     toDir = normalizePath(this._model.path, toDir);
-    return this._contentsManager.copy(fromFile, toDir);
+    return this._contentsManager.copy(fromFile, toDir).then(contents => {
+      this.fileChanged.emit({
+        name: 'file',
+        oldValue: void 0,
+        newValue: contents.path
+      });
+      return contents;
+    });
   }
 
   /**
@@ -328,7 +335,14 @@ class FileBrowserModel implements IDisposable {
     }
     return this._contentsManager.newUntitled(this._model.path,
       { type: type, ext: ext }
-    );
+    ).then(contents => {
+      this.fileChanged.emit({
+        name: 'file',
+        oldValue: void 0,
+        newValue: contents.path
+      });
+      return contents;
+    });
   }
 
   /**
@@ -480,7 +494,14 @@ class FileBrowserModel implements IDisposable {
           name: name,
           content: Private.getContent(reader)
         }
-        resolve(this._contentsManager.save(path, model));
+        this._contentsManager.save(path, model).then(contents => {
+          this.fileChanged.emit({
+            name: 'file',
+            oldValue: void 0,
+            newValue: contents.path
+          });
+          resolve(contents);
+        });
       }
 
       reader.onerror = (event: Event) => {