ANTIPALSU Label template editor using flutter

main.dart 6.7KB

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