diff --git a/pd/nw/index.html b/pd/nw/index.html index 324586bd27e06480d5ab6cd4ea059f2ae0fa1357..c3117d729b43a7d4a9501e816f7473ee40225651 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 d3312ac110d705449eda96061d547220333b38f4..b801ff1caefe9ef250a0e6b35d6396508f79bcf5 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 d7caa3ed78673bccc8cdef75dc6cba95e128dd46..57b36bef6551e3c243287ff0891a12af91de3607 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 8894358c2d0c89839ee346178402c3b0b830d199..cd3e93a320a5c49afa912f1f322d9de37298bd79 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 e013ba93d61bd4e8d3ac3da3339ceaeef447a92c..eb9805547c67f2d41c966fbe535f2f3614f25db1 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(); }