ANTIPALSU Label template editor using flutter

main.dart 7.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. import 'dart:math';
  2. import 'package:defer_pointer/defer_pointer.dart';
  3. import 'package:flutter/material.dart';
  4. import 'package:flutter_canvas_editor/canvas_setup_page.dart';
  5. import 'package:flutter_canvas_editor/providers/editor.dart';
  6. import 'package:flutter_canvas_editor/snaptest_page.dart';
  7. import 'package:flutter_canvas_editor/test_page.dart';
  8. import 'package:flutter_canvas_editor/widgets/elements.dart';
  9. import 'package:provider/provider.dart';
  10. import 'package:toastification/toastification.dart';
  11. import 'resizeable_element.dart';
  12. import 'widgets/toolbar.dart';
  13. void main() {
  14. runApp(MyApp());
  15. }
  16. class MyApp extends StatelessWidget {
  17. @override
  18. Widget build(BuildContext context) {
  19. return MultiProvider(
  20. providers: [
  21. ChangeNotifierProvider(create: (_) => Editor()),
  22. ChangeNotifierProvider(create: (_) => EditorTest()),
  23. ],
  24. child: ToastificationWrapper(
  25. child: MaterialApp(
  26. theme: ThemeData(
  27. textTheme: TextTheme(
  28. // bodyMedium: TextStyle(fontSize: 20)
  29. )
  30. ),
  31. home: HomePage(),
  32. ),
  33. ),
  34. );
  35. }
  36. }
  37. class HomePage extends StatefulWidget {
  38. @override
  39. State<HomePage> createState() => _HomePageState();
  40. }
  41. class _HomePageState extends State<HomePage> {
  42. double initialScale = 1;
  43. // CanvasProperty _canvasProperty = CanvasProperty(
  44. // width: 0,
  45. // height: 0,
  46. // );
  47. String? selectedElmId;
  48. bool _showResetPosition = false;
  49. @override
  50. void initState() {
  51. super.initState();
  52. WidgetsBinding.instance!.addPostFrameCallback((_) {
  53. // _canvasProperty = Provider.of<Editor>(context, listen: false).canvasProperty;
  54. setInitialZoom();
  55. });
  56. setTransformControllerListener();
  57. }
  58. @override
  59. void dispose() {
  60. Provider.of<Editor>(context, listen: false).disposeCanvasTransformationController();
  61. super.dispose();
  62. }
  63. // functions
  64. void setInitialZoom() {
  65. Provider.of<Editor>(context, listen: false).setCanvasTransformationInitialZoom(context);
  66. // double deviceWidth = MediaQuery.of(context).size.width;
  67. // double deviceHeight = MediaQuery.of(context).size.height;
  68. // print('device width: $deviceWidth');
  69. // print('device height: $deviceHeight');
  70. // initialScale = deviceWidth / Provider.of<Editor>(context, listen: false).canvasProperty.width * 0.9;
  71. // print('initialScale $initialScale');
  72. // _transformationController.value = Matrix4.identity()..scale(initialScale);
  73. }
  74. void setTransformControllerListener() {
  75. Provider.of<Editor>(context, listen: false).canvasTransformationController.addListener(() {
  76. if (!_showResetPosition && (Provider.of<Editor>(context, listen: false).canvasTransformationController.value != (Matrix4.identity()..scale(initialScale)))) {
  77. print('triggered');
  78. setState(() {
  79. _showResetPosition = true;
  80. });
  81. }
  82. });
  83. }
  84. @override
  85. Widget build(BuildContext context) {
  86. return DeferredPointerHandler(
  87. link: Provider.of<Editor>(context).textboxResizerDeferredPointerHandlerLink,
  88. child: GestureDetector(
  89. onDoubleTap: () {
  90. // print((_transformationController.value) == Matrix4.identity());
  91. // print(_transformationController.value.getMaxScaleOnAxis());
  92. },
  93. onTap: () {
  94. print('Main Gesture Detector Tapped!');
  95. setState(() {
  96. Provider.of<Editor>(context, listen: false).unSelectElm();
  97. });
  98. },
  99. // onScaleStart: (details) {
  100. // print('Scale start $details');
  101. // _previousScale = _scale;
  102. // _previousPosition = details.focalPoint;
  103. // },
  104. // onScaleUpdate: (details) {
  105. // print('Scale update $details');
  106. // setState(() {
  107. // _scale = _previousScale * details.scale;
  108. // _position += details.focalPoint - _previousPosition;
  109. // _previousPosition = details.focalPoint;
  110. // });
  111. // },
  112. // onScaleEnd: (details) {
  113. // _previousScale = 1.0;
  114. // },
  115. child: Scaffold(
  116. backgroundColor: Colors.grey,
  117. appBar: AppBar(
  118. title: Text('Template Editor'),
  119. actions: [
  120. IconButton(
  121. onPressed: () {
  122. Navigator.push(
  123. context,
  124. MaterialPageRoute(builder: (context) => CanvasSetupPage(),)
  125. );
  126. },
  127. icon: Icon(Icons.link)
  128. )
  129. ],
  130. ),
  131. body: Column(
  132. children: [
  133. Expanded(
  134. child: Stack(
  135. children: [
  136. InteractiveViewer(
  137. transformationController: Provider.of<Editor>(context).canvasTransformationController,
  138. boundaryMargin: EdgeInsets.all(double.infinity),
  139. maxScale: 4,
  140. minScale: 0.1,
  141. constrained: false,
  142. child: DeferredPointerHandler(
  143. child: Center(
  144. child: Container(
  145. margin: EdgeInsets.all(16),
  146. color: Colors.white,
  147. height: Provider.of<Editor>(context).canvasProperty.height,
  148. width: Provider.of<Editor>(context).canvasProperty.width,
  149. child: Stack(
  150. children: [
  151. for (ElementProperty elementProperty in Provider.of<Editor>(context).elementProperties) ... [
  152. ElementWidget(
  153. elementProperty: elementProperty,
  154. canvasProperty: Provider.of<Editor>(context).canvasProperty,
  155. globalKey: elementProperty.elementKey,
  156. )
  157. ]
  158. ],
  159. ),
  160. ),
  161. ),
  162. ),
  163. ),
  164. if (_showResetPosition) Positioned(
  165. bottom: 16,
  166. right: 16,
  167. child: IconButton.filled(
  168. tooltip: 'Reset Position',
  169. onPressed: () {
  170. Provider.of<Editor>(context, listen: false).resetCanvasTransformationScale();
  171. _showResetPosition = false;
  172. setState(() {});
  173. },
  174. icon: Icon(Icons.center_focus_strong),
  175. color: Colors.white,
  176. ),
  177. )
  178. ],
  179. ),
  180. ),
  181. // Toolbar
  182. ToolbarWidget()
  183. ],
  184. ),
  185. ),
  186. ),
  187. );
  188. }
  189. }
  190. class CanvasProperty {
  191. double width;
  192. double height;
  193. CanvasProperty({
  194. required this.width,
  195. required this.height,
  196. });
  197. }