diff --git a/common/static/js/capa/drag_and_drop/base_image.js b/common/static/js/capa/drag_and_drop/base_image.js index 9fa5ef6f52..185325512c 100644 --- a/common/static/js/capa/drag_and_drop/base_image.js +++ b/common/static/js/capa/drag_and_drop/base_image.js @@ -8,34 +8,34 @@ define(['logme'], function (logme) { return BaseImage; function BaseImage(state) { - var targetImgSrc, targetElContainer, mouseMoveDiv; + var targetImgSrc, baseImageElContainer, mouseMoveDiv; targetImgSrc = state.config.imageDir + '/' + state.config.base_image; - targetElContainer = $( + baseImageElContainer = $( '
' ); - state.targetEl = $( + state.baseImageEl = $( '' ); - state.targetEl.appendTo(targetElContainer); + state.baseImageEl.appendTo(baseImageElContainer); - state.targetElWidth = null; + state.baseImageElWidth = null; $('') // Make in memory copy of image to avoid css issues. - .attr('src', state.targetEl.attr('src')) + .attr('src', state.baseImageEl.attr('src')) .load(function () { - state.targetElWidth = this.width; + state.baseImageElWidth = this.width; }); - // state.targetEl.mousemove( + // state.baseImageEl.mousemove( // function (event) { // mouseMoveDiv.html( // '[' + event.offsetX + ', ' + event.offsetY + ']' @@ -53,9 +53,9 @@ define(['logme'], function (logme) { '" ' + '>' ); - mouseMoveDiv.appendTo(targetElContainer); + mouseMoveDiv.appendTo(baseImageElContainer); - targetElContainer.appendTo(state.containerEl); + baseImageElContainer.appendTo(state.containerEl); } }); diff --git a/common/static/js/capa/drag_and_drop/container.js b/common/static/js/capa/drag_and_drop/container.js index 766a020802..e5a7de447f 100644 --- a/common/static/js/capa/drag_and_drop/container.js +++ b/common/static/js/capa/drag_and_drop/container.js @@ -12,6 +12,9 @@ define(['logme'], function (logme) { '
' ); diff --git a/common/static/js/capa/drag_and_drop/draggables.js b/common/static/js/capa/drag_and_drop/draggables.js index bb6b52a7a4..9186c0d837 100644 --- a/common/static/js/capa/drag_and_drop/draggables.js +++ b/common/static/js/capa/drag_and_drop/draggables.js @@ -20,6 +20,17 @@ define(['logme', 'update_input'], function (logme, updateInput) { } }(0)); + state.currentMovingDraggable = null; + + $(document).mousemove(function (event) { + normalizeEvent(event); + + if (state.currentMovingDraggable !== null) { + state.currentMovingDraggable.css('left', event.pageX - state.baseImageEl.offset().left - 50); + state.currentMovingDraggable.css('top', event.pageY - state.baseImageEl.offset().top - 50); + } + }); + return; function processDraggable(obj, index) { @@ -81,7 +92,7 @@ define(['logme', 'update_input'], function (logme, updateInput) { draggableContainerEl.mousedown(mouseDown); draggableContainerEl.mouseup(mouseUp); draggableContainerEl.mousemove(mouseMove); - draggableContainerEl.mouseleave(mouseLeave); + // draggableContainerEl.mouseleave(mouseLeave); if (state.individualTargets === false) { updateInput(state); @@ -91,12 +102,16 @@ define(['logme', 'update_input'], function (logme, updateInput) { function mouseDown(event) { if (mousePressed === false) { + state.currentMovingDraggable = draggableContainerEl; + normalizeEvent(event); + if (inContainer === true) { draggableContainerEl.detach(); + draggableContainerEl.css('border', 'none'); draggableContainerEl.css('position', 'absolute'); - draggableContainerEl.css('left', event.pageX - 50); - draggableContainerEl.css('top', event.pageY - 50); - draggableContainerEl.appendTo(state.containerEl); + draggableContainerEl.css('left', event.pageX - state.baseImageEl.offset().left - 50); + draggableContainerEl.css('top', event.pageY - state.baseImageEl.offset().top - 50); + draggableContainerEl.appendTo(state.baseImageEl.parent()); inContainer = false; } @@ -109,40 +124,43 @@ define(['logme', 'update_input'], function (logme, updateInput) { } } - function mouseUp() { + function mouseUp(event) { if (mousePressed === true) { - checkLandingElement(); + state.currentMovingDraggable = null; + normalizeEvent(event); + + checkLandingElement(event); } } function mouseMove() { if (mousePressed === true) { - draggableContainerEl.css('left', (event.pageX - 50)); - draggableContainerEl.css('top', (event.pageY - 50)); + draggableContainerEl.css('left', event.pageX - state.baseImageEl.offset().left - 50); + draggableContainerEl.css('top', event.pageY - state.baseImageEl.offset().top - 50); } } - function mouseLeave() { - if (mousePressed === true) { - checkLandingElement(); - } - } + // function mouseLeave(event) { + // if (mousePressed === true) { + // normalizeEvent(event); + // + // checkLandingElement(event); + // } + // } - function checkLandingElement() { - var offsetDE, offsetTE, indexes, DEindex, targetFound; + function checkLandingElement(event) { + var offsetDE, indexes, DEindex, targetFound; mousePressed = false; - offsetDE = draggableContainerEl.offset(); + offsetDE = draggableContainerEl.position(); if (state.individualTargets === false) { - offsetTE = state.targetEl.offset(); - if ( - (offsetDE.left < offsetTE.left) || - (offsetDE.left + 100 > offsetTE.left + state.targetEl.width()) || - (offsetDE.top < offsetTE.top) || - (offsetDE.top + 100 > offsetTE.top + state.targetEl.height()) + (offsetDE.left < 0) || + (offsetDE.left + 100 > state.baseImageEl.width()) || + (offsetDE.top < 0) || + (offsetDE.top + 100 > state.baseImageEl.height()) ) { moveBackToSlider(); @@ -151,8 +169,8 @@ define(['logme', 'update_input'], function (logme, updateInput) { } else { correctZIndexes(); - draggableObj.x = offsetDE.left + 50 - offsetTE.left; - draggableObj.y = offsetDE.top + 50 - offsetTE.top; + draggableObj.x = offsetDE.left + 50; + draggableObj.y = offsetDE.top + 50; } } else if (state.individualTargets === true) { targetFound = false; @@ -238,8 +256,8 @@ define(['logme', 'update_input'], function (logme, updateInput) { } function snapToTarget(target) { - draggableContainerEl.css('left', (target.offset.left + 0.5 * target.w - 50)); - draggableContainerEl.css('top', (target.offset.top + 0.5 * target.h - 50)); + draggableContainerEl.css('left', target.offset.left + 0.5 * target.w - 50); + draggableContainerEl.css('top', target.offset.top + 0.5 * target.h - 50); } function correctZIndexes() { @@ -288,10 +306,19 @@ define(['logme', 'update_input'], function (logme, updateInput) { draggableContainerEl.appendTo(state.sliderEl); inContainer = true; } + + draggableContainerEl.css('border', '1px solid gray'); } } } + function normalizeEvent(event) { + if(!event.offsetX) { + event.offsetX = (event.pageX - $(event.target).offset().left); + event.offsetY = (event.pageY - $(event.target).offset().top); + } + return event; + } } }); diff --git a/common/static/js/capa/drag_and_drop/main.js b/common/static/js/capa/drag_and_drop/main.js index 7a18eacd93..9027f55d01 100644 --- a/common/static/js/capa/drag_and_drop/main.js +++ b/common/static/js/capa/drag_and_drop/main.js @@ -32,13 +32,6 @@ define( return; } - imageDir = $(value).attr('data-course-folder'); - if (typeof imageDir !== 'string') { - logme('ERROR: Could not find the name of the image directory.'); - - return; - } - try { config = JSON.parse($('#drag_and_drop_json_' + problemId).html()); } catch (err) { @@ -48,6 +41,13 @@ define( return; } + imageDir = $(value).attr('data-course-folder'); + if (typeof imageDir !== 'string') { + logme('ERROR: Could not find the name of the image directory.'); + + return; + } + state = State(problemId); if (configParser(config, imageDir, state) !== true) { diff --git a/common/static/js/capa/drag_and_drop/scroller.js b/common/static/js/capa/drag_and_drop/scroller.js index fc11740611..6c2950e458 100644 --- a/common/static/js/capa/drag_and_drop/scroller.js +++ b/common/static/js/capa/drag_and_drop/scroller.js @@ -13,7 +13,7 @@ define(['logme'], function (logme) { parentEl = $( '
' ); - tEl.appendTo(state.targetEl.parent()); + tEl.appendTo(state.baseImageEl.parent()); state.targets.push({ 'id': obj.id, - 'offset': tEl.offset(), + 'offset': tEl.position(), 'w': obj.w, 'h': obj.h, 'el': tEl,