import 'package:fis_measure/interfaces/date_types/point.dart'; import 'package:fis_measure/interfaces/date_types/rect.dart'; import 'package:fis_measure/interfaces/date_types/rect_region.dart'; import 'package:fis_measure/interfaces/process/workspace/application.dart'; import 'package:fis_measure/interfaces/process/workspace/point_info.dart'; import 'package:fis_measure/view/gesture/cross_position_indicator.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:vid/us/vid_us_visual_area_type.dart'; import 'positioned_cursor.dart'; class MeasureMouseGesturePanel extends StatefulWidget { const MeasureMouseGesturePanel({Key? key}) : super(key: key); @override State createState() => _MeasureMouseGesturePanelState(); } class _MeasureMouseGesturePanelState extends State { Offset? mousePosition; Offset? cursorPosition; final mouseState = Get.put(MouseState()); late final application = Get.find(); bool ifContainerTissueTM = false; CursorDisplayType displayType = CursorDisplayType.none; RectRegion tissueTMPixelRegion = RectRegion(); @override void initState() { // TODO: from config mouseState.cursorSize = 32; _findMultiRegions(); application.displaySizeChanged.addListener(_onResize); super.initState(); } @override void dispose() { application.displaySizeChanged.removeListener(_onResize); super.dispose(); } @override Widget build(BuildContext context) { return GestureDetector( onTapDown: (details) { application.createPointInfo( details.localPosition, PointInfoType.mouseDown, ); }, onPanDown: (details) { // application.createPointInfo( // details.localPosition, // PointInfoType.mouseDown, // ); }, onPanUpdate: (details) { mouseState.mousePosition = details.localPosition; application.createPointInfo( details.localPosition, PointInfoType.mouseMove, ); }, child: MouseRegion( cursor: SystemMouseCursors.none, onHover: (event) { mouseState.mousePosition = event.localPosition; application.createPointInfo( event.localPosition, PointInfoType.mouseMove, ); _handleAreaChange(event.localPosition); }, onEnter: (e) { setState(() { displayType = CursorDisplayType.normal; }); }, onExit: (e) { setState(() { displayType = CursorDisplayType.none; }); }, child: Stack( children: [ _buildCursor(), ], ), ), ); } Widget _buildCursor() { switch (displayType) { case CursorDisplayType.none: return Container(); case CursorDisplayType.normal: return const PositionedCursor(); case CursorDisplayType.cross: return CrossIndicator( areaRegion: Rect.fromLTRB( tissueTMPixelRegion.left, tissueTMPixelRegion.top, tissueTMPixelRegion.right, tissueTMPixelRegion.bottom), ); } } void _onResize(_, e) { _findMultiRegions(); } void _handleAreaChange(Offset pointerOffset) { if (ifContainerTissueTM) { if (tissueTMPixelRegion .containsPoint(DPoint.parseOffset(pointerOffset))) { if (displayType != CursorDisplayType.cross) { setState(() { displayType = CursorDisplayType.cross; }); } } else { if (displayType != CursorDisplayType.normal) { setState(() { displayType = CursorDisplayType.normal; }); } } } } void _findMultiRegions() { final displaySize = application.displaySize; for (var visual in application.visuals) { for (var area in visual.visualAreas) { if (area.visualAreaType == VidUsVisualAreaType.TissueTimeMotion) { ifContainerTissueTM = true; ///TODO Left 好像不准?需要其他相关组进行调整 tissueTMPixelRegion = RectRegion.rect(DRect( // area.displayRegion.left * displaySize.width, 0, area.displayRegion.top * displaySize.height, area.displayRegion.width * displaySize.width, area.displayRegion.height * displaySize.height, )); } } } } } enum CursorDisplayType { none, cross, normal, }