changeset 3010:7bbf1b1bfd95

More refactoring of APE.js
author Nicholas Jillings <n.g.r.jillings@se14.qmul.ac.uk>
date Fri, 04 Aug 2017 10:56:26 +0200
parents 1ced6e0cb9ac
children 03b9e845f730
files interfaces/ape.js
diffstat 1 files changed, 87 insertions(+), 103 deletions(-) [+]
line wrap: on
line diff
--- a/interfaces/ape.js	Fri Aug 04 10:03:56 2017 +0200
+++ b/interfaces/ape.js	Fri Aug 04 10:56:26 2017 +0200
@@ -7,7 +7,6 @@
 /*globals metricTracker */
 // Once this is loaded and parsed, begin execution
 loadInterface();
-window.APE = undefined;
 
 function loadInterface() {
 
@@ -22,107 +21,13 @@
     testContent.id = 'testContent';
 
     // Bindings for interfaceContext
-    interfaceContext.checkAllPlayed = function () {
-        var hasBeenPlayed = audioEngineContext.checkAllPlayed();
-        if (hasBeenPlayed.length > 0) // if a fragment has not been played yet
-        {
-            var str = "";
-            if (hasBeenPlayed.length > 1) {
-                for (var i = 0; i < hasBeenPlayed.length; i++) {
-                    var ao_id = audioEngineContext.audioObjects[hasBeenPlayed[i]].interfaceDOM.getPresentedId();
-                    str = str + ao_id; // start from 1
-                    if (i < hasBeenPlayed.length - 2) {
-                        str += ", ";
-                    } else if (i == hasBeenPlayed.length - 2) {
-                        str += " or ";
-                    }
-                }
-                str = 'You have not played fragments ' + str + ' yet. Please listen, rate and comment all samples before submitting.';
-            } else {
-                str = 'You have not played fragment ' + (audioEngineContext.audioObjects[hasBeenPlayed[0]].interfaceDOM.getPresentedId()) + ' yet. Please listen, rate and comment all samples before submitting.';
-            }
-            this.storeErrorNode(str);
-            interfaceContext.lightbox.post("Message", str);
-            return false;
-        }
-        return true;
-    };
 
     interfaceContext.checkAllMoved = function () {
-        var state = true;
-        var str = 'You have not moved the following sliders. ';
-        for (var i = 0; i < this.interfaceSliders.length; i++) {
-            var interfaceTID = [];
-            for (var j = 0; j < this.interfaceSliders[i].metrics.length; j++) {
-                var ao_id = this.interfaceSliders[i].sliders[j].getAttribute("trackIndex");
-                if (this.interfaceSliders[i].metrics[j].wasMoved === false && audioEngineContext.audioObjects[ao_id].interfaceDOM.canMove()) {
-                    state = false;
-                    interfaceTID.push(j);
-                }
-            }
-            if (interfaceTID.length !== 0) {
-                var interfaceName = this.interfaceSliders[i].interfaceObject.title;
-                if (interfaceName === undefined) {
-                    str += 'On axis ' + String(i + 1) + ' you must move ';
-                } else {
-                    str += 'On axis "' + interfaceName + '" you must move ';
-                }
-                if (interfaceTID.length == 1) {
-                    str += 'slider ' + (audioEngineContext.audioObjects[interfaceTID[0]].interfaceDOM.getPresentedId()) + '. '; // start from 1
-                } else {
-                    str += 'sliders ';
-                    for (var k = 0; k < interfaceTID.length - 1; k++) {
-                        str += (audioEngineContext.audioObjects[interfaceTID[k]].interfaceDOM.getPresentedId()) + ', '; // start from 1
-                    }
-                    str += (audioEngineContext.audioObjects[interfaceTID[interfaceTID.length - 1]].interfaceDOM.getPresentedId()) + '. ';
-                }
-            }
-        }
-        if (state !== true) {
-            this.storeErrorNode(str);
-            interfaceContext.lightbox.post("Message", str);
-            console.log(str);
-        }
-        return state;
+        module.checkAllMoved();
     };
 
     interfaceContext.checkScaleRange = function () {
-        var audioObjs = audioEngineContext.audioObjects;
-        var audioHolder = testState.stateMap[testState.stateIndex];
-        var interfaceObject = this.interfaceSliders[0].interfaceObject;
-        var state = true;
-        var str = '';
-        this.interfaceSliders.forEach(function (sliderHolder, i) {
-            var scales = (function () {
-                var scaleRange = interfaceObject.options.find(function (a) {
-                    return a.name == "scalerange";
-                });
-                return {
-                    min: scaleRange.min,
-                    max: scaleRange.max
-                };
-            })();
-            var range = sliderHolder.sliders.reduce(function (a, b) {
-                var v = convSliderPosToRate(b) * 100.0;
-                return {
-                    min: Math.min(a.min, v),
-                    max: Math.max(a.max, v)
-                };
-            }, {
-                min: 100,
-                max: 0
-            });
-            if (range.min >= scales.min || range.max <= scales.max) {
-                state = false;
-                str += 'On axis "' + sliderHolder.interfaceObject.title + '" you have not used the full width of the scale. ';
-            }
-        });
-        if (state !== true) {
-            this.storeErrorNode(str);
-            interfaceContext.lightbox.post("Message", str);
-            console.log(str);
-        }
-        return state;
+        module.checkScaleRange();
     };
 
     // Bindings for audioObjects
@@ -194,13 +99,13 @@
     interfaceContext.insertPoint.appendChild(testContent);
 
     // Load the full interface
-    window.APE = new ape();
+    window.module = new ape();
     testState.initialise();
     testState.advanceState();
 }
 
 function loadTest(audioHolderObject) {
-    APE.clear();
+    module.clear();
     var width = window.innerWidth;
     var height = window.innerHeight;
     var id = audioHolderObject.id;
@@ -268,7 +173,7 @@
 
     var loopPlayback = audioHolderObject.loop;
 
-    APE.initialisePage(audioHolderObject);
+    module.initialisePage(audioHolderObject);
 
     var interfaceList = audioHolderObject.interfaces.concat(specification.interfaces);
     for (var k = 0; k < interfaceList.length; k++) {
@@ -468,6 +373,9 @@
                     }
                 });
             }
+            this.hasMoved = function () {
+                return metric.wasMoved;
+            }
             Object.defineProperties(this, {
                 "DOM": {
                     "value": trackObj
@@ -514,6 +422,7 @@
         }
         this.name = interfaceObject.name;
         var DOMRoot = document.createElement("div");
+        parent.getDOMRoot().appendChild(DOMRoot);
         DOMRoot.className = "sliderCanvasDiv";
         DOMRoot.id = "sliderCanvasHolder-" + this.name;
         var sliders = [];
@@ -568,8 +477,6 @@
         DOMRoot.appendChild(scale);
         createScaleMarkers(interfaceObject, scale, $(sliderRail).width());
 
-        parent.getDOMRoot().appendChild(DOMRoot);
-
         this.resize = function (event) {
             var w = $(sliderRail).width();
             var marginsize = 50;
@@ -632,6 +539,49 @@
                 UI.selected.moveToPixel(move);
             }
         }
+        this.checkAllMoved = function () {
+            var notMoved = sliders.filter(function (s) {
+                return !s.hasMoved();
+            });
+            if (notMoved.length !== 0) {
+                var ls = [];
+                notMoved.forEach(function (s) {
+                    ls.push(s.label);
+                })
+                var str = "On axis \"" + interfaceObject.title + "\", ";
+                if (ls.length == 1) {
+                    str += "slider " + ls[0];
+                } else {
+                    str += "sliders " + [ls.slice(0, ls.length - 1).join(", ")].concat(ls[ls.length - 1]).join(" and ");
+                }
+                str += ".";
+                return str;
+            } else {
+                return "";
+            }
+        }
+        this.checkScaleRange = function () {
+            var scaleRange = interfaceObject.options.find(function (a) {
+                return a.name == "scalerange";
+            });
+            if (scaleRange === undefined) {
+                return "";
+            }
+            var scales = {
+                min: scaleRange.min,
+                max: scaleRange.max
+            };
+            var maxSlider = sliders.reduce(function (a, b) {
+                return Math.max(a, b.value);
+            }, 0);
+            var minSlider = sliders.reduce(function (a, b) {
+                return Math.min(a, b.value);
+            }, 100);
+            if (minSlider >= scales.min || maxSlider <= scales.max) {
+                return "On axis \"" + interfaceObject.title + "\", you have not used the required width of the scales";
+            }
+            return "";
+        }
         sliderRail.addEventListener("mousemove", this);
         sliderRail.addEventListener("touchmove", this);
         Object.defineProperties(this, {
@@ -681,6 +631,40 @@
             }
         });
     }
+    this.checkAllMoved = function () {
+        var str = "You have not moved the following sliders. "
+        var cont = true;
+        axis.forEach(function (a) {
+            var msg = a.checkAllMoved();
+            if (msg.length > 0) {
+                cont = false;
+                str += msg;
+            }
+        });
+        if (!cont) {
+            interfaceContext.lightbox.post("Error", str);
+            interfaceContext.storeErrorNode(str);
+            console.log(str);
+        }
+        return cont;
+    }
+    this.checkScaleRange = function () {
+        var str = "";
+        var cont = true;
+        axis.forEach(function (a) {
+            var msg = a.checkScaleRange();
+            if (msg.length > 0) {
+                cont = false;
+                str += msg;
+            }
+        });
+        if (!cont) {
+            interfaceContext.lightbox.post("Error", str);
+            interfaceContext.storeErrorNode(str);
+            console.log(str);
+        }
+        return cont;
+    }
     this.pageXMLSave = function (store, pageSpecification) {
         AOIs.forEach(function (ao) {
             ao.pageXMLSave(store);
@@ -841,5 +825,5 @@
     // pageSpecification is the current page node configuration
     // To create new XML nodes, use storage.document.createElement();
 
-    APE.pageXMLSave(store, pageSpecification);
+    module.pageXMLSave(store, pageSpecification);
 }