piskel/src/js/service/storage/LocalStorageService.js
2016-10-01 14:34:01 +02:00

105 lines
3.2 KiB
JavaScript

(function () {
var ns = $.namespace('pskl.service.storage');
ns.LocalStorageService = function (piskelController) {
if (piskelController === undefined) {
throw 'Bad LocalStorageService initialization: <undefined piskelController>';
}
this.piskelController = piskelController;
};
ns.LocalStorageService.prototype.init = function() {};
ns.LocalStorageService.prototype.save = function(piskel) {
var name = piskel.getDescriptor().name;
var description = piskel.getDescriptor().description;
var serialized = pskl.utils.Serializer.serializePiskel(piskel);
var serializedString = '';
var uint16 = new Uint16Array(serialized);
for (var i = 0, length = uint16.length; i < length; i++) {
serializedString += String.fromCharCode(uint16[i]);
}
if (pskl.app.localStorageService.getPiskel(name)) {
var confirmOverwrite = window.confirm('There is already a piskel saved as ' + name + '. Overwrite ?');
if (!confirmOverwrite) {
return Q.reject('Cancelled by user, "' + name + '" already exists');
}
}
try {
this.removeFromKeys_(name);
this.addToKeys_(name, description, Date.now());
window.localStorage.setItem('piskel.' + name, serializedString);
return Q.resolve();
} catch (e) {
return Q.reject(e.message);
}
};
ns.LocalStorageService.prototype.load = function(name) {
var piskelString = this.getPiskel(name);
var key = this.getKey_(name);
var serializedPiskel = new Uint16Array(piskelString.length);
for (var i = 0, length = piskelString.length; i < length; i++) {
serializedPiskel[i] = piskelString.charCodeAt(i);
}
pskl.utils.serialization.Deserializer.deserialize(serializedPiskel.buffer, function (piskel, extra) {
pskl.app.piskelController.setPiskel(piskel);
pskl.app.previewController.setFPS(extra.fps);
});
};
ns.LocalStorageService.prototype.remove = function(name) {
this.removeFromKeys_(name);
window.localStorage.removeItem('piskel.' + name);
};
ns.LocalStorageService.prototype.saveKeys_ = function(keys) {
window.localStorage.setItem('piskel.keys', JSON.stringify(keys));
};
ns.LocalStorageService.prototype.removeFromKeys_ = function(name) {
var keys = this.getKeys();
var otherKeys = keys.filter(function (key) {
return key.name !== name;
});
this.saveKeys_(otherKeys);
};
ns.LocalStorageService.prototype.getKey_ = function(name) {
var matches = this.getKeys().filter(function (key) {
return key.name === name;
});
if (matches.length > 0) {
return matches[0];
} else {
return null;
}
};
ns.LocalStorageService.prototype.addToKeys_ = function(name, description, date) {
var keys = this.getKeys();
keys.push({
name : name,
description : description,
date : date
});
this.saveKeys_(keys);
};
ns.LocalStorageService.prototype.getPiskel = function(name) {
return window.localStorage.getItem('piskel.' + name);
};
ns.LocalStorageService.prototype.getKeys = function(name) {
var keysString = window.localStorage.getItem('piskel.keys');
return JSON.parse(keysString) || [];
};
})();