ANTIPALSU Label template editor using flutter

snaptest_page.dart 3.3KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import 'package:flutter/material.dart';
  2. class SnapToGridCanvas extends StatefulWidget {
  3. @override
  4. _SnapToGridCanvasState createState() => _SnapToGridCanvasState();
  5. }
  6. class _SnapToGridCanvasState extends State<SnapToGridCanvas> {
  7. final double snappingThreshold = 10.0;
  8. final List<Rect> elements = []; // Store elements' bounds
  9. Offset selectedElementPosition = Offset(100, 100);
  10. Size selectedElementSize = Size(100, 100);
  11. Offset? snapToElementOrCanvas(Offset newPosition, Size canvasSize) {
  12. for (var element in elements) {
  13. // Snap to other elements
  14. if ((newPosition.dx - element.right).abs() <= snappingThreshold) {
  15. return Offset(element.right, newPosition.dy); // Snap to the right of another element
  16. } else if ((newPosition.dx - element.left).abs() <= snappingThreshold) {
  17. return Offset(element.left, newPosition.dy); // Snap to the left of another element
  18. } else if ((newPosition.dy - element.bottom).abs() <= snappingThreshold) {
  19. return Offset(newPosition.dx, element.bottom); // Snap to the bottom of another element
  20. } else if ((newPosition.dy - element.top).abs() <= snappingThreshold) {
  21. return Offset(newPosition.dx, element.top); // Snap to the top of another element
  22. }
  23. }
  24. // Snap to canvas center
  25. final canvasCenter = Offset(canvasSize.width / 2, canvasSize.height / 2);
  26. if ((newPosition.dx - canvasCenter.dx).abs() <= snappingThreshold) {
  27. return Offset(canvasCenter.dx, newPosition.dy); // Snap horizontally to canvas center
  28. } else if ((newPosition.dy - canvasCenter.dy).abs() <= snappingThreshold) {
  29. return Offset(newPosition.dx, canvasCenter.dy); // Snap vertically to canvas center
  30. }
  31. return null; // No snapping
  32. }
  33. @override
  34. Widget build(BuildContext context) {
  35. final canvasSize = MediaQuery.of(context).size;
  36. return Scaffold(
  37. appBar: AppBar(title: Text("Snap to Grid Canvas")),
  38. body: GestureDetector(
  39. onPanUpdate: (details) {
  40. setState(() {
  41. final newPosition = selectedElementPosition + details.delta;
  42. // Check for snapping
  43. final snappedPosition = snapToElementOrCanvas(newPosition, canvasSize);
  44. if (snappedPosition != null) {
  45. selectedElementPosition = snappedPosition;
  46. } else {
  47. selectedElementPosition = newPosition;
  48. }
  49. });
  50. },
  51. child: Stack(
  52. children: [
  53. // Canvas background
  54. Container(color: Colors.grey[200]),
  55. // Render all elements
  56. ...elements.map((element) {
  57. return Positioned(
  58. left: element.left,
  59. top: element.top,
  60. child: Container(
  61. width: element.width,
  62. height: element.height,
  63. color: Colors.blue,
  64. ),
  65. );
  66. }).toList(),
  67. // Selected element
  68. Positioned(
  69. left: selectedElementPosition.dx,
  70. top: selectedElementPosition.dy,
  71. child: Container(
  72. width: selectedElementSize.width,
  73. height: selectedElementSize.height,
  74. color: Colors.red,
  75. child: Center(child: Text("Drag Me")),
  76. ),
  77. ),
  78. ],
  79. ),
  80. ),
  81. );
  82. }
  83. }