# HG changeset patch # User Nicholas Jillings # Date 1470137179 -3600 # Node ID 221688a8be4f73ce70c24b80a3c279e0a453d8da # Parent 496fde335890ac2691f1c066422945bf8fa22679# Parent d26623bd65e0f9c4e93b849f40a650c891839741 Merge branch 'master' into Dev_main diff -r d26623bd65e0 -r 221688a8be4f interfaces/ape.js --- a/interfaces/ape.js Tue Aug 02 11:22:51 2016 +0100 +++ b/interfaces/ape.js Tue Aug 02 12:26:19 2016 +0100 @@ -395,7 +395,11 @@ event.preventDefault(); var obj = interfaceContext.getSelectedObject(); if (obj == null) {return;} - $(obj).css("left",event.clientX-6 + "px"); + var move = event.clientX-6; + var w = $(event.currentTarget).width(); + move = Math.max(50,move); + move = Math.min(w+50,move); + $(obj).css("left",move + "px"); interfaceContext.moveObject(); }); @@ -404,6 +408,9 @@ var obj = interfaceContext.getSelectedObject(); if (obj == null) {return;} var move = event.originalEvent.targetTouches[0].clientX - 6; + var w = $(event.currentTarget).width(); + move = Math.max(50,move); + move = Math.min(w+50,move); $(obj).css("left",move + "px"); interfaceContext.moveObject(); }); diff -r d26623bd65e0 -r 221688a8be4f js/core.js --- a/js/core.js Tue Aug 02 11:22:51 2016 +0100 +++ b/js/core.js Tue Aug 02 12:26:19 2016 +0100 @@ -859,6 +859,39 @@ console.log("Question Response: "+ textArea.value); node.response = textArea.value; } + // Perform the conditional + for (var condition of node.specification.conditions) { + var pass = false; + switch(condition.check) { + case "equals": + if (textArea.value == condition.value) { + pass = true; + } + break; + case "greaterThan": + case "lessThan": + console.log("Survey Element of type 'question' cannot interpret greaterThan/lessThan conditions. IGNORING"); + break; + case "contains": + if (textArea.value.includes(condition.value)) { + pass = true; + } + break; + } + var jumpID; + if (pass) { + jumpID = condition.jumpToOnPass; + } else { + jumpID = condition.jumpToOnFail; + } + if (jumpID != undefined) { + var index = this.popupOptions.findIndex(function(item,index,element){ + if (item.specification.id == jumpID) {return true;} else {return false;} + },this); + this.currentIndex = index-1; + break; + } + } } else if (node.specification.type == 'checkbox') { // Must extract checkbox data console.log("Checkbox: "+ node.specification.statement); @@ -872,6 +905,38 @@ }); console.log(node.specification.options[i].name+": "+ inputs[i].checked); } + // Perform the conditional + for (var condition of node.specification.conditions) { + var pass = false; + switch(condition.check) { + case "equals": + case "greaterThan": + case "lessThan": + console.log("Survey Element of type 'checkbox' cannot interpret equals/greaterThan/lessThan conditions. IGNORING"); + break; + case "contains": + for (var response of node.response) { + if (response.name == condition.value && response.checked) { + pass = true; + break; + } + } + break; + } + var jumpID; + if (pass) { + jumpID = condition.jumpToOnPass; + } else { + jumpID = condition.jumpToOnFail; + } + if (jumpID != undefined) { + var index = this.popupOptions.findIndex(function(item,index,element){ + if (item.specification.id == jumpID) {return true;} else {return false;} + },this); + this.currentIndex = index-1; + break; + } + } } else if (node.specification.type == "radio") { var optHold = this.popupResponse; console.log("Radio: "+ node.specification.statement); @@ -894,6 +959,35 @@ } i++; } + // Perform the conditional + for (var condition of node.specification.conditions) { + var pass = false; + switch(condition.check) { + case "contains": + case "greaterThan": + case "lessThan": + console.log("Survey Element of type 'radio' cannot interpret contains/greaterThan/lessThan conditions. IGNORING"); + break; + case "equals": + if (node.response == condition.value) { + pass = true; + } + break; + } + var jumpID; + if (pass) { + jumpID = condition.jumpToOnPass; + } else { + jumpID = condition.jumpToOnFail; + } + if (jumpID != undefined) { + var index = this.popupOptions.findIndex(function(item,index,element){ + if (item.specification.id == jumpID) {return true;} else {return false;} + },this); + this.currentIndex = index-1; + break; + } + } } else if (node.specification.type == "number") { var input = this.popupContent.getElementsByTagName('input')[0]; if (node.mandatory == true && input.value.length == 0) { @@ -914,6 +1008,43 @@ return; } node.response = input.value; + // Perform the conditional + for (var condition of node.specification.conditions) { + var pass = false; + switch(condition.check) { + case "contains": + console.log("Survey Element of type 'number' cannot interpret contains conditions. IGNORING"); + break; + case "greaterThan": + if (node.response > Number(condition.value)) { + pass = true; + } + break; + case "lessThan": + if (node.response < Number(condition.value)) { + pass = true; + } + break; + case "equals": + if (node.response == condition.value) { + pass = true; + } + break; + } + var jumpID; + if (pass) { + jumpID = condition.jumpToOnPass; + } else { + jumpID = condition.jumpToOnFail; + } + if (jumpID != undefined) { + var index = this.popupOptions.findIndex(function(item,index,element){ + if (item.specification.id == jumpID) {return true;} else {return false;} + },this); + this.currentIndex = index-1; + break; + } + } } this.currentIndex++; if (this.currentIndex < this.popupOptions.length) { @@ -1355,29 +1486,48 @@ // Copies the entire bufferObj. if (preSilenceTime == undefined) {preSilenceTime = 0;} if (postSilenceTime == undefined) {postSilenceTime = 0;} - var copy = new this.constructor(); - copy.url = this.url; var preSilenceSamples = secondsToSamples(preSilenceTime,this.buffer.sampleRate); var postSilenceSamples = secondsToSamples(postSilenceTime,this.buffer.sampleRate); var newLength = this.buffer.length+preSilenceSamples+postSilenceSamples; - copy.buffer = audioContext.createBuffer(this.buffer.numberOfChannels, newLength, this.buffer.sampleRate); + var copybuffer = audioContext.createBuffer(this.buffer.numberOfChannels, newLength, this.buffer.sampleRate); // Now we can use some efficient background copy schemes if we are just padding the end - if (preSilenceSamples == 0 && typeof copy.buffer.copyToChannel == "function") { + if (preSilenceSamples == 0 && typeof copybuffer.copyToChannel == "function") { for (var c=0; c Please enter your name. + Please select with which activities you have any experience (example checkbox question) @@ -13,6 +14,9 @@ + + What instrument did you play + This is an example of an 'APE'-style test, with two pages, using the test stimuli in 'example_eval/'. diff -r d26623bd65e0 -r 221688a8be4f xml/test-schema.xsd --- a/xml/test-schema.xsd Tue Aug 02 11:22:51 2016 +0100 +++ b/xml/test-schema.xsd Tue Aug 02 12:26:19 2016 +0100 @@ -249,6 +249,23 @@ + + + + + + + + + + + + + + + + +