Mercurial > hg > webaudioevaluationtool
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 |