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