changeset 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
files ape.js
diffstat 1 files changed, 132 insertions(+), 99 deletions(-) [+]
line wrap: on
line diff
--- a/ape.js	Tue Dec 08 15:04:59 2015 +0000
+++ b/ape.js	Tue Dec 08 17:15:34 2015 +0000
@@ -206,6 +206,9 @@
 		return this.objectMoved;
 	};
 	
+	// Bindings for slider interfaces
+	Interface.prototype.interfaceSliders = [];
+	
 	// Bindings for audioObjects
 	
 	// Create the top div for the Title element
@@ -281,6 +284,8 @@
 	var height = window.innerHeight;
 	var id = audioHolderObject.id;
 	
+	interfaceContext.interfaceSliders = [];
+	
 	var feedbackHolder = document.getElementById('feedbackHolder');
 	var sliderHolder = document.getElementById('slider-holder');
 	feedbackHolder.innerHTML = null;
@@ -289,66 +294,7 @@
 	var interfaceObj = audioHolderObject.interfaces;
 	for (var k=0; k<interfaceObj.length; k++) {
 		// Create the div box to center align
-		var sliderBox = document.createElement('div');
-		sliderBox.className = 'sliderCanvasDiv';
-		sliderBox.id = 'sliderCanvasHolder-'+k;
-		
-		var pagetitle = document.createElement('div');
-		pagetitle.className = "pageTitle";
-		pagetitle.align = "center";
-		var titleSpan = document.createElement('span');
-		titleSpan.id = "pageTitle-"+k;
-		if (interfaceObj[k].title != undefined && typeof interfaceObj[k].title == "string")
-		{
-			titleSpan.textContent = interfaceObj[k].title;
-		}
-		pagetitle.appendChild(titleSpan);
-		sliderBox.appendChild(pagetitle);
-		
-		// Create the slider box to hold the slider elements
-		var canvas = document.createElement('div');
-		if (interfaceObj[k].name != undefined)
-			canvas.id = 'slider-'+interfaceObj[k].name;
-		else
-			canvas.id = 'slider-'+k;
-		canvas.className = 'slider';
-		canvas.align = "left";
-		canvas.addEventListener('dragover',function(event){
-			event.preventDefault();
-			event.dataTransfer.effectAllowed = 'none';
-			event.dataTransfer.dropEffect = 'copy';
-			return false;
-		},false);
-		var sliderMargin = document.createAttribute('marginsize');
-		sliderMargin.nodeValue = 42; // Set default margins to 42px either side
-		// Must have a known EXACT width, as this is used later to determine the ratings
-		var w = (Number(sliderMargin.nodeValue)+8)*2;
-		canvas.style.width = width - w +"px";
-		canvas.style.marginLeft = sliderMargin.nodeValue +'px';
-		canvas.setAttributeNode(sliderMargin);
-		sliderBox.appendChild(canvas);
-		
-		// Create the div to hold any scale objects
-		var scale = document.createElement('div');
-		scale.className = 'sliderScale';
-		scale.id = 'sliderScaleHolder';
-		scale.align = 'left';
-		sliderBox.appendChild(scale);
-		sliderHolder.appendChild(sliderBox);
-		var positionScale = canvas.style.width.substr(0,canvas.style.width.length-2);
-		var offset = Number(canvas.attributes['marginsize'].value);
-		$(interfaceObj[k].scale).each(function(index,scaleObj){
-			var value = document.createAttribute('value');
-			var position = Number(scaleObj[0])*0.01;
-			value.nodeValue = position;
-			var pixelPosition = (position*positionScale)+offset;
-			var scaleDOM = document.createElement('span');
-			scaleDOM.textContent = scaleObj[1];
-			scale.appendChild(scaleDOM);
-			scaleDOM.style.left = Math.floor((pixelPosition-($(scaleDOM).width()/2)))+'px';
-			scaleDOM.setAttributeNode(value);
-		});
-		
+		interfaceContext.interfaceSliders.push(new interfaceSliderHolder(interfaceObj[k]));
 		for (var i=0; i<interfaceObj[k].options.length; i++)
 		{
 			if (interfaceObj[k].options[i].type == 'option' && interfaceObj[k].options[i].name == 'playhead')
@@ -493,31 +439,140 @@
 	//testWaitIndicator();
 }
 
-function sliderObject(audioObject,interfaceObjects) {
-	// Create a new slider object;
-	this.parent = audioObject;
-	this.trackSliderObjects = [];
-	for (var i=0; i<interfaceObjects.length; i++)
+function interfaceSliderHolder(interfaceObject)
+{
+	this.sliders = [];
+	this.id = document.getElementsByClassName("sliderCanvasDiv").length;
+	this.name = interfaceObject.name;
+	this.interfaceObject = interfaceObject;
+	this.sliderDOM = document.createElement('div');
+	this.sliderDOM.className = 'sliderCanvasDiv';
+	this.sliderDOM.id = 'sliderCanvasHolder-'+this.id;
+	
+	var pagetitle = document.createElement('div');
+	pagetitle.className = "pageTitle";
+	pagetitle.align = "center";
+	var titleSpan = document.createElement('span');
+	titleSpan.id = "pageTitle-"+this.id;
+	if (interfaceObject.title != undefined && typeof interfaceObject.title == "string")
+	{
+		titleSpan.textContent = interfaceObject.title;
+	}
+	pagetitle.appendChild(titleSpan);
+	this.sliderDOM.appendChild(pagetitle);
+	
+	// Create the slider box to hold the slider elements
+	this.canvas = document.createElement('div');
+	if (this.name != undefined)
+		this.canvas.id = 'slider-'+this.name;
+	else
+		this.canvas.id = 'slider-'+this.id;
+	this.canvas.className = 'slider';
+	this.canvas.align = "left";
+	this.canvas.addEventListener('dragover',function(event){
+		event.preventDefault();
+		event.dataTransfer.effectAllowed = 'none';
+		event.dataTransfer.dropEffect = 'copy';
+		return false;
+	},false);
+	var sliderMargin = document.createAttribute('marginsize');
+	sliderMargin.nodeValue = 42; // Set default margins to 42px either side
+	// Must have a known EXACT width, as this is used later to determine the ratings
+	var w = (Number(sliderMargin.nodeValue)+8)*2;
+	this.canvas.style.width = window.innerWidth - w +"px";
+	this.canvas.style.marginLeft = sliderMargin.nodeValue +'px';
+	this.canvas.setAttributeNode(sliderMargin);
+	this.sliderDOM.appendChild(this.canvas);
+	
+	// Create the div to hold any scale objects
+	this.scale = document.createElement('div');
+	this.scale.className = 'sliderScale';
+	this.scale.id = 'sliderScaleHolder-'+this.id;
+	this.scale.align = 'left';
+	this.sliderDOM.appendChild(this.scale);
+	var positionScale = this.canvas.style.width.substr(0,this.canvas.style.width.length-2);
+	var offset = Number(this.canvas.attributes['marginsize'].value);
+	for (var index=0; index<interfaceObject.scale.length; index++)
+	{
+		var scaleObj = interfaceObject.scale[index];
+		var value = document.createAttribute('value');
+		var position = Number(scaleObj[0])*0.01;
+		value.nodeValue = position;
+		var pixelPosition = (position*positionScale)+offset;
+		var scaleDOM = document.createElement('span');
+		scaleDOM.textContent = scaleObj[1];
+		this.scale.appendChild(scaleDOM);
+		scaleDOM.style.left = Math.floor((pixelPosition-($(scaleDOM).width()/2)))+'px';
+		scaleDOM.setAttributeNode(value);
+	}
+	
+	var dest = document.getElementById("slider-holder");
+	dest.appendChild(this.sliderDOM);
+	
+	this.createSliderObject = function(audioObject)
 	{
 		var trackObj = document.createElement('div');
 		trackObj.className = 'track-slider track-slider-disabled track-slider-'+audioObject.id;
-		trackObj.id = 'track-slider-'+i+'-'+audioObject.id;
+		trackObj.id = 'track-slider-'+this.id+'-'+audioObject.id;
 		trackObj.setAttribute('trackIndex',audioObject.id);
 		trackObj.innerHTML = '<span>'+audioObject.id+'</span>';
-		if (interfaceObjects[i].name != undefined) {
-			trackObj.setAttribute('interface-name',interfaceObjects[i].name);
+		if (this.name != undefined) {
+			trackObj.setAttribute('interface-name',this.name);
 		} else {
-			trackObj.setAttribute('interface-name',i);
+			trackObj.setAttribute('interface-name',this.id);
 		}
-		this.trackSliderObjects.push(trackObj);
-		var slider = document.getElementById("slider-"+trackObj.getAttribute("interface-name"));
-		var offset = Number(slider.attributes['marginsize'].value);
+		var offset = Number(this.canvas.attributes['marginsize'].value);
 		// Distribute it randomnly
 		var w = window.innerWidth - (offset+8)*2;
 		w = Math.random()*w;
 		w = Math.floor(w+(offset+8));
 		trackObj.style.left = w+'px';
-		slider.appendChild(trackObj);
+		this.canvas.appendChild(trackObj);
+		this.sliders.push(trackObj);
+		return trackObj;
+	};
+	
+	this.resize = function(event)
+	{
+		var holdValues = [];
+		for (var index = 0; index < this.sliders.length; index++)
+		{
+			holdValues.push(convSliderPosToRate(this.sliders[index])); 
+		}
+		var width = event.target.innerWidth;
+		var sliderDiv = this.canvas;
+		var sliderScaleDiv = this.scale;
+		var marginsize = Number(sliderDiv.attributes['marginsize'].value);
+		var w = (marginsize+8)*2;
+		sliderDiv.style.width = width - w + 'px';
+		var width = width - w;
+		// Move sliders into new position
+		for (var index = 0; index < this.sliders.length; index++)
+		{
+			var pos = holdValues[index];
+			var pix = pos * width;
+			this.sliders[index].style.left = pix+marginsize+'px';
+		}
+		
+		// Move scale labels
+		for (var index = 0; index < this.scale.children.length; index++)
+		{
+			var scaleObj = this.scale.children[index];
+			var position = Number(scaleObj.attributes['value'].value);
+			var pixelPosition = (position*width)+marginsize;
+			scaleObj.style.left = Math.floor((pixelPosition-($(scaleObj).width()/2)))+'px';
+		}
+	}
+}
+
+function sliderObject(audioObject,interfaceObjects) {
+	// Create a new slider object;
+	this.parent = audioObject;
+	this.trackSliderObjects = [];
+	for (var i=0; i<interfaceContext.interfaceSliders.length; i++)
+	{
+		var trackObj = interfaceContext.interfaceSliders[i].createSliderObject(audioObject);
+		this.trackSliderObjects.push(trackObj);
 	}
 
 	// Onclick, switch playback to that track
@@ -626,32 +681,10 @@
 	// MANDATORY FUNCTION
 	
 	// Store the slider marker values
-	var holdValues = [];
-	$(".track-slider").each(function(index,sliderObj){
-		holdValues.push(convSliderPosToRate(sliderObj));
-	});
-	
-	var width = event.target.innerWidth;
-	var canvas = document.getElementById('sliderCanvasHolder');
-	var sliderDiv = canvas.children[0];
-	var sliderScaleDiv = canvas.children[1];
-	var marginsize = Number(sliderDiv.attributes['marginsize'].value);
-	var w = (marginsize+8)*2;
-	sliderDiv.style.width = width - w + 'px';
-	var width = width - w;
-	// Move sliders into new position
-	$(".track-slider").each(function(index,sliderObj){
-		var pos = holdValues[index];
-		var pix = pos * width;
-		sliderObj.style.left = pix+marginsize+'px';
-	});
-	
-	// Move scale labels
-	$(sliderScaleDiv.children).each(function(index,scaleObj){
-		var position = Number(scaleObj.attributes['value'].value);
-		var pixelPosition = (position*width)+marginsize;
-		scaleObj.style.left = Math.floor((pixelPosition-($(scaleObj).width()/2)))+'px';
-	});
+	for (var i=0; i<interfaceContext.interfaceSliders.length; i++)
+	{
+		interfaceContext.interfaceSliders[i].resize(event);
+	}
 }
 
 function pageXMLSave(store, testXML)