comparison ape.js @ 383:38439b21d369 Dev_main

STASH: UNSTABLE. Implementing APE multiple sliders.
author Nicholas Jillings <n.g.r.jillings@se14.qmul.ac.uk>
date Tue, 08 Dec 2015 12:01:48 +0000
parents b1cb28c63a19
children 5995d8fe96eb
comparison
equal deleted inserted replaced
381:b1cb28c63a19 383:38439b21d369
145 Interface.prototype.checkScaleRange = function() 145 Interface.prototype.checkScaleRange = function()
146 { 146 {
147 var audioObjs = audioEngineContext.audioObjects; 147 var audioObjs = audioEngineContext.audioObjects;
148 var audioHolder = testState.stateMap[testState.stateIndex]; 148 var audioHolder = testState.stateMap[testState.stateIndex];
149 var interfaces = audioHolder.interfaces; 149 var interfaces = audioHolder.interfaces;
150 150 for (var i=0; i<interfaces.length; i++)
151 var minRanking = audioObjs[0].interfaceDOM.getValue(); 151 {
152 var maxRanking = minRanking; 152 var minRanking = convSliderPosToRate(audioObjs[0].interfaceDOM.trackSliderObjects[i]);
153 153 var maxRanking = minRanking;
154 var minScale; 154
155 var maxScale; 155 var minScale;
156 for (var i=0; i<interfaces[0].options.length; i++) 156 var maxScale;
157 { 157 for (var j=0; j<interfaces[i].options.length; j++)
158 if (interfaces[0].options[i].check == "scalerange") { 158 {
159 minScale = interfaces[0].options[i].min; 159 if (interfaces[i].options[j].check == "scalerange") {
160 maxScale = interfaces[0].options[i].max; 160 minScale = interfaces[i].options[j].min;
161 } 161 maxScale = interfaces[i].options[j].max;
162 } 162 break;
163 163 }
164 for (var i=1; i<audioObjs.length; i++){ 164 }
165 if (audioObjs[i].specification.type != 'outsidereference') { 165 for (var j=1; j<audioObjs.length; j++){
166 var ranking = audioObjs[i].interfaceDOM.getValue(); 166 if (audioObjs[j].specification.type != 'outsidereference') {
167 if (ranking < minRanking) { minRanking = ranking;} 167 var ranking = convSliderPosToRate(audioObjs[j].interfaceDOM.trackSliderObjects[i]);
168 if (ranking > maxRanking) { maxRanking = ranking;} 168 if (ranking < minRanking) { minRanking = ranking;}
169 } 169 if (ranking > maxRanking) { maxRanking = ranking;}
170 } 170 }
171 if (minRanking > minScale || maxRanking < maxScale) { 171 }
172 alert('Please use the full width of the scale'); 172 if (minRanking > minScale || maxRanking < maxScale) {
173 return false; 173 alert('Please use the full width of the scale');
174 } else { 174 return false;
175 return true; 175 }
176 } 176 }
177 return true;
177 }; 178 };
178 179
179 Interface.prototype.objectSelected = null; 180 Interface.prototype.objectSelected = null;
180 Interface.prototype.objectMoved = false; 181 Interface.prototype.objectMoved = false;
181 Interface.prototype.selectObject = function(object) 182 Interface.prototype.selectObject = function(object)
222 } else { 223 } else {
223 titleSpan.textContent = 'Listening test'; 224 titleSpan.textContent = 'Listening test';
224 } 225 }
225 // Insert the titleSpan element into the title div element. 226 // Insert the titleSpan element into the title div element.
226 title.appendChild(titleSpan); 227 title.appendChild(titleSpan);
227
228 var pagetitle = document.createElement('div');
229 pagetitle.className = "pageTitle";
230 pagetitle.align = "center";
231 var titleSpan = document.createElement('span');
232 titleSpan.id = "pageTitle";
233 pagetitle.appendChild(titleSpan);
234 228
235 // Create Interface buttons! 229 // Create Interface buttons!
236 var interfaceButtons = document.createElement('div'); 230 var interfaceButtons = document.createElement('div');
237 interfaceButtons.id = 'interface-buttons'; 231 interfaceButtons.id = 'interface-buttons';
238 232
257 submit.id = 'submit-button'; 251 submit.id = 'submit-button';
258 // Append the interface buttons into the interfaceButtons object. 252 // Append the interface buttons into the interfaceButtons object.
259 interfaceButtons.appendChild(playback); 253 interfaceButtons.appendChild(playback);
260 interfaceButtons.appendChild(submit); 254 interfaceButtons.appendChild(submit);
261 255
262 // Now create the slider and HTML5 canvas boxes 256 var sliderHolder = document.createElement("div");
263 257 sliderHolder.id = "slider-holder";
264 // Create the div box to center align 258
265 var sliderBox = document.createElement('div');
266 sliderBox.className = 'sliderCanvasDiv';
267 sliderBox.id = 'sliderCanvasHolder';
268
269 // Create the slider box to hold the slider elements
270 var canvas = document.createElement('div');
271 canvas.id = 'slider';
272 canvas.align = "left";
273 canvas.addEventListener('dragover',function(event){
274 event.preventDefault();
275 event.dataTransfer.effectAllowed = 'none';
276 event.dataTransfer.dropEffect = 'copy';
277 return false;
278 },false);
279 var sliderMargin = document.createAttribute('marginsize');
280 sliderMargin.nodeValue = 42; // Set default margins to 42px either side
281 // Must have a known EXACT width, as this is used later to determine the ratings
282 var w = (Number(sliderMargin.nodeValue)+8)*2;
283 canvas.style.width = width - w +"px";
284 canvas.style.marginLeft = sliderMargin.nodeValue +'px';
285 canvas.setAttributeNode(sliderMargin);
286 sliderBox.appendChild(canvas);
287
288 // Create the div to hold any scale objects
289 var scale = document.createElement('div');
290 scale.className = 'sliderScale';
291 scale.id = 'sliderScaleHolder';
292 scale.align = 'left';
293 sliderBox.appendChild(scale);
294 259
295 // Global parent for the comment boxes on the page 260 // Global parent for the comment boxes on the page
296 var feedbackHolder = document.createElement('div'); 261 var feedbackHolder = document.createElement('div');
297 feedbackHolder.id = 'feedbackHolder'; 262 feedbackHolder.id = 'feedbackHolder';
298 263
299 testContent.style.zIndex = 1; 264 testContent.style.zIndex = 1;
300 interfaceContext.insertPoint.innerHTML = null; // Clear the current schema 265 interfaceContext.insertPoint.innerHTML = null; // Clear the current schema
301 266
302 // Inject into HTML 267 // Inject into HTML
303 testContent.appendChild(title); // Insert the title 268 testContent.appendChild(title); // Insert the title
304 testContent.appendChild(pagetitle);
305 testContent.appendChild(interfaceButtons); 269 testContent.appendChild(interfaceButtons);
306 testContent.appendChild(sliderBox); 270 testContent.appendChild(sliderHolder);
307 testContent.appendChild(feedbackHolder); 271 testContent.appendChild(feedbackHolder);
308 interfaceContext.insertPoint.appendChild(testContent); 272 interfaceContext.insertPoint.appendChild(testContent);
309 273
310 // Load the full interface 274 // Load the full interface
311 testState.initialise(); 275 testState.initialise();
313 277
314 } 278 }
315 279
316 function loadTest(audioHolderObject) 280 function loadTest(audioHolderObject)
317 { 281 {
318 282 var width = window.innerWidth;
283 var height = window.innerHeight;
319 var id = audioHolderObject.id; 284 var id = audioHolderObject.id;
320 285
321 var feedbackHolder = document.getElementById('feedbackHolder'); 286 var feedbackHolder = document.getElementById('feedbackHolder');
322 var canvas = document.getElementById('slider'); 287 var sliderHolder = document.getElementById('slider-holder');
323 feedbackHolder.innerHTML = null; 288 feedbackHolder.innerHTML = null;
324 canvas.innerHTML = null; 289 sliderHolder.innerHTML = null;
325 290
326 var interfaceObj = audioHolderObject.interfaces; 291 var interfaceObj = audioHolderObject.interfaces;
327 for (var k=0; k<interfaceObj.length; k++) { 292 for (var k=0; k<interfaceObj.length; k++) {
293 // Create the div box to center align
294 var sliderBox = document.createElement('div');
295 sliderBox.className = 'sliderCanvasDiv';
296 sliderBox.id = 'sliderCanvasHolder-'+k;
297
298 var pagetitle = document.createElement('div');
299 pagetitle.className = "pageTitle";
300 pagetitle.align = "center";
301 var titleSpan = document.createElement('span');
302 titleSpan.id = "pageTitle-"+k;
303 if (interfaceObj[k].title != undefined && typeof interfaceObj[k].title == "string")
304 {
305 titleSpan.textContent = interfaceObj[k].title;
306 }
307 pagetitle.appendChild(titleSpan);
308 sliderBox.appendChild(pagetitle);
309
310 // Create the slider box to hold the slider elements
311 var canvas = document.createElement('div');
312 if (interfaceObj[k].name != undefined)
313 canvas.id = 'slider-'+name;
314 else
315 canvas.id = 'slider-'+k;
316 canvas.className = 'slider';
317 canvas.align = "left";
318 canvas.addEventListener('dragover',function(event){
319 event.preventDefault();
320 event.dataTransfer.effectAllowed = 'none';
321 event.dataTransfer.dropEffect = 'copy';
322 return false;
323 },false);
324 var sliderMargin = document.createAttribute('marginsize');
325 sliderMargin.nodeValue = 42; // Set default margins to 42px either side
326 // Must have a known EXACT width, as this is used later to determine the ratings
327 var w = (Number(sliderMargin.nodeValue)+8)*2;
328 canvas.style.width = width - w +"px";
329 canvas.style.marginLeft = sliderMargin.nodeValue +'px';
330 canvas.setAttributeNode(sliderMargin);
331 sliderBox.appendChild(canvas);
332
333 // Create the div to hold any scale objects
334 var scale = document.createElement('div');
335 scale.className = 'sliderScale';
336 scale.id = 'sliderScaleHolder';
337 scale.align = 'left';
338 sliderBox.appendChild(scale);
339 sliderHolder.appendChild(sliderBox);
340 var positionScale = canvas.style.width.substr(0,canvas.style.width.length-2);
341 var offset = Number(canvas.attributes['marginsize'].value);
342 $(interfaceObj[k].scale).each(function(index,scaleObj){
343 var value = document.createAttribute('value');
344 var position = Number(scaleObj[0])*0.01;
345 value.nodeValue = position;
346 var pixelPosition = (position*positionScale)+offset;
347 var scaleDOM = document.createElement('span');
348 scaleDOM.textContent = scaleObj[1];
349 scale.appendChild(scaleDOM);
350 scaleDOM.style.left = Math.floor((pixelPosition-($(scaleDOM).width()/2)))+'px';
351 scaleDOM.setAttributeNode(value);
352 });
353
328 for (var i=0; i<interfaceObj[k].options.length; i++) 354 for (var i=0; i<interfaceObj[k].options.length; i++)
329 { 355 {
330 if (interfaceObj[k].options[i].type == 'option' && interfaceObj[k].options[i].name == 'playhead') 356 if (interfaceObj[k].options[i].type == 'option' && interfaceObj[k].options[i].name == 'playhead')
331 { 357 {
332 var playbackHolder = document.getElementById('playback-holder'); 358 var playbackHolder = document.getElementById('playback-holder');
350 var inject = document.getElementById('interface-buttons'); 376 var inject = document.getElementById('interface-buttons');
351 inject.appendChild(pagecountHolder); 377 inject.appendChild(pagecountHolder);
352 } 378 }
353 } 379 }
354 } 380 }
355 // Setup question title
356 381
357 var commentBoxPrefix = "Comment on track"; 382 var commentBoxPrefix = "Comment on track";
358 if (interfaceObj.length != 0) {
359 interfaceObj = interfaceObj[0];
360 var titleNode = interfaceObj.title;
361 if (titleNode != undefined)
362 {
363 document.getElementById('pageTitle').textContent = titleNode;
364 }
365 var positionScale = canvas.style.width.substr(0,canvas.style.width.length-2);
366 var offset = Number(document.getElementById('slider').attributes['marginsize'].value);
367 var scale = document.getElementById('sliderScaleHolder');
368 scale.innerHTML = null;
369 $(interfaceObj.scale).each(function(index,scaleObj){
370 var value = document.createAttribute('value');
371 var position = Number(scaleObj[0])*0.01;
372 value.nodeValue = position;
373 var pixelPosition = (position*positionScale)+offset;
374 var scaleDOM = document.createElement('span');
375 scaleDOM.textContent = scaleObj[1];
376 scale.appendChild(scaleDOM);
377 scaleDOM.style.left = Math.floor((pixelPosition-($(scaleDOM).width()/2)))+'px';
378 scaleDOM.setAttributeNode(value);
379 });
380
381 if (interfaceObj.commentBoxPrefix != undefined) {
382 commentBoxPrefix = interfaceObj.commentBoxPrefix;
383 }
384 }
385 383
386 var commentShow = audioHolderObject.elementComments; 384 var commentShow = audioHolderObject.elementComments;
387 385
388 var loopPlayback = audioHolderObject.loop; 386 var loopPlayback = audioHolderObject.loop;
389 387
401 var audioObject = audioEngineContext.newTrack(element); 399 var audioObject = audioEngineContext.newTrack(element);
402 400
403 var node = interfaceContext.createCommentBox(audioObject); 401 var node = interfaceContext.createCommentBox(audioObject);
404 402
405 // Create a slider per track 403 // Create a slider per track
406 audioObject.interfaceDOM = new sliderObject(audioObject); 404 audioObject.interfaceDOM = new sliderObject(audioObject,interfaceObj);
407 if (audioObject.state == 1) 405 if (audioObject.state == 1)
408 { 406 {
409 audioObject.interfaceDOM.enable(); 407 audioObject.interfaceDOM.enable();
410 } 408 }
411
412 // Distribute it randomnly
413 var w = window.innerWidth - (offset+8)*2;
414 w = Math.random()*w;
415 w = Math.floor(w+(offset+8));
416 audioObject.interfaceDOM.trackSliderObj.style.left = w+'px';
417
418 canvas.appendChild(audioObject.interfaceDOM.trackSliderObj);
419 audioObject.metric.initialised(convSliderPosToRate(audioObject.interfaceDOM.trackSliderObj));
420 409
421 }); 410 });
422 411
423 $('.track-slider').mousedown(function(event) { 412 $('.track-slider').mousedown(function(event) {
424 interfaceContext.selectObject($(this)[0]); 413 interfaceContext.selectObject($(this)[0]);
426 415
427 $('.track-slider').mousemove(function(event) { 416 $('.track-slider').mousemove(function(event) {
428 event.preventDefault(); 417 event.preventDefault();
429 }); 418 });
430 419
431 $('#slider').mousemove(function(event) { 420 $('.slider').mousemove(function(event) {
432 event.preventDefault(); 421 event.preventDefault();
433 var obj = interfaceContext.getSelectedObject(); 422 var obj = interfaceContext.getSelectedObject();
434 if (obj == null) {return;} 423 if (obj == null) {return;}
435 $(obj).css("left",event.clientX + "px"); 424 $(obj).css("left",event.clientX + "px");
436 interfaceContext.moveObject(); 425 interfaceContext.moveObject();
452 var id = Number(obj.attributes['trackIndex'].value); 441 var id = Number(obj.attributes['trackIndex'].value);
453 //audioEngineContext.metric.sliderPlayed(id); 442 //audioEngineContext.metric.sliderPlayed(id);
454 audioEngineContext.play(id); 443 audioEngineContext.play(id);
455 // Currently playing track red, rest green 444 // Currently playing track red, rest green
456 445
457 //document.getElementById('track-slider-'+index).style.backgroundColor = "#FF0000"; 446
458 $('.track-slider').removeClass('track-slider-playing'); 447 $('.track-slider').removeClass('track-slider-playing');
459 $(obj).addClass('track-slider-playing'); 448 var name = ".track-slider-"+obj.getAttribute("trackindex");
449 $(name).addClass('track-slider-playing');
460 $('.comment-div').removeClass('comment-box-playing'); 450 $('.comment-div').removeClass('comment-box-playing');
461 $('#comment-div-'+id).addClass('comment-box-playing'); 451 $('#comment-div-'+id).addClass('comment-box-playing');
462 var outsideReference = document.getElementById('outside-reference'); 452 var outsideReference = document.getElementById('outside-reference');
463 if (outsideReference != undefined) 453 if (outsideReference != undefined)
464 $(outsideReference).removeClass('track-slider-playing'); 454 $(outsideReference).removeClass('track-slider-playing');
503 493
504 494
505 //testWaitIndicator(); 495 //testWaitIndicator();
506 } 496 }
507 497
508 function sliderObject(audioObject) { 498 function sliderObject(audioObject,interfaceObjects) {
509 // Create a new slider object; 499 // Create a new slider object;
510 this.parent = audioObject; 500 this.parent = audioObject;
511 this.trackSliderObj = document.createElement('div'); 501 this.trackSliderObjects = [];
512 this.trackSliderObj.className = 'track-slider track-slider-disabled'; 502 for (var i=0; i<interfaceObjects.length; i++)
513 this.trackSliderObj.id = 'track-slider-'+audioObject.id; 503 {
514 504 var trackObj = document.createElement('div');
515 this.trackSliderObj.setAttribute('trackIndex',audioObject.id); 505 trackObj.className = 'track-slider track-slider-disabled track-slider-'+audioObject.id;
516 this.trackSliderObj.innerHTML = '<span>'+audioObject.id+'</span>'; 506 trackObj.id = 'track-slider-'+i+'-'+audioObject.id;
507 trackObj.setAttribute('trackIndex',audioObject.id);
508 trackObj.innerHTML = '<span>'+audioObject.id+'</span>';
509 if (interfaceObjects[i].name != undefined) {
510 trackObj.setAttribute('interface-name',interfaceObjects[i].name);
511 } else {
512 trackObj.setAttribute('interface-name',i);
513 }
514 this.trackSliderObjects.push(trackObj);
515 var slider = document.getElementById("slider-"+trackObj.getAttribute("interface-name"));
516 var offset = Number(slider.attributes['marginsize'].value);
517 // Distribute it randomnly
518 var w = window.innerWidth - (offset+8)*2;
519 w = Math.random()*w;
520 w = Math.floor(w+(offset+8));
521 trackObj.style.left = w+'px';
522 slider.appendChild(trackObj);
523 }
517 524
518 // Onclick, switch playback to that track 525 // Onclick, switch playback to that track
519 526
520 this.enable = function() { 527 this.enable = function() {
521 if (this.parent.state == 1) 528 if (this.parent.state == 1)
522 { 529 {
523 $(this.trackSliderObj).removeClass('track-slider-disabled'); 530 $(this.trackSliderObjects).each(function(i,trackObj){
531 $(trackObj).removeClass('track-slider-disabled');
532 });
524 } 533 }
525 }; 534 };
526 535
527 this.exportXMLDOM = function(audioObject) { 536 this.exportXMLDOM = function(audioObject) {
528 // Called by the audioObject holding this element. Must be present 537 // Called by the audioObject holding this element. Must be present
529 var node = document.createElement('value'); 538 var obj = [];
530 node.textContent = convSliderPosToRate(this.trackSliderObj); 539 $(this.trackSliderObjects).each(function(i,trackObj){
531 return node; 540 var node = document.createElement('value');
541 node.setAttribute("name",trackObj.getAttribute("interface-name"));
542 node.textContent = convSliderPosToRate(trackObj);
543 obj.push(node);
544 });
545
546 return obj;
532 }; 547 };
533 this.getValue = function() { 548 this.getValue = function() {
534 return convSliderPosToRate(this.trackSliderObj); 549 return convSliderPosToRate(this.trackSliderObj);
535 }; 550 };
536 } 551 }
594 } 609 }
595 testState.advanceState(); 610 testState.advanceState();
596 } 611 }
597 } 612 }
598 613
599 function convSliderPosToRate(slider) 614 function convSliderPosToRate(trackSlider)
600 { 615 {
601 var w = document.getElementById('slider').style.width; 616 var slider = trackSlider.parentElement;
602 var marginsize = Number(document.getElementById('slider').attributes['marginsize'].value); 617 var w = slider.style.width;
618 var marginsize = Number(slider.attributes['marginsize'].value);
603 var maxPix = w.substr(0,w.length-2); 619 var maxPix = w.substr(0,w.length-2);
604 var pix = slider.style.left; 620 var pix = trackSlider.style.left;
605 pix = pix.substr(0,pix.length-2); 621 pix = pix.substr(0,pix.length-2);
606 var rate = (pix-marginsize)/maxPix; 622 var rate = (pix-marginsize)/maxPix;
607 return rate; 623 return rate;
608 } 624 }
609 625