1 import { debounceInIntervals
} from '../util.js';
3 export const controllerEvents
= {
5 SIM_RESET
: 'SIMULATION_RESET',
6 VALUE_SET
: 'VALUE_SET',
7 SLIDING_VALUE
: 'SLIDING_VALUE',
11 /** Class that enables data binding. Allows for callback functions to subscribe to the Controller which will
12 * then be called whenever the value in the controller is updated. */
13 export class Controller
{
14 constructor(value
=null) {
17 this.debouncedSetValue
= debounceInIntervals((setArgs
) => {
18 this.setValueCallback(setArgs
);
22 subscribe(callback
, eventName
=controllerEvents
.VALUE_SET
) {
23 if (!(eventName
in this.listeners
)) {
24 this.listeners
[eventName
] = [];
26 this.listeners
[eventName
].push(callback
);
29 setValue(value
, eventName
=controllerEvents
.VALUE_SET
) {
30 this.setValueCallback([value
, eventName
]);
33 setValueCallback([value
, eventName
=controllerEvents
.VALUE_SET
]) {
35 if (eventName
!= controllerEvents
.QUIET
) {
36 this.notifyListeners(this.listeners
[eventName
]);
37 if (eventName
!= controllerEvents
.ALL
) {
38 this.notifyListeners(this.listeners
[controllerEvents
.ALL
]);
47 notifyListeners(listeners
, args
=null) {
48 if (listeners
== null) {
51 listeners
.map(listener
=> listener(args
));
54 broadcastEvent(event
, args
=null) {
55 this.notifyListeners(this.listeners
[event
], args
);
60 export const controllers
= {
61 currentTimestamp
: (function createCurrentTimestamp() {
62 let currentTimestamp
= new Controller();
63 currentTimestamp
.setValue
= (value
, eventName
=controllerEvents
.VALUE_SET
) => {
64 currentTimestamp
.debouncedSetValue([value
, eventName
]);
66 return currentTimestamp
;
68 domainInstance
: new Controller(),
69 currentDomain
: new Controller(),
70 loadingProgress
: (function createLoadProg() {
71 const loadingProgress
= new Controller(0);
72 loadingProgress
.nFrames
= 0;
73 loadingProgress
.loadedFrames
= 0;
75 loadingProgress
.setFrames
= (nFrames
) => {
76 loadingProgress
.nFrames
= nFrames
;
77 loadingProgress
.loadedFrames
= 0;
78 loadingProgress
.setValue(0);
81 loadingProgress
.frameLoaded
= (frames
= 1) => {
82 loadingProgress
.loadedFrames
+= frames
;
83 let progress
= loadingProgress
.loadedFrames
/ loadingProgress
.nFrames
;
84 loadingProgress
.setValue(progress
);
87 return loadingProgress
;
89 timeSeriesMarkers
: (function createTimeSeriesMarkers() {
90 let timeSeriesMarkers
= new Controller([]);
91 timeSeriesMarkers
.removeEvent
= 'REMOVE_EVENT';
92 timeSeriesMarkers
.add
= (newMarker
) => {
93 timeSeriesMarkers
.value
.push(newMarker
);
95 timeSeriesMarkers
.remove
= (removeMarker
) => {
96 let index
= timeSeriesMarkers
.value
.indexOf(removeMarker
);
97 timeSeriesMarkers
.value
.splice(index
, 1);
98 timeSeriesMarkers
.broadcastEvent(timeSeriesMarkers
.removeEvent
, index
);
100 return timeSeriesMarkers
;
102 opacity
: new Controller(0.5),
103 startDate
: (function createStartDate() {
104 let startDateController
= new Controller();
106 const subscriptionFunction
= () => {
107 let newStartDate
= startDateController
.getValue();
108 let currentTimestamp
= controllers
.currentTimestamp
.getValue();
110 if (newStartDate
> currentTimestamp
) {
111 controllers
.currentTimestamp
.setValue(newStartDate
);
114 startDateController
.subscribe(subscriptionFunction
, controllerEvents
.ALL
);
115 startDateController
.setValue
= (value
, eventName
=controllerEvents
.VALUE_SET
) => {
116 startDateController
.debouncedSetValue([value
, eventName
]);
119 return startDateController
;
121 endDate
: (function createEndDate() {
122 let endDateController
= new Controller();
124 const subscriptionFunction
= ()=> {
125 let newEndDate
= endDateController
.getValue();
126 let currentTimestamp
= controllers
.currentTimestamp
.getValue();
128 if (newEndDate
< currentTimestamp
) {
129 controllers
.currentTimestamp
.setValue(newEndDate
);
132 endDateController
.subscribe(subscriptionFunction
, controllerEvents
.ALL
);
133 endDateController
.setValue
= (value
, eventName
=controllerEvents
.VALUE_SET
) => {
134 endDateController
.debouncedSetValue([value
, eventName
]);
137 return endDateController
;