mouse_gesture.dart 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. import 'package:fis_measure/interfaces/date_types/point.dart';
  2. import 'package:fis_measure/interfaces/date_types/rect.dart';
  3. import 'package:fis_measure/interfaces/date_types/rect_region.dart';
  4. import 'package:fis_measure/interfaces/process/workspace/application.dart';
  5. import 'package:fis_measure/interfaces/process/workspace/point_info.dart';
  6. import 'package:fis_measure/view/gesture/cross_position_indicator.dart';
  7. import 'package:flutter/material.dart';
  8. import 'package:get/get.dart';
  9. import 'package:vid/us/vid_us_visual_area_type.dart';
  10. import 'positioned_cursor.dart';
  11. class MeasureMouseGesturePanel extends StatefulWidget {
  12. const MeasureMouseGesturePanel({Key? key}) : super(key: key);
  13. @override
  14. State<StatefulWidget> createState() => _MeasureMouseGesturePanelState();
  15. }
  16. class _MeasureMouseGesturePanelState extends State<MeasureMouseGesturePanel> {
  17. Offset? mousePosition;
  18. Offset? cursorPosition;
  19. final mouseState = Get.put<IMouseState>(MouseState());
  20. late final application = Get.find<IApplication>();
  21. bool ifContainerTissueTM = false;
  22. CursorDisplayType displayType = CursorDisplayType.none;
  23. RectRegion tissueTMPixelRegion = RectRegion();
  24. @override
  25. void initState() {
  26. // TODO: from config
  27. mouseState.cursorSize = 32;
  28. _findMultiRegions();
  29. application.displaySizeChanged.addListener(_onResize);
  30. super.initState();
  31. }
  32. @override
  33. void dispose() {
  34. application.displaySizeChanged.removeListener(_onResize);
  35. super.dispose();
  36. }
  37. @override
  38. Widget build(BuildContext context) {
  39. return GestureDetector(
  40. onTapDown: (details) {
  41. application.createPointInfo(
  42. details.localPosition,
  43. PointInfoType.mouseDown,
  44. );
  45. },
  46. onPanDown: (details) {
  47. // application.createPointInfo(
  48. // details.localPosition,
  49. // PointInfoType.mouseDown,
  50. // );
  51. },
  52. onPanUpdate: (details) {
  53. mouseState.mousePosition = details.localPosition;
  54. application.createPointInfo(
  55. details.localPosition,
  56. PointInfoType.mouseMove,
  57. );
  58. },
  59. child: MouseRegion(
  60. cursor: SystemMouseCursors.none,
  61. onHover: (event) {
  62. mouseState.mousePosition = event.localPosition;
  63. application.createPointInfo(
  64. event.localPosition,
  65. PointInfoType.mouseMove,
  66. );
  67. _handleAreaChange(event.localPosition);
  68. },
  69. onEnter: (e) {
  70. setState(() {
  71. displayType = CursorDisplayType.normal;
  72. });
  73. },
  74. onExit: (e) {
  75. setState(() {
  76. displayType = CursorDisplayType.none;
  77. });
  78. },
  79. child: Stack(
  80. children: [
  81. _buildCursor(),
  82. ],
  83. ),
  84. ),
  85. );
  86. }
  87. Widget _buildCursor() {
  88. switch (displayType) {
  89. case CursorDisplayType.none:
  90. return Container();
  91. case CursorDisplayType.normal:
  92. return const PositionedCursor();
  93. case CursorDisplayType.cross:
  94. return CrossIndicator(
  95. areaRegion: Rect.fromLTRB(
  96. tissueTMPixelRegion.left,
  97. tissueTMPixelRegion.top,
  98. tissueTMPixelRegion.right,
  99. tissueTMPixelRegion.bottom),
  100. );
  101. }
  102. }
  103. void _onResize(_, e) {
  104. _findMultiRegions();
  105. }
  106. void _handleAreaChange(Offset pointerOffset) {
  107. if (ifContainerTissueTM) {
  108. if (tissueTMPixelRegion
  109. .containsPoint(DPoint.parseOffset(pointerOffset))) {
  110. if (displayType != CursorDisplayType.cross) {
  111. setState(() {
  112. displayType = CursorDisplayType.cross;
  113. });
  114. }
  115. } else {
  116. if (displayType != CursorDisplayType.normal) {
  117. setState(() {
  118. displayType = CursorDisplayType.normal;
  119. });
  120. }
  121. }
  122. }
  123. }
  124. void _findMultiRegions() {
  125. final displaySize = application.displaySize;
  126. for (var visual in application.visuals) {
  127. for (var area in visual.visualAreas) {
  128. if (area.visualAreaType == VidUsVisualAreaType.TissueTimeMotion) {
  129. ifContainerTissueTM = true;
  130. ///TODO Left 好像不准?需要其他相关组进行调整
  131. tissueTMPixelRegion = RectRegion.rect(DRect(
  132. // area.displayRegion.left * displaySize.width,
  133. 0,
  134. area.displayRegion.top * displaySize.height,
  135. area.displayRegion.width * displaySize.width,
  136. area.displayRegion.height * displaySize.height,
  137. ));
  138. }
  139. }
  140. }
  141. }
  142. }
  143. enum CursorDisplayType {
  144. none,
  145. cross,
  146. normal,
  147. }