|
@@ -255,12 +255,15 @@ class _ElementWidgetState extends State<ElementWidget> {
|
255
|
255
|
_elementDragStartPosition = Provider.of<Editor>(context, listen: false).getClonedElementPosition(element);
|
256
|
256
|
},
|
257
|
257
|
onPanUpdate: (details) {
|
|
258
|
+ // return if moved element is not selected
|
258
|
259
|
if (!Provider.of<Editor>(context, listen: false).isSelected(element.id)) {
|
259
|
260
|
return;
|
260
|
261
|
}
|
261
|
|
-
|
|
262
|
+
|
|
263
|
+ // return if element is locked
|
262
|
264
|
if (element.isLocked) return;
|
263
|
265
|
|
|
266
|
+
|
264
|
267
|
final elmKeyContext = Provider.of<Editor>(context, listen: false).selectedElmKey?.currentContext;
|
265
|
268
|
|
266
|
269
|
if (elmKeyContext == null) {
|
|
@@ -278,7 +281,42 @@ class _ElementWidgetState extends State<ElementWidget> {
|
278
|
281
|
|
279
|
282
|
bool isElmWidthExceedCanvas = width > canvas.width;
|
280
|
283
|
bool isElmHeightExceedCanvas = height > canvas.height;
|
281
|
|
-
|
|
284
|
+
|
|
285
|
+ // ! todo: lanjut fix magnet
|
|
286
|
+ // * alignment test
|
|
287
|
+ double alignmentTreshold = 5;
|
|
288
|
+ log('The center offset of this canvas is ${canvas.getCanvasCenterPoint().dx}, ${canvas.getCanvasCenterPoint().dy}');
|
|
289
|
+ log('The center offset of this element is ${width / 2}, ${height/2}');
|
|
290
|
+ // log('delta ${details.delta.dx}, ${details.delta.dy}');
|
|
291
|
+ log('delta distance ${details.delta.distanceSquared}');
|
|
292
|
+
|
|
293
|
+ final selectedElm = Provider.of<Editor>(context, listen: false).selectedElm;
|
|
294
|
+ final elementCenter = Offset(selectedElm!.position.left + (width / 2), selectedElm!.position.top + (height / 2));
|
|
295
|
+ bool shouldAborUpdate = false;
|
|
296
|
+
|
|
297
|
+ final canvasCenter = canvas.getCanvasCenterPoint();
|
|
298
|
+ if (details.delta.distance < 2) {
|
|
299
|
+ if ((canvasCenter.dx - elementCenter.dx).abs() < alignmentTreshold) {
|
|
300
|
+ shouldAborUpdate = true;
|
|
301
|
+ Provider.of<Editor>(context, listen: false).updateElmPosition(details.delta, fixedLeft: canvasCenter.dx - (width / 2));
|
|
302
|
+ Provider.of<Editor>(context, listen: false).updateShouldShowHorizontalCenterLine(true);
|
|
303
|
+ // return;
|
|
304
|
+ }
|
|
305
|
+ } else {
|
|
306
|
+ Provider.of<Editor>(context, listen: false).updateShouldShowHorizontalCenterLine(false);
|
|
307
|
+ }
|
|
308
|
+
|
|
309
|
+ if (details.delta.distance < 2) {
|
|
310
|
+ if ((canvasCenter.dy - elementCenter.dy).abs() < alignmentTreshold) {
|
|
311
|
+ shouldAborUpdate = true;
|
|
312
|
+ Provider.of<Editor>(context, listen: false).updateElmPosition(details.delta, fixedTop: canvasCenter.dy - (height / 2));
|
|
313
|
+ Provider.of<Editor>(context, listen: false).updateShouldShowVerticalCenterLine(true);
|
|
314
|
+ }
|
|
315
|
+ } else {
|
|
316
|
+ Provider.of<Editor>(context, listen: false).updateShouldShowVerticalCenterLine(false);
|
|
317
|
+ }
|
|
318
|
+
|
|
319
|
+
|
282
|
320
|
// Check if the object is out of the canvas
|
283
|
321
|
// ? top side
|
284
|
322
|
if (element.position.top < 0) {
|
|
@@ -322,7 +360,9 @@ class _ElementWidgetState extends State<ElementWidget> {
|
322
|
360
|
log('Adjusting right position, if isElmHeightExceedCanvas');
|
323
|
361
|
return;
|
324
|
362
|
}
|
325
|
|
-
|
|
363
|
+
|
|
364
|
+ if (shouldAborUpdate) return;
|
|
365
|
+
|
326
|
366
|
Provider.of<Editor>(context, listen: false).updateElmPosition(details.delta);
|
327
|
367
|
},
|
328
|
368
|
onPanEnd: (details) {
|
|
@@ -379,6 +419,10 @@ class _ElementWidgetState extends State<ElementWidget> {
|
379
|
419
|
Provider.of<Editor>(context, listen: false).moveElement(
|
380
|
420
|
Offset(adjustedElementPosition.left - element.position.left, adjustedElementPosition.top - element.position.top)
|
381
|
421
|
);
|
|
422
|
+
|
|
423
|
+ // reset canvas alignment helper
|
|
424
|
+ Provider.of<Editor>(context, listen: false).updateShouldShowHorizontalCenterLine(false);
|
|
425
|
+ Provider.of<Editor>(context, listen: false).updateShouldShowVerticalCenterLine(false);
|
382
|
426
|
},
|
383
|
427
|
child: Stack(
|
384
|
428
|
clipBehavior: Clip.none,
|