var jsPsychResize = (function (jspsych) { 'use strict'; const info = { name: "resize", parameters: { /** The height of the item to be measured. */ item_height: { type: jspsych.ParameterType.INT, pretty_name: "Item height", default: 1, }, /** The width of the item to be measured. */ item_width: { type: jspsych.ParameterType.INT, pretty_name: "Item width", default: 1, }, /** The content displayed below the resizable box and above the button. */ prompt: { type: jspsych.ParameterType.HTML_STRING, pretty_name: "Prompt", default: null, }, /** After the scaling factor is applied, this many pixels will equal one unit of measurement. */ pixels_per_unit: { type: jspsych.ParameterType.INT, pretty_name: "Pixels per unit", default: 100, }, /** The initial size of the box, in pixels, along the larget dimension. */ starting_size: { type: jspsych.ParameterType.INT, pretty_name: "Starting size", default: 100, }, /** Label to display on the button to complete calibration. */ button_label: { type: jspsych.ParameterType.STRING, pretty_name: "Button label", default: "Continue", }, }, }; /** * **resize** * * jsPsych plugin for controlling the real world size of the display * * @author Steve Chao * @see {@link https://www.jspsych.org/plugins/jspsych-resize/ resize plugin documentation on jspsych.org} */ class ResizePlugin { constructor(jsPsych) { this.jsPsych = jsPsych; } trial(display_element, trial) { var aspect_ratio = trial.item_width / trial.item_height; // variables to determine div size if (trial.item_width >= trial.item_height) { var start_div_width = trial.starting_size; var start_div_height = Math.round(trial.starting_size / aspect_ratio); } else { var start_div_height = trial.starting_size; var start_div_width = Math.round(trial.starting_size * aspect_ratio); } // create html for display var html = '
'; html += '
'; html += "
"; if (trial.prompt !== null) { html += trial.prompt; } html += '' + trial.button_label + ""; // render display_element.innerHTML = html; // function to end trial const end_trial = () => { // clear document event listeners document.removeEventListener("mousemove", resizeevent); document.removeEventListener("mouseup", mouseupevent); // clear the screen display_element.innerHTML = ""; // finishes trial var trial_data = { final_height_px: final_height_px, final_width_px: final_width_px, scale_factor: scale_factor, }; this.jsPsych.finishTrial(trial_data); }; // listens for the click document.getElementById("jspsych-resize-btn").addEventListener("click", () => { scale(); end_trial(); }); var dragging = false; var origin_x, origin_y; var cx, cy; var mousedownevent = (e) => { e.preventDefault(); dragging = true; origin_x = e.pageX; origin_y = e.pageY; cx = parseInt(scale_div.style.width); cy = parseInt(scale_div.style.height); }; display_element .querySelector("#jspsych-resize-handle") .addEventListener("mousedown", mousedownevent); var mouseupevent = (e) => { dragging = false; }; document.addEventListener("mouseup", mouseupevent); var scale_div = display_element.querySelector("#jspsych-resize-div"); var resizeevent = (e) => { if (dragging) { var dx = e.pageX - origin_x; var dy = e.pageY - origin_y; if (Math.abs(dx) >= Math.abs(dy)) { scale_div.style.width = Math.round(Math.max(20, cx + dx * 2)) + "px"; scale_div.style.height = Math.round(Math.max(20, cx + dx * 2) / aspect_ratio) + "px"; } else { scale_div.style.height = Math.round(Math.max(20, cy + dy * 2)) + "px"; scale_div.style.width = Math.round(aspect_ratio * Math.max(20, cy + dy * 2)) + "px"; } } }; document.addEventListener("mousemove", resizeevent); // scales the stimulus var scale_factor; var final_height_px, final_width_px; function scale() { final_width_px = scale_div.offsetWidth; //final_height_px = scale_div.offsetHeight; var pixels_unit_screen = final_width_px / trial.item_width; scale_factor = pixels_unit_screen / trial.pixels_per_unit; document.getElementById("jspsych-content").style.transform = "scale(" + scale_factor + ")"; } } } ResizePlugin.info = info; return ResizePlugin; })(jsPsychModule);