comparison interfaces/ape.js @ 3041:0a5f34a5eec6

Implemented #78 for APE. Plus some APE fixes
author Nicholas Jillings <nicholas.jillings@mail.bcu.ac.uk>
date Tue, 26 Sep 2017 14:02:34 +0100
parents 1620cbee9111
children b17a3e5e469b
comparison
equal deleted inserted replaced
3040:5b652438802c 3041:0a5f34a5eec6
212 var node = interfaceContext.createCommentQuestion(element); 212 var node = interfaceContext.createCommentQuestion(element);
213 feedbackHolder.appendChild(node.holder); 213 feedbackHolder.appendChild(node.holder);
214 }); 214 });
215 215
216 //testWaitIndicator(); 216 //testWaitIndicator();
217 module.resize();
217 } 218 }
218 219
219 function ape() { 220 function ape() {
220 var axis = [] 221 var axis = []
221 var DOMRoot = document.getElementById("slider-holder"); 222 var DOMRoot = document.getElementById("slider-holder");
251 s.stopped(); 252 s.stopped();
252 }); 253 });
253 } 254 }
254 255
255 this.getValue = function () { 256 this.getValue = function () {
256 return sliders[0].value(); 257 return sliders[0].value;
257 } 258 }
258 259
259 this.getPresentedId = function () { 260 this.getPresentedId = function () {
260 return sliders[0].label; 261 return sliders[0].label;
261 } 262 }
305 function sliderInterface(AOI, axisInterface) { 306 function sliderInterface(AOI, axisInterface) {
306 var trackObj = document.createElement('div'); 307 var trackObj = document.createElement('div');
307 var labelHolder = document.createElement("span"); 308 var labelHolder = document.createElement("span");
308 var label = ""; 309 var label = "";
309 var metric = new metricTracker(this); 310 var metric = new metricTracker(this);
311 var value = Math.random();
310 trackObj.align = "center"; 312 trackObj.align = "center";
311 trackObj.className = 'track-slider track-slider-disabled'; 313 trackObj.className = 'track-slider track-slider-disabled';
312 trackObj.appendChild(labelHolder); 314 trackObj.appendChild(labelHolder);
313 trackObj.style.left = (Math.random() * $(sliderRail).width()) + 50 + "px";
314 axisInterface.sliderRail.appendChild(trackObj); 315 axisInterface.sliderRail.appendChild(trackObj);
315 metric.initialise(this.value); 316 metric.initialise(this.value);
316 this.setLabel = function (s) { 317 this.setLabel = function (s) {
317 label = s; 318 label = s;
318 } 319 }
319 this.resize = function (event) { 320 this.resize = function (event) {
320 var width = $(axisInterface.sliderRail).width(); 321 var width = $(axisInterface.sliderRail).width();
321 var w = Number(value * width + 50); 322 var w = Number(value * width);
322 trackObj.style.left = String(w) + "px"; 323 trackObj.style.left = String(w) + "px";
323 } 324 }
324 this.playing = function () { 325 this.playing = function () {
325 trackObj.classList.add("track-slider-playing"); 326 trackObj.classList.add("track-slider-playing");
326 } 327 }
381 Object.defineProperties(this, { 382 Object.defineProperties(this, {
382 "DOM": { 383 "DOM": {
383 "value": trackObj 384 "value": trackObj
384 }, 385 },
385 "value": { 386 "value": {
386 "value": function () { 387 "get": function () {
387 var maxPix = $(axisInterface.sliderRail).width(); 388 return value;
388 var pix = trackObj.style.left.substr(0, trackObj.style.left.length - 2); 389 },
389 return (pix - 50) / maxPix; 390 "set": function (v) {
390 } 391 if (v >= 0 && v <= 1) {
391 }, 392 value = v;
392 "moveToPixel": { 393 }
393 "value": function (pix) { 394 this.resize();
394 var t = audioEngineContext.timer.getTestTime(); 395 return value;
395 trackObj.style.left = String(pix) + "px";
396 metric.moved(t, this.value);
397 } 396 }
398 }, 397 },
399 "label": { 398 "label": {
400 "get": function () { 399 "get": function () {
401 return label; 400 return label;
403 "set": function () {} 402 "set": function () {}
404 } 403 }
405 }); 404 });
406 } 405 }
407 406
407 function drawTick(position) {
408 var context = tickCanvas.getContext("2d"),
409 w = tickCanvas.width,
410 h = tickCanvas.height;
411 context.beginPath();
412 context.setLineDash([1, 2]);
413 context.moveTo(position * w, 0);
414 context.lineTo(position * w, h);
415 context.closePath();
416 context.stroke();
417 }
418
419 function clearTicks() {
420 var c = tickCanvas.getContext("2d"),
421 w = tickCanvas.width,
422 h = tickCanvas.height;
423 c.clearRect(0, 0, w, h);
424 }
425
408 function createScaleMarkers(interfaceObject, root, w) { 426 function createScaleMarkers(interfaceObject, root, w) {
427 var ticks = interfaceObject.options.findIndex(function (a) {
428 return (a.type == "show" && a.name == "ticks");
429 });
430 ticks = (ticks >= 0);
431 clearTicks();
409 interfaceObject.scales.forEach(function (scaleObj) { 432 interfaceObject.scales.forEach(function (scaleObj) {
410 var position = Number(scaleObj.position) * 0.01; 433 var position = Number(scaleObj.position) * 0.01;
411 var pixelPosition = (position * w) + 50; 434 var pixelPosition = (position * w) + 50;
412 var scaleDOM = document.createElement('span'); 435 var scaleDOM = document.createElement('span');
413 scaleDOM.className = "ape-marker-text"; 436 scaleDOM.className = "ape-marker-text";
414 scaleDOM.textContent = scaleObj.text; 437 scaleDOM.textContent = scaleObj.text;
415 scaleDOM.setAttribute('value', position); 438 scaleDOM.setAttribute('value', position);
416 root.appendChild(scaleDOM); 439 root.appendChild(scaleDOM);
417 scaleDOM.style.left = Math.floor((pixelPosition - ($(scaleDOM).width() / 2))) + 'px'; 440 scaleDOM.style.left = Math.floor((pixelPosition - ($(scaleDOM).width() / 2))) + 'px';
441 if (ticks) {
442 drawTick(position);
443 }
418 }, this); 444 }, this);
419 } 445 }
420 var sliders = []; 446 var sliders = [];
421 var UI = { 447 var UI = {
422 selected: undefined, 448 selected: undefined,
469 sliderRail.id = "sliderrail-" + this.name; 495 sliderRail.id = "sliderrail-" + this.name;
470 sliderRail.className = "slider"; 496 sliderRail.className = "slider";
471 sliderRail.align = "left"; 497 sliderRail.align = "left";
472 DOMRoot.appendChild(sliderRail); 498 DOMRoot.appendChild(sliderRail);
473 499
500 // Canvas for the markers
501 var tickCanvas = document.createElement("canvas");
502 tickCanvas.id = "ticks-" + this.name;
503 tickCanvas.className = "tick-canvas";
504 tickCanvas.height = 150;
505 tickCanvas.width = $(sliderRail).width() - 100;
506 tickCanvas.style.width = ($(sliderRail).width() - 100) + "px";
507 sliderRail.appendChild(tickCanvas);
508
474 // Create the div to hold any scale objects 509 // Create the div to hold any scale objects
475 var scale = document.createElement("div"); 510 var scale = document.createElement("div");
476 scale.className = "sliderScale"; 511 scale.className = "sliderScale";
477 scale.id = "slider-scale-holder-" + this.name; 512 scale.id = "slider-scale-holder-" + this.name;
478 scale.slign = "left"; 513 scale.slign = "left";
484 var marginsize = 50; 519 var marginsize = 50;
485 sliders.forEach(function (s) { 520 sliders.forEach(function (s) {
486 s.resize(); 521 s.resize();
487 }); 522 });
488 scale.innerHTML = ""; 523 scale.innerHTML = "";
524 tickCanvas.width = $(sliderRail).width();
525 tickCanvas.style.width = tickCanvas.width + "px";
489 createScaleMarkers(interfaceObject, scale, $(sliderRail).width()); 526 createScaleMarkers(interfaceObject, scale, $(sliderRail).width());
490 } 527 }
491 this.playing = function (id) { 528 this.playing = function (id) {
492 var node = audioEngineContext.audioObjects.find(function (a) { 529 var node = audioEngineContext.audioObjects.find(function (a) {
493 return a.id == id; 530 return a.id == id;
529 } 566 }
530 if (event.type == "mousemove") { 567 if (event.type == "mousemove") {
531 var move = event.clientX - 6; 568 var move = event.clientX - 6;
532 var w = $(sliderRail).width(); 569 var w = $(sliderRail).width();
533 move = Math.max(50, move); 570 move = Math.max(50, move);
534 move = Math.min(w + 50, move); 571 move = Math.min(w, move);
535 UI.selected.moveToPixel(move); 572 UI.selected.value = (move / w);
536 } else if (event.type == "touchmove") { 573 } else if (event.type == "touchmove") {
537 var move = event.originalEvent.targetTouches[0].clientX - 6; 574 var move = event.originalEvent.targetTouches[0].clientX - 6;
538 var w = $(event.currentTarget).width(); 575 var w = $(event.currentTarget).width();
539 move = Math.max(50, move); 576 move = Math.max(50, move);
540 move = Math.min(w + 50, move); 577 move = Math.min(w, move);
541 UI.selected.moveToPixel(move); 578 UI.selected.value = (move / w);
542 } 579 }
543 } 580 }
544 this.checkAllMoved = function () { 581 this.checkAllMoved = function () {
545 var notMoved = sliders.filter(function (s) { 582 var notMoved = sliders.filter(function (s) {
546 return !s.hasMoved(); 583 return !s.hasMoved();
681 if (axis.length > 1) { 718 if (axis.length > 1) {
682 AOIs.forEach(function (ao) { 719 AOIs.forEach(function (ao) {
683 ao.pageXMLSave(store); 720 ao.pageXMLSave(store);
684 }); 721 });
685 } 722 }
723 }
724 this.resize = function (event) {
725 axis.forEach(function (a) {
726 a.resize(event);
727 });
686 } 728 }
687 } 729 }
688 730
689 function outsideReferenceDOM(audioObject, index, inject) { 731 function outsideReferenceDOM(audioObject, index, inject) {
690 this.parent = audioObject; 732 this.parent = audioObject;
827 function resizeWindow(event) { 869 function resizeWindow(event) {
828 // Function called when the window has been resized. 870 // Function called when the window has been resized.
829 // MANDATORY FUNCTION 871 // MANDATORY FUNCTION
830 872
831 // Resize the slider objects 873 // Resize the slider objects
832 for (var i = 0; i < interfaceContext.interfaceSliders.length; i++) { 874 window.module.resize(event);
833 interfaceContext.interfaceSliders[i].resize(event);
834 }
835 } 875 }
836 876
837 function pageXMLSave(store, pageSpecification) { 877 function pageXMLSave(store, pageSpecification) {
838 // MANDATORY 878 // MANDATORY
839 // Saves a specific test page 879 // Saves a specific test page