ANTIPALSU Label template editor using flutter

main.dart 6.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  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: Scaffold(
  89. backgroundColor: Colors.grey,
  90. appBar: AppBar(
  91. title: Text('Template Editor'),
  92. actions: [
  93. // ! DEBUG BUTTON
  94. IconButton(
  95. onPressed: () {
  96. Provider.of<Editor>(context, listen: false).buildJSON();
  97. },
  98. icon: Icon(Icons.bug_report_outlined)
  99. ),
  100. IconButton(
  101. onPressed: () {
  102. Navigator.push(
  103. context,
  104. MaterialPageRoute(builder: (context) => CanvasSetupPage(),)
  105. );
  106. },
  107. icon: Icon(Icons.link)
  108. )
  109. ],
  110. ),
  111. body: Column(
  112. children: [
  113. Expanded(
  114. child: GestureDetector(
  115. onTap: () {
  116. print('Main Gesture Detector Tapped!');
  117. setState(() {
  118. Provider.of<Editor>(context, listen: false).unSelectElm();
  119. });
  120. },
  121. child: Stack(
  122. children: [
  123. InteractiveViewer(
  124. transformationController: Provider.of<Editor>(context).canvasTransformationController,
  125. boundaryMargin: EdgeInsets.all(double.infinity),
  126. maxScale: 4,
  127. minScale: 0.1,
  128. constrained: false,
  129. child: DeferredPointerHandler(
  130. child: Center(
  131. child: Container(
  132. margin: EdgeInsets.all(16),
  133. color: Colors.white,
  134. height: Provider.of<Editor>(context).canvasProperty.height,
  135. width: Provider.of<Editor>(context).canvasProperty.width,
  136. child: Stack(
  137. children: [
  138. for (ElementProperty elementProperty in Provider.of<Editor>(context).elementProperties) ... [
  139. ElementWidget(
  140. elementProperty: elementProperty,
  141. canvasProperty: Provider.of<Editor>(context).canvasProperty,
  142. globalKey: elementProperty.elementKey,
  143. )
  144. ]
  145. ],
  146. ),
  147. ),
  148. ),
  149. ),
  150. ),
  151. if (_showResetPosition) Positioned(
  152. bottom: 16,
  153. right: 16,
  154. child: IconButton.filled(
  155. tooltip: 'Reset Position',
  156. onPressed: () {
  157. Provider.of<Editor>(context, listen: false).resetCanvasTransformationScale();
  158. _showResetPosition = false;
  159. setState(() {});
  160. },
  161. icon: Icon(Icons.center_focus_strong),
  162. color: Colors.white,
  163. ),
  164. )
  165. ],
  166. ),
  167. ),
  168. ),
  169. // Toolbar
  170. ToolbarWidget()
  171. ],
  172. ),
  173. ),
  174. );
  175. }
  176. }
  177. class CanvasProperty {
  178. double width;
  179. double height;
  180. CanvasProperty({
  181. required this.width,
  182. required this.height,
  183. });
  184. }