浏览代码

移动端优化测量交互,支持记住上次选择的测量项

gavin.chen 2 年之前
父节点
当前提交
e2015827e5

+ 39 - 14
lib/process/primitives/straightline.dart

@@ -15,6 +15,9 @@ import 'package:fis_measure/process/primitives/location.dart';
 import 'package:fis_measure/utils/canvas.dart';
 import 'package:fis_measure/view/gesture/cross_position_indicator.dart';
 import 'package:fis_measure/view/gesture/positioned_cursor.dart';
+import 'package:fis_measure/view/gesture/positioned_touch_cursor.dart';
+import 'package:fis_ui/index.dart';
+import 'package:flutter/foundation.dart';
 import 'package:get/get.dart';
 import 'package:vid/us/vid_us_mode.dart';
 
@@ -23,6 +26,7 @@ import '../items/item_feature.dart';
 
 /// 直线
 class StraightLine extends MeasureItem<StraightLineFeature> {
+  late final touchState = Get.find<ITouchPointState>();
   late final mouseState = Get.find<IMouseState>();
   StraightLine(ItemMeta meta, IMeasureItem? parent) : super(meta, parent);
 
@@ -81,8 +85,7 @@ class StraightLine extends MeasureItem<StraightLineFeature> {
         doFeatureFinish();
 
         ///重置十字样式
-        mouseState.crossIndicatorStyleChanged
-            .emit(this, CrossIndicatorStyle.nomal);
+        changeCrossIndicatorStyle(CrossIndicatorStyle.nomal);
       }
     }
     return true;
@@ -101,11 +104,16 @@ class StraightLine extends MeasureItem<StraightLineFeature> {
       switch (args.pointType) {
         case PointInfoType.touchDown:
           startPoint = args; // 设置线段起点
+          handleTouchBeforeStart(startPoint!); // 开始绘制前动态设置第一个起点
           break;
         case PointInfoType.touchUp:
-          break; // 按下立即抬起无事发生
+          startPoint = args; // 设置线段起点
+          feature?.startPoint = args;
+          state = ItemStates.running;
+          break;
         case PointInfoType.touchMove:
-          handleMouseDownWhileWaiting(startPoint!); // 通过设置的起点开始一个绘制事件
+          feature?.startPoint = args;
+          feature?.endPoint = args;
           break;
         default:
           break;
@@ -134,6 +142,16 @@ class StraightLine extends MeasureItem<StraightLineFeature> {
     state = ItemStates.running;
   }
 
+  void handleTouchBeforeStart(PointInfo args) {
+    // 转换为Area逻辑位置
+    final point = args.toAreaLogicPoint();
+    // feature = StraightLineFeature(this, point, point);
+    if (args.hostVisualArea != null) {
+      handleTissueTM(args.hostVisualArea!.mode.modeType, point);
+      feature!.hostVisualArea = args.hostVisualArea;
+    }
+  }
+
   /// 处理TissueTimeMotion模式
   void handleTissueTM(VidUsModeType mode, DPoint point) {
     if (mode == VidUsModeType.TissueTM || mode == VidUsModeType.Doppler) {
@@ -141,13 +159,11 @@ class StraightLine extends MeasureItem<StraightLineFeature> {
         case MeasureTypes.TimeSpan:
           feature = StraightLineTimeMotionFeature(this, point, point,
               ifHorizontal: false);
-          mouseState.crossIndicatorStyleChanged
-              .emit(this, CrossIndicatorStyle.vertical);
+          changeCrossIndicatorStyle(CrossIndicatorStyle.vertical);
           break;
         case MeasureTypes.VerticalDistance:
           feature = StraightLineTimeMotionFeature(this, point, point);
-          mouseState.crossIndicatorStyleChanged
-              .emit(this, CrossIndicatorStyle.horizontal);
+          changeCrossIndicatorStyle(CrossIndicatorStyle.horizontal);
           break;
         case MeasureTypes.Slope:
           feature = StraightLineSlopeFeature(this, point, point);
@@ -157,8 +173,7 @@ class StraightLine extends MeasureItem<StraightLineFeature> {
           break;
         case MeasureTypes.Pht:
           feature = StraightLinePhtFeature(this, point, point);
-          mouseState.crossIndicatorStyleChanged
-              .emit(this, CrossIndicatorStyle.vertical);
+          changeCrossIndicatorStyle(CrossIndicatorStyle.vertical);
           break;
         default:
       }
@@ -166,6 +181,14 @@ class StraightLine extends MeasureItem<StraightLineFeature> {
       feature = StraightLineFeature(this, point, point);
     }
   }
+
+  void changeCrossIndicatorStyle(CrossIndicatorStyle e) {
+    if (kIsMobile) {
+      touchState.crossIndicatorStyleChanged.emit(this, e);
+    } else {
+      mouseState.crossIndicatorStyleChanged.emit(this, e);
+    }
+  }
 }
 
 class StraightLineFeature extends MeasureItemFeature {
@@ -191,7 +214,7 @@ class StraightLineFeature extends MeasureItemFeature {
 
   @override
   void paint(Canvas canvas, Size size) {
-    if (startPoint == endPoint) return;
+    if (startPoint == endPoint && kIsWeb) return;
 
     drawId(canvas, size, idText);
 
@@ -217,7 +240,8 @@ class StraightLineTimeMotionFeature extends StraightLineFeature {
   final bool ifHorizontal;
   @override
   void paint(Canvas canvas, Size size) {
-    if (startPoint == endPoint) return;
+    if (startPoint == endPoint && kIsWeb) return;
+
     drawId(canvas, size, idText);
 
     final startOffset = convert2ViewPoint(size, startPoint).toOffset();
@@ -239,7 +263,7 @@ class StraightLineSlopeFeature extends StraightLineFeature {
       : super(refItem, startPoint, endPoint);
   @override
   void paint(Canvas canvas, Size size) {
-    if (startPoint == endPoint) return;
+    if (startPoint == endPoint && kIsWeb) return;
 
     drawId(canvas, size, idText);
 
@@ -260,7 +284,8 @@ class StraightLinePhtFeature extends StraightLineFeature {
 
   @override
   void paint(Canvas canvas, Size size) {
-    if (startPoint == endPoint) return;
+    if (startPoint == endPoint && kIsWeb) return;
+
     drawId(canvas, size, idText);
     final distanceToCenter = (startPoint.y - regionCenter.y);
     //TODO:[Gavin] 偏移量比例系数待精确

+ 32 - 26
lib/process/primitives/trace.dart

@@ -1,6 +1,5 @@
 import 'dart:ui';
 
-import 'package:fis_measure/interfaces/date_types/point.dart';
 import 'package:fis_measure/interfaces/enums/items.dart';
 import 'package:fis_measure/interfaces/process/items/item.dart';
 import 'package:fis_measure/interfaces/process/items/item_metas.dart';
@@ -8,15 +7,10 @@ import 'package:fis_measure/interfaces/process/workspace/point_info.dart';
 import 'package:fis_measure/process/calcuators/curve.dart';
 import 'package:fis_measure/process/primitives/utils/auto_snap.dart';
 import 'package:path_drawing/path_drawing.dart';
-
-import '../items/item.dart';
-import '../items/item_feature.dart';
 import 'area_abstract.dart';
 
 /// 手势轨迹图形
 class Trace extends AreaItemAbstract with AutoSnapMixin {
-  PointInfo? _firstPoint;
-
   Trace(ItemMeta meta, IMeasureItem? parent) : super(meta, parent);
 
   @override
@@ -45,25 +39,6 @@ class Trace extends AreaItemAbstract with AutoSnapMixin {
     return true;
   }
 
-  @override
-  void doFeatureFinish() {
-    super.doFeatureFinish();
-    _firstPoint = null;
-  }
-
-  void handleMouseDownWhileWaiting(PointInfo args) {
-    // TODO: 判断是否当前area
-    // 转换为Area逻辑位置
-    feature = TraceFeature(this);
-    if (args.hostVisualArea != null) {
-      feature!.hostVisualArea = args.hostVisualArea;
-    }
-    final point = args.toAreaLogicPoint();
-    feature!.adopt(point);
-    _firstPoint = args;
-    state = ItemStates.running;
-  }
-
   PointInfo? startPoint;
   @override
   bool onExecuteTouch(PointInfo args) {
@@ -77,11 +52,14 @@ class Trace extends AreaItemAbstract with AutoSnapMixin {
       switch (args.pointType) {
         case PointInfoType.touchDown:
           startPoint = args; // 设置线段起点
+          handleTouchBeforeStart(args);
           break;
         case PointInfoType.touchUp:
+          state = ItemStates.running;
+          feature?.innerPoints.first = args;
           break; // 按下立即抬起无事发生
         case PointInfoType.touchMove:
-          handleMouseDownWhileWaiting(startPoint!); // 通过设置的起点开始一个绘制事件
+          feature?.innerPoints.first = args;
           break;
         default:
           break;
@@ -99,6 +77,34 @@ class Trace extends AreaItemAbstract with AutoSnapMixin {
     return true;
   }
 
+  @override
+  void doFeatureFinish() {
+    super.doFeatureFinish();
+  }
+
+  void handleMouseDownWhileWaiting(PointInfo args) {
+    // TODO: 判断是否当前area
+    // 转换为Area逻辑位置
+    feature = TraceFeature(this);
+    if (args.hostVisualArea != null) {
+      feature!.hostVisualArea = args.hostVisualArea;
+    }
+    final point = args.toAreaLogicPoint();
+    feature!.adopt(point);
+    state = ItemStates.running;
+  }
+
+  void handleTouchBeforeStart(PointInfo args) {
+    // TODO: 判断是否当前area
+    // 转换为Area逻辑位置
+    feature = TraceFeature(this);
+    if (args.hostVisualArea != null) {
+      feature!.hostVisualArea = args.hostVisualArea;
+    }
+    final point = args.toAreaLogicPoint();
+    feature!.adopt(point);
+  }
+
   static Trace createAreaPerimeter(
     ItemMeta meta, [
     IMeasureItem? parent,

+ 0 - 8
lib/view/gesture/touch_gesture.dart

@@ -42,14 +42,6 @@ class _MeasureTouchGesturePanelState extends State<MeasureTouchGesturePanel> {
   Widget build(BuildContext context) {
     return GestureDetector(
       behavior: HitTestBehavior.opaque,
-      onTapDown: (details) {
-        touchState.mousePosition = details.localPosition;
-        _handleAreaChange(details.localPosition);
-        application.createPointInfo(
-          details.localPosition,
-          PointInfoType.touchDown,
-        );
-      },
       onPanDown: (details) {
         touchState.mousePosition = details.localPosition;
         _handleAreaChange(details.localPosition);

+ 1 - 1
lib/view/mobile_view/mobile_measure_view.dart

@@ -114,7 +114,7 @@ class _MobileMeasureMainPageState extends State<MobileMeasureMainPage> {
   void initDefaultMeasureSystemSetting() {
     final defaultMobileMeasureSystemSetting = MeasureSystemSettingDTO(
       cursorSize: 16,
-      shapeCursorSize: 14,
+      shapeCursorSize: 30,
       showResultWindow: true,
       fontSize: 14,
       showCursorLine: true,

+ 15 - 6
lib/view/mobile_view/mobile_right_panel/mobile_measure_tool.dart

@@ -56,6 +56,9 @@ class _MobileMeasureSelector extends FState<MobileMeasureSelector> {
   /// 当前的组合测量项父类
   ITopMeasureItem? topMeasureItem;
 
+  /// 更多测量项弹窗状态缓存
+  MoreMeasureBackResult? moreMeasureBackResult;
+
   /// 写死的移动端基础测量项
   final List<MobileBaseMeasureItemBtn> _mobileBasicMeasureItemsList = [
     MobileBaseMeasureItemBtn(
@@ -194,6 +197,7 @@ class _MobileMeasureSelector extends FState<MobileMeasureSelector> {
   @override
   void initState() {
     super.initState();
+    _cancelCurrSelect();
     application.activeMeasureItemChanged
         .addListener(_onActiveMeasureItemChanged);
     application.visualAreaChanged.addListener(_visualAreaChanged);
@@ -454,13 +458,17 @@ class _MobileMeasureSelector extends FState<MobileMeasureSelector> {
         .where((element) => _currModes.contains(element.modeName))
         .toList();
 
-    final ItemMeta? result =
-        await Get.dialog<ItemMeta>(MobileMoreMeasureItemDialog(
+    final MoreMeasureBackResult? result =
+        await Get.dialog<MoreMeasureBackResult>(MobileMoreMeasureItemDialog(
       measureModeList: activeModes,
       activeItemName: activeName,
+      initModeIndex: showMore ? moreMeasureBackResult?.currModeIndex : null,
+      initScrollOffset:
+          showMore ? moreMeasureBackResult?.currScrollOffset : null,
     ));
     if (result != null) {
-      changeItem(result);
+      moreMeasureBackResult = result;
+      changeItem(result.selectedMeasureItemMeta);
       setState(() {
         showMore = true;
       });
@@ -567,10 +575,11 @@ class _MobileMeasureSelector extends FState<MobileMeasureSelector> {
   List<ItemMetaDTO> _currSupportedItemFilter(MeasureModeDTO mode) {
     final supportedMeasureTypeName = [
       'Distance', // StraightLine
+      "VerticalDistance", // StraightLine
       'AreaPerimeterTrace', // Trace
       "Depth", // Location
       "Velocity", // Location
-      "MDepth" // Location
+      "MDepth", // Location
     ];
     List<ItemMetaDTO> _supportedItems = [];
     if (mode.availableGroups == null || mode.availableGroups!.isEmpty) {
@@ -618,9 +627,9 @@ class _MobileMeasureSelector extends FState<MobileMeasureSelector> {
           }
 
           if (isSupported) {
-            // print("✅ 支持的测量项:${items.name} | ${items.measureTypeName}}");
+            print("✅ 支持的测量项:${items.name} | ${items.measureTypeName}}");
           } else {
-            // print("❌ 不支持的测量项:${items.name} | ${items.measureTypeName}}");
+            print("❌ 不支持的测量项:${items.name} | ${items.measureTypeName}}");
           }
         }
       }

+ 31 - 3
lib/view/mobile_view/mobile_right_panel/mobile_more_measure_item_dialog.dart

@@ -11,9 +11,15 @@ import 'package:get/get.dart';
 
 class MobileMoreMeasureItemDialog extends FStatefulWidget {
   const MobileMoreMeasureItemDialog(
-      {super.key, required this.measureModeList, required this.activeItemName});
+      {super.key,
+      required this.measureModeList,
+      required this.activeItemName,
+      this.initModeIndex,
+      this.initScrollOffset});
   final List<MobileMoreMeasureItemModesModel> measureModeList;
   final String activeItemName;
+  final int? initModeIndex;
+  final double? initScrollOffset;
 
   @override
   FState<MobileMoreMeasureItemDialog> createState() =>
@@ -22,7 +28,7 @@ class MobileMoreMeasureItemDialog extends FStatefulWidget {
 
 class _MobileMoreMeasureItemDialogState
     extends FState<MobileMoreMeasureItemDialog> {
-  final scrollController = ScrollController();
+  late final ScrollController scrollController;
   final searchBarController = TextEditingController();
 
   /// 当前模式的下标
@@ -53,6 +59,12 @@ class _MobileMoreMeasureItemDialogState
     currentModeMeasureItemList =
         widget.measureModeList[currentModeIndex].availableItems;
     filteredItems = currentModeMeasureItemList.toList();
+    if (widget.initModeIndex != null) {
+      currentModeIndex = widget.initModeIndex!;
+    }
+    scrollController = ScrollController(
+      initialScrollOffset: widget.initScrollOffset ?? 0,
+    );
   }
 
   @override
@@ -231,7 +243,11 @@ class _MobileMoreMeasureItemDialogState
         ItemMeta selectedItemMeta;
         try {
           selectedItemMeta = ItemMetaConverter(item.itemMeta).output();
-          Get.back<ItemMeta>(result: selectedItemMeta);
+          final MoreMeasureBackResult result = MoreMeasureBackResult(
+              currModeIndex: currentModeIndex,
+              currScrollOffset: scrollController.offset,
+              selectedMeasureItemMeta: selectedItemMeta);
+          Get.back<MoreMeasureBackResult>(result: result);
         } catch (e) {
           logger.e(
             "Item meta -[${item.displayName}] convert error; JSON-Text: ${item.itemMeta.toJson()}",
@@ -429,3 +445,15 @@ class MeasureItemCategoryModel {
     required this.items,
   });
 }
+
+/// 更多测量项弹窗返回值
+class MoreMeasureBackResult {
+  final int currModeIndex;
+  final double currScrollOffset;
+  final ItemMeta selectedMeasureItemMeta;
+  MoreMeasureBackResult({
+    required this.currModeIndex,
+    required this.currScrollOffset,
+    required this.selectedMeasureItemMeta,
+  });
+}