source: gs3-extensions/tabletop-dl/trunk/tabletop-interact.js@ 37538

Last change on this file since 37538 was 37538, checked in by davidb, 14 months ago

'Development of winbox combined with interact.js to the point where basic rotation and zooming is working

File size: 6.6 KB
RevLine 
[37463]1
[37538]2function 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]17function 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
42function 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
99function 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});
Note: See TracBrowser for help on using the repository browser.