Bladeren bron

Merge pull request #338 from blink1073/filebrowser-cwd

Expose the path from the filebrowser plugin
A. Darian 8 jaren geleden
bovenliggende
commit
28ae2cc07d
2 gewijzigde bestanden met toevoegingen van 70 en 1 verwijderingen
  1. 1 0
      jupyterlab/index.js
  2. 69 1
      src/filebrowser/plugin.ts

+ 1 - 0
jupyterlab/index.js

@@ -31,6 +31,7 @@ var app = new phosphide.Application({
   providers: [
     require('jupyterlab/lib/clipboard/plugin').clipboardProvider,
     require('jupyterlab/lib/docregistry/plugin').docRegistryProvider,
+    require('jupyterlab/lib/filebrowser/plugin').fileBrowserProvider,
     require('jupyterlab/lib/notebook/plugin').notebookTrackerProvider,
     require('jupyterlab/lib/mainmenu/plugin').mainMenuProvider,
     require('jupyterlab/lib/rendermime/plugin').renderMimeProvider,

+ 69 - 1
src/filebrowser/plugin.ts

@@ -29,6 +29,14 @@ import {
   Menu, MenuItem, IMenuItemOptions, MenuItemType
 } from 'phosphor-menus';
 
+import {
+  IChangedArgs
+} from 'phosphor-properties';
+
+import {
+  ISignal, Signal
+} from 'phosphor-signaling';
+
 import {
   Widget
 } from 'phosphor-widget';
@@ -42,6 +50,43 @@ import {
 } from '../mainmenu/plugin';
 
 
+/**
+ * A class that tracks the current path of the file browser.
+ */
+export
+class PathTracker {
+  /**
+   * A signal emitted when the current path changes.
+   */
+  get pathChanged(): ISignal<PathTracker, IChangedArgs<string>> {
+    return Private.pathChangedSignal.bind(this);
+  }
+
+  /**
+   * The current path of the filebrowser.
+   *
+   * #### Notes
+   * This is a read-only property.
+   */
+  get path(): string {
+    return Private.fbWidget ? Private.fbWidget.model.path : '';
+  }
+}
+
+
+/**
+ * The default file browser provider.
+ */
+export
+const fileBrowserProvider = {
+  id: 'jupyter.services.fileBrowser',
+  provides: PathTracker,
+  resolve: () => {
+    return Private.pathTracker;
+  }
+};
+
+
 /**
  * The default file browser extension.
  */
@@ -52,6 +97,7 @@ const fileBrowserExtension = {
   activate: activateFileBrowser
 };
 
+
 /**
  * The class name for all main area portrait tab icons.
  */
@@ -98,12 +144,16 @@ function activateFileBrowser(app: Application, manager: ServiceManager, registry
     opener
   });
   let fbModel = new FileBrowserModel({ manager });
-  let fbWidget = new FileBrowserWidget({
+  let fbWidget = Private.fbWidget = new FileBrowserWidget({
     model: fbModel,
     manager: docManager,
     opener
   });
 
+  fbModel.pathChanged.connect((sender, args) => {
+    Private.pathTracker.pathChanged.emit(args);
+  });
+
   // Add a context menu to the dir listing.
   let node = fbWidget.node.getElementsByClassName('jp-DirListing-content')[0];
   node.addEventListener('contextmenu', (event: MouseEvent) => {
@@ -430,3 +480,21 @@ function createMenu(fbWidget: FileBrowserWidget, openWith: MenuItem[]):  Menu {
   );
   return new Menu(items);
 }
+
+
+/**
+ * A namespace for private data.
+ */
+namespace Private {
+  export
+  var fbWidget: FileBrowserWidget;
+
+  export
+  const pathTracker = new PathTracker();
+
+  /**
+   * A signal emitted when the current working directory changes.
+   */
+  export
+  const pathChangedSignal = new Signal<PathTracker, IChangedArgs<string>>();
+}