mirror of
https://github.com/JannisX11/blockbench.git
synced 2025-02-17 16:20:13 +08:00
Switch auto-backup to indexedDB
This commit is contained in:
parent
90634b07cc
commit
8a524bd776
@ -655,6 +655,7 @@ async function closeBlockbenchWindow() {
|
||||
for (let project of ModelProject.all.slice()) {
|
||||
project.closeOnQuit();
|
||||
}
|
||||
AutoBackup.removeAllBackups();
|
||||
if (Blockbench.hasFlag('update_downloaded')) {
|
||||
await new Promise(resolve => {
|
||||
Blockbench.showMessageBox({
|
||||
|
@ -129,7 +129,7 @@ function addStartScreenSection(id, data) {
|
||||
}
|
||||
}
|
||||
|
||||
onVueSetup(function() {
|
||||
onVueSetup(async function() {
|
||||
StateMemory.init('start_screen_list_type', 'string')
|
||||
|
||||
let slideshow_timer = 0;
|
||||
@ -495,8 +495,8 @@ onVueSetup(function() {
|
||||
}
|
||||
|
||||
//Backup Model
|
||||
if (localStorage.getItem('backup_model') && (!isApp || !currentwindow.webContents.second_instance) && localStorage.getItem('backup_model').length > 40) {
|
||||
var backup_models = localStorage.getItem('backup_model')
|
||||
let has_backups = await AutoBackup.hasBackups();
|
||||
if (has_backups && (!isApp || !currentwindow.webContents.second_instance)) {
|
||||
|
||||
let section = addStartScreenSection({
|
||||
color: 'var(--color-back)',
|
||||
@ -506,18 +506,11 @@ onVueSetup(function() {
|
||||
{type: 'h2', text: tl('message.recover_backup.title')},
|
||||
{text: tl('message.recover_backup.message')},
|
||||
{type: 'button', text: tl('message.recover_backup.recover'), click: (e) => {
|
||||
let parsed_backup_models = JSON.parse(backup_models);
|
||||
for (let uuid in parsed_backup_models) {
|
||||
AutoBackupModels[uuid] = parsed_backup_models[uuid];
|
||||
|
||||
let model = parsed_backup_models[uuid];
|
||||
setupProject(Formats[model.meta.model_format] || Formats.free, uuid);
|
||||
Codecs.project.parse(model, 'backup.bbmodel')
|
||||
}
|
||||
AutoBackup.recoverAllBackups();
|
||||
section.delete();
|
||||
}},
|
||||
{type: 'button', text: tl('dialog.discard'), click: (e) => {
|
||||
localStorage.removeItem('backup_model');
|
||||
AutoBackup.removeAllBackups();
|
||||
section.delete();
|
||||
}}
|
||||
]
|
||||
|
@ -349,8 +349,6 @@ class ModelProject {
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
}
|
||||
delete AutoBackupModels[this.uuid];
|
||||
localStorage.setItem('backup_model', JSON.stringify(AutoBackupModels));
|
||||
if (this.EditSession) {
|
||||
this.EditSession.quit();
|
||||
}
|
||||
@ -431,8 +429,7 @@ class ModelProject {
|
||||
delete ProjectData[this.uuid];
|
||||
Project = 0;
|
||||
|
||||
delete AutoBackupModels[this.uuid];
|
||||
localStorage.setItem('backup_model', JSON.stringify(AutoBackupModels));
|
||||
await AutoBackup.removeBackup(this.uuid);
|
||||
|
||||
if (last_selected && last_selected !== this) {
|
||||
last_selected.select();
|
||||
|
118
js/misc.js
118
js/misc.js
@ -232,14 +232,124 @@ function unselectAll() {
|
||||
}
|
||||
|
||||
//Backup
|
||||
const AutoBackupModels = {};
|
||||
const AutoBackup = {
|
||||
/**
|
||||
* IndexedDB Database
|
||||
* @type {IDBDatabase}
|
||||
*/
|
||||
db: null,
|
||||
initialize() {
|
||||
let request = indexedDB.open('auto_backups', 1);
|
||||
request.onerror = function(e) {
|
||||
console.error('Failed to load backup database', e);
|
||||
}
|
||||
request.onblocked = function(e) {
|
||||
console.error('Another instance of Blockbench is opened, the backup database cannot be upgraded at the moment');
|
||||
}
|
||||
request.onupgradeneeded = function() {
|
||||
let db = request.result;
|
||||
let store = db.createObjectStore('projects', {keyPath: 'uuid'});
|
||||
|
||||
// Legacy system
|
||||
let backup_models = localStorage.getItem('backup_model')
|
||||
if (backup_models) {
|
||||
let parsed_backup_models = JSON.parse(backup_models);
|
||||
for (let uuid in parsed_backup_models) {
|
||||
let model = JSON.stringify(parsed_backup_models[uuid]);
|
||||
store.put({uuid, data: model});
|
||||
}
|
||||
console.log(`Upgraded ${Object.keys(parsed_backup_models).length} project back-ups to indexedDB`);
|
||||
}
|
||||
}
|
||||
request.onsuccess = function() {
|
||||
AutoBackup.db = request.result;
|
||||
}
|
||||
},
|
||||
async backupOpenProject() {
|
||||
if (!Project) return;
|
||||
let transaction = AutoBackup.db.transaction('projects', 'readwrite');
|
||||
let store = transaction.objectStore('projects');
|
||||
|
||||
let model = Codecs.project.compile({compressed: false, backup: true, raw: false});
|
||||
store.put({uuid: Project.uuid, data: model});
|
||||
|
||||
await new Promise((resolve) => {
|
||||
transaction.oncomplete = resolve;
|
||||
})
|
||||
},
|
||||
async hasBackups() {
|
||||
let transaction = AutoBackup.db.transaction('projects', 'readonly');
|
||||
let store = transaction.objectStore('projects');
|
||||
return await new Promise(resolve => {
|
||||
let request = store.count();
|
||||
request.onsuccess = function() {
|
||||
resolve(!!request.result);
|
||||
}
|
||||
request.onerror = function(e) {
|
||||
console.error(e);
|
||||
resolve(false);
|
||||
}
|
||||
})
|
||||
},
|
||||
recoverAllBackups() {
|
||||
let transaction = AutoBackup.db.transaction('projects', 'readonly');
|
||||
let store = transaction.objectStore('projects');
|
||||
let request = store.getAll();
|
||||
request.onsuccess = function() {
|
||||
let projects = request.result;
|
||||
for (let project of projects) {
|
||||
let parsed_content = JSON.parse(project.data);
|
||||
setupProject(Formats[parsed_content.meta.model_format] || Formats.free, project.uuid);
|
||||
Codecs.project.parse(parsed_content, 'backup.bbmodel')
|
||||
}
|
||||
}
|
||||
request.onerror = function(e) {
|
||||
console.error(e);
|
||||
}
|
||||
/*var backup_models = localStorage.getItem('backup_model')
|
||||
let parsed_backup_models = JSON.parse(backup_models);
|
||||
for (let uuid in parsed_backup_models) {
|
||||
AutoBackupModels[uuid] = parsed_backup_models[uuid];
|
||||
|
||||
let model = parsed_backup_models[uuid];
|
||||
setupProject(Formats[model.meta.model_format] || Formats.free, uuid);
|
||||
Codecs.project.parse(model, 'backup.bbmodel')
|
||||
}*/
|
||||
},
|
||||
async removeBackup(uuid) {
|
||||
let transaction = AutoBackup.db.transaction('projects', 'readwrite');
|
||||
let store = transaction.objectStore('projects');
|
||||
let request = store.delete(uuid);
|
||||
|
||||
return await new Promise((resolve, reject) => {
|
||||
request.onsuccess = resolve;
|
||||
request.onerror = function(e) {
|
||||
reject();
|
||||
}
|
||||
});
|
||||
},
|
||||
async removeAllBackups() {
|
||||
let transaction = AutoBackup.db.transaction('projects', 'readwrite');
|
||||
let store = transaction.objectStore('projects');
|
||||
let request = store.clear();
|
||||
|
||||
return await new Promise((resolve, reject) => {
|
||||
request.onsuccess = resolve;
|
||||
request.onerror = function(e) {
|
||||
console.error(e);
|
||||
reject();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
AutoBackup.initialize();
|
||||
|
||||
|
||||
setInterval(function() {
|
||||
if (Project && (Outliner.root.length || Project.textures.length)) {
|
||||
Validator.validate();
|
||||
try {
|
||||
var model = Codecs.project.compile({compressed: false, backup: true, raw: true});
|
||||
AutoBackupModels[Project.uuid] = model;
|
||||
localStorage.setItem('backup_model', JSON.stringify(AutoBackupModels));
|
||||
AutoBackup.backupOpenProject();
|
||||
} catch (err) {
|
||||
console.error('Unable to create backup. ', err)
|
||||
}
|
||||
|
@ -127,7 +127,9 @@ class Plugin {
|
||||
if (!isApp && this.new_repository_format) {
|
||||
path = `${Plugins.path}${scope.id}/${scope.id}.js`;
|
||||
}
|
||||
console.log('get script', path, this.id)
|
||||
$.getScript(path, () => {
|
||||
console.log('got script', path, this.id)
|
||||
if (cb) cb.bind(scope)()
|
||||
scope.bindGlobalData(first)
|
||||
if (first && scope.oninstall) {
|
||||
|
Loading…
Reference in New Issue
Block a user