openOutpaint/js/lib/workspaces.js

129 lines
2.4 KiB
JavaScript
Raw Normal View History

/**
* Workspaces (or sessions) are settings and canvas state storage structures that can be changed at will, saved, and restored.
*/
/**
* Represents a workspace
*
* @template [S] Settings type
*/
class Workspace {
/**
* The name of the workspace
* @type {string}
*/
name = "Workspace Name";
/**
* Workspace default settings.
*
* @type {S}
*/
defaults = {};
/**
* Storage for workspace settings.
*
* @type {S}
*/
settings = new Proxy(
{},
{
get(t, name) {
if (t[name] === undefined)
t[name] =
JSON.parse(localStorage.getItem(`openoutpaint/${name}`)) ??
defaults[name];
return t[name];
},
set(t, name, value) {
localStorage.setItem(`openoutpaint/${name}`, JSON.stringify(value));
t[name] = value;
},
}
);
/**
* Storage for other data
*
* @type {Record<string, any>}
*/
data = new Proxy({}, {});
/**
* Saves the data to the workspace
*
* @param {string} key The key of the data to be saved (eg. history or layers)
* @param {any} data The data to be saved on this key. MUST BE SERIALIZABLE.
*/
save(key, data) {
this.data[key] = data;
}
/**
* Gets saved data from the workspace
*
* @param {string} key The key of the data to be saved (eg. history or layers)
* @param {any} data The data to be saved on this key. MUST BE SERIALIZABLE.
*/
load(key) {
return this.data[key];
}
/**
* @param {string} name The name of the workspace
* @param {Object} options
* @param {S} options.defaults Default workspace settings
*/
constructor(name, options = {}) {
defaultOpt(options, {
defaults: {},
});
this.name = name;
this.defaults = options.defaults;
}
}
const workspaces = {
/**
* Loaded workspace
*
* @type {Workspace<workspaceDefaults>}
*/
_workspace: null,
get current() {
return this._workspace;
},
/**
* On Workspace Changed
*
* @type {Observer<{workspace: Workspace<workspaceDefaults>}>}
*/
onchange: new Observer(),
/**
* Loads a workspace
*
* @param {Workspace<workspaceDefaults>} workspace Workspace to load
*/
loadWorkspace(workspace) {
console.info(`[workspaces] Loading workspace: ${workspace.name}`);
// Set current workspace
this._workspace = workspace;
// Notify observers that the workspace has changed
this.onchange.emit({workspace});
},
};
// Creates a new workspace instance
workspaces.loadWorkspace(
new Workspace("Default", {
workspaceDefaults,
})
);