diff --git a/index.html b/index.html index 9df5f944..77ed44ec 100644 --- a/index.html +++ b/index.html @@ -80,6 +80,7 @@ + diff --git a/js/api.js b/js/api.js index 25f56929..e5cc0daa 100644 --- a/js/api.js +++ b/js/api.js @@ -252,306 +252,6 @@ const Blockbench = { } }) }, - //IO - import(options, cb) { - if (typeof options !== 'object') {options = {}} - //extensions - //type - //readtype - //multiple - //startpath - //title - //errorbox - //resource_id - - if (isApp) { - var properties = [] - if (options.multiple) { - properties.push('multiSelections') - } - if (options.extensions[0] === 'image/*') { - options.type = 'Images' - options.extensions = ['png', 'jpg', 'jpeg', 'bmp', 'tiff', 'tif', 'gif'] - } - if (!options.startpath && options.resource_id) { - options.startpath = StateMemory.dialog_paths[options.resource_id] - } - - ElecDialogs.showOpenDialog( - currentwindow, - { - title: options.title ? options.title : '', - dontAddToRecent: true, - filters: [{ - name: options.type ? options.type : options.extensions[0], - extensions: options.extensions - }], - properties: (properties.length && Blockbench.platform !== 'darwin')?properties:undefined, - defaultPath: settings.streamer_mode.value - ? app.getPath('desktop') - : options.startpath - }, - function (fileNames) { - if (!fileNames) return; - if (options.resource_id) { - StateMemory.dialog_paths[options.resource_id] = PathModule.dirname(fileNames[0]) - StateMemory.save('dialog_paths') - } - Blockbench.read(fileNames, options, cb) - }) - } else { - $('').change(function(e) { - var input = this; - var results = []; - var result_count = 0; - var i = 0; - Blockbench.read(input.files, options, cb) - }).click() - } - }, - read(files, options, cb) { - if (files == undefined) return false; - if (typeof files == 'string') files = [files]; - console.log(files) - - var results = []; - var result_count = 0; - var i = 0; - var errant; - if (isApp) { - while (i < files.length) { - (function() { - var this_i = i; - var file = files[i] - let readtype = options.readtype; - if (typeof readtype == 'function') { - readtype = readtype(file); - } else if (readtype != 'buffer' && readtype != 'binary') { - readtype = 'text'; - } - - if (readtype === 'image') { - // - var extension = pathToExtension(file) - if (extension === 'tga') { - var targa_loader = new Targa() - targa_loader.open(file, () => { - - results[this_i] = { - name: pathToName(file, true), - path: file, - content: targa_loader.getDataURL() - } - - result_count++; - if (result_count === files.length) { - cb(results) - } - }) - - } else { - results[this_i] = { - name: pathToName(file, true), - path: file - } - result_count++; - if (result_count === files.length) { - cb(results) - } - } - } else /*text*/ { - var load = function (data) { - if ((readtype != 'buffer' && readtype != 'binary') && data.charCodeAt(0) === 0xFEFF) { - data = data.substr(1) - } - results[this_i] = { - name: pathToName(file, true), - path: file, - content: data - } - result_count++; - if (result_count === files.length) { - cb(results) - } - } - var read_files; - try { - read_files = fs.readFileSync(file, readtype == 'text' ? 'utf8' : undefined); - } catch(err) { - console.log(err) - if (!errant && options.errorbox !== false) { - Blockbench.showMessageBox({ - translateKey: 'file_not_found', - icon: 'error_outline' - }) - } - errant = true; - return; - } finally { - load(read_files); - } - } - })() - i++; - } - } else { - while (i < files.length) { - (function() { - var file = files[i] - var reader = new FileReader() - reader.i = i - reader.onloadend = function() { - - if (reader.result.byteLength && pathToExtension(file.name) === 'tga') { - var arr = new Uint8Array(reader.result) - var targa_loader = new Targa() - targa_loader.load(arr) - var result = targa_loader.getDataURL() - } else { - var result = reader.result - } - results[this.i] = { - name: file.name, - path: file.name, - content: result - } - result_count++; - if (result_count === files.length) { - cb(results) - } - } - let readtype = options.readtype; - if (typeof readtype == 'function') { - readtype = readtype(file.name); - } - if (readtype === 'image') { - if (pathToExtension(file.name) === 'tga') { - reader.readAsArrayBuffer(file) - } else { - reader.readAsDataURL(file) - } - } else if (readtype === 'buffer' || readtype === 'binary') { - reader.readAsArrayBuffer(file) - } else /*text*/ { - reader.readAsText(file) - } - i++; - })() - } - } - }, - export(options, cb) { - if (!options) return; - /* - type - extensions - name - content - startpath - savetype - project_file - custom_writer - resource_id - */ - if (Blockbench.isWeb) { - var file_name = options.name + (options.extensions ? '.'+options.extensions[0] : '') - if (options.custom_writer) { - options.custom_writer(options.content, file_name) - - } else if (options.savetype === 'image') { - - var download = document.createElement('a'); - download.href = options.content - download.download = file_name; - if (Blockbench.browser === 'firefox') document.body.appendChild(download); - download.click(); - if (Blockbench.browser === 'firefox') document.body.removeChild(download); - - } else if (options.savetype === 'zip' || options.savetype === 'buffer' || options.savetype === 'binary') { - saveAs(options.content, file_name) - - } else { - var blob = new Blob([options.content], {type: "text/plain;charset=utf-8"}); - saveAs(blob, file_name, {autoBOM: true}) - } - if (typeof cb === 'function') { - cb(file_name) - } - } else { - if (!options.startpath && options.resource_id) { - options.startpath = StateMemory.dialog_paths[options.resource_id] - if (options.name) { - options.startpath += osfs + options.name + (options.extensions ? '.'+options.extensions[0] : ''); - } - } - ElecDialogs.showSaveDialog(currentwindow, { - dontAddToRecent: true, - filters: [ { - name: options.type, - extensions: options.extensions - } ], - defaultPath: settings.streamer_mode.value - ? app.getPath('desktop') - : ((options.startpath && options.startpath !== 'Unknown') - ? options.startpath.replace(/\.\w+$/, '') - : options.name) - }, function (file_path) { - if (!file_path) return; - if (options.resource_id) { - StateMemory.dialog_paths[options.resource_id] = PathModule.dirname(file_path) - StateMemory.save('dialog_paths') - } - var extension = pathToExtension(file_path); - if (!extension && options.extensions && options.extensions[0]) { - file_path += '.'+options.extensions[0] - } - Blockbench.writeFile(file_path, options, cb) - }) - } - }, - writeFile(file_path, options, cb) { - /* - content - savetype - project_file - custom_writer - */ - if (!isApp || !file_path) { - return; - } - if (options.savetype === 'image' && typeof options.content === 'string') { - if (options.content.substr(0, 10) === 'data:image') { - options.content = nativeImage.createFromDataURL(options.content).toPNG() - } else { - options.content = options.content.replace(/\?\d+$/, ''); - options.content = nativeImage.createFromPath(options.content).toPNG() - } - } - if (options.savetype === 'zip') { - var fileReader = new FileReader(); - fileReader.onload = function(event) { - var buffer = Buffer.from(new Uint8Array(this.result)); - fs.writeFileSync(file_path, buffer) - if (cb) { - cb(file_path) - } - }; - fileReader.readAsArrayBuffer(options.content); - } else if (options.custom_writer) { - options.custom_writer(options.content, file_path) - - } else { - //text or binary - fs.writeFileSync(file_path, options.content) - if (cb) { - cb(file_path) - } - } - }, //Flags addFlag(flag) { this.flags[flag] = true @@ -586,26 +286,6 @@ const Blockbench = { if (!this.events[event_name]) return; this.events[event_name].remove(cb); }, - //File Drag - addDragHandler(id, options, cb) { - var entry = { - cb: cb, - condition: options.condition - } - if (options.extensions && options.extensions.length) { - entry.extensions = options.extensions - } - if (options.addClass !== false) entry.addClass = true; - if (options.propagate) entry.propagate = true; - if (options.readtype) entry.readtype = options.readtype; - if (options.errorbox) entry.errorbox = true; - if (options.element) entry.element = options.element; - - this.drag_handlers[id] = entry - }, - removeDragHandler(id) { - delete this.drag_handlers[id] - }, }; (function() { @@ -655,91 +335,3 @@ const StateMemory = { localStorage.setItem(`StateMemory.${key}`, serialized) } } - - - -document.ondragover = function(event) { - event.preventDefault() -} -document.body.ondrop = function(event) { - event.preventDefault() - forDragHandlers(event, function(handler, el) { - var fileNames = event.dataTransfer.files - - var input = this; - var results = []; - var result_count = 0; - var i = 0; - var errant; - var paths = [] - if (isApp) { - for (var file of fileNames) { - paths.push(file.path) - } - } else { - paths = fileNames - } - Blockbench.read(paths, handler, (content) => { - handler.cb(content, event) - }) - }) -} -document.body.ondragenter = function(event) { - event.preventDefault() - forDragHandlers(event, function(handler, el) { - //$(el).css('background-color', 'red') - }) -} -document.body.ondragleave = function(event) { - event.preventDefault() - forDragHandlers(event, function(handler, el) { - //$(el).css('background-color', '') - }) -} - -function forDragHandlers(event, cb) { - if (event.dataTransfer == undefined || event.dataTransfer.files.length == 0 || !event.dataTransfer.files[0].name) { - return; - } - for (var id in Blockbench.drag_handlers) { - var handler = Blockbench.drag_handlers[id] - var el = undefined; - if (!Condition(handler.condition)) { - continue; - } - - if (!handler.element) { - el = $('body').get(0) - - } else if ($(handler.element).get(0) === event.target) { - el = event.target - - } else if (typeof handler.element === 'string' && $(event.target).is(handler.element)) { - el = event.target - - } else if (typeof handler.element === 'function') { - var result = handler.element() - if (result === true) { - el = $(event.target) - } else if ($(result).length) { - el = $(result).get(0) - } - } else if (handler.propagate) { - var parent = $(handler.element) - if (typeof handler.element === 'function' && !result) { - parent = $(handler.element()) - } - if (parent && parent.has(event.target).length) { - el = parent - } - } - handler.extensions.includes( pathToExtension(event.dataTransfer.files[0].name).toLowerCase()) - var name = event.dataTransfer.files[0].name; - if (el && handler.extensions.filter(ex => { - return name.substr(-ex.length) == ex; - }).length) { - cb(handler, el) - break; - } - } -} diff --git a/js/file_system.js b/js/file_system.js new file mode 100644 index 00000000..9d0c817c --- /dev/null +++ b/js/file_system.js @@ -0,0 +1,407 @@ +Object.assign(Blockbench, { + import(options, cb) { + if (typeof options !== 'object') {options = {}} + //extensions + //type + //readtype + //multiple + //startpath + //title + //errorbox + //resource_id + + if (isApp) { + var properties = [] + if (options.multiple) { + properties.push('multiSelections') + } + if (options.extensions[0] === 'image/*') { + options.type = 'Images' + options.extensions = ['png', 'jpg', 'jpeg', 'bmp', 'tiff', 'tif', 'gif'] + } + if (!options.startpath && options.resource_id) { + options.startpath = StateMemory.dialog_paths[options.resource_id] + } + + ElecDialogs.showOpenDialog( + currentwindow, + { + title: options.title ? options.title : '', + dontAddToRecent: true, + filters: [{ + name: options.type ? options.type : options.extensions[0], + extensions: options.extensions + }], + properties: (properties.length && Blockbench.platform !== 'darwin')?properties:undefined, + defaultPath: settings.streamer_mode.value + ? app.getPath('desktop') + : options.startpath + }, + function (fileNames) { + if (!fileNames) return; + if (options.resource_id) { + StateMemory.dialog_paths[options.resource_id] = PathModule.dirname(fileNames[0]) + StateMemory.save('dialog_paths') + } + Blockbench.read(fileNames, options, cb) + }) + } else { + $('').change(function(e) { + var input = this; + var results = []; + var result_count = 0; + var i = 0; + Blockbench.read(input.files, options, cb) + }).click() + } + }, + read(files, options, cb) { + if (files == undefined) return false; + if (typeof files == 'string') files = [files]; + + var results = []; + var result_count = 0; + var i = 0; + var errant; + if (isApp) { + while (i < files.length) { + (function() { + var this_i = i; + var file = files[i] + let readtype = options.readtype; + if (typeof readtype == 'function') { + readtype = readtype(file); + } else if (readtype != 'buffer' && readtype != 'binary') { + readtype = 'text'; + } + + if (readtype === 'image') { + // + var extension = pathToExtension(file) + if (extension === 'tga') { + var targa_loader = new Targa() + targa_loader.open(file, () => { + + results[this_i] = { + name: pathToName(file, true), + path: file, + content: targa_loader.getDataURL() + } + + result_count++; + if (result_count === files.length) { + cb(results) + } + }) + + } else { + results[this_i] = { + name: pathToName(file, true), + path: file + } + result_count++; + if (result_count === files.length) { + cb(results) + } + } + } else /*text*/ { + var load = function (data) { + if ((readtype != 'buffer' && readtype != 'binary') && data.charCodeAt(0) === 0xFEFF) { + data = data.substr(1) + } + results[this_i] = { + name: pathToName(file, true), + path: file, + content: data + } + result_count++; + if (result_count === files.length) { + cb(results) + } + } + var read_files; + try { + read_files = fs.readFileSync(file, readtype == 'text' ? 'utf8' : undefined); + } catch(err) { + console.log(err) + if (!errant && options.errorbox !== false) { + Blockbench.showMessageBox({ + translateKey: 'file_not_found', + icon: 'error_outline' + }) + } + errant = true; + return; + } finally { + load(read_files); + } + } + })() + i++; + } + } else { + while (i < files.length) { + (function() { + var file = files[i] + var reader = new FileReader() + reader.i = i + reader.onloadend = function() { + + if (reader.result.byteLength && pathToExtension(file.name) === 'tga') { + var arr = new Uint8Array(reader.result) + var targa_loader = new Targa() + targa_loader.load(arr) + var result = targa_loader.getDataURL() + } else { + var result = reader.result + } + results[this.i] = { + name: file.name, + path: file.name, + content: result + } + result_count++; + if (result_count === files.length) { + cb(results) + } + } + let readtype = options.readtype; + if (typeof readtype == 'function') { + readtype = readtype(file.name); + } + if (readtype === 'image') { + if (pathToExtension(file.name) === 'tga') { + reader.readAsArrayBuffer(file) + } else { + reader.readAsDataURL(file) + } + } else if (readtype === 'buffer' || readtype === 'binary') { + reader.readAsArrayBuffer(file) + } else /*text*/ { + reader.readAsText(file) + } + i++; + })() + } + } + }, + export(options, cb) { + if (!options) return; + /* + type + extensions + name + content + startpath + savetype + project_file + custom_writer + resource_id + */ + if (Blockbench.isWeb) { + var file_name = options.name + (options.extensions ? '.'+options.extensions[0] : '') + if (options.custom_writer) { + options.custom_writer(options.content, file_name) + + } else if (options.savetype === 'image') { + + var download = document.createElement('a'); + download.href = options.content + download.download = file_name; + if (Blockbench.browser === 'firefox') document.body.appendChild(download); + download.click(); + if (Blockbench.browser === 'firefox') document.body.removeChild(download); + + } else if (options.savetype === 'zip' || options.savetype === 'buffer' || options.savetype === 'binary') { + saveAs(options.content, file_name) + + } else { + var blob = new Blob([options.content], {type: "text/plain;charset=utf-8"}); + saveAs(blob, file_name, {autoBOM: true}) + } + if (typeof cb === 'function') { + cb(file_name) + } + } else { + if (!options.startpath && options.resource_id) { + options.startpath = StateMemory.dialog_paths[options.resource_id] + if (options.name) { + options.startpath += osfs + options.name + (options.extensions ? '.'+options.extensions[0] : ''); + } + } + ElecDialogs.showSaveDialog(currentwindow, { + dontAddToRecent: true, + filters: [ { + name: options.type, + extensions: options.extensions + } ], + defaultPath: settings.streamer_mode.value + ? app.getPath('desktop') + : ((options.startpath && options.startpath !== 'Unknown') + ? options.startpath.replace(/\.\w+$/, '') + : options.name) + }, function (file_path) { + if (!file_path) return; + if (options.resource_id) { + StateMemory.dialog_paths[options.resource_id] = PathModule.dirname(file_path) + StateMemory.save('dialog_paths') + } + var extension = pathToExtension(file_path); + if (!extension && options.extensions && options.extensions[0]) { + file_path += '.'+options.extensions[0] + } + Blockbench.writeFile(file_path, options, cb) + }) + } + }, + writeFile(file_path, options, cb) { + /* + content + savetype + project_file + custom_writer + */ + if (!isApp || !file_path) { + return; + } + if (options.savetype === 'image' && typeof options.content === 'string') { + if (options.content.substr(0, 10) === 'data:image') { + options.content = nativeImage.createFromDataURL(options.content).toPNG() + } else { + options.content = options.content.replace(/\?\d+$/, ''); + options.content = nativeImage.createFromPath(options.content).toPNG() + } + } + if (options.savetype === 'zip') { + var fileReader = new FileReader(); + fileReader.onload = function(event) { + var buffer = Buffer.from(new Uint8Array(this.result)); + fs.writeFileSync(file_path, buffer) + if (cb) { + cb(file_path) + } + }; + fileReader.readAsArrayBuffer(options.content); + } else if (options.custom_writer) { + options.custom_writer(options.content, file_path) + + } else { + //text or binary + fs.writeFileSync(file_path, options.content) + if (cb) { + cb(file_path) + } + } + }, + //File Drag + addDragHandler(id, options, cb) { + var entry = { + cb: cb, + condition: options.condition + } + if (options.extensions && options.extensions.length) { + entry.extensions = options.extensions + } + if (options.addClass !== false) entry.addClass = true; + if (options.propagate) entry.propagate = true; + if (options.readtype) entry.readtype = options.readtype; + if (options.errorbox) entry.errorbox = true; + if (options.element) entry.element = options.element; + + this.drag_handlers[id] = entry + }, + removeDragHandler(id) { + delete this.drag_handlers[id] + }, +}); + + +document.ondragover = function(event) { + event.preventDefault() +} +document.body.ondrop = function(event) { + event.preventDefault() + forDragHandlers(event, function(handler, el) { + var fileNames = event.dataTransfer.files + + var input = this; + var results = []; + var result_count = 0; + var i = 0; + var errant; + var paths = [] + if (isApp) { + for (var file of fileNames) { + paths.push(file.path) + } + } else { + paths = fileNames + } + Blockbench.read(paths, handler, (content) => { + handler.cb(content, event) + }) + }) +} +document.body.ondragenter = function(event) { + event.preventDefault() + forDragHandlers(event, function(handler, el) { + //$(el).css('background-color', 'red') + }) +} +document.body.ondragleave = function(event) { + event.preventDefault() + forDragHandlers(event, function(handler, el) { + //$(el).css('background-color', '') + }) +} + +function forDragHandlers(event, cb) { + if (event.dataTransfer == undefined || event.dataTransfer.files.length == 0 || !event.dataTransfer.files[0].name) { + return; + } + for (var id in Blockbench.drag_handlers) { + var handler = Blockbench.drag_handlers[id] + var el = undefined; + if (!Condition(handler.condition)) { + continue; + } + + if (!handler.element) { + el = $('body').get(0) + + } else if ($(handler.element).get(0) === event.target) { + el = event.target + + } else if (typeof handler.element === 'string' && $(event.target).is(handler.element)) { + el = event.target + + } else if (typeof handler.element === 'function') { + var result = handler.element() + if (result === true) { + el = $(event.target) + } else if ($(result).length) { + el = $(result).get(0) + } + } else if (handler.propagate) { + var parent = $(handler.element) + if (typeof handler.element === 'function' && !result) { + parent = $(handler.element()) + } + if (parent && parent.has(event.target).length) { + el = parent + } + } + handler.extensions.includes( pathToExtension(event.dataTransfer.files[0].name).toLowerCase()) + var name = event.dataTransfer.files[0].name; + if (el && handler.extensions.filter(ex => { + return name.substr(-ex.length) == ex; + }).length) { + cb(handler, el) + break; + } + } +}