瀏覽代碼

fix bug 0009361 - review by Gavin

melon.yin 2 年之前
父節點
當前提交
15e3393c10

+ 3 - 0
lib/interfaces/process/workspace/application.dart

@@ -161,4 +161,7 @@ abstract class IApplication {
 
   /// 清除所有操作记录
   void clearRecords();
+
+  /// 判断是否第三方图像且参考信息为空
+  bool checkIs3rdAndEmptyStandardLine();
 }

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

@@ -24,6 +24,7 @@ import 'package:vid/us/vid_us_image.dart';
 import 'package:vid/us/vid_us_probe.dart';
 import 'dart:math';
 import 'recorder.dart';
+import 'third_part/application.dart';
 import 'visual_loader.dart';
 
 class Application implements IApplication {
@@ -394,6 +395,15 @@ class Application implements IApplication {
     _updateRender();
   }
 
+  /// 判断是否第三方图像且参考信息为空
+  @override
+  bool checkIs3rdAndEmptyStandardLine() {
+    if (isThirdPart == false) return false;
+
+    final standardLine = (this as ThirdPartApplication).standardLine;
+    return standardLine.currentPixelSpacing.isEmpty;
+  }
+
   @protected
   List<IVisual> convertVisuals() {
     return VisualsLoader(frameData!.visuals).load();

+ 33 - 0
lib/process/workspace/measure_controller.dart

@@ -1,9 +1,12 @@
+import 'dart:async';
+
 import 'package:fis_i18n/i18n.dart';
 import 'package:fis_measure/interfaces/process/workspace/exam_info.dart';
 import 'package:fis_measure/interfaces/process/workspace/measure_controller.dart';
 import 'package:fis_measure/process/workspace/application.dart';
 import 'package:fis_measure/process/workspace/third_part/application.dart';
 import 'package:fis_measure/utils/prompt_box.dart';
+import 'package:fis_measure/view/measure/operate_type_change_button.dart';
 import 'package:fis_measure/view/player/controller.dart';
 import 'package:fis_measure/view/player/enums.dart';
 import 'package:fis_measure/view/player/events.dart';
@@ -12,6 +15,7 @@ import 'package:fis_measure/interfaces/process/workspace/application.dart';
 import 'package:fis_measure/interfaces/process/player/play_controller.dart';
 import 'package:fis_measure/interfaces/process/config/style_config.dart';
 import 'package:fis_common/event/event_type.dart';
+import 'package:flutter/widgets.dart';
 import 'package:get/get.dart';
 import 'package:vid/us/vid_us_image.dart';
 
@@ -26,6 +30,7 @@ class MeasureController implements IMeasureController {
   IPlayerController? _playerController;
   IApplication? _application;
   int _recursive = 0;
+  Timer? _tipsBtnGroupTimer;
 
   late final MeasureImagesFetchFunc _imagesFetchFunc;
   final measureData = Get.find<MeasureDataController>();
@@ -70,6 +75,7 @@ class MeasureController implements IMeasureController {
   @override
   void dispose() {
     examInfo.selectedImageChanged.removeListener(_onExamImageSelectedChanged);
+    _tipsBtnGroupTimer?.cancel();
     _playerController?.dispose();
     Get.delete<IApplication>();
     Get.delete<IPlayerController>();
@@ -160,6 +166,33 @@ class MeasureController implements IMeasureController {
   void _onPlayerEnvent(Object sender, VidPlayerEvent e) {
     if (e is VidPlayerStatusChangeEvent) {
       _application?.canMeasure = e.status == VidPlayStatus.pause;
+      _handleAutoEnterMeasure(e.status);
+    }
+  }
+
+  void _handleAutoEnterMeasure(VidPlayStatus status) {
+    if (status == VidPlayStatus.play || status == VidPlayStatus.pause) {
+      OperateTypeChangeButtonState? getState() {
+        final key = GlobalObjectKey(playerController.url);
+        final state = key.currentState as OperateTypeChangeButtonState?;
+        return state;
+      }
+
+      _tipsBtnGroupTimer?.cancel();
+      _tipsBtnGroupTimer = Timer.periodic(
+        const Duration(milliseconds: 100),
+        (timer) {
+          final state = getState();
+          if (state != null) {
+            timer.cancel();
+            if (status == VidPlayStatus.play) {
+              state.handleAutoExitMeasure();
+            } else {
+              state.handleAutoTapInMeasure();
+            }
+          }
+        },
+      );
     }
   }
 

+ 86 - 31
lib/view/measure/operate_type_change_button.dart

@@ -10,7 +10,6 @@ import 'package:fis_measure/interfaces/process/workspace/exam_info.dart';
 import 'package:fis_measure/process/workspace/measure_controller.dart';
 import 'package:fis_measure/process/workspace/measure_data_controller.dart';
 import 'package:fis_measure/process/workspace/measure_handler.dart';
-import 'package:fis_measure/process/workspace/third_part/application.dart';
 import 'package:fis_measure/view/measure/measure_view_controller.dart';
 import 'package:fis_measure/view/menu_button_group/menu_button_group.dart';
 import 'package:fis_measure/view/player/controller.dart';
@@ -18,7 +17,6 @@ import 'package:fis_ui/base_define/page.dart';
 import 'package:fis_ui/index.dart';
 import 'package:flutter/material.dart';
 import 'package:get/get.dart';
-import 'package:get/get_connect/http/src/utils/utils.dart';
 import 'package:vid/us/vid_us_image.dart';
 
 /// 测量工具 注释工具 切换按钮
@@ -44,6 +42,8 @@ class OperateTypeChangeButtonState extends State<OperateTypeChangeButton>
   // late TabController tabController;
   late final measureData = Get.find<MeasureDataController>();
   bool isShowMeasureButton = true;
+  bool is3rdVideoTappedMeasure = false; // 三方视频是否进入(or请求)过测量
+  bool isWaitingDrawStandardLine = false;
   OperateButtonState operateButtonState = OperateButtonState.isMeasure;
 
   /// 全部图片list
@@ -80,13 +80,23 @@ class OperateTypeChangeButtonState extends State<OperateTypeChangeButton>
         operateButtonState = OperateButtonState.isAnnotation;
       });
     } else {
-      _enterMeasure(() {
+      if (isWaitingDrawStandardLine) return;
+
+      if (application.checkIs3rdAndEmptyStandardLine()) {
+        // 第三方图像参考信息是空的,先关闭测量
         measureHandler.toolPanelState = false;
         measureHandler.canMeasureDrawing = false;
         setState(() {
           operateButtonState = OperateButtonState.allClose;
         });
-      });
+      } else {
+        changeTypeTo(MeasureOperateType.measure);
+        measureHandler.toolPanelState = true;
+        measureHandler.canMeasureDrawing = true;
+        setState(() {
+          operateButtonState = OperateButtonState.isMeasure;
+        });
+      }
     }
   }
 
@@ -124,6 +134,32 @@ class OperateTypeChangeButtonState extends State<OperateTypeChangeButton>
     playerController.firstFrameLoaded.addListener(_onFrameLoadedAfterFirst);
   }
 
+  /// 处理自动进入测量状态
+  void handleAutoTapInMeasure() {
+    if (isShowMeasureButton == false) {
+      enterAnnotation();
+      return;
+    }
+    final application = Get.find<IApplication>();
+    bool canEnterMeasure = true;
+    if (application.checkIs3rdAndEmptyStandardLine() &&
+        application.isSingleFrame == false &&
+        is3rdVideoTappedMeasure == true) {
+      // 校准信息为空,但不是首次进入,不再自动进入测量
+      canEnterMeasure = false;
+    }
+    if (canEnterMeasure) {
+      enterMeasure();
+    }
+  }
+
+  /// 处理自动退出测量状态
+  void handleAutoExitMeasure() {
+    if (Get.find<IApplication>().checkIs3rdAndEmptyStandardLine()) {
+      closeAll();
+    }
+  }
+
   @override
   void didUpdateWidget(covariant OperateTypeChangeButton oldWidget) {
     super.didUpdateWidget(oldWidget);
@@ -131,37 +167,57 @@ class OperateTypeChangeButtonState extends State<OperateTypeChangeButton>
 
   onTapMeasure() {
     if (operateButtonState == OperateButtonState.isMeasure) {
-      measureHandler.toolPanelState = false;
-      measureHandler.canMeasureDrawing = false;
-      setState(() {
-        operateButtonState = OperateButtonState.allClose;
-      });
+      closeAll();
     } else {
-      final rollbackFn = _generateStatesRollbackFn();
-      _enterMeasure(rollbackFn);
+      enterMeasure();
     }
   }
 
   onTapAnnotation() {
     if (operateButtonState == OperateButtonState.isAnnotation) {
-      measureHandler.toolPanelState = false;
-      measureHandler.canMeasureDrawing = false;
-      setState(() {
-        operateButtonState = OperateButtonState.allClose;
-      });
+      closeAll();
     } else {
-      measureHandler.toolPanelState = true;
-      measureHandler.canMeasureDrawing = true;
-      changeTypeTo(MeasureOperateType.annotation);
-      setState(() {
-        operateButtonState = OperateButtonState.isAnnotation;
-      });
+      enterAnnotation();
     }
   }
 
+  /// 进入注释
+  void enterAnnotation() {
+    measureHandler.toolPanelState = true;
+    measureHandler.canMeasureDrawing = true;
+    changeTypeTo(MeasureOperateType.annotation);
+    setState(() {
+      operateButtonState = OperateButtonState.isAnnotation;
+    });
+  }
+
   /// 进入测量
-  Future<void> _enterMeasure(VoidCallback rejectCallback) async {
-    _setEnterMeasureState(false); // 预进入
+  void enterMeasure() {
+    if (Get.find<IApplication>().checkIs3rdAndEmptyStandardLine()) {
+      VoidCallback rollbackFn;
+      if (operateButtonState == OperateButtonState.isAnnotation) {
+        rollbackFn = onTapAnnotation;
+      } else {
+        rollbackFn = closeAll;
+      }
+      _tryEnterMeasure(rollbackFn);
+    } else {
+      _tryEnterMeasure(() {});
+    }
+  }
+
+  closeAll() {
+    measureHandler.toolPanelState = false;
+    measureHandler.canMeasureDrawing = false;
+    setState(() {
+      operateButtonState = OperateButtonState.allClose;
+    });
+  }
+
+  /// 进入测量
+  Future<void> _tryEnterMeasure(VoidCallback rejectCallback) async {
+    isWaitingDrawStandardLine = true;
+    _setEnterMeasureState(); // 预进入
 
     final checked = await _checkMeasureCanEnter();
     if (checked) {
@@ -169,19 +225,18 @@ class OperateTypeChangeButtonState extends State<OperateTypeChangeButton>
     } else {
       rejectCallback();
     }
+    isWaitingDrawStandardLine = false;
   }
 
   /// 检查是否可进入测量
   Future<bool> _checkMeasureCanEnter() {
     final application = Get.find<IApplication>();
-    if (application.isThirdPart) {
-      final standardLine = (application as ThirdPartApplication).standardLine;
-      if (standardLine.currentPixelSpacing.isEmpty) {
-        // 第三方图像 像素比信息空,需要通过校准线校准
-        return _waitStandardLineDone();
-      }
+    if (application.checkIs3rdAndEmptyStandardLine()) {
+      // 第三方图像 像素比信息空,需要通过校准线校准
+      return _waitStandardLineDone();
+    } else {
+      return Future.value(true);
     }
-    return Future.value(true);
   }
 
   /// 等待校准线完成

+ 4 - 1
lib/view/menu_button_group/menu_button_group.dart

@@ -122,7 +122,10 @@ class _FMenuButtonGroupState extends FState<FMenuButtonGroup> {
         i18nBook.measure.clear.t,
         () => application.clearRecords(),
       ),
-      OperateTypeChangeButton(businessParent: widget.businessParent),
+      OperateTypeChangeButton(
+        key: GlobalObjectKey(playerController.url),
+        businessParent: widget.businessParent,
+      ),
       _buildTitleButton(
         measureHandler.fullScreenState
             ? FIcons.fis_full_screen_reduction