Line data Source code
1 : import 'package:flutter/material.dart'; 2 : import 'package:widgetbook/src/models/organizers/organizers.dart'; 3 : import 'package:widgetbook/src/providers/canvas_provider.dart'; 4 : import 'package:widgetbook/src/providers/zoom_provider.dart'; 5 : import 'package:widgetbook/src/widgets/device_render.dart'; 6 : import 'package:vector_math/vector_math_64.dart' as vector; 7 : 8 : class StoryRender extends StatefulWidget { 9 10 : const StoryRender({Key? key}) : super(key: key); 10 : 11 0 : @override 12 0 : _StoryState createState() => _StoryState(); 13 : } 14 : 15 : class _StoryState extends State<StoryRender> { 16 : TransformationController controller = TransformationController( 17 : Matrix4.identity(), 18 : ); 19 : 20 0 : Widget _buildStory() { 21 0 : var state = CanvasProvider.of(context)!.state; 22 0 : if (state.selectedStory != null) { 23 0 : return _buildCanvas(state.selectedStory!); 24 : } 25 : 26 0 : return Center( 27 0 : child: Container(), 28 : ); 29 : } 30 : 31 0 : void _updateController() { 32 0 : var state = ZoomProvider.of(context)!.state; 33 : 34 0 : var oldMatrix = controller.value; 35 : 36 0 : var translation = oldMatrix.getTranslation(); 37 : 38 0 : var rotation = oldMatrix.getRotation(); 39 0 : oldMatrix.setFromTranslationRotationScale( 40 : translation, 41 0 : vector.Quaternion.fromRotation(rotation), 42 0 : vector.Vector3.all(state.zoomLevel), 43 : ); 44 0 : controller = TransformationController(oldMatrix); 45 : } 46 : 47 0 : Widget _buildCanvas(Story story) { 48 0 : _updateController(); 49 : 50 0 : return InteractiveViewer( 51 : boundaryMargin: const EdgeInsets.all(double.infinity), 52 : minScale: 0.25, 53 : maxScale: 5, 54 : constrained: false, 55 0 : transformationController: controller, 56 0 : onInteractionUpdate: (ScaleUpdateDetails details) { 57 0 : ZoomProvider.of(context)! 58 0 : .setScale(controller.value.getMaxScaleOnAxis()); 59 : }, 60 0 : child: DeviceRender( 61 : story: story, 62 : ), 63 : ); 64 : } 65 : 66 0 : @override 67 : Widget build(BuildContext context) { 68 0 : return _buildStory(); 69 : } 70 : }