comparison ape.js @ 391:3b97ee830b48 Dev_main

APE: Each slider now a JS object to ease metric tracking. Resize function fixed.
author Nicholas Jillings <nicholas.jillings@eecs.qmul.ac.uk>
date Tue, 08 Dec 2015 17:15:34 +0000
parents 5995d8fe96eb
children feaa33f28221
comparison
equal deleted inserted replaced
387:5995d8fe96eb 391:3b97ee830b48
204 Interface.prototype.hasSelectedObjectMoved = function() 204 Interface.prototype.hasSelectedObjectMoved = function()
205 { 205 {
206 return this.objectMoved; 206 return this.objectMoved;
207 }; 207 };
208 208
209 // Bindings for slider interfaces
210 Interface.prototype.interfaceSliders = [];
211
209 // Bindings for audioObjects 212 // Bindings for audioObjects
210 213
211 // Create the top div for the Title element 214 // Create the top div for the Title element
212 var titleAttr = specification.title; 215 var titleAttr = specification.title;
213 var title = document.createElement('div'); 216 var title = document.createElement('div');
279 { 282 {
280 var width = window.innerWidth; 283 var width = window.innerWidth;
281 var height = window.innerHeight; 284 var height = window.innerHeight;
282 var id = audioHolderObject.id; 285 var id = audioHolderObject.id;
283 286
287 interfaceContext.interfaceSliders = [];
288
284 var feedbackHolder = document.getElementById('feedbackHolder'); 289 var feedbackHolder = document.getElementById('feedbackHolder');
285 var sliderHolder = document.getElementById('slider-holder'); 290 var sliderHolder = document.getElementById('slider-holder');
286 feedbackHolder.innerHTML = null; 291 feedbackHolder.innerHTML = null;
287 sliderHolder.innerHTML = null; 292 sliderHolder.innerHTML = null;
288 293
289 var interfaceObj = audioHolderObject.interfaces; 294 var interfaceObj = audioHolderObject.interfaces;
290 for (var k=0; k<interfaceObj.length; k++) { 295 for (var k=0; k<interfaceObj.length; k++) {
291 // Create the div box to center align 296 // Create the div box to center align
292 var sliderBox = document.createElement('div'); 297 interfaceContext.interfaceSliders.push(new interfaceSliderHolder(interfaceObj[k]));
293 sliderBox.className = 'sliderCanvasDiv';
294 sliderBox.id = 'sliderCanvasHolder-'+k;
295
296 var pagetitle = document.createElement('div');
297 pagetitle.className = "pageTitle";
298 pagetitle.align = "center";
299 var titleSpan = document.createElement('span');
300 titleSpan.id = "pageTitle-"+k;
301 if (interfaceObj[k].title != undefined && typeof interfaceObj[k].title == "string")
302 {
303 titleSpan.textContent = interfaceObj[k].title;
304 }
305 pagetitle.appendChild(titleSpan);
306 sliderBox.appendChild(pagetitle);
307
308 // Create the slider box to hold the slider elements
309 var canvas = document.createElement('div');
310 if (interfaceObj[k].name != undefined)
311 canvas.id = 'slider-'+interfaceObj[k].name;
312 else
313 canvas.id = 'slider-'+k;
314 canvas.className = 'slider';
315 canvas.align = "left";
316 canvas.addEventListener('dragover',function(event){
317 event.preventDefault();
318 event.dataTransfer.effectAllowed = 'none';
319 event.dataTransfer.dropEffect = 'copy';
320 return false;
321 },false);
322 var sliderMargin = document.createAttribute('marginsize');
323 sliderMargin.nodeValue = 42; // Set default margins to 42px either side
324 // Must have a known EXACT width, as this is used later to determine the ratings
325 var w = (Number(sliderMargin.nodeValue)+8)*2;
326 canvas.style.width = width - w +"px";
327 canvas.style.marginLeft = sliderMargin.nodeValue +'px';
328 canvas.setAttributeNode(sliderMargin);
329 sliderBox.appendChild(canvas);
330
331 // Create the div to hold any scale objects
332 var scale = document.createElement('div');
333 scale.className = 'sliderScale';
334 scale.id = 'sliderScaleHolder';
335 scale.align = 'left';
336 sliderBox.appendChild(scale);
337 sliderHolder.appendChild(sliderBox);
338 var positionScale = canvas.style.width.substr(0,canvas.style.width.length-2);
339 var offset = Number(canvas.attributes['marginsize'].value);
340 $(interfaceObj[k].scale).each(function(index,scaleObj){
341 var value = document.createAttribute('value');
342 var position = Number(scaleObj[0])*0.01;
343 value.nodeValue = position;
344 var pixelPosition = (position*positionScale)+offset;
345 var scaleDOM = document.createElement('span');
346 scaleDOM.textContent = scaleObj[1];
347 scale.appendChild(scaleDOM);
348 scaleDOM.style.left = Math.floor((pixelPosition-($(scaleDOM).width()/2)))+'px';
349 scaleDOM.setAttributeNode(value);
350 });
351
352 for (var i=0; i<interfaceObj[k].options.length; i++) 298 for (var i=0; i<interfaceObj[k].options.length; i++)
353 { 299 {
354 if (interfaceObj[k].options[i].type == 'option' && interfaceObj[k].options[i].name == 'playhead') 300 if (interfaceObj[k].options[i].type == 'option' && interfaceObj[k].options[i].name == 'playhead')
355 { 301 {
356 var playbackHolder = document.getElementById('playback-holder'); 302 var playbackHolder = document.getElementById('playback-holder');
491 437
492 438
493 //testWaitIndicator(); 439 //testWaitIndicator();
494 } 440 }
495 441
496 function sliderObject(audioObject,interfaceObjects) { 442 function interfaceSliderHolder(interfaceObject)
497 // Create a new slider object; 443 {
498 this.parent = audioObject; 444 this.sliders = [];
499 this.trackSliderObjects = []; 445 this.id = document.getElementsByClassName("sliderCanvasDiv").length;
500 for (var i=0; i<interfaceObjects.length; i++) 446 this.name = interfaceObject.name;
447 this.interfaceObject = interfaceObject;
448 this.sliderDOM = document.createElement('div');
449 this.sliderDOM.className = 'sliderCanvasDiv';
450 this.sliderDOM.id = 'sliderCanvasHolder-'+this.id;
451
452 var pagetitle = document.createElement('div');
453 pagetitle.className = "pageTitle";
454 pagetitle.align = "center";
455 var titleSpan = document.createElement('span');
456 titleSpan.id = "pageTitle-"+this.id;
457 if (interfaceObject.title != undefined && typeof interfaceObject.title == "string")
458 {
459 titleSpan.textContent = interfaceObject.title;
460 }
461 pagetitle.appendChild(titleSpan);
462 this.sliderDOM.appendChild(pagetitle);
463
464 // Create the slider box to hold the slider elements
465 this.canvas = document.createElement('div');
466 if (this.name != undefined)
467 this.canvas.id = 'slider-'+this.name;
468 else
469 this.canvas.id = 'slider-'+this.id;
470 this.canvas.className = 'slider';
471 this.canvas.align = "left";
472 this.canvas.addEventListener('dragover',function(event){
473 event.preventDefault();
474 event.dataTransfer.effectAllowed = 'none';
475 event.dataTransfer.dropEffect = 'copy';
476 return false;
477 },false);
478 var sliderMargin = document.createAttribute('marginsize');
479 sliderMargin.nodeValue = 42; // Set default margins to 42px either side
480 // Must have a known EXACT width, as this is used later to determine the ratings
481 var w = (Number(sliderMargin.nodeValue)+8)*2;
482 this.canvas.style.width = window.innerWidth - w +"px";
483 this.canvas.style.marginLeft = sliderMargin.nodeValue +'px';
484 this.canvas.setAttributeNode(sliderMargin);
485 this.sliderDOM.appendChild(this.canvas);
486
487 // Create the div to hold any scale objects
488 this.scale = document.createElement('div');
489 this.scale.className = 'sliderScale';
490 this.scale.id = 'sliderScaleHolder-'+this.id;
491 this.scale.align = 'left';
492 this.sliderDOM.appendChild(this.scale);
493 var positionScale = this.canvas.style.width.substr(0,this.canvas.style.width.length-2);
494 var offset = Number(this.canvas.attributes['marginsize'].value);
495 for (var index=0; index<interfaceObject.scale.length; index++)
496 {
497 var scaleObj = interfaceObject.scale[index];
498 var value = document.createAttribute('value');
499 var position = Number(scaleObj[0])*0.01;
500 value.nodeValue = position;
501 var pixelPosition = (position*positionScale)+offset;
502 var scaleDOM = document.createElement('span');
503 scaleDOM.textContent = scaleObj[1];
504 this.scale.appendChild(scaleDOM);
505 scaleDOM.style.left = Math.floor((pixelPosition-($(scaleDOM).width()/2)))+'px';
506 scaleDOM.setAttributeNode(value);
507 }
508
509 var dest = document.getElementById("slider-holder");
510 dest.appendChild(this.sliderDOM);
511
512 this.createSliderObject = function(audioObject)
501 { 513 {
502 var trackObj = document.createElement('div'); 514 var trackObj = document.createElement('div');
503 trackObj.className = 'track-slider track-slider-disabled track-slider-'+audioObject.id; 515 trackObj.className = 'track-slider track-slider-disabled track-slider-'+audioObject.id;
504 trackObj.id = 'track-slider-'+i+'-'+audioObject.id; 516 trackObj.id = 'track-slider-'+this.id+'-'+audioObject.id;
505 trackObj.setAttribute('trackIndex',audioObject.id); 517 trackObj.setAttribute('trackIndex',audioObject.id);
506 trackObj.innerHTML = '<span>'+audioObject.id+'</span>'; 518 trackObj.innerHTML = '<span>'+audioObject.id+'</span>';
507 if (interfaceObjects[i].name != undefined) { 519 if (this.name != undefined) {
508 trackObj.setAttribute('interface-name',interfaceObjects[i].name); 520 trackObj.setAttribute('interface-name',this.name);
509 } else { 521 } else {
510 trackObj.setAttribute('interface-name',i); 522 trackObj.setAttribute('interface-name',this.id);
511 } 523 }
512 this.trackSliderObjects.push(trackObj); 524 var offset = Number(this.canvas.attributes['marginsize'].value);
513 var slider = document.getElementById("slider-"+trackObj.getAttribute("interface-name"));
514 var offset = Number(slider.attributes['marginsize'].value);
515 // Distribute it randomnly 525 // Distribute it randomnly
516 var w = window.innerWidth - (offset+8)*2; 526 var w = window.innerWidth - (offset+8)*2;
517 w = Math.random()*w; 527 w = Math.random()*w;
518 w = Math.floor(w+(offset+8)); 528 w = Math.floor(w+(offset+8));
519 trackObj.style.left = w+'px'; 529 trackObj.style.left = w+'px';
520 slider.appendChild(trackObj); 530 this.canvas.appendChild(trackObj);
531 this.sliders.push(trackObj);
532 return trackObj;
533 };
534
535 this.resize = function(event)
536 {
537 var holdValues = [];
538 for (var index = 0; index < this.sliders.length; index++)
539 {
540 holdValues.push(convSliderPosToRate(this.sliders[index]));
541 }
542 var width = event.target.innerWidth;
543 var sliderDiv = this.canvas;
544 var sliderScaleDiv = this.scale;
545 var marginsize = Number(sliderDiv.attributes['marginsize'].value);
546 var w = (marginsize+8)*2;
547 sliderDiv.style.width = width - w + 'px';
548 var width = width - w;
549 // Move sliders into new position
550 for (var index = 0; index < this.sliders.length; index++)
551 {
552 var pos = holdValues[index];
553 var pix = pos * width;
554 this.sliders[index].style.left = pix+marginsize+'px';
555 }
556
557 // Move scale labels
558 for (var index = 0; index < this.scale.children.length; index++)
559 {
560 var scaleObj = this.scale.children[index];
561 var position = Number(scaleObj.attributes['value'].value);
562 var pixelPosition = (position*width)+marginsize;
563 scaleObj.style.left = Math.floor((pixelPosition-($(scaleObj).width()/2)))+'px';
564 }
565 }
566 }
567
568 function sliderObject(audioObject,interfaceObjects) {
569 // Create a new slider object;
570 this.parent = audioObject;
571 this.trackSliderObjects = [];
572 for (var i=0; i<interfaceContext.interfaceSliders.length; i++)
573 {
574 var trackObj = interfaceContext.interfaceSliders[i].createSliderObject(audioObject);
575 this.trackSliderObjects.push(trackObj);
521 } 576 }
522 577
523 // Onclick, switch playback to that track 578 // Onclick, switch playback to that track
524 579
525 this.enable = function() { 580 this.enable = function() {
624 function resizeWindow(event){ 679 function resizeWindow(event){
625 // Function called when the window has been resized. 680 // Function called when the window has been resized.
626 // MANDATORY FUNCTION 681 // MANDATORY FUNCTION
627 682
628 // Store the slider marker values 683 // Store the slider marker values
629 var holdValues = []; 684 for (var i=0; i<interfaceContext.interfaceSliders.length; i++)
630 $(".track-slider").each(function(index,sliderObj){ 685 {
631 holdValues.push(convSliderPosToRate(sliderObj)); 686 interfaceContext.interfaceSliders[i].resize(event);
632 }); 687 }
633
634 var width = event.target.innerWidth;
635 var canvas = document.getElementById('sliderCanvasHolder');
636 var sliderDiv = canvas.children[0];
637 var sliderScaleDiv = canvas.children[1];
638 var marginsize = Number(sliderDiv.attributes['marginsize'].value);
639 var w = (marginsize+8)*2;
640 sliderDiv.style.width = width - w + 'px';
641 var width = width - w;
642 // Move sliders into new position
643 $(".track-slider").each(function(index,sliderObj){
644 var pos = holdValues[index];
645 var pix = pos * width;
646 sliderObj.style.left = pix+marginsize+'px';
647 });
648
649 // Move scale labels
650 $(sliderScaleDiv.children).each(function(index,scaleObj){
651 var position = Number(scaleObj.attributes['value'].value);
652 var pixelPosition = (position*width)+marginsize;
653 scaleObj.style.left = Math.floor((pixelPosition-($(scaleObj).width()/2)))+'px';
654 });
655 } 688 }
656 689
657 function pageXMLSave(store, testXML) 690 function pageXMLSave(store, testXML)
658 { 691 {
659 // MANDATORY 692 // MANDATORY