shape_editor 0.0.15 copy "shape_editor: ^0.0.15" to clipboard
shape_editor: ^0.0.15 copied to clipboard

A flutter shape editor library that provides DiagramEditor widget.

example/main.dart

// import 'dart:math' as math;
//
// import 'package:shape_editor/shape_editor.dart';
// import 'package:flutter/material.dart';
//
// void main() => runApp(const DiagramApp());
//
// class DiagramApp extends StatefulWidget {
//   const DiagramApp({Key? key}) : super(key: key);
//
//   @override
//   _DiagramAppState createState() => _DiagramAppState();
// }
//
// class _DiagramAppState extends State<DiagramApp> {
//   MyPolicySet myPolicySet = MyPolicySet();
//
//   @override
//   Widget build(BuildContext context) {
//     return MaterialApp(
//       home: Scaffold(
//         body: SafeArea(
//           child: Stack(
//             children: [
//               Container(color: Colors.grey),
//               Padding(
//                 padding: const EdgeInsets.all(16),
//                 child: DiagramEditor(
//                   diagramEditorContext:
//                       DiagramEditorContext(policySet: myPolicySet),
//                 ),
//               ),
//               Padding(
//                 padding: const EdgeInsets.all(0),
//                 child: Row(
//                   children: [
//                     ElevatedButton(
//                         onPressed: () => myPolicySet.deleteAllComponents(),
//                         style: ElevatedButton.styleFrom(backgroundColor: Colors.red),
//                         child: const Text('delete all')),
//                     const Spacer(),
//                     ElevatedButton(
//                         onPressed: () => myPolicySet.serialize(),
//                         child: const Text('serialize')),
//                     const SizedBox(width: 8),
//                     ElevatedButton(
//                         onPressed: () => myPolicySet.deserialize(),
//                         child: const Text('deserialize')),
//                   ],
//                 ),
//               ),
//             ],
//           ),
//         ),
//       ),
//     );
//   }
// }
//
// // Custom component Data which you can assign to a component to dynamic data property.
// class MyComponentData {
//   MyComponentData();
//
//   bool isHighlightVisible = false;
//   Color color =
//       Color((math.Random().nextDouble() * 0xFFFFFF).toInt()).withOpacity(1.0);
//
//   showHighlight() {
//     isHighlightVisible = true;
//   }
//
//   hideHighlight() {
//     isHighlightVisible = false;
//   }
//
//   // Function used to deserialize the diagram. Must be passed to `canvasWriter.model.deserializeDiagram` for proper deserialization.
//   MyComponentData.fromJson(Map<String, dynamic> json)
//       : isHighlightVisible = json['highlight'],
//         color = Color(int.parse(json['color'], radix: 16));
//
//   // Function used to serialization of the diagram. E.g. to save to a file.
//   Map<String, dynamic> toJson() => {
//         'highlight': isHighlightVisible,
//         'color': color.toString().split('(0x')[1].split(')')[0],
//       };
// }
//
// // A set of policies compound of mixins. There are some custom policy implementations and some policies defined by diagram_editor library.
// class MyPolicySet extends PolicySet
//     with
//         MyInitPolicy,
//         MyComponentDesignPolicy,
//         MyCanvasPolicy,
//         MyComponentPolicy,
//         CustomPolicy,
//         //
//         LinkControlPolicy,
//         LinkJointControlPolicy,
//         LinkAttachmentRectPolicy {}
//
// // A place where you can init the canvas or your diagram (eg. load an existing diagram).
// mixin MyInitPolicy implements InitPolicy {
//   @override
//   initializeDiagramEditor() {
//     canvasWriter.state.setCanvasColor(Colors.grey[300]!);
//   }
// }
//
// // This is the place where you can design a component.
// // Use switch on componentData.type or componentData.data to define different component designs.
// mixin MyComponentDesignPolicy implements ComponentDesignPolicy {
//   @override
//   Widget showComponentBody(ComponentData componentData, double scale) {
//     return Container(
//       decoration: BoxDecoration(
//         color: (componentData.data as MyComponentData).color,
//         border: Border.all(
//           width: 2,
//           color: (componentData.data as MyComponentData).isHighlightVisible
//               ? Colors.pink
//               : Colors.black,
//         ),
//       ),
//       child: const Center(child: Text('component')),
//     );
//   }
// }
//
// // You can override the behavior of any gesture on canvas here.
// // Note that it also implements CustomPolicy where own variables and functions can be defined and used here.
// mixin MyCanvasPolicy implements CanvasPolicy, CustomPolicy {
//   @override
//   onCanvasTapUp(TapUpDetails details) {
//     canvasWriter.model.hideAllLinkJoints();
//     if (selectedComponentId != null) {
//       hideComponentHighlight(selectedComponentId);
//     } else {
//       canvasWriter.model.addComponent(
//         ComponentData(
//           size: const Size(96, 72),
//           position:
//               canvasReader.state.fromCanvasCoordinates(details.localPosition),
//           data: MyComponentData(),
//         ),
//       );
//     }
//   }
// }
//
// // Mixin where component behaviour is defined. In this example it is the movement, highlight and connecting two components.
// mixin MyComponentPolicy implements ComponentPolicy, CustomPolicy {
//   // variable used to calculate delta offset to move the component.
//   late Offset lastFocalPoint;
//
//   @override
//   onComponentTap(String componentId) {
//     canvasWriter.model.hideAllLinkJoints();
//
//     bool connected = connectComponents(selectedComponentId, componentId);
//     hideComponentHighlight(selectedComponentId);
//     if (!connected) {
//       highlightComponent(componentId);
//     }
//   }
//
//   @override
//   onComponentLongPress(String componentId) {
//     hideComponentHighlight(selectedComponentId);
//     canvasWriter.model.hideAllLinkJoints();
//     canvasWriter.model.removeComponent(componentId);
//   }
//
//   @override
//   onComponentScaleStart(componentId, details) {
//     lastFocalPoint = details.localFocalPoint;
//   }
//
//   @override
//   onComponentScaleUpdate(componentId, details) {
//     Offset positionDelta = details.localFocalPoint - lastFocalPoint;
//     canvasWriter.model.moveComponent(componentId, positionDelta);
//     lastFocalPoint = details.localFocalPoint;
//   }
//
//   // This function tests if it's possible to connect the components and if yes, connects them
//   bool connectComponents(String? sourceComponentId, String? targetComponentId) {
//     if (sourceComponentId == null || targetComponentId == null) {
//       return false;
//     }
//     // tests if the ids are not same (the same component)
//     if (sourceComponentId == targetComponentId) {
//       return false;
//     }
//     // tests if the connection between two components already exists (one way)
//     if (canvasReader.model.getComponent(sourceComponentId).connections.any(
//         (connection) =>
//             (connection is ConnectionOut) &&
//             (connection.otherComponentId == targetComponentId))) {
//       return false;
//     }
//
//     // This connects two components (creates a link between), you can define the design of the link with LinkStyle.
//     canvasWriter.model.connectTwoComponents(
//       sourceComponentId: sourceComponentId,
//       targetComponentId: targetComponentId,
//       linkStyle: LinkStyle(
//         arrowType: ArrowType.pointedArrow,
//         lineWidth: 1.5,
//         backArrowType: ArrowType.centerCircle,
//       ),
//     );
//
//     return true;
//   }
// }
//
// // You can create your own Policy to define own variables and functions with canvasReader and canvasWriter.
// mixin CustomPolicy implements PolicySet {
//   String? selectedComponentId;
//   String serializedDiagram = '{"components": [], "links": []}';
//
//   highlightComponent(String componentId) {
//     canvasReader.model.getComponent(componentId).data.showHighlight();
//     canvasReader.model.getComponent(componentId).updateComponent();
//     selectedComponentId = componentId;
//   }
//
//   hideComponentHighlight(String? componentId) {
//     if (componentId != null) {
//       canvasReader.model.getComponent(componentId).data.hideHighlight();
//       canvasReader.model.getComponent(componentId).updateComponent();
//       selectedComponentId = null;
//     }
//   }
//
//   deleteAllComponents() {
//     selectedComponentId = null;
//     canvasWriter.model.removeAllComponents();
//   }
//
//   // Save the diagram to String in json format.
//   serialize() {
//     serializedDiagram = canvasReader.model.serializeDiagram();
//   }
//
//   // Load the diagram from json format. Do it cautiously, to prevent unstable state remove the previous diagram (id collision can happen).
//   deserialize() {
//     canvasWriter.model.removeAllComponents();
//     canvasWriter.model.deserializeDiagram(
//       serializedDiagram,
//       decodeCustomComponentData: (json) => MyComponentData.fromJson(json),
//       decodeCustomLinkData: null,
//     );
//   }
// }
7
likes
0
points
360
downloads

Publisher

unverified uploader

Weekly Downloads

A flutter shape editor library that provides DiagramEditor widget.

Repository (GitHub)
View/report issues

License

unknown (license)

Dependencies

event, flutter, flutter_colorpicker, provider, uuid, vector_math

More

Packages that depend on shape_editor