@vived/app 2.21.2 → 2.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ export declare type EntityObserver = () => void;
2
+ export declare abstract class ObservableEntity {
3
+ private observerList;
4
+ addObserver: (observer: EntityObserver) => void;
5
+ removeObserver: (observer: EntityObserver) => void;
6
+ notify: () => void;
7
+ }
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ObservableEntity = void 0;
4
+ const ObserverList_1 = require("./ObserverList");
5
+ class ObservableEntity {
6
+ constructor() {
7
+ this.observerList = new ObserverList_1.ObserverList();
8
+ this.addObserver = (observer) => {
9
+ this.observerList.add(observer);
10
+ };
11
+ this.removeObserver = (observer) => {
12
+ this.observerList.remove(observer);
13
+ };
14
+ this.notify = () => {
15
+ this.observerList.notify();
16
+ };
17
+ }
18
+ }
19
+ exports.ObservableEntity = ObservableEntity;
@@ -0,0 +1,48 @@
1
+ import { ObservableEntity } from "./ObservableEntity";
2
+ export declare enum ToolState {
3
+ HIDDEN = 0,
4
+ DISABLED = 1,
5
+ ENABLED = 2,
6
+ ACTIVE = 3
7
+ }
8
+ export interface ToolData {
9
+ id: string;
10
+ isDefault: boolean;
11
+ label: string;
12
+ shortcutLabel: string;
13
+ keyCode: string;
14
+ }
15
+ export declare abstract class Tool extends ObservableEntity {
16
+ /**
17
+ * The tool's unique identifier
18
+ */
19
+ abstract readonly id: string;
20
+ /**
21
+ * The shortcut key code for this tool.
22
+ * Example: 'KeyZ'
23
+ */
24
+ abstract readonly keyCode: string;
25
+ /**
26
+ * The label for this tool. This should be human readable
27
+ */
28
+ abstract readonly label: string;
29
+ /**
30
+ * Is this the default tool? The default tool is what is initiall set Active and
31
+ * is what will be set active if the currently active tool is hidden or disabled.
32
+ */
33
+ abstract readonly isDefault: boolean;
34
+ /**
35
+ * The keyboard shorcut label. This will be displayed to the user via the tool tip
36
+ * Example 'z'
37
+ */
38
+ abstract readonly shortcutLabel: string;
39
+ /**
40
+ * Get the current tool state
41
+ */
42
+ abstract get state(): ToolState;
43
+ /**
44
+ * Sets the current tool state. This will notify on change
45
+ */
46
+ abstract set state(val: ToolState);
47
+ }
48
+ export declare function makeTool(data: ToolData): Tool;
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeTool = exports.Tool = exports.ToolState = void 0;
4
+ const MemoizedNumber_1 = require("./MemoizedNumber");
5
+ const ObservableEntity_1 = require("./ObservableEntity");
6
+ var ToolState;
7
+ (function (ToolState) {
8
+ ToolState[ToolState["HIDDEN"] = 0] = "HIDDEN";
9
+ ToolState[ToolState["DISABLED"] = 1] = "DISABLED";
10
+ ToolState[ToolState["ENABLED"] = 2] = "ENABLED";
11
+ ToolState[ToolState["ACTIVE"] = 3] = "ACTIVE";
12
+ })(ToolState = exports.ToolState || (exports.ToolState = {}));
13
+ class Tool extends ObservableEntity_1.ObservableEntity {
14
+ }
15
+ exports.Tool = Tool;
16
+ function makeTool(data) {
17
+ return new ToolImp(data);
18
+ }
19
+ exports.makeTool = makeTool;
20
+ class ToolImp extends Tool {
21
+ constructor(data) {
22
+ super();
23
+ this.memoizedState = new MemoizedNumber_1.MemoizedNumber(ToolState.ENABLED, this.notify);
24
+ this.id = data.id;
25
+ this.keyCode = data.keyCode;
26
+ this.label = data.label;
27
+ this.isDefault = data.isDefault;
28
+ this.shortcutLabel = data.shortcutLabel;
29
+ }
30
+ get state() {
31
+ return this.memoizedState.val;
32
+ }
33
+ set state(val) {
34
+ this.memoizedState.val = val;
35
+ }
36
+ }
@@ -0,0 +1,46 @@
1
+ import { ObservableEntity } from "./ObservableEntity";
2
+ import { Tool, ToolData } from "./Tool";
3
+ export declare abstract class ToolRepository extends ObservableEntity {
4
+ /**
5
+ * Retuns the active tool. If no tool is active it will return undefined.
6
+ */
7
+ abstract get activeTool(): Tool | undefined;
8
+ /**
9
+ * Returns all the tools.
10
+ */
11
+ abstract get allTools(): Tool[];
12
+ /**
13
+ * Set up the tools from a JSON data file. This should be called during construction.
14
+ * It is assumed this is only called once.
15
+ * @param toolData
16
+ */
17
+ abstract setupToolsFromData(toolData: ToolData[]): void;
18
+ /**
19
+ * Get's a tool by it's ID. Retruns undefined if no tool could be found
20
+ * @param id The tool ID
21
+ */
22
+ abstract getTool(id: string): Tool | undefined;
23
+ /**
24
+ * Returns the tool that has been assinged to a particular key code.
25
+ * Will return undefined of no tool is found
26
+ * @param keyCode Key Code
27
+ */
28
+ abstract getToolForKey(keyCode: string): Tool | undefined;
29
+ /**
30
+ * Call this to set the default tool as active
31
+ */
32
+ abstract setDefaultToolActive(): void;
33
+ /**
34
+ * Sets a tool active by ID.
35
+ * @param id Tool ID
36
+ */
37
+ abstract setToolActive(id: string): void;
38
+ /**
39
+ * Toggls a tool between Hidden and shown.
40
+ * If the tool is tool is currently Active, the default tool will be set active
41
+ * The Default Tool cannot be toggled
42
+ * @param id Tool ID
43
+ */
44
+ abstract toggleToolVisibility(id: string): void;
45
+ }
46
+ export declare function makeToolRepo(): ToolRepository;
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeToolRepo = exports.ToolRepository = void 0;
4
+ const ObservableEntity_1 = require("./ObservableEntity");
5
+ const Tool_1 = require("./Tool");
6
+ class ToolRepository extends ObservableEntity_1.ObservableEntity {
7
+ }
8
+ exports.ToolRepository = ToolRepository;
9
+ function makeToolRepo() {
10
+ return new ToolRepositoryImp();
11
+ }
12
+ exports.makeToolRepo = makeToolRepo;
13
+ class ToolRepositoryImp extends ToolRepository {
14
+ constructor() {
15
+ super(...arguments);
16
+ this.toolLookup = new Map();
17
+ this._defaultToolID = "";
18
+ this._activeToolID = "";
19
+ }
20
+ get allTools() {
21
+ return Array.from(this.toolLookup.values());
22
+ }
23
+ setDefaultToolActive() {
24
+ if (this._defaultToolID) {
25
+ this.setToolActive(this._defaultToolID);
26
+ }
27
+ else {
28
+ console.warn(`[ToolRepository] No default tools has been specified`);
29
+ }
30
+ }
31
+ setupToolsFromData(toolDatas) {
32
+ toolDatas.forEach((toolData) => {
33
+ if (this.toolLookup.has(toolData.id)) {
34
+ console.warn(`[ToolRepository] A tool with the ID ${toolData.id} already exists. Replacing`);
35
+ }
36
+ const tool = Tool_1.makeTool(toolData);
37
+ this.toolLookup.set(tool.id, tool);
38
+ if (toolData.isDefault) {
39
+ if (this._defaultToolID) {
40
+ console.warn(`[ToolRepository] More than one tools is marked as default. Replacing`);
41
+ }
42
+ this._defaultToolID = tool.id;
43
+ }
44
+ });
45
+ if (!this._defaultToolID) {
46
+ console.warn(`[ToolRepository] No default tools was specified. Defaulting to the first tool in the list`);
47
+ this._defaultToolID = Array.from(this.toolLookup.values())[0].id;
48
+ }
49
+ this.setToolActive(this._defaultToolID);
50
+ }
51
+ getTool(id) {
52
+ return this.toolLookup.get(id);
53
+ }
54
+ getToolForKey(keyCode) {
55
+ let tool;
56
+ this.allTools.forEach((t) => {
57
+ if (t.keyCode === keyCode) {
58
+ tool = t;
59
+ }
60
+ });
61
+ return tool;
62
+ }
63
+ get activeTool() {
64
+ return this.getTool(this._activeToolID);
65
+ }
66
+ setToolActive(id) {
67
+ if (this._activeToolID === id)
68
+ return;
69
+ const newActiveTool = this.toolLookup.get(id);
70
+ if (!newActiveTool) {
71
+ console.warn(`[ToolRepository] Unable to find tool ${id}`);
72
+ return;
73
+ }
74
+ if (newActiveTool.state === Tool_1.ToolState.DISABLED) {
75
+ console.warn(`[ToolRepository] ${newActiveTool.label} cannot be set active because it is disabled`);
76
+ return;
77
+ }
78
+ if (newActiveTool.state === Tool_1.ToolState.HIDDEN) {
79
+ console.warn(`[ToolRepository] ${newActiveTool.label} cannot be set active because it is hidden`);
80
+ return;
81
+ }
82
+ this.toolLookup.forEach((tool) => {
83
+ if (tool.id === id) {
84
+ this._activeToolID = id;
85
+ tool.state = Tool_1.ToolState.ACTIVE;
86
+ }
87
+ else if (tool.state === Tool_1.ToolState.ACTIVE) {
88
+ tool.state = Tool_1.ToolState.ENABLED;
89
+ }
90
+ });
91
+ this.notify();
92
+ }
93
+ toggleToolVisibility(id) {
94
+ const tool = this.getTool(id);
95
+ if (!tool) {
96
+ console.warn(`[ToolRepository] Unable to find tool to toggle: ${id}`);
97
+ return;
98
+ }
99
+ if (tool.id === this._defaultToolID) {
100
+ console.warn(`[ToolRepository] The default tool's visibility cannot be toggled`);
101
+ return;
102
+ }
103
+ if (tool.state === Tool_1.ToolState.HIDDEN) {
104
+ tool.state = Tool_1.ToolState.ENABLED;
105
+ }
106
+ else {
107
+ if (tool.state === Tool_1.ToolState.ACTIVE) {
108
+ this.setDefaultToolActive();
109
+ }
110
+ tool.state = Tool_1.ToolState.HIDDEN;
111
+ }
112
+ }
113
+ }
@@ -10,9 +10,12 @@ export * from "./MemoizedVector3";
10
10
  export * from "./ObserverList";
11
11
  export * from "./FocusCamera";
12
12
  export * from "./StateMachine";
13
+ export * from "./Tool";
14
+ export * from "./ToolRepository";
13
15
  export * from "./TransformNode";
14
16
  export * from "./UndoRedo";
15
17
  export * from "./MouseInput";
18
+ export * from "./ObservableEntity";
16
19
  export * from "./TouchInput";
17
20
  export * from "./QuestionChallengeAnswer";
18
21
  export * from "./QuestionChallenge";
@@ -22,9 +22,12 @@ __exportStar(require("./MemoizedVector3"), exports);
22
22
  __exportStar(require("./ObserverList"), exports);
23
23
  __exportStar(require("./FocusCamera"), exports);
24
24
  __exportStar(require("./StateMachine"), exports);
25
+ __exportStar(require("./Tool"), exports);
26
+ __exportStar(require("./ToolRepository"), exports);
25
27
  __exportStar(require("./TransformNode"), exports);
26
28
  __exportStar(require("./UndoRedo"), exports);
27
29
  __exportStar(require("./MouseInput"), exports);
30
+ __exportStar(require("./ObservableEntity"), exports);
28
31
  __exportStar(require("./TouchInput"), exports);
29
32
  __exportStar(require("./QuestionChallengeAnswer"), exports);
30
33
  __exportStar(require("./QuestionChallenge"), exports);
@@ -0,0 +1,8 @@
1
+ import { EntityObserver, ObservableEntity } from "../Entities";
2
+ export declare abstract class PresentionManager {
3
+ private observableEntity;
4
+ abstract doUpdateView: EntityObserver;
5
+ private internalDoUodateView;
6
+ dispose: () => void;
7
+ constructor(observableEntity: ObservableEntity);
8
+ }
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PresentionManager = void 0;
4
+ class PresentionManager {
5
+ constructor(observableEntity) {
6
+ this.observableEntity = observableEntity;
7
+ this.internalDoUodateView = () => {
8
+ this.doUpdateView();
9
+ };
10
+ this.dispose = () => {
11
+ this.observableEntity.removeObserver(this.internalDoUodateView);
12
+ };
13
+ observableEntity.addObserver(this.internalDoUodateView);
14
+ }
15
+ }
16
+ exports.PresentionManager = PresentionManager;
@@ -0,0 +1,18 @@
1
+ import { Tool } from "../Entities";
2
+ import { PresentionManager } from "./PresentationManager";
3
+ export interface ToolVM {
4
+ toolID: string;
5
+ label: string;
6
+ enabled: boolean;
7
+ selected: boolean;
8
+ show: boolean;
9
+ shortcutLabel: string;
10
+ tooltipLabel: string;
11
+ }
12
+ export declare class ToolPM extends PresentionManager {
13
+ private tool;
14
+ private updateView;
15
+ doUpdateView: () => void;
16
+ constructor(tool: Tool, updateView: (tools: ToolVM) => void);
17
+ }
18
+ export declare const defaultToolVM: ToolVM;
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.defaultToolVM = exports.ToolPM = void 0;
4
+ const Entities_1 = require("../Entities");
5
+ const PresentationManager_1 = require("./PresentationManager");
6
+ class ToolPM extends PresentationManager_1.PresentionManager {
7
+ constructor(tool, updateView) {
8
+ super(tool);
9
+ this.tool = tool;
10
+ this.updateView = updateView;
11
+ this.doUpdateView = () => {
12
+ let enabled = false;
13
+ if (this.tool.state === Entities_1.ToolState.ACTIVE ||
14
+ this.tool.state === Entities_1.ToolState.ENABLED) {
15
+ enabled = true;
16
+ }
17
+ const selected = this.tool.state === Entities_1.ToolState.ACTIVE ? true : false;
18
+ const show = this.tool.state === Entities_1.ToolState.HIDDEN ? false : true;
19
+ const tooltipLabel = `${this.tool.label} [${this.tool.shortcutLabel}]`;
20
+ const vm = {
21
+ toolID: this.tool.id,
22
+ enabled,
23
+ label: this.tool.label,
24
+ selected,
25
+ show,
26
+ shortcutLabel: this.tool.shortcutLabel,
27
+ tooltipLabel,
28
+ };
29
+ this.updateView(vm);
30
+ };
31
+ this.doUpdateView();
32
+ }
33
+ }
34
+ exports.ToolPM = ToolPM;
35
+ exports.defaultToolVM = {
36
+ toolID: "",
37
+ enabled: false,
38
+ label: "",
39
+ selected: false,
40
+ shortcutLabel: "",
41
+ show: false,
42
+ tooltipLabel: "",
43
+ };
@@ -1,9 +1,11 @@
1
1
  export * from "./DevicePreviewPM";
2
2
  export * from "./IsAuthoringPM";
3
+ export * from "./PresentationManager";
3
4
  export * from "./ShowBabylonInspectorPM";
4
5
  export * from "./HasRedoPM";
5
6
  export * from "./HasUndoPM";
6
7
  export * from "./FocusCameraPM";
7
8
  export * from "./QuestionChallenge";
8
9
  export * from "./FocusCameraPosRotPM";
10
+ export * from "./ToolPM";
9
11
  export * from "./TransformNodePM";
@@ -12,10 +12,12 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
12
12
  Object.defineProperty(exports, "__esModule", { value: true });
13
13
  __exportStar(require("./DevicePreviewPM"), exports);
14
14
  __exportStar(require("./IsAuthoringPM"), exports);
15
+ __exportStar(require("./PresentationManager"), exports);
15
16
  __exportStar(require("./ShowBabylonInspectorPM"), exports);
16
17
  __exportStar(require("./HasRedoPM"), exports);
17
18
  __exportStar(require("./HasUndoPM"), exports);
18
19
  __exportStar(require("./FocusCameraPM"), exports);
19
20
  __exportStar(require("./QuestionChallenge"), exports);
20
21
  __exportStar(require("./FocusCameraPosRotPM"), exports);
22
+ __exportStar(require("./ToolPM"), exports);
21
23
  __exportStar(require("./TransformNodePM"), exports);
@@ -76,11 +76,13 @@ class Color {
76
76
  * @returns True if Color A === Color B
77
77
  */
78
78
  static Equal(a, b) {
79
- if (a.a !== b.a)
80
- return false;
81
- if (a.b !== b.a)
82
- return false;
83
- return true;
79
+ let areEqual = true;
80
+ for (let index = 0; index < 4; index++) {
81
+ if (a.array[index] !== b.array[index]) {
82
+ areEqual = false;
83
+ }
84
+ }
85
+ return areEqual;
84
86
  }
85
87
  /**
86
88
  * Return the r value as a percent
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vived/app",
3
- "version": "2.21.2",
3
+ "version": "2.23.0",
4
4
  "description": "Public package for the VIVED Learning App system",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",