Jelajahi Sumber

fix(measure): 修正移动端进入注释模式后无法再测量 #0014202

gavin.chen 1 tahun lalu
induk
melakukan
7c71c60ea0

+ 26 - 0
lib/process/workspace/application.dart

@@ -6,6 +6,7 @@ import 'package:fis_measure/interfaces/process/annotations/annotation.dart';
 import 'package:fis_measure/interfaces/process/items/item.dart';
 import 'package:fis_measure/interfaces/process/items/item_feature.dart';
 import 'package:fis_measure/interfaces/process/items/item_metas.dart';
+import 'package:fis_measure/interfaces/process/items/types.dart';
 import 'package:fis_measure/interfaces/process/visuals/visual_area.dart';
 import 'package:fis_measure/interfaces/process/visuals/visual.dart';
 import 'package:fis_measure/interfaces/process/viewports/viewport.dart';
@@ -47,6 +48,13 @@ class Application implements IApplication {
   final Set<IAnnotationItem> _annotationItems = {};
   late final _recorder = MeasureRecorder(this);
 
+  final emptyItem = ItemMeta(
+    "EmptyItem",
+    measureType: MeasureTypes.Empty,
+    description: "",
+    outputs: [],
+  );
+
   Application(VidUsProbe probe) {
     _probe = probe;
     currentModeChanged = FEventHandler<IMode>();
@@ -331,6 +339,8 @@ class Application implements IApplication {
 
   @override
   void switchAnnotation([AnnotationType? type, String? text]) {
+    _handleBeforeExitMeasure();
+    switchItem(emptyItem);
     _updateOperateType(MeasureOperateType.annotation);
     final targetType = type ?? AnnotationType.input;
     if (activeAnnotationItem != null &&
@@ -434,6 +444,22 @@ class Application implements IApplication {
     }
   }
 
+  // 离开测量模式前处理
+  void _handleBeforeExitMeasure() {
+    if (activeMeasureItem == null) return;
+    final item = activeMeasureItem!;
+    if (item is TopMeasureItem && item.feature != null) {
+      bool isAllEmpty =
+          item.childItems.every((e) => e.measuredFeatures.isEmpty);
+      if (isAllEmpty) {
+        _recorder.undoOnce();
+      }
+    }
+    if (item.feature != null) {
+      _recorder.undoOnce();
+    }
+  }
+
   void _clearFrameCache() {
     _recorder.clear();
     _annotationItems.clear();

+ 9 - 0
lib/view/mobile_view/mobile_bottom_menu.dart

@@ -1,5 +1,7 @@
 import 'package:fis_i18n/i18n.dart';
 import 'package:fis_measure/interfaces/enums/annotation.dart';
+import 'package:fis_measure/interfaces/process/items/item_metas.dart';
+import 'package:fis_measure/interfaces/process/items/types.dart';
 import 'package:fis_measure/interfaces/process/player/play_controller.dart';
 import 'package:fis_measure/interfaces/process/workspace/application.dart';
 import 'package:fis_measure/interfaces/process/workspace/mobile_measure_view_state_controller.dart';
@@ -128,6 +130,12 @@ class _MobileBottomMenuState extends State<MobileBottomMenu> {
   bool ifShowMeasureBtn = true;
   bool ifShowAnnotationBtn = true;
   bool ifShowParamsPanel = false;
+  final emptyItem = ItemMeta(
+    "EmptyItem",
+    measureType: MeasureTypes.Empty,
+    description: "",
+    outputs: [],
+  );
 
   void _onViewModeChanged(Object s, MobileMeasureMode mode) {
     switch (mode) {
@@ -203,6 +211,7 @@ class _MobileBottomMenuState extends State<MobileBottomMenu> {
                     ? SingleIconButton(
                         icon: Icons.straighten,
                         onPressed: () {
+                          application.switchItem(emptyItem);
                           mobileMeasureStateController.currentMeasureMode =
                               MobileMeasureMode.measureMode;
                         },

+ 3 - 3
lib/view/mobile_view/mobile_measure_main_view.dart

@@ -80,7 +80,7 @@ class _MobileMeasureMainViewState extends State<MobileMeasureMainView> {
   IStandardLineCalibrationController? standardLineCalibrationController;
 
   final playerKey = GlobalKey();
-  final _ImageCaptureAreakey = GlobalKey();
+  final _imageCaptureAreakey = GlobalKey();
 
   bool get inAnnotation =>
       application.currentOperateType == MeasureOperateType.annotation;
@@ -178,7 +178,7 @@ class _MobileMeasureMainViewState extends State<MobileMeasureMainView> {
       );
       await Future.delayed(const Duration(milliseconds: 10), () async {
         final RenderRepaintBoundary? boundary =
-            _ImageCaptureAreakey.currentContext?.findRenderObject()
+            _imageCaptureAreakey.currentContext?.findRenderObject()
                 as RenderRepaintBoundary?;
 
         if (boundary != null) {
@@ -377,7 +377,7 @@ class _MobileMeasureMainViewState extends State<MobileMeasureMainView> {
           alignment: Alignment.bottomCenter,
           children: [
             RepaintBoundary(
-              key: _ImageCaptureAreakey,
+              key: _imageCaptureAreakey,
               child: CustomMultiChildLayout(
                 delegate: _LayerLayoutDelegate(),
                 children: [