[37463] | 1 |
|
---|
[37538] | 2 | function dragMoveListener(event)
|
---|
| 3 | {
|
---|
[37463] | 4 | var target = event.target
|
---|
| 5 | // keep the dragged position in the data-x/data-y attributes
|
---|
| 6 | var x = (parseFloat(target.getAttribute('data-x')) || 0) + event.dx
|
---|
| 7 | var y = (parseFloat(target.getAttribute('data-y')) || 0) + event.dy
|
---|
| 8 |
|
---|
| 9 | // translate the element
|
---|
| 10 | target.style.transform = 'translate(' + x + 'px, ' + y + 'px)'
|
---|
| 11 |
|
---|
| 12 | // update the posiion attributes
|
---|
| 13 | target.setAttribute('data-x', x)
|
---|
| 14 | target.setAttribute('data-y', y)
|
---|
| 15 | }
|
---|
| 16 |
|
---|
[37538] | 17 | function getCoreDraggableOptions()
|
---|
| 18 | {
|
---|
| 19 | let core_draggable_options = {
|
---|
[37463] | 20 |
|
---|
[37538] | 21 | listeners: { move: dragMoveListener },
|
---|
[37463] | 22 |
|
---|
[37538] | 23 | modifiers: [
|
---|
| 24 | interact.modifiers.restrictRect({
|
---|
| 25 | restriction: 'parent',
|
---|
| 26 | endOnly: true
|
---|
| 27 | })
|
---|
| 28 | ],
|
---|
| 29 |
|
---|
| 30 | inertia: {
|
---|
| 31 | resistance: 6,
|
---|
| 32 | //minSpeed: 20,
|
---|
| 33 | //endSpeed: 10,
|
---|
| 34 | smoothEndDuration: 500,
|
---|
| 35 | allowResume: true
|
---|
| 36 | }
|
---|
| 37 | };
|
---|
| 38 |
|
---|
| 39 | return core_draggable_options;
|
---|
| 40 | }
|
---|
| 41 |
|
---|
| 42 | function getCoreResizableOptions()
|
---|
| 43 | {
|
---|
| 44 | let core_resizable_options = {
|
---|
| 45 |
|
---|
| 46 | edges: { left: true, right: true, bottom: true, top: true },
|
---|
[37464] | 47 |
|
---|
[37538] | 48 | listeners: {
|
---|
| 49 | move (event) {
|
---|
| 50 | var target = event.target
|
---|
| 51 | var x = (parseFloat(target.getAttribute('data-x')) || 0)
|
---|
| 52 | var y = (parseFloat(target.getAttribute('data-y')) || 0)
|
---|
[37464] | 53 |
|
---|
[37538] | 54 | // update the element's style
|
---|
| 55 | target.style.width = event.rect.width + 'px'
|
---|
| 56 | target.style.height = event.rect.height + 'px'
|
---|
| 57 |
|
---|
| 58 | // translate when resizing from top or left edges
|
---|
| 59 | x += event.deltaRect.left
|
---|
| 60 | y += event.deltaRect.top
|
---|
| 61 |
|
---|
| 62 | target.style.transform = 'translate(' + x + 'px,' + y + 'px)'
|
---|
| 63 |
|
---|
| 64 | target.setAttribute('data-x', x)
|
---|
| 65 | target.setAttribute('data-y', y)
|
---|
| 66 |
|
---|
| 67 | // var textEl = $(event.target).find('.interact-info-bar')[0];
|
---|
| 68 | // textEl.textContent = "Resized to: " + Math.round(event.rect.width) + '\u00D7' + Math.round(event.rect.height) + " pixels"
|
---|
[37464] | 69 | }
|
---|
[37538] | 70 | },
|
---|
| 71 |
|
---|
| 72 | modifiers: [
|
---|
| 73 | // keep the edges inside the parent
|
---|
| 74 | interact.modifiers.restrictEdges({
|
---|
| 75 | outer: 'parent'
|
---|
| 76 | }),
|
---|
[37464] | 77 |
|
---|
[37538] | 78 | // minimum size
|
---|
| 79 | interact.modifiers.restrictSize({
|
---|
| 80 | min: { width: 100, height: 50 }
|
---|
| 81 | })
|
---|
| 82 | ],
|
---|
| 83 |
|
---|
| 84 |
|
---|
| 85 | inertia: {
|
---|
| 86 | resistance: 6,
|
---|
| 87 | //minSpeed: 20,
|
---|
| 88 | //endSpeed: 10,
|
---|
| 89 | smoothEndDuration: 500,
|
---|
| 90 | allowResume: true
|
---|
| 91 | }
|
---|
| 92 | };
|
---|
[37467] | 93 |
|
---|
[37538] | 94 | return core_resizable_options;
|
---|
| 95 |
|
---|
| 96 | }
|
---|
| 97 |
|
---|
| 98 |
|
---|
| 99 | function getCoreGesturableOptions(elem,angleScale)
|
---|
| 100 | {
|
---|
| 101 | let core_gesturable_options = {
|
---|
| 102 |
|
---|
| 103 | listeners: {
|
---|
| 104 | start (event) {
|
---|
| 105 | angleScale.angle -= event.angle;
|
---|
[37464] | 106 | },
|
---|
[37538] | 107 | move (event) {
|
---|
| 108 | let currentAngle = event.angle + angleScale.angle;
|
---|
| 109 | let currentScale = event.scale * angleScale.scale;
|
---|
[37464] | 110 |
|
---|
[37538] | 111 | let scale_elem = $(elem).find('.scale-element')[0];
|
---|
| 112 |
|
---|
| 113 | scale_elem.style.transform =
|
---|
| 114 | 'rotate(' + currentAngle + 'deg)' + 'scale(' + currentScale + ')';
|
---|
| 115 |
|
---|
| 116 | dragMoveListener(event);
|
---|
| 117 | },
|
---|
| 118 | end (event) {
|
---|
| 119 | angleScale.angle = angleScale.angle + event.angle;
|
---|
| 120 | angleScale.scale = angleScale.scale * event.scale;
|
---|
| 121 | }
|
---|
| 122 | }
|
---|
| 123 | };
|
---|
[37463] | 124 |
|
---|
[37538] | 125 | return core_gesturable_options;
|
---|
| 126 | }
|
---|
| 127 |
|
---|
| 128 |
|
---|
| 129 |
|
---|
| 130 | $(document).ready(function() {
|
---|
[37463] | 131 |
|
---|
[37538] | 132 | let draggable_options = getCoreDraggableOptions();
|
---|
| 133 | let resizable_options = getCoreResizableOptions();
|
---|
| 134 |
|
---|
| 135 | draggable_options.autoScroll =true;
|
---|
| 136 |
|
---|
| 137 | interact('.resize-drag')
|
---|
| 138 | .draggable(draggable_options)
|
---|
| 139 | .resizable(resizable_options)
|
---|
[37463] | 140 |
|
---|
[37538] | 141 | // still needed??
|
---|
| 142 | //window.dragMoveListener = dragMoveListener
|
---|
[37463] | 143 |
|
---|
| 144 |
|
---|
[37466] | 145 | var $drag_and_zoom_elems = $('.drag-and-zoom');
|
---|
[37463] | 146 |
|
---|
[37466] | 147 | $drag_and_zoom_elems.each(function(index) {
|
---|
[37463] | 148 |
|
---|
[37466] | 149 | let this_elem = this;
|
---|
[37538] | 150 |
|
---|
| 151 | /*
|
---|
| 152 | let draggable_options = getCoreDraggableOptions();
|
---|
[37466] | 153 | let angleScale = {
|
---|
| 154 | angle: 0,
|
---|
| 155 | scale: 1
|
---|
| 156 | }
|
---|
[37463] | 157 |
|
---|
[37538] | 158 | */
|
---|
| 159 |
|
---|
| 160 | let this_angle_scale = {
|
---|
| 161 | angle: 0,
|
---|
| 162 | scale: 1
|
---|
| 163 | }
|
---|
[37463] | 164 |
|
---|
[37466] | 165 |
|
---|
[37538] | 166 | let gdraggable_options = getCoreDraggableOptions();
|
---|
| 167 | let gesturable_options = getCoreGesturableOptions(this_elem,this_angle_scale);
|
---|
| 168 |
|
---|
[37466] | 169 | interact(this_elem)
|
---|
[37538] | 170 | .gesturable(gesturable_options)
|
---|
| 171 | .draggable(gdraggable_options);
|
---|
| 172 |
|
---|
| 173 | /*
|
---|
| 174 | interact(this_elem)
|
---|
[37466] | 175 | .gesturable({
|
---|
| 176 | listeners: {
|
---|
| 177 | start (event) {
|
---|
[37538] | 178 | angleScale.angle -= event.angle
|
---|
[37466] | 179 | },
|
---|
| 180 | move (event) {
|
---|
| 181 | let currentAngle = event.angle + angleScale.angle
|
---|
| 182 | let currentScale = event.scale * angleScale.scale
|
---|
[37538] | 183 |
|
---|
[37466] | 184 | let this_scale_elem = $(this_elem).find('.scale-element')[0];
|
---|
| 185 |
|
---|
| 186 | this_scale_elem.style.transform =
|
---|
| 187 | 'rotate(' + currentAngle + 'deg)' + 'scale(' + currentScale + ')'
|
---|
| 188 |
|
---|
| 189 | dragMoveListener(event)
|
---|
| 190 | },
|
---|
| 191 | end (event) {
|
---|
| 192 | angleScale.angle = angleScale.angle + event.angle
|
---|
[37538] | 193 | angleScale.scale = angleScale.scale * event.scale
|
---|
[37466] | 194 | }
|
---|
[37464] | 195 | }
|
---|
[37466] | 196 | })
|
---|
[37538] | 197 | .draggable(draggable_options)
|
---|
| 198 |
|
---|
| 199 | */
|
---|
| 200 |
|
---|
| 201 | });
|
---|
| 202 | });
|
---|
| 203 |
|
---|
| 204 |
|
---|
| 205 | $(document).ready(function() {
|
---|
| 206 |
|
---|
| 207 | const win1 = new WinBox({
|
---|
| 208 | id: "my-winbox1",
|
---|
| 209 | title: 'Winbox + Interact Example 1',
|
---|
| 210 | x: 200,
|
---|
| 211 | y: 200,
|
---|
| 212 | width: '400px',
|
---|
| 213 | height: '400px',
|
---|
| 214 | border: "0.3em",
|
---|
| 215 | background: "#29e",
|
---|
| 216 | html: "<p style=\"padding: 8px; color: #000;\">This window can be dragged around and resized</p>"
|
---|
| 217 | });
|
---|
| 218 |
|
---|
| 219 | let draggable_options = getCoreDraggableOptions();
|
---|
| 220 | let resizable_options = getCoreResizableOptions();
|
---|
| 221 |
|
---|
| 222 | draggable_options.autoScroll = true;
|
---|
[37467] | 223 |
|
---|
[37538] | 224 | interact('#my-winbox1')
|
---|
| 225 | .draggable(draggable_options)
|
---|
| 226 | .resizable(resizable_options);
|
---|
[37467] | 227 |
|
---|
| 228 |
|
---|
[37538] | 229 |
|
---|
| 230 | const win2 = new WinBox({
|
---|
| 231 | id: "my-winbox2",
|
---|
| 232 | title: 'Winbox + Interact Example 2',
|
---|
| 233 | x: 800,
|
---|
| 234 | y: 200,
|
---|
| 235 | width: '500px',
|
---|
| 236 | height: '300px',
|
---|
| 237 | border: "0.3em",
|
---|
| 238 | background: "#29e",
|
---|
| 239 | html: "<p class=\"scale-element\" style=\"padding: 8px; color: #000;\">This window can be dragged around, rotated and zoomed in and out</p>"
|
---|
| 240 | });
|
---|
| 241 |
|
---|
| 242 | /*
|
---|
| 243 | interact('#my-winbox2')
|
---|
| 244 | .draggable(draggable_options)
|
---|
| 245 | .resizable(resizable_options);
|
---|
| 246 | */
|
---|
| 247 |
|
---|
| 248 | let this_elem = document.getElementById('my-winbox2');
|
---|
| 249 |
|
---|
| 250 | let this_angle_scale = {
|
---|
| 251 | angle: 0,
|
---|
| 252 | scale: 1
|
---|
| 253 | }
|
---|
| 254 |
|
---|
| 255 |
|
---|
| 256 | let gdraggable_options = getCoreDraggableOptions();
|
---|
| 257 | let gesturable_options = getCoreGesturableOptions(this_elem,this_angle_scale);
|
---|
| 258 |
|
---|
| 259 | interact('#my-winbox2')
|
---|
| 260 | .gesturable(gesturable_options)
|
---|
| 261 | .draggable(gdraggable_options);
|
---|
| 262 |
|
---|
| 263 |
|
---|
| 264 | /*
|
---|
| 265 | interact('#my-winbox')
|
---|
[37467] | 266 | .draggable({
|
---|
| 267 | // enable inertial throwing
|
---|
| 268 | inertia: true,
|
---|
| 269 | // keep the element within the area of it's parent
|
---|
| 270 | modifiers: [
|
---|
| 271 | interact.modifiers.restrictRect({
|
---|
| 272 | restriction: 'parent',
|
---|
| 273 | endOnly: true
|
---|
| 274 | })
|
---|
| 275 | ],
|
---|
| 276 | // enable autoScroll
|
---|
| 277 | autoScroll: true,
|
---|
| 278 |
|
---|
| 279 | listeners: {
|
---|
| 280 | // call this function on every dragmove event
|
---|
| 281 | move: dragMoveListener,
|
---|
| 282 |
|
---|
| 283 | // call this function on every dragend event
|
---|
| 284 | end (event) {
|
---|
| 285 | var textEl = event.target.querySelector('p')
|
---|
| 286 |
|
---|
| 287 | textEl && (textEl.textContent =
|
---|
| 288 | 'moved a distance of ' +
|
---|
| 289 | (Math.sqrt(Math.pow(event.pageX - event.x0, 2) +
|
---|
| 290 | Math.pow(event.pageY - event.y0, 2) | 0))
|
---|
| 291 | .toFixed(2) + 'px')
|
---|
| 292 | }
|
---|
| 293 | }
|
---|
[37538] | 294 | });
|
---|
| 295 | */
|
---|
[37467] | 296 |
|
---|
[37463] | 297 | });
|
---|