[HTML5] Drag and drop zip in project manager.
With a very nice hack, a new hidden configuration option that delays dropped files removal at exit. This still leaks while the project manager is running, but will clear memory as soon as it exits or load something. (reminder, dropped files are reguarly removed after the signal is emitted specifically to avoid leaks, but I prefer hacking the HTML5 config then the project manager).
This commit is contained in:
parent
08767a16fd
commit
f1e810adcb
|
@ -502,7 +502,7 @@
|
||||||
showTab('loader');
|
showTab('loader');
|
||||||
setLoaderEnabled(true);
|
setLoaderEnabled(true);
|
||||||
};
|
};
|
||||||
editor.start({'args': args});
|
editor.start({'args': args, 'persistentDrops': is_project_manager});
|
||||||
});
|
});
|
||||||
}, 0);
|
}, 0);
|
||||||
OnEditorExit = null;
|
OnEditorExit = null;
|
||||||
|
@ -563,7 +563,7 @@
|
||||||
//selectVideoMode();
|
//selectVideoMode();
|
||||||
showTab('editor');
|
showTab('editor');
|
||||||
setLoaderEnabled(false);
|
setLoaderEnabled(false);
|
||||||
editor.start({'args': ['--video-driver', video_driver]}).then(function() {
|
editor.start({'args': ['--project-manager', '--video-driver', video_driver], 'persistentDrops': true}).then(function() {
|
||||||
setStatusMode('hidden');
|
setStatusMode('hidden');
|
||||||
initializing = false;
|
initializing = false;
|
||||||
});
|
});
|
||||||
|
|
|
@ -103,6 +103,11 @@ const InternalConfig = function (initConfig) { // eslint-disable-line no-unused-
|
||||||
* @type {Array.<string>}
|
* @type {Array.<string>}
|
||||||
*/
|
*/
|
||||||
persistentPaths: ['/userfs'],
|
persistentPaths: ['/userfs'],
|
||||||
|
/**
|
||||||
|
* @ignore
|
||||||
|
* @type {boolean}
|
||||||
|
*/
|
||||||
|
persistentDrops: false,
|
||||||
/**
|
/**
|
||||||
* @ignore
|
* @ignore
|
||||||
* @type {Array.<string>}
|
* @type {Array.<string>}
|
||||||
|
@ -231,6 +236,7 @@ const InternalConfig = function (initConfig) { // eslint-disable-line no-unused-
|
||||||
this.locale = parse('locale', this.locale);
|
this.locale = parse('locale', this.locale);
|
||||||
this.canvasResizePolicy = parse('canvasResizePolicy', this.canvasResizePolicy);
|
this.canvasResizePolicy = parse('canvasResizePolicy', this.canvasResizePolicy);
|
||||||
this.persistentPaths = parse('persistentPaths', this.persistentPaths);
|
this.persistentPaths = parse('persistentPaths', this.persistentPaths);
|
||||||
|
this.persistentDrops = parse('persistentDrops', this.persistentDrops);
|
||||||
this.experimentalVK = parse('experimentalVK', this.experimentalVK);
|
this.experimentalVK = parse('experimentalVK', this.experimentalVK);
|
||||||
this.gdnativeLibs = parse('gdnativeLibs', this.gdnativeLibs);
|
this.gdnativeLibs = parse('gdnativeLibs', this.gdnativeLibs);
|
||||||
this.fileSizes = parse('fileSizes', this.fileSizes);
|
this.fileSizes = parse('fileSizes', this.fileSizes);
|
||||||
|
@ -316,6 +322,7 @@ const InternalConfig = function (initConfig) { // eslint-disable-line no-unused-
|
||||||
'canvas': this.canvas,
|
'canvas': this.canvas,
|
||||||
'canvasResizePolicy': this.canvasResizePolicy,
|
'canvasResizePolicy': this.canvasResizePolicy,
|
||||||
'locale': locale,
|
'locale': locale,
|
||||||
|
'persistentDrops': this.persistentDrops,
|
||||||
'virtualKeyboard': this.experimentalVK,
|
'virtualKeyboard': this.experimentalVK,
|
||||||
'onExecute': this.onExecute,
|
'onExecute': this.onExecute,
|
||||||
'onExit': function (p_code) {
|
'onExit': function (p_code) {
|
||||||
|
|
|
@ -192,16 +192,29 @@ const GodotDisplayDragDrop = {
|
||||||
GodotDisplayDragDrop.promises = [];
|
GodotDisplayDragDrop.promises = [];
|
||||||
GodotDisplayDragDrop.pending_files = [];
|
GodotDisplayDragDrop.pending_files = [];
|
||||||
callback(drops);
|
callback(drops);
|
||||||
const dirs = [DROP.substr(0, DROP.length - 1)];
|
if (GodotConfig.persistent_drops) {
|
||||||
|
// Delay removal at exit.
|
||||||
|
GodotOS.atexit(function (resolve, reject) {
|
||||||
|
GodotDisplayDragDrop.remove_drop(files, DROP);
|
||||||
|
resolve();
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
GodotDisplayDragDrop.remove_drop(files, DROP);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
remove_drop: function (files, drop_path) {
|
||||||
|
const dirs = [drop_path.substr(0, drop_path.length - 1)];
|
||||||
// Remove temporary files
|
// Remove temporary files
|
||||||
files.forEach(function (file) {
|
files.forEach(function (file) {
|
||||||
FS.unlink(file);
|
FS.unlink(file);
|
||||||
let dir = file.replace(DROP, '');
|
let dir = file.replace(drop_path, '');
|
||||||
let idx = dir.lastIndexOf('/');
|
let idx = dir.lastIndexOf('/');
|
||||||
while (idx > 0) {
|
while (idx > 0) {
|
||||||
dir = dir.substr(0, idx);
|
dir = dir.substr(0, idx);
|
||||||
if (dirs.indexOf(DROP + dir) === -1) {
|
if (dirs.indexOf(drop_path + dir) === -1) {
|
||||||
dirs.push(DROP + dir);
|
dirs.push(drop_path + dir);
|
||||||
}
|
}
|
||||||
idx = dir.lastIndexOf('/');
|
idx = dir.lastIndexOf('/');
|
||||||
}
|
}
|
||||||
|
@ -219,7 +232,6 @@ const GodotDisplayDragDrop = {
|
||||||
}).forEach(function (dir) {
|
}).forEach(function (dir) {
|
||||||
FS.rmdir(dir);
|
FS.rmdir(dir);
|
||||||
});
|
});
|
||||||
});
|
|
||||||
},
|
},
|
||||||
|
|
||||||
handler: function (callback) {
|
handler: function (callback) {
|
||||||
|
|
|
@ -60,6 +60,7 @@ const GodotConfig = {
|
||||||
locale: 'en',
|
locale: 'en',
|
||||||
canvas_resize_policy: 2, // Adaptive
|
canvas_resize_policy: 2, // Adaptive
|
||||||
virtual_keyboard: false,
|
virtual_keyboard: false,
|
||||||
|
persistent_drops: false,
|
||||||
on_execute: null,
|
on_execute: null,
|
||||||
on_exit: null,
|
on_exit: null,
|
||||||
|
|
||||||
|
@ -68,6 +69,7 @@ const GodotConfig = {
|
||||||
GodotConfig.canvas = p_opts['canvas'];
|
GodotConfig.canvas = p_opts['canvas'];
|
||||||
GodotConfig.locale = p_opts['locale'] || GodotConfig.locale;
|
GodotConfig.locale = p_opts['locale'] || GodotConfig.locale;
|
||||||
GodotConfig.virtual_keyboard = p_opts['virtualKeyboard'];
|
GodotConfig.virtual_keyboard = p_opts['virtualKeyboard'];
|
||||||
|
GodotConfig.persistent_drops = !!p_opts['persistentDrops'];
|
||||||
GodotConfig.on_execute = p_opts['onExecute'];
|
GodotConfig.on_execute = p_opts['onExecute'];
|
||||||
GodotConfig.on_exit = p_opts['onExit'];
|
GodotConfig.on_exit = p_opts['onExit'];
|
||||||
},
|
},
|
||||||
|
@ -80,6 +82,7 @@ const GodotConfig = {
|
||||||
GodotConfig.locale = 'en';
|
GodotConfig.locale = 'en';
|
||||||
GodotConfig.canvas_resize_policy = 2;
|
GodotConfig.canvas_resize_policy = 2;
|
||||||
GodotConfig.virtual_keyboard = false;
|
GodotConfig.virtual_keyboard = false;
|
||||||
|
GodotConfig.persistent_drops = false;
|
||||||
GodotConfig.on_execute = null;
|
GodotConfig.on_execute = null;
|
||||||
GodotConfig.on_exit = null;
|
GodotConfig.on_exit = null;
|
||||||
},
|
},
|
||||||
|
|
Loading…
Reference in New Issue