mouse_gesture.dart 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  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. super.initState();
  30. }
  31. @override
  32. void dispose() {
  33. //
  34. super.dispose();
  35. }
  36. @override
  37. Widget build(BuildContext context) {
  38. return GestureDetector(
  39. onTapDown: (details) {
  40. application.createPointInfo(
  41. details.localPosition,
  42. PointInfoType.mouseDown,
  43. );
  44. },
  45. onPanDown: (details) {
  46. // application.createPointInfo(
  47. // details.localPosition,
  48. // PointInfoType.mouseDown,
  49. // );
  50. },
  51. onPanUpdate: (details) {
  52. mouseState.mousePosition = details.localPosition;
  53. application.createPointInfo(
  54. details.localPosition,
  55. PointInfoType.mouseMove,
  56. );
  57. },
  58. child: MouseRegion(
  59. cursor: SystemMouseCursors.none,
  60. onHover: (event) {
  61. mouseState.mousePosition = event.localPosition;
  62. application.createPointInfo(
  63. event.localPosition,
  64. PointInfoType.mouseMove,
  65. );
  66. _handleAreaChange(event.localPosition);
  67. },
  68. onEnter: (e) {
  69. setState(() {
  70. displayType = CursorDisplayType.normal;
  71. });
  72. },
  73. onExit: (e) {
  74. setState(() {
  75. displayType = CursorDisplayType.none;
  76. });
  77. },
  78. child: Stack(
  79. children: [
  80. _buildCursor(),
  81. ],
  82. ),
  83. ),
  84. );
  85. }
  86. Widget _buildCursor() {
  87. switch (displayType) {
  88. case CursorDisplayType.none:
  89. return Container();
  90. case CursorDisplayType.normal:
  91. return const PositionedCursor();
  92. case CursorDisplayType.cross:
  93. return CrossIndicator(
  94. areaRegion: Rect.fromLTRB(
  95. tissueTMPixelRegion.left,
  96. tissueTMPixelRegion.top,
  97. tissueTMPixelRegion.right,
  98. tissueTMPixelRegion.bottom),
  99. );
  100. }
  101. }
  102. void _handleAreaChange(Offset pointerOffset) {
  103. if (ifContainerTissueTM) {
  104. if (tissueTMPixelRegion
  105. .containsPoint(DPoint.parseOffset(pointerOffset))) {
  106. if (displayType != CursorDisplayType.cross) {
  107. setState(() {
  108. displayType = CursorDisplayType.cross;
  109. });
  110. }
  111. } else {
  112. if (displayType != CursorDisplayType.normal) {
  113. setState(() {
  114. displayType = CursorDisplayType.normal;
  115. });
  116. }
  117. }
  118. }
  119. }
  120. void _findMultiRegions() {
  121. final displaySize = application.displaySize;
  122. for (var visual in application.visuals) {
  123. for (var area in visual.visualAreas) {
  124. if (area.visualAreaType == VidUsVisualAreaType.TissueTimeMotion) {
  125. ifContainerTissueTM = true;
  126. ///TODO 此处选择用严格区域来作为 TissueTM 区域,也可以放宽到边界,以获得更好的体验
  127. ///TODO Left 好像不准?需要其他相关组进行调整
  128. tissueTMPixelRegion = RectRegion.rect(DRect(
  129. // area.displayRegion.left * displaySize.width,
  130. 0,
  131. area.displayRegion.top * displaySize.height,
  132. area.displayRegion.width * displaySize.width,
  133. area.displayRegion.height * displaySize.height,
  134. ));
  135. }
  136. }
  137. }
  138. }
  139. }
  140. enum CursorDisplayType {
  141. none,
  142. cross,
  143. normal,
  144. }