REFACTOR Removes unused syncImage Controller and refactors vars into
[wrfxweb.git] / fdds / js / components / Controller.js
blobe029f9538b0d06fcdb8bd1cc9882169d23865592
1 import { debounceInIntervals } from '../util.js';
3 export const controllerEvents = {
4 QUIET: 'QUIET',
5 SIM_RESET: 'SIMULATION_RESET',
6 VALUE_SET: 'VALUE_SET',
7 SLIDING_VALUE: 'SLIDING_VALUE',
8 ALL: 'ALL'
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) {
15 this.listeners = {};
16 this.value = value;
17 this.debouncedSetValue = debounceInIntervals((setArgs) => {
18 this.setValueCallback(setArgs);
19 }, 100);
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]) {
34 this.value = value;
35 if (eventName != controllerEvents.QUIET) {
36 this.notifyListeners(this.listeners[eventName]);
37 if (eventName != controllerEvents.ALL) {
38 this.notifyListeners(this.listeners[controllerEvents.ALL]);
43 getValue() {
44 return this.value;
47 notifyListeners(listeners, args=null) {
48 if (listeners == null) {
49 return;
51 listeners.map(listener => listener(args));
54 broadcastEvent(event, args=null) {
55 this.notifyListeners(this.listeners[event], args);
59 // global controllers
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;
67 })(),
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;
88 })(),
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;
101 })(),
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;
120 })(),
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;
138 })(),