diff --git a/src/main/mesh.js b/src/main/mesh.js index 067abd5e..5b864d6b 100644 --- a/src/main/mesh.js +++ b/src/main/mesh.js @@ -27,6 +27,9 @@ function init() { db.admin.put("init", Date.now()); db.admin.get("uses").then(v => db.admin.put("uses", (v||0) + 1)); + // reload preferences + api.prefs.restore(); + // setup default workspace space.useDefaultKeys(false); space.sky.set({ diff --git a/src/mesh/api.js b/src/mesh/api.js index 83041cb6..105bd12f 100644 --- a/src/mesh/api.js +++ b/src/mesh/api.js @@ -11,6 +11,7 @@ gapp.register("mesh.api", [ "moto.client", // dep: moto.client "moto.broker", // dep: moto.broker "moto.space", // dep: moto.space + "data.index", // dep: data.index "mesh.tool", // dep: mesh.tool "add.array", // dep: add.array ]); @@ -277,6 +278,28 @@ let tool = { } }; +// persisted preference map +let prefs = { + map: {}, + + put(key, val) { + prefs.map[key] = val; + prefs.update(); + }, + + // persist to data store + update() { + mesh.db.admin.put("prefs", prefs.map); + }, + + // reload from data store + restore() { + mesh.db.admin.get("prefs").then(data => { + if (data) prefs.map = data; + }); + } +}; + // api is augmented in mesh.build (log, modal, download) let api = mesh.api = { help() { @@ -328,6 +351,8 @@ let api = mesh.api = { tool, + prefs, + objects() { // return model objects suitable for finding ray intersections return group.list().map(o => o.models).flat().map(o => o.mesh); @@ -476,4 +501,7 @@ broker.wrapObject(selection, 'selection'); broker.wrapObject(model, 'model'); broker.wrapObject(group, 'group'); +// optimize db writes by merging updates +prefs.update = util.deferWrap(prefs.update); + })(); diff --git a/src/mesh/build.js b/src/mesh/build.js index 0bb98b71..d7ebf0a0 100644 --- a/src/mesh/build.js +++ b/src/mesh/build.js @@ -355,14 +355,14 @@ function ui_build() { s.onclick = () => { s.style.display = 'none'; d.style.display = 'flex'; - prefs[label] = 1; + api.prefs.put(label, 1); }; h.onclick = () => { d.style.display = 'none'; s.style.display = 'flex'; - prefs[label] = 2; + api.prefs.put(label, 2); }; - if (prefs[label] === 1) { + if (api.prefs.map[label] === 1) { s.onclick(); } else { h.onclick(); @@ -374,9 +374,6 @@ function ui_build() { } } - // temp store of ui prefs (hide/show) - let prefs = {}; - // listen for api calls // create a deferred wrapper to merge multiple rapid events let defer_all = util.deferWrap(update_all); diff --git a/src/mesh/model.js b/src/mesh/model.js index 75d2d121..91eac8df 100644 --- a/src/mesh/model.js +++ b/src/mesh/model.js @@ -63,7 +63,6 @@ mesh.model = class MeshModel extends mesh.object { this.file = file || 'unnamed'; this.load(mesh || vertices, indices, normals); - // persist in db so it can be restored on page load mapp.db.space.put(this.id, { file, mesh }); }