From 80b89c52b7ed3a2cf32099cb202b9b37a9b01452 Mon Sep 17 00:00:00 2001
From: Jonathan Wilkes <jon.w.wilkes@gmail.com>
Date: Sun, 1 Nov 2015 01:57:28 -0400
Subject: [PATCH] attempt to show the correct directory in a "Save" dialog. 
 (Still doesn't work for the "Open" dialog.)

---
 pd/nw/index.html     |  6 +++--
 pd/nw/index.js       | 13 +++++++++++
 pd/nw/pd_canvas.html | 11 ++++++----
 pd/nw/pd_canvas.js   | 11 +++++++++-
 pd/nw/pdgui.js       | 52 ++++++++++++++++++++++++++++++++++++++++----
 5 files changed, 82 insertions(+), 11 deletions(-)

diff --git a/pd/nw/index.html b/pd/nw/index.html
index 324586bd2..c3117d729 100644
--- a/pd/nw/index.html
+++ b/pd/nw/index.html
@@ -5,8 +5,10 @@
           type="text/css" href="css/default.css">
   </head>
   <body id="console_body">
-    <input style="display:none;" id="fileDialog" type="file"
-           nwworkingdir multiple />
+    <span id="fileDialogSpan">
+      <input style="display:none;" id="fileDialog" type="file"
+             nwworkingdir multiple />
+    </span>
     <div id="console_controls" class="noselect">
       <div id="control_frame">
         <label><input type="checkbox" id="dsp_control" name="dsp_control"
diff --git a/pd/nw/index.js b/pd/nw/index.js
index d3312ac11..b801ff1ca 100644
--- a/pd/nw/index.js
+++ b/pd/nw/index.js
@@ -343,6 +343,19 @@ function nw_create_pd_window_menus () {
         modifiers: "ctrl",
         tooltip: l("menu.open.tt"),
         click: function (){
+            var input, chooser,
+                span = document.querySelector("#fileDialogSpan");
+            // Complicated workaround-- see comment in build_file_dialog_string
+            input = pdgui.build_file_dialog_string({
+                style: "display: none;",
+                type: "file",
+                id: "fileDialog",
+                nwworkingdir: pwd,
+                multiple: null,
+                // These are copied from pd_filetypes in pdgui.js
+                accept: ".pd,.pat,.mxt,.mxb,.help"
+            });
+            span.innerHTML = input;
             var chooser = document.querySelector("#fileDialog");
             chooser.click();
         }
diff --git a/pd/nw/pd_canvas.html b/pd/nw/pd_canvas.html
index d7caa3ed7..57b36bef6 100644
--- a/pd/nw/pd_canvas.html
+++ b/pd/nw/pd_canvas.html
@@ -5,16 +5,19 @@
           type="text/css" href="css/default.css">
   </head>
   <body id="patch_body">
-    <input style="display:none;" id="fileDialog" type="file" multiple />
-    <input style="display:none;" id="saveDialog" type="file"
-           nwsaveas nwworkingdir accept=".pd" />
+    <span id = fileDialogSpan>
+      <input style="display:none;" id="fileDialog" type="file" multiple />
+    </span>
+    <span id = saveDialogSpan>
+      <input style="display:none;" id="saveDialog" type="file"
+             nwsaveas nwworkingdir accept=".pd" />
+    </span>
     <input style="display:none;" id="openpanel_dialog" type="file" />
     <input style="display:none;" id="savepanel_dialog" type="file"
            nwsaveas nwworkingdir />
     <svg xmlns="http://www.w3.org/2000/svg"
          version="1.1"
          id="patchsvg"
-         overflow="visible"
          class="noselect">
     </svg>
     <div id="canvas_find" style="display:none;">
diff --git a/pd/nw/pd_canvas.js b/pd/nw/pd_canvas.js
index 8894358c2..cd3e93a32 100644
--- a/pd/nw/pd_canvas.js
+++ b/pd/nw/pd_canvas.js
@@ -641,7 +641,16 @@ function nw_create_patch_window_menus(name) {
         modifiers: "ctrl",
         tooltip: l("menu.open_tt"),
         click: function() {
-            var chooser = document.querySelector("#fileDialog");
+            var input, chooser,
+                span = document.querySelector("#fileDialogSpan");
+            input = pdgui.build_file_dialog_string({
+                id: "fileDialog",
+                nwworkingdir: "/user/home",
+                style: "display: none;",
+                type: "file",
+            });
+            span.innerHTML = input;
+            chooser = document.querySelector("#fileDialog");
             chooser.click();
         }
     }));
diff --git a/pd/nw/pdgui.js b/pd/nw/pdgui.js
index e013ba93d..eb9805547 100644
--- a/pd/nw/pdgui.js
+++ b/pd/nw/pdgui.js
@@ -21,6 +21,14 @@ exports.get_gui_dir = function() {
     return gui_dir;
 }
 
+exports.get_pd_opendir = function() {
+    if (pd_opendir) {
+        return pd_opendir;
+    } else {
+        return pwd;
+    }
+}
+
 var fs = require("fs");     // for fs.existsSync
 var path = require("path"); // for path.dirname path.extname path.join
 
@@ -316,14 +324,50 @@ function menu_save(name) {
 
 exports.menu_save = menu_save;
 
+// This is an enormous workaround based off of the comment for this bug:
+//   https://github.com/nwjs/nw.js/issues/3372
+// Essentially nwworkingdir won't work if you set it through a javascript
+// object like a normal human being. Instead, you have to let it get parsed
+// by the browser, which means adding a <span> tag as a parent just so we
+// can set its innerHTML.
+// If this bug is ever resolved then this function can go away, as you should
+// be able to just set nwsaveas and nwworkingdir through the setAttribute
+// DOM interface.
+function build_file_dialog_string(obj) {
+    var prop, input = "<input ";
+    for (prop in obj) {
+        if (obj.hasOwnProperty(prop)) {
+            input += prop;
+            if (obj[prop]) {
+                input += '="' + obj[prop] + '"'; 
+            }
+            input += ' ';
+        }
+    }
+    input += "/>";
+    return input;
+}
+
+exports.build_file_dialog_string = build_file_dialog_string;
+
 function gui_canvas_saveas (name, initfile, initdir) {
-    post("working directory is " + pwd);
-    //global pd_nt filetypes untitled_directory
+    var input, chooser,
+        span = patchwin[name].window.document.querySelector("#saveDialogSpan");
     if (!fs.existsSync(initdir)) {
         initdir = pwd;
     }
-//    patchwin[name].window.document.getElementById("fileDialog").setAttribute("nwworkingdir", pwd);
-    var chooser = patchwin[name].window.document.querySelector("#saveDialog");
+    // This is complicated because of a bug... see above
+    input = build_file_dialog_string({
+        style: "display: none;",
+        type: "file",
+        id: "saveDialog",
+        nwsaveas: initdir + '/' +  initfile + ".pd",
+        nwworkingdir: initdir,
+        accept: ".pd"
+    });
+    post("input is " + input);
+    span.innerHTML = input;
+    chooser = patchwin[name].window.document.querySelector("#saveDialog"); 
     chooser.click();
 }
 
-- 
GitLab