Reputation: 731
I want to allow user to drag icons from one div container and drop and draw them on canvas keeping the original icon intact. The icons are added dynamically on table. I also want to give effect of icon dragging with cursor when i drag the icon.When i use " helper: 'clone'" property i get the effect but the dropped position is incorrect and when i remove this property the original icon is removed.
My parent container for icons
<div id="dvEquipmentTool" style="removed: absolute; border: 1px solid rgb(173, 201, 247);
display: block; background-color: white; height: 400px; z-index: 50000; padding: 3px;
removed 100px; removed 50px; width: 200px !important;" class="ui-draggable">
<table id="tbEquipmentTool" border="0" style="background-color: White; padding-left: 10px;
max-height: 400px !important;">
<tbody>
<tr id="tRow1">
<td>
<img src="" id="imgEquipIcon1" class="ui-draggable" style="position: relative; left: 473px;
top: 183px;">
</td>
<td>
<span id="lblImgEquipName1" class="label">10-FL-105-A20</span><span id="lblImgEquipID1"
class="label" style="display: none;">100200</span>
</td>
<td width="10px">
</td>
</tr>
<tr id="tRow2">
<td>
<img src="" id="imgEquipIcon2" class="ui-draggable" style="position: relative;">
</td>
<td>
<span id="lblImgEquipName2" class="label">10-FL-3111-A20</span><span id="lblImgEquipID2"
class="label" style="display: none;">100199</span>
</td>
<td width="10px">
</td>
</tr>
</tbody>
</table>
</div>
Javascript function to make images draggable
$("img[id^=imgEquipIcon]").each(function () {
$(this).draggable({ containment: "#dvContainer", scroll: false,//helper: 'clone',
stop: function (event, ui) {
var stoppos = $(this).position();
alert(stoppos.left+","+ stoppos.top);
var img = new Image();
img.src = this.src;
createEquipIcon(img, stoppos.left, stoppos.top);
}
});
});
function createEquipIcon(img, X, Y) {
var dv = document.createElement('div');
$(dv).css('top', Y);
$(dv).css('left', X);
$(dv).css('cursor', 'move');
$(dv).css('position', 'absolute');
$(dv).css('background-color', 'red');
dv.appendChild(img);
var index = img.id.replace('imgEquipIcon', '');
var container = document.getElementById('dvContainer');
container.appendChild(dv);
//code for drawing on canvas goes here
}
Canvas for drawing images
<div id="dvContainer" runat="server" style="overflow: visible; background-repeat: no-repeat">
<canvas id="myCanvas" width="1000px" height="600px">
<b> *Your browser doesn't support canvas. Please switch to different browser.</b>
</canvas>
Upvotes: 2
Views: 3402
Reputation: 105035
Demo: http://jsfiddle.net/m1erickson/cyur7/
Before drag and after drag:
Make an html toolbar
Html toolbar-div with tool-imgs:
<div id="toolbar">
<img class="tool" width=32 height=32 src="equipment1.jpg">
<img class="tool" width=32 height=32 src="equipment1.jpg">
<img class="tool" width=32 height=32 src="equipment1.jpg">
</div>
Make all .tools draggable with jQuery
Make all .tools draggable:
// select all .tool's
var $tools=$(".tool");
// make all .tool's draggable
$tools.draggable({ helper:'clone' });
// assign each .tool its index in $tools
$tools.each(function(index,element){
$(this).data("toolsIndex",index);
});
Make the canvas a drop target:
// make the canvas a dropzone
$canvas.droppable({
drop:dragDrop,
});
When dropped, draw the img on the canvas
Drop handler
// handle a drop into the canvas
function dragDrop(e,ui){
// get the drop point (be sure to adjust for border)
var x=parseInt(ui.offset.left-offsetX)-1;
var y=parseInt(ui.offset.top-offsetY);
// get the drop payload (here the payload is the $tools index)
var theIndex=ui.draggable.data("toolsIndex");
// drawImage at the drop point using the dropped image
ctx.drawImage($tools[theIndex],x,y,32,32);
}
Upvotes: 6