1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021 |
- import 'dart:convert';
- import 'dart:developer';
- import 'package:defer_pointer/defer_pointer.dart';
- import 'package:flutter/material.dart';
- import 'package:flutter_canvas_editor/history.dart';
- import 'package:flutter_canvas_editor/style/canvas_style.dart';
- import 'package:flutter_canvas_editor/widgets/elements.dart';
- import 'package:toastification/toastification.dart';
- import 'package:uuid/uuid.dart';
- import 'package:collection/collection.dart';
- import '../main.dart';
- var uuid = Uuid();
- class Editor extends ChangeNotifier {
- String editorVersion = '0.1m';
- String? selectedElmId;
-
- bool isEditing = false;
- final textboxResizerDeferredPointerHandlerLink = DeferredPointerHandlerLink();
- String? valueOnStartEditing;
- // ? Canvas State
- double canvasScale = 1.0;
- final CanvasProperty canvasProperty = CanvasProperty(
- width: 780,
- height: 1000,
- );
- TransformationController canvasTransformationController = TransformationController();
- void setCanvasTransformationInitialZoom(BuildContext context) {
- final deviceWidth = MediaQuery.of(context).size.width;
- canvasScale = deviceWidth / canvasProperty.width * 0.9;
- canvasTransformationController.value = Matrix4.identity()..scale(canvasScale);
- }
- void resetCanvasTransformationScale() {
- print('canvas scale $canvasScale');
- canvasTransformationController.value = Matrix4.identity()..scale(canvasScale);
- }
- void disposeCanvasTransformationController() {
- canvasTransformationController.dispose();
- }
- // List<ElementProperty> elementProperties = [
- // ElementProperty(
- // id: uuid.v4(),
- // valueController: TextEditingController(text: '{{QRCODE}}'),
- // type: ElementType.qr,
- // position: ElementPosition(top: 0, left: 0),
- // width: 80,
- // quarterTurns: 0,
- // elementKey: GlobalKey(),
- // qrScale: 3
- // )
- // ];
- // This list store all changes history, and currentCanvasState (stackState.last)
- List<List<ElementState>> stateStack = [
- // ? default state
- [
- ElementState(
- id: uuid.v4(),
- valueController: TextEditingController(text: '{{QRCODE}}'),
- type: ElementType.qr,
- position: ElementPosition(top: 0, left: 0),
- width: 80,
- quarterTurns: 0,
- elementKey: GlobalKey(),
- qrScale: 3
- )
- ]
- ];
- // current canvas state
- List<ElementState> get currentElementsState => stateStack.last;
- // ? History stack
- // List<CanvasHistory> undoStack = [];
- List<List<ElementState>> redoStack = [];
- void setNewElementsState(List<ElementState> newElementsState) {
- _setNewStateTextEdit(newElementsState);
- stateStack.add(newElementsState);
- redoStack.clear();
- notifyListeners();
- }
- void undo() {
- addRedoEntry(stateStack.last);
- // apply to current state
- // if (undoStack.last.type == CanvasHistoryModifyType.textEdit && undoStack.last.getState != elementProperties) {
- // undoStack.removeLast();
- // }
- // elementProperties = undoStack.last.getState;
- stateStack.removeLast();
- // unselect element
- if (currentElementsState.firstWhereOrNull((e) => e.id == selectedElmId) == null) {
- unSelectElm();
- }
- notifyListeners();
- }
- void addRedoEntry(List<ElementState> elementProperties) {
- redoStack.add(_cloneElementsState(elementProperties));
- notifyListeners();
- }
- void redo() {
- // undoStack.add(CanvasHistory(CanvasHistoryModifyType.redo, _cloneCurrentState(elementProperties)));
- stateStack.add(_cloneElementsState(redoStack.last));
-
- // apply to current state
- // elementProperties = redoStack.last;
- redoStack.removeLast();
- notifyListeners();
- }
- List<ElementState> _cloneElementsState(List<ElementState> elementProperties) {
- List<ElementState> clonedElementProperties = elementProperties.map((elementProperty) {
- return ElementState(
- id: elementProperty.id,
- valueController: TextEditingController(text: elementProperty.valueController.text),
- type: elementProperty.type,
- position: ElementPosition(top: elementProperty.position.top, left: elementProperty.position.left),
- width: elementProperty.width,
- quarterTurns: elementProperty.quarterTurns,
- elementKey: elementProperty.elementKey,
- qrScale: elementProperty.qrScale,
- fontScale: elementProperty.fontScale,
- variableType: elementProperty.variableType,
- isLocked: elementProperty.isLocked
- );
- }).toList();
- return clonedElementProperties;
- }
- // ? udpate canvas
- void updateCanvasProperty(BuildContext context, double width, double height) {
- canvasProperty.height = height;
- canvasProperty.width = width;
-
- // undoStack.clear();
- stateStack = [currentElementsState];
- redoStack.clear();
- _adjustOutOfBoundElement();
- setCanvasTransformationInitialZoom(context);
- notifyListeners();
- }
- void _adjustOutOfBoundElement() {
- for (var element in currentElementsState) {
- bool isOutOfBoundFromTop = (element.position.top + 10) > canvasProperty.height;
- bool isOutOfBoundFromLeft = (element.position.left + 10) > canvasProperty.width;
- // if (isOutOfBoundFromTop | isOutOfBoundFromLeft) {
- // element.position.top = 0;
- // element.position.left = 0;
- // }
- if (isOutOfBoundFromTop) {
- element.position.top = canvasProperty.height - (element.elementKey.currentContext?.size?.height ?? 0);
- }
- if (isOutOfBoundFromLeft) {
- element.position.left = canvasProperty.width - (element.elementKey.currentContext?.size?.width ?? 0);
- }
-
- }
- }
- // ? Primitive Element
- void addTextElement(){
- String id = uuid.v4();
- ElementState newElement = ElementState(
- id: id,
- valueController: TextEditingController(text: 'Double tap to edit text'),
- type: ElementType.text,
- position: ElementPosition(top: 0, left: 0),
- // size: ElementSize(width: 20, height: 70),
- width: 20,
- elementKey: GlobalKey(),
- quarterTurns: 0
- );
- // Set State
- // List<ElementState> newElementsState = [..._cloneElementsState(currentElementsState), newElement];
- // setNewElementsState(newElementsState);
- _setAddNewElementState(newElement);
- notifyListeners();
- selectElmById(id);
- }
- void addTextboxElement() {
- String id = uuid.v4();
- ElementState newElement = ElementState(
- id: id,
- valueController: TextEditingController(text: 'Double tap to edit text'),
- type: ElementType.textbox,
- position: ElementPosition(top: 0, left: 0),
- width: 70,
- quarterTurns: 0,
- elementKey: GlobalKey()
- );
- // Set State
- _setAddNewElementState(newElement);
- notifyListeners();
- selectElmById(id);
- }
- // ? Variable Element
- void addProductNameElement() {
- String id = uuid.v4();
- ElementState newElement = ElementState(
- id: id,
- valueController: TextEditingController(text: '{{PRODUCTNAME}}'),
- type: ElementType.textbox,
- variableType: ElementVariableType.productName,
- position: ElementPosition(top: 0, left: 0),
- width: 250,
- quarterTurns: 0,
- elementKey: GlobalKey()
- );
- // Set State
- _setAddNewElementState(newElement);
- notifyListeners();
- selectElmById(id);
- }
- void addVariantNameElement() {
- String id = uuid.v4();
- ElementState newElement = ElementState(
- id: id,
- valueController: TextEditingController(text: '{{VARIANTNAME}}'),
- type: ElementType.textbox,
- variableType: ElementVariableType.variantName,
- position: ElementPosition(top: 0, left: 0),
- width: 250,
- quarterTurns: 0,
- elementKey: GlobalKey()
- );
- // Set State
- _setAddNewElementState(newElement);
- notifyListeners();
- selectElmById(id);
- }
- void addProductionCodeElement() {
- String id = uuid.v4();
- ElementState newElement = ElementState(
- id: id,
- valueController: TextEditingController(text: '{{PRODUCTIONCODE}}'),
- type: ElementType.textbox,
- variableType: ElementVariableType.productionCode,
- position: ElementPosition(top: 0, left: 0),
- width: 250,
- quarterTurns: 0,
- elementKey: GlobalKey()
- );
- // Set State
- _setAddNewElementState(newElement);
- notifyListeners();
- selectElmById(id);
- }
- void addProductionDateElement() {
- String id = uuid.v4();
- ElementState newElement = ElementState(
- id: id,
- valueController: TextEditingController(text: '{{PRODUCTIONDATE}}'),
- type: ElementType.text,
- variableType: ElementVariableType.productionDate,
- position: ElementPosition(top: 0, left: 0),
- width: 250,
- quarterTurns: 0,
- elementKey: GlobalKey()
- );
- // Save History
- _setAddNewElementState(newElement);
- notifyListeners();
- selectElmById(id);
- }
- void addSerialNumberElement() {
- String id = uuid.v4();
- ElementState newElement = ElementState(
- id: id,
- valueController: TextEditingController(text: '{{SERIALNUMBER}}'),
- type: ElementType.text,
- variableType: ElementVariableType.serialNumber,
- position: ElementPosition(top: 0, left: 0),
- width: 250,
- quarterTurns: 0,
- elementKey: GlobalKey()
- );
- // Set State
- _setAddNewElementState(newElement);
- notifyListeners();
- selectElmById(id);
- }
- void updateElmPosition(Offset offset, {double? fixedTop, double? fixedLeft}) {
- ElementState? element = selectedElm;
- if (element == null) return;
- // element.position = ElementPosition(top: offset.dy, left: offset.dx);
- print(offset.dx);
- if (fixedTop != null) {
- element.position.top = fixedTop;
- } else {
- element.position.top += offset.dy.round();
- }
- if (fixedLeft != null) {
- print('fixed left: $fixedLeft');
- element.position.left = fixedLeft;
- } else {
- element.position.left += offset.dx.round();
- }
-
- notifyListeners();
- }
- // Reset position after drag end
- void resetElmPosition(ElementPosition? elementPosition) {
- ElementState? element = selectedElm;
- if (element == null) return;
- if (elementPosition == null) return;
- element.position = elementPosition;
- }
- void moveElement(Offset offset) {
- log('[MOVING ELEMENT]');
- ElementState? element = selectedElm;
- if (element == null) return;
- List<ElementState> newElementsState = _cloneElementsState(currentElementsState);
- var newElement = newElementsState.firstWhere((e) => e.id == selectedElmId);
- newElement.position.top += offset.dy.round();
- newElement.position.left += offset.dx.round();
- setNewElementsState(newElementsState);
- }
- ElementPosition getClonedElementPosition(ElementState element) {
- return ElementPosition(
- top: element.position.top,
- left: element.position.left
- );
- }
- void updateElmWitdh(double width) {
- ElementState? element = selectedElm;
- if (element == null) return;
- element.width = width;
- notifyListeners();
- }
- void commitTextboxResize(double width, double textboxDragStartWidth) {
- if (selectedElm == null) return;
- List<ElementState> newElementsState = _cloneElementsState(currentElementsState);
- var newElement = newElementsState.firstWhere((e) => e.id == selectedElmId);
- newElement.width = width;
- // reset previous element
- _resetPreviousTextboxWidth(selectedElm!, textboxDragStartWidth);
- setNewElementsState(newElementsState);
- }
- void _resetPreviousTextboxWidth(ElementState previousElement, double textboxDragStartWidth) {
- if (selectedElm == null) return;
- previousElement.width = textboxDragStartWidth;
- }
- void toggleLockElement() {
- if (selectedElm == null) return;
- List<ElementState> newElementsState = _cloneElementsState(currentElementsState);
- var selectedNewElement = newElementsState.firstWhere((e) => e.id == selectedElm!.id);
-
- selectedNewElement.isLocked = !selectedNewElement.isLocked;
- setNewElementsState(newElementsState);
- // selectedElm!.isLocked = !selectedElm!.isLocked;
- notifyListeners();
- }
- bool shouldIgnoreTouch(String elementId) {
- if (elementId == selectedElmId) return false;
- if (selectedElmId == null) return false;
- return true;
- }
- void selectElmById(String id) {
- selectedElmId = id;
- valueOnStartEditing = currentElementsState.firstWhere((e) => e.id == selectedElmId).valueController.text;
- notifyListeners();
- }
- void enableEdit() {
- if (isVariableElement) return;
- if (selectedElm!.isLocked) {
- _showLockedToast('Cant modify locked element');
- return;
- }
- isEditing = true;
- notifyListeners();
- }
- void disableEdit() {
- isEditing = false;
- notifyListeners();
- }
- void unSelectElm() {
- selectedElmId = null;
- isEditing = false;
- valueOnStartEditing = null;
- notifyListeners();
- }
- bool isSelected(String id) {
- return selectedElmId == id;
- }
- // ? Getters
- String get selectedElmType {
- if (currentElementsState.isNotEmpty && selectedElmId != null) {
- final selectedElm = currentElementsState.firstWhere((element) => element.id == selectedElmId);
- return elementGetter(selectedElm.type);
- }
- return '';
- }
- ElementState? get selectedElm {
- if (currentElementsState.isNotEmpty && selectedElmId != null) {
- return currentElementsState.firstWhereOrNull((element) => element.id == selectedElmId);
- }
- return null;
- }
- GlobalKey? get selectedElmKey {
- if (currentElementsState.isNotEmpty && selectedElmId != null) {
- return currentElementsState.firstWhere((element) => element.id == selectedElmId).elementKey;
- }
- return null;
- }
- bool get shouldShowFontResizer {
- if (selectedElm == null) return false;
- if (![ElementType.text, ElementType.textbox].contains(selectedElm!.type)) return false;
- return true;
- }
- bool get shouldShowQrResizer {
- if (selectedElm == null) return false;
- if (selectedElm!.type != ElementType.qr) return false;
- return true;
- }
- bool get shouldShowDeleteElementButton {
- if (selectedElm == null) return false;
- if ([ElementType.qr].contains(selectedElm!.type)) return false;
- return true;
- }
- bool get isVariableElement {
- if (selectedElm == null) return false;
- if (selectedElm!.variableType == null) return false;
- return true;
- }
- // ? Element overlay
- bool shouldShowTextboxResizer(String elmId) {
- if (selectedElmId == null) return false;
- if (selectedElmId != elmId ) return false;
- if (selectedElm!.type != ElementType.textbox) return false;
- return true;
- }
- bool shouldShowOverlay(String elmId) {
- if (selectedElmId == null) return false;
- if (selectedElmId != elmId ) return false;
- if (selectedElm!.type == ElementType.qr) return false;
- return true;
- }
- // Toolbar
- bool get insertElementMode{
- if (selectedElm == null) return true;
- return false;
- }
- /// Can only rotate [ElementType.text, ElementType.textBox]
- void rotate() {
- if (selectedElm == null) return;
- if (selectedElm!.isLocked) {
- _showLockedToast('Cant rotate locked element');
- return;
- }
-
- if (![ElementType.text, ElementType.textbox].contains(selectedElm!.type)) return;
-
- List<ElementState> newElementsState = _cloneElementsState(currentElementsState);
- var newElement = newElementsState.firstWhere((e) => e.id == selectedElmId);
- if (newElement.type == ElementType.text) _rotateText(newElement);
- if (newElement.type == ElementType.textbox) _rotateTextBox(newElement);
- setNewElementsState(newElementsState);
- // Adjust Size
- // double currentElementHeight = selectedElmKey!.currentContext!.size!.height;
- // double currentElementWidth = selectedElmKey!.currentContext!.size!.width;
- // selectedElmKey!.currentContext!.size!.height = currentElementWidth;
- // selectedElmKey!.currentContext!.size!.width = currentElementHeight;
-
- notifyListeners();
- }
-
- void editText(TextEditingController controller) {
- if (selectedElm == null) return;
- List<ElementState> newElementsState = _cloneElementsState(currentElementsState);
- var newElement = newElementsState.firstWhere((e) => e.id == selectedElmId);
- newElement.valueController.text = controller.text;
- // newElement.valueController.selection = TextSelection.collapsed(offset: controller.selection.base.offset);
-
- setNewElementsState(newElementsState);
- }
- void setValueOnStartEditing(String text) {
- valueOnStartEditing = text;
- }
- // FontSize Handler
- void changeFontSize(int? fontSize) {
- if (fontSize == null) return;
- if (selectedElm == null) return;
- if (selectedElm!.isLocked) {
- _showLockedToast('Cant modify locked element');
- return;
- }
- List<ElementState> newElementsState = _cloneElementsState(currentElementsState);
- var newElement = newElementsState.firstWhere((e) => e.id == selectedElmId);
- newElement.fontScale = fontSize;
- setNewElementsState(newElementsState);
- notifyListeners();
- }
-
- void incrementFontSize() {
- if (selectedElm == null) return;
- final incrementTo = selectedElm!.fontScale + 1;
- if (selectedElm!.isLocked) {
- _showLockedToast('Cant modify locked element');
- return;
- }
- // check if value is allowed for resize
- if (CanvasStyle.fontSizeMap.containsKey(incrementTo)) {
- // // ? Save History
- // setNewElementsState(CanvasHistoryModifyType.resize, elementProperties);
- List<ElementState> newElementsState = _cloneElementsState(currentElementsState);
- var newElement = newElementsState.firstWhere((e) => e.id == selectedElmId);
- // selectedElm!.fontScale = incrementTo;
- newElement.fontScale = incrementTo;
- setNewElementsState(newElementsState);
- print('kepenjet increase');
- } else {
- print('cant increment');
- }
- notifyListeners();
- }
- void decrementFontSize() {
- if (selectedElm == null) return;
- final decrementTo = selectedElm!.fontScale - 1;
- if (selectedElm!.isLocked) {
- _showLockedToast('Cant modify locked element');
- return;
- }
- // check if value is allowed for resize
- if (CanvasStyle.fontSizeMap.containsKey(decrementTo)) {
- List<ElementState> newElementsState = _cloneElementsState(currentElementsState);
- var newElement = newElementsState.firstWhere((e) => e.id == selectedElmId);
- newElement.fontScale = decrementTo;
- setNewElementsState(newElementsState);
- } else {
- print('cant decrement');
- }
- }
- // Qr Size Handler
- void changeQrSize(int? fontSize) {
- if (fontSize == null) return;
- if (selectedElm == null) return;
- if (selectedElm!.isLocked) {
- _showLockedToast('Cant modify locked element');
- return;
- }
- List<ElementState> newElementsState = _cloneElementsState(currentElementsState);
- var newElement = newElementsState.firstWhere((e) => e.id == selectedElmId);
- // selectedElm!.qrScale = fontSize;
- newElement.qrScale = fontSize;
- setNewElementsState(newElementsState);
- }
-
- void incrementQrSize() {
- if (selectedElm == null) return;
- if (selectedElm!.type != ElementType.qr) return;
- final incrementTo = selectedElm!.qrScale! + 1;
- if (selectedElm!.isLocked) {
- _showLockedToast('Cant modify locked element');
- return;
- }
- // check if value is allowed for resize
- if (CanvasStyle.qrSizeMap.containsKey(incrementTo)) {
- List<ElementState> newElementsState = _cloneElementsState(currentElementsState);
- var newElement = newElementsState.firstWhere((e) => e.id == selectedElmId);
- // selectedElm!.qrScale = incrementTo;
- newElement.qrScale = incrementTo;
- setNewElementsState(newElementsState);
- } else {
- print('cant increment');
- }
- }
- void decrementQrSize() {
- if (selectedElm == null) return;
- if (selectedElm!.type != ElementType.qr) return;
- final decrementTo = selectedElm!.qrScale! - 1;
- if (selectedElm!.isLocked) {
- _showLockedToast('Cant modify locked element');
- return;
- }
- // check if value is allowed for resize
- if (CanvasStyle.qrSizeMap.containsKey(decrementTo)) {
- List<ElementState> newElementsState = _cloneElementsState(currentElementsState);
- var newElement = newElementsState.firstWhere((e) => e.id == selectedElmId);
- // selectedElm!.qrScale = decrementTo;
- newElement.qrScale = decrementTo;
- setNewElementsState(newElementsState);
- } else {
- print('cant decrement');
- }
- notifyListeners();
- }
- // Delete Element
- Future<void> deleteElement(BuildContext context) async {
- if (selectedElm == null) return;
- if (selectedElm!.isLocked) {
- _showLockedToast('Cant delete locked element');
- return;
- }
- final shouldDelete = await showDialog(
- context: context,
- builder: (context) {
- return AlertDialog(
- title: Text('Delete Element ?'),
- content: Text('Are you sure want to delete this element ?'),
- actions: [
- TextButton(
- onPressed: () => Navigator.pop(context, false),
- child: Text('Cancel')
- ),
- TextButton(
- onPressed: () => Navigator.pop(context, true),
- child: Text('Delete')
- ),
- ],
- );
- },
- );
- if (!shouldDelete) return;
- // // ? Save History
- // setNewElementsState(CanvasHistoryModifyType.remove, elementProperties);
- // elementProperties.removeWhere((e) => e.id == selectedElm!.id);
- List<ElementState> newElementsState = _cloneElementsState(currentElementsState);
- log('selectedElmId: ${selectedElm!.id}');
- for (var i = 0; i < newElementsState.length; i++) {
- log('element[$i]: ${newElementsState[i].id}');
- }
- newElementsState.removeWhere((e) => e.id == selectedElm!.id);
- setNewElementsState(newElementsState);
-
- unSelectElm();
- notifyListeners();
- }
- // ? snapping element
- // Offset? snapToElement(Offset newPosition) {
- // for (var element in elementProperties) {
- // if ((newPosition.dx - element.))
- // }
- // }
- // ? Template to JSON
- String buildJSON() {
- var elementsMap = [];
- var canvasResultMap = {
- 'title': 'Test',
- 'width': (canvasProperty.width / 10).round(),
- 'height': (canvasProperty.height / 10).round(),
- 'content': {
- 'version': editorVersion,
- 'elements': []
- }
- };
- for (var element in currentElementsState) {
- var elementMap = {
- 'id': element.id,
- 'content': element.valueController.text,
- 'height': element.elementKey.currentContext?.size?.height.round() ?? 0,
- 'width': element.elementKey.currentContext?.size?.width.round() ?? 0,
- 'position': {
- 'top': element.position.top.round(),
- 'left': element.position.left.round()
- },
- 'size': _getElementSizeResult(element),
- 'rotation': _getElementRotationResult(element.quarterTurns),
- 'type': _getElementTypeResult(element)
- };
- elementsMap.add(elementMap);
- }
-
- (canvasResultMap['content'] as Map<String, dynamic>)['elements'] = elementsMap;
- final templateJsonResult = jsonEncode(canvasResultMap);
- print(templateJsonResult);
- log(templateJsonResult);
-
- return templateJsonResult;
- }
- String _getElementTypeResult(ElementState element) {
- switch (element.type) {
- case ElementType.text:
- return 'text';
- case ElementType.textbox:
- return 'textbox';
- case ElementType.qr:
- return 'qrcode';
- default:
- return '';
- }
- }
- int _getElementRotationResult(int quarterTurns) {
- switch (quarterTurns) {
- case 1:
- return 90;
- case 2:
- return 180;
- case 3:
- return -90;
- default:
- return 0;
- }
- }
- int _getElementSizeResult(ElementState element) {
- if (element.type == ElementType.qr) {
- return element.qrScale ?? 1;
- }
- return element.fontScale;
- }
- // ? Helper Method
- void _setAddNewElementState(ElementState newElement) {
- List<ElementState> newElementsState = [..._cloneElementsState(currentElementsState), newElement];
- setNewElementsState(newElementsState);
- }
- void _rotateText(ElementState element) {
- if (element.quarterTurns < 3) {
- element.quarterTurns += 1;
- } else {
- element.quarterTurns = 0;
- }
- }
- void _rotateTextBox(ElementState element) {
- if (element.quarterTurns == 0) {
- element.quarterTurns = 3;
- } else {
- element.quarterTurns = 0;
- }
- }
- void _showLockedToast(String titleText) {
- toastification.show(
- title: Text(titleText),
- description: Text('unlock to change element property'),
- closeButtonShowType: CloseButtonShowType.none,
- style: ToastificationStyle.minimal,
- type: ToastificationType.warning,
- autoCloseDuration: const Duration(seconds: 3),
- alignment: Alignment.bottomCenter,
- dragToClose: true
- );
- }
- void _setNewStateTextEdit(List<ElementState> newElementsState) {
- log(selectedElm?.id ?? 'null');
- if (selectedElm == null) return;
-
-
- var newElement = newElementsState.firstWhereOrNull((e) => e.id == selectedElmId);
- if (newElement != null && [ElementType.text, ElementType.textbox].contains(newElement.type)) {
- newElement.valueController.selection = TextSelection.collapsed(offset: selectedElm!.valueController.selection.base.offset);
- }
- }
- // canvas alignment line helper
- bool shouldShowHorizontalCenterLine = false;
- void updateShouldShowHorizontalCenterLine(bool value) {
- shouldShowHorizontalCenterLine = value;
- notifyListeners();
- }
- bool shouldShowVerticalCenterLine = false;
- void updateShouldShowVerticalCenterLine(bool value) {
- shouldShowVerticalCenterLine = value;
- notifyListeners();
- }
- }
- enum SetActionType { add, remove, move, resize, lock, rotate, textEdit, redo }
|