annotate light9/live/Effect.ts @ 2235:f9edd9819b7d

move live/ out of web; it's just a normal (web-only) tool now
author drewp@bigasterisk.com
date Wed, 24 May 2023 14:37:11 -0700
parents light9/web/live/Effect.ts@611c3e97de2f
children 91ae65157e5f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2087
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
1 import debug from "debug";
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
2 import { Literal, NamedNode, Quad_Object, Quad_Predicate, Quad_Subject, Term } from "n3";
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
3 import { some } from "underscore";
2235
f9edd9819b7d move live/ out of web; it's just a normal (web-only) tool now
drewp@bigasterisk.com
parents: 2160
diff changeset
4 import { Patch, patchContainsPreds, patchUpdate } from "../web/patch";
f9edd9819b7d move live/ out of web; it's just a normal (web-only) tool now
drewp@bigasterisk.com
parents: 2160
diff changeset
5 import { SyncedGraph } from "../web/SyncedGraph";
f9edd9819b7d move live/ out of web; it's just a normal (web-only) tool now
drewp@bigasterisk.com
parents: 2160
diff changeset
6 import { shortShow } from "../web/show_specific";
2087
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
7
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
8 type Color = string;
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
9 export type ControlValue = number | Color | NamedNode;
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
10
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
11 const log = debug("effect");
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
12
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
13 function isUri(x: Term | number | string): x is NamedNode {
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
14 return typeof x == "object" && x.termType == "NamedNode";
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
15 }
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
16
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
17 function valuePred(graph: SyncedGraph, attr: NamedNode): NamedNode {
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
18 const U = graph.U();
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
19 const scaledAttributeTypes = [U(":color"), U(":brightness"), U(":uv")];
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
20 if (some(scaledAttributeTypes, (x: NamedNode) => attr.equals(x))) {
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
21 return U(":scaledValue");
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
22 } else {
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
23 return U(":value");
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
24 }
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
25 }
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
26
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
27 // effect settings data; r/w sync with the graph
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
28 export class Effect {
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
29 private settings: Array<{ device: NamedNode; deviceAttr: NamedNode; setting: NamedNode; value: ControlValue }> = [];
2102
9c2e1b5c16e9 speed: don't redo uri string replace all the time
drewp@bigasterisk.com
parents: 2091
diff changeset
30 private ctxForEffect: NamedNode
2087
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
31 constructor(
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
32 public graph: SyncedGraph,
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
33 public uri: NamedNode,
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
34 // called if the graph changes our values and not when the caller uses edit()
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
35 private onValuesChanged: (values: void) => void
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
36 ) {
2160
611c3e97de2f factor out the show-specific strs
drewp@bigasterisk.com
parents: 2102
diff changeset
37 this.ctxForEffect = this.graph.Uri(this.uri.value.replace("light9.bigasterisk.com/effect", `light9.bigasterisk.com/show/${shortShow}/effect`));
2087
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
38 graph.runHandler(this.rebuildSettingsFromGraph.bind(this), `effect sync ${uri.value}`);
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
39 }
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
40
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
41 addNewEffectToGraph() {
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
42 const U = this.graph.U();
2102
9c2e1b5c16e9 speed: don't redo uri string replace all the time
drewp@bigasterisk.com
parents: 2091
diff changeset
43 const quad = (s: Quad_Subject, p: Quad_Predicate, o: Quad_Object) => this.graph.Quad(s, p, o, this.ctxForEffect);
2087
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
44
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
45 const addQuads = [
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
46 quad(this.uri, U("rdf:type"), U(":Effect")),
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
47 quad(this.uri, U("rdfs:label"), this.graph.Literal(this.uri.value.replace(/.*\//, ""))),
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
48 quad(this.uri, U(":publishAttr"), U(":strength")),
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
49 ];
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
50 const patch = { adds: addQuads, dels: [] } as Patch;
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
51 log("init new effect", patch);
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
52 this.settings = [];
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
53 this.graph.applyAndSendPatch(patch);
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
54 }
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
55
2089
bbd6816d9e9e big optimization on effect editing. 50% time still in rebuildSettingsFromGraph though, and the rest is in setLabel
drewp@bigasterisk.com
parents: 2087
diff changeset
56 rebuildSettingsFromGraph(patch?: Patch) {
2087
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
57 const U = this.graph.U();
2089
bbd6816d9e9e big optimization on effect editing. 50% time still in rebuildSettingsFromGraph though, and the rest is in setLabel
drewp@bigasterisk.com
parents: 2087
diff changeset
58 if (patch && !patchContainsPreds(patch, [U(":setting"), U(":device"), U(":deviceAttr")])) {
bbd6816d9e9e big optimization on effect editing. 50% time still in rebuildSettingsFromGraph though, and the rest is in setLabel
drewp@bigasterisk.com
parents: 2087
diff changeset
59 // that's an approx list of preds , but it just means we'll miss some pathological settings edits
2091
9324fc8285ad Effect repairs duplicate :settings edges when it finds them
drewp@bigasterisk.com
parents: 2089
diff changeset
60 // return;
2089
bbd6816d9e9e big optimization on effect editing. 50% time still in rebuildSettingsFromGraph though, and the rest is in setLabel
drewp@bigasterisk.com
parents: 2087
diff changeset
61 }
bbd6816d9e9e big optimization on effect editing. 50% time still in rebuildSettingsFromGraph though, and the rest is in setLabel
drewp@bigasterisk.com
parents: 2087
diff changeset
62
bbd6816d9e9e big optimization on effect editing. 50% time still in rebuildSettingsFromGraph though, and the rest is in setLabel
drewp@bigasterisk.com
parents: 2087
diff changeset
63 // log("syncFromGraph", this.uri);
2087
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
64
2091
9324fc8285ad Effect repairs duplicate :settings edges when it finds them
drewp@bigasterisk.com
parents: 2089
diff changeset
65 // this repeats work- it gathers all settings when really some values changed (and we might even know about them). maybe push the value-fetching into a secnod phase of the run, and have the 1st phase drop out early
2087
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
66 const newSettings = [];
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
67
2091
9324fc8285ad Effect repairs duplicate :settings edges when it finds them
drewp@bigasterisk.com
parents: 2089
diff changeset
68 const seenDevAttrPairs: Set<string> = new Set();
9324fc8285ad Effect repairs duplicate :settings edges when it finds them
drewp@bigasterisk.com
parents: 2089
diff changeset
69
2087
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
70 for (let setting of Array.from(this.graph.objects(this.uri, U(":setting")))) {
2089
bbd6816d9e9e big optimization on effect editing. 50% time still in rebuildSettingsFromGraph though, and the rest is in setLabel
drewp@bigasterisk.com
parents: 2087
diff changeset
71 // log(` setting ${setting.value}`);
2087
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
72 if (!isUri(setting)) throw new Error();
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
73 let value: ControlValue;
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
74 const device = this.graph.uriValue(setting, U(":device"));
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
75 const deviceAttr = this.graph.uriValue(setting, U(":deviceAttr"));
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
76
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
77 const pred = valuePred(this.graph, deviceAttr);
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
78 try {
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
79 value = this.graph.uriValue(setting, pred);
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
80 if (!(value as NamedNode).id.match(/^http/)) {
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
81 throw new Error("not uri");
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
82 }
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
83 } catch (error) {
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
84 try {
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
85 value = this.graph.floatValue(setting, pred);
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
86 } catch (error1) {
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
87 value = this.graph.stringValue(setting, pred); // this may find multi values and throw
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
88 }
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
89 }
2091
9324fc8285ad Effect repairs duplicate :settings edges when it finds them
drewp@bigasterisk.com
parents: 2089
diff changeset
90 // log(`change: graph contains ${deviceAttr.value} ${value}`);
2087
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
91
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
92 newSettings.push({ device, deviceAttr, setting, value });
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
93 }
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
94 this.settings = newSettings;
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
95 log(`rebuild to ${this.settings.length}`);
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
96 this.onValuesChanged();
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
97 }
2089
bbd6816d9e9e big optimization on effect editing. 50% time still in rebuildSettingsFromGraph though, and the rest is in setLabel
drewp@bigasterisk.com
parents: 2087
diff changeset
98
2087
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
99 currentValue(device: NamedNode, deviceAttr: NamedNode): ControlValue | null {
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
100 for (let s of this.settings) {
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
101 if (device.equals(s.device) && deviceAttr.equals(s.deviceAttr)) {
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
102 return s.value;
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
103 }
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
104 }
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
105 return null;
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
106 }
2089
bbd6816d9e9e big optimization on effect editing. 50% time still in rebuildSettingsFromGraph though, and the rest is in setLabel
drewp@bigasterisk.com
parents: 2087
diff changeset
107
2087
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
108 // change this object now, but return the patch to be applied to the graph so it can be coalesced.
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
109 edit(device: NamedNode, deviceAttr: NamedNode, newValue: ControlValue | null): Patch {
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
110 log(`edit: value=${newValue}`);
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
111 let existingSetting: NamedNode | null = null;
2091
9324fc8285ad Effect repairs duplicate :settings edges when it finds them
drewp@bigasterisk.com
parents: 2089
diff changeset
112 let result = { adds: [], dels: [] };
2087
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
113 for (let s of this.settings) {
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
114 if (device.equals(s.device) && deviceAttr.equals(s.deviceAttr)) {
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
115 if (existingSetting !== null) {
2091
9324fc8285ad Effect repairs duplicate :settings edges when it finds them
drewp@bigasterisk.com
parents: 2089
diff changeset
116 // this is corrupt. There was only supposed to be one setting per (dev,attr) pair. But we can fix it because we're going to update existingSetting to the user's requested value.
9324fc8285ad Effect repairs duplicate :settings edges when it finds them
drewp@bigasterisk.com
parents: 2089
diff changeset
117 log(`${this.uri.value} had two settings for ${device.value} - ${deviceAttr.value} - deleting ${s.setting}`);
9324fc8285ad Effect repairs duplicate :settings edges when it finds them
drewp@bigasterisk.com
parents: 2089
diff changeset
118 patchUpdate(result, this._removeEffectSetting(s.setting));
2087
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
119 }
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
120 existingSetting = s.setting;
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
121 }
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
122 }
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
123
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
124 if (newValue !== null && this.shouldBeStored(deviceAttr, newValue)) {
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
125 if (existingSetting === null) {
2091
9324fc8285ad Effect repairs duplicate :settings edges when it finds them
drewp@bigasterisk.com
parents: 2089
diff changeset
126 patchUpdate(result, this._addEffectSetting(device, deviceAttr, newValue));
2087
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
127 } else {
2091
9324fc8285ad Effect repairs duplicate :settings edges when it finds them
drewp@bigasterisk.com
parents: 2089
diff changeset
128 patchUpdate(result, this._patchExistingEffectSetting(existingSetting, deviceAttr, newValue));
2087
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
129 }
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
130 } else {
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
131 if (existingSetting !== null) {
2091
9324fc8285ad Effect repairs duplicate :settings edges when it finds them
drewp@bigasterisk.com
parents: 2089
diff changeset
132 patchUpdate(result, this._removeEffectSetting(existingSetting));
2087
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
133 }
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
134 }
2091
9324fc8285ad Effect repairs duplicate :settings edges when it finds them
drewp@bigasterisk.com
parents: 2089
diff changeset
135 return result;
2087
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
136 }
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
137
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
138 shouldBeStored(deviceAttr: NamedNode, value: ControlValue | null): boolean {
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
139 // this is a bug for zoom=0, since collector will default it to
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
140 // stick at the last setting if we don't explicitly send the
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
141 // 0. rx/ry similar though not the exact same deal because of
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
142 // their remap.
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
143 return value != null && value !== 0 && value !== "#000000";
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
144 }
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
145
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
146 _addEffectSetting(device: NamedNode, deviceAttr: NamedNode, value: ControlValue): Patch {
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
147 log(" _addEffectSetting", deviceAttr.value, value);
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
148 const U = (x: string) => this.graph.Uri(x);
2102
9c2e1b5c16e9 speed: don't redo uri string replace all the time
drewp@bigasterisk.com
parents: 2091
diff changeset
149 const quad = (s: Quad_Subject, p: Quad_Predicate, o: Quad_Object) => this.graph.Quad(s, p, o, this.ctxForEffect);
2087
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
150 if (!this.uri) throw new Error("effect unset");
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
151 const setting = this.graph.nextNumberedResource(this.uri.value + "_set");
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
152
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
153 const addQuads = [
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
154 quad(this.uri, U(":setting"), setting),
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
155 quad(setting, U(":device"), device),
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
156 quad(setting, U(":deviceAttr"), deviceAttr),
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
157 quad(setting, valuePred(this.graph, deviceAttr), this._nodeForValue(value)),
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
158 ];
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
159 const patch = { adds: addQuads, dels: [] } as Patch;
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
160 log(" save", patch);
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
161 this.settings.push({ device, deviceAttr, setting, value });
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
162 return patch;
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
163 }
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
164
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
165 _patchExistingEffectSetting(effectSetting: NamedNode, deviceAttr: NamedNode, value: ControlValue): Patch {
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
166 log(" patch existing", effectSetting.value);
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
167 return this.graph.getObjectPatch(
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
168 effectSetting, //
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
169 valuePred(this.graph, deviceAttr),
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
170 this._nodeForValue(value),
2102
9c2e1b5c16e9 speed: don't redo uri string replace all the time
drewp@bigasterisk.com
parents: 2091
diff changeset
171 this.ctxForEffect
2087
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
172 );
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
173 }
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
174
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
175 _removeEffectSetting(effectSetting: NamedNode): Patch {
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
176 const U = (x: string) => this.graph.Uri(x);
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
177 log(" _removeEffectSetting", effectSetting.value);
2102
9c2e1b5c16e9 speed: don't redo uri string replace all the time
drewp@bigasterisk.com
parents: 2091
diff changeset
178 const toDel = [this.graph.Quad(this.uri, U(":setting"), effectSetting, this.ctxForEffect)];
2087
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
179 for (let q of this.graph.subjectStatements(effectSetting)) {
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
180 toDel.push(q);
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
181 }
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
182 return { dels: toDel, adds: [] };
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
183 }
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
184
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
185 _nodeForValue(value: ControlValue): NamedNode | Literal {
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
186 if (value === null) {
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
187 throw new Error("no value");
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
188 }
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
189 if (isUri(value)) {
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
190 return value;
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
191 }
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
192 return this.graph.prettyLiteral(value);
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
193 }
1b6e7016e3de rewrite state mgmt in live/
drewp@bigasterisk.com
parents:
diff changeset
194 }