Browse Source

fix bug 0009361 - review by Gavin

melon.yin 2 years ago
parent
commit
11ba0f4490

+ 0 - 1
.gitignore

@@ -33,7 +33,6 @@
 /pubspec.lock
 
 # Web related
-lib/generated_plugin_registrant.dart
 
 # Symbolication related
 app.*.symbols

+ 5 - 2
lib/interfaces/process/standard_line/pixel_space.dart

@@ -1,6 +1,6 @@
 class PixelSpacing {
-  double _physicalDeltaY = 1.0;
-  double _physicalDeltaX = 1.0;
+  double _physicalDeltaY = 0.0;
+  double _physicalDeltaX = 0.0;
 
   factory PixelSpacing.fill(double physicalDeltaX, double physicalDeltaY) {
     return PixelSpacing()
@@ -25,4 +25,7 @@ class PixelSpacing {
       _physicalDeltaY = val;
     }
   }
+
+  /// 是否为空数据
+  bool get isEmpty => _physicalDeltaX == 0 || _physicalDeltaY == 0;
 }

+ 21 - 0
lib/process/workspace/measure_handler.dart

@@ -92,6 +92,8 @@ abstract class IMeasureHandler {
 
   late FEventHandler<void> annotationsLoaded;
 
+  late final FEventHandler<bool> canMeasureDrawingChanged;
+
   /// 切换图像传递数据
   ChangeImageInfo get imageChanged;
   set imageChanged(ChangeImageInfo value);
@@ -123,6 +125,10 @@ abstract class IMeasureHandler {
   /// 工具面板状态
   bool get toolPanelState;
   set toolPanelState(bool value);
+
+  /// 测量是否可绘制
+  bool get canMeasureDrawing;
+  set canMeasureDrawing(bool value);
 }
 
 class MeasureHandler implements IMeasureHandler {
@@ -141,6 +147,8 @@ class MeasureHandler implements IMeasureHandler {
 
   bool _toolPanelState = true;
 
+  bool _canMeasureDrawing = true;
+
   AnnotationType _changedAnnotationType = AnnotationType.label;
   @override
   var onImageChanged = FEventHandler<ChangeImageInfo>();
@@ -178,6 +186,9 @@ class MeasureHandler implements IMeasureHandler {
   @override
   var annotationsLoaded = FEventHandler<void>();
 
+  @override
+  FEventHandler<bool> canMeasureDrawingChanged = FEventHandler<bool>();
+
   @override
   ChangeImageInfo get imageChanged => _imageChanged;
 
@@ -216,6 +227,16 @@ class MeasureHandler implements IMeasureHandler {
     }
   }
 
+  @override
+  bool get canMeasureDrawing => _canMeasureDrawing;
+  @override
+  set canMeasureDrawing(bool value) {
+    if (value != _canMeasureDrawing) {
+      _canMeasureDrawing = value;
+      canMeasureDrawingChanged.emit(this, _canMeasureDrawing);
+    }
+  }
+
   @override
   set changeImageLoaded(bool value) {
     if (value != _changeImageLoaded) {

+ 3 - 1
lib/process/workspace/third_part/calibration_controller.dart

@@ -64,7 +64,9 @@ class StandardLineCalibrationController
     standardLine.pixelLength = _getPixelLength();
     standardLine.physicsLength = physicalLength;
     _changeState(StandardLineCalibrationEditState.done);
-    _changeState(StandardLineCalibrationEditState.inactive);
+    Future.delayed(const Duration(milliseconds: 100), () {
+      _changeState(StandardLineCalibrationEditState.inactive);
+    });
   }
 
   @override

+ 3 - 1
lib/process/workspace/third_part/standard_line.dart

@@ -114,7 +114,9 @@ class StandardLine extends IStandardLine {
     } else {
       currentPixelSpacing = PixelSpacing();
     }
-    _initPixelLength();
+    if (currentPixelSpacing.isEmpty == false) {
+      _initPixelLength();
+    }
   }
 
   /// 加载初始参考线像素长度

+ 13 - 8
lib/view/measure/measure_main_view.dart

@@ -30,6 +30,7 @@ import 'package:fis_measure/view/paint/ai_patint_result.dart';
 import 'package:fis_measure/view/result/results_panel.dart';
 import 'package:fis_measure/view/standard_line/calibration_canvas.dart';
 import 'package:fis_measure/view/standard_line/calibration_gesture.dart';
+import 'package:fis_ui/base_define/page.dart';
 import 'package:fis_ui/index.dart';
 import 'package:fis_ui/widgets/layout/offstage.dart';
 import 'package:flutter/material.dart';
@@ -45,11 +46,14 @@ import 'package:fis_measure/view/player/controller.dart';
 import 'package:fis_measure/view/player/player.dart';
 import 'package:fis_measure/view/loadding/loadding.dart';
 
-class MeasureMainView extends StatefulWidget implements FWidget {
+class MeasureMainView extends StatefulWidget implements FPage {
   const MeasureMainView({Key? key}) : super(key: key);
 
   @override
   State<StatefulWidget> createState() => _MeasureMainViewState();
+
+  @override
+  String get pageName => "MeasureMainView";
 }
 
 class _MeasureMainViewState extends State<MeasureMainView> {
@@ -63,7 +67,7 @@ class _MeasureMainViewState extends State<MeasureMainView> {
   final measureData = Get.find<MeasureDataController>();
 
   late bool canMeasure = application.canMeasure;
-  bool get isToolPanelOpen => measureHandler.toolPanelState;
+  bool get canMeasureDrawing => measureHandler.canMeasureDrawing;
   late final aiPatintController = Get.find<AiPatintController>();
 
   late bool enableCarotid2DMeasure = false;
@@ -122,8 +126,8 @@ class _MeasureMainViewState extends State<MeasureMainView> {
     });
     vidPlayerController.errorOccured.addListener(_onErrorOccured);
     playerController.frameLoadStateChanged.addListener(_onLoadStateChanged);
-    measureHandler.onToolPanelStateChanged
-        .addListener(_onToolPanelStateChanged);
+    measureHandler.canMeasureDrawingChanged
+        .addListener(_onCanMeasureDrawingChanged);
   }
 
   @override
@@ -132,8 +136,8 @@ class _MeasureMainViewState extends State<MeasureMainView> {
     application.operateTypeChanged.removeListener(onOperateTypeChanged);
     measure3DViewController.updatePlayerMode.removeListener(_onModeChanged);
     playerController.frameLoadStateChanged.removeListener(_onLoadStateChanged);
-    measureHandler.onToolPanelStateChanged
-        .removeListener(_onToolPanelStateChanged);
+    measureHandler.canMeasureDrawingChanged
+        .removeListener(_onCanMeasureDrawingChanged);
     uninstallStandardLine();
     super.dispose();
   }
@@ -283,7 +287,7 @@ class _MeasureMainViewState extends State<MeasureMainView> {
     setState(() {});
   }
 
-  void _onToolPanelStateChanged(Object sender, bool e) {
+  void _onCanMeasureDrawingChanged(Object sender, bool e) {
     setState(() {});
   }
 
@@ -405,7 +409,7 @@ class _MeasureMainViewState extends State<MeasureMainView> {
                                     playerController as VidPlayerController,
                                   ),
                           ),
-                          if (canMeasure && isToolPanelOpen) ...[
+                          if (canMeasure && canMeasureDrawing) ...[
                             LayoutId(
                               id: _LayerLayoutIds.recordsCanvas,
                               child: const MeasureRecordsCanvasPanel(),
@@ -439,6 +443,7 @@ class _MeasureMainViewState extends State<MeasureMainView> {
                               child: FOffstage(
                                 offstage: isCaptureState,
                                 child: FMenuButtonGroup(
+                                  businessParent: widget,
                                   capturePng: () => capturePng(),
                                 ),
                               ),

+ 115 - 10
lib/view/measure/operate_type_change_button.dart

@@ -1,15 +1,20 @@
+import 'dart:async';
+
 import 'package:fis_i18n/i18n.dart';
 import 'package:fis_measure/interfaces/enums/annotation.dart';
 import 'package:fis_measure/interfaces/enums/operate.dart';
 import 'package:fis_measure/interfaces/process/player/play_controller.dart';
+import 'package:fis_measure/interfaces/process/standard_line/calibration.dart';
 import 'package:fis_measure/interfaces/process/workspace/application.dart';
 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';
+import 'package:fis_ui/base_define/page.dart';
 import 'package:fis_ui/index.dart';
 import 'package:flutter/material.dart';
 import 'package:get/get.dart';
@@ -18,7 +23,12 @@ import 'package:vid/us/vid_us_image.dart';
 
 /// 测量工具 注释工具 切换按钮
 class OperateTypeChangeButton extends StatefulWidget implements FWidget {
-  const OperateTypeChangeButton({super.key});
+  const OperateTypeChangeButton({
+    super.key,
+    required this.businessParent,
+  });
+
+  final FPage businessParent;
 
   @override
   State<OperateTypeChangeButton> createState() =>
@@ -70,10 +80,11 @@ class OperateTypeChangeButtonState extends State<OperateTypeChangeButton>
         operateButtonState = OperateButtonState.isAnnotation;
       });
     } else {
-      changeTypeTo(MeasureOperateType.measure);
-      setState(() {
-        isShowMeasureButton = true;
-        operateButtonState = OperateButtonState.isMeasure;
+      _enterMeasure(() {
+        measureHandler.toolPanelState = false;
+        setState(() {
+          operateButtonState = OperateButtonState.allClose;
+        });
       });
     }
   }
@@ -122,11 +133,8 @@ class OperateTypeChangeButtonState extends State<OperateTypeChangeButton>
         operateButtonState = OperateButtonState.allClose;
       });
     } else {
-      measureHandler.toolPanelState = true;
-      changeTypeTo(MeasureOperateType.measure);
-      setState(() {
-        operateButtonState = OperateButtonState.isMeasure;
-      });
+      final rollbackFn = _generateStatesRollbackFn();
+      _enterMeasure(rollbackFn);
     }
   }
 
@@ -145,6 +153,103 @@ class OperateTypeChangeButtonState extends State<OperateTypeChangeButton>
     }
   }
 
+  /// 进入测量
+  Future<void> _enterMeasure(VoidCallback rejectCallback) async {
+    _setEnterMeasureState(false); // 预进入
+
+    final checked = await _checkStandardLineNotEmpty();
+    if (checked) {
+      _setEnterMeasureState();
+    } else {
+      rejectCallback();
+    }
+  }
+
+  /// 检查第三方图像校准线信息是否空
+  Future<bool> _checkStandardLineNotEmpty() {
+    final application = Get.find<IApplication>();
+    if (application.isThirdPart) {
+      final standardLine = (application as ThirdPartApplication).standardLine;
+      if (standardLine.currentPixelSpacing.isEmpty) {
+        final completer = Completer<bool>();
+        FConfirmAlert.show(
+          context: context,
+          title: i18nBook.common.tip.t,
+          subTitle: i18nBook.measure.thirdImageNeedCalibratingTips.t,
+          businessParent: widget.businessParent,
+          onConfirm: () {
+            final calibrationController =
+                Get.find<IStandardLineCalibrationController>();
+
+            void onEditStateChanged(
+                Object _, StandardLineCalibrationEditState e) {
+              void finish(bool result) {
+                calibrationController.editStateChanged
+                    .removeListener(onEditStateChanged);
+                completer.complete(result);
+              }
+
+              if (e == StandardLineCalibrationEditState.done) {
+                finish(true);
+              } else if (e == StandardLineCalibrationEditState.inactive) {
+                finish(false);
+              } else {
+                // no process
+              }
+            }
+
+            // 开始监听
+            calibrationController.editStateChanged
+                .addListener(onEditStateChanged);
+
+            // 进入编辑
+            calibrationController.enterEditMode();
+          },
+          onCancel: () {
+            completer.complete(false);
+          },
+        );
+        return completer.future;
+      }
+    }
+    return Future.value(true);
+  }
+
+  /// 生成状态回滚函数
+  VoidCallback _generateStatesRollbackFn() {
+    final toolPanelStateSnapshot = measureHandler.toolPanelState;
+    final operateButtonStateSnapshot = operateButtonState;
+    final operateTypeSnapshot = measureHandler.currOperateType;
+    void fn() {
+      measureHandler.toolPanelState = toolPanelStateSnapshot;
+      changeTypeTo(operateTypeSnapshot);
+      setState(() {
+        operateButtonState = operateButtonStateSnapshot;
+      });
+    }
+
+    return fn;
+  }
+
+// 进入测量状态
+  void _setEnterMeasureState([bool showToolPanel = true]) {
+    if (measureHandler.toolPanelState != showToolPanel) {
+      measureHandler.toolPanelState = showToolPanel;
+    }
+    if (measureHandler.canMeasureDrawing == false) {
+      measureHandler.canMeasureDrawing = true;
+    }
+    if (measureHandler.currOperateType != MeasureOperateType.measure) {
+      changeTypeTo(MeasureOperateType.measure);
+    }
+    if (operateButtonState != OperateButtonState.isMeasure) {
+      setState(() {
+        isShowMeasureButton = true;
+        operateButtonState = OperateButtonState.isMeasure;
+      });
+    }
+  }
+
   bool get isCurrMeasure => operateButtonState == OperateButtonState.isMeasure;
   bool get isCurrAnnotation =>
       operateButtonState == OperateButtonState.isAnnotation;

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

@@ -13,6 +13,7 @@ import 'package:fis_measure/view/loadding/loadding.dart';
 import 'package:fis_measure/view/measure/operate_type_change_button.dart';
 import 'package:fis_measure/view/paint/ai_patint_controller.dart';
 import 'package:fis_measure/view/player/controller.dart';
+import 'package:fis_ui/base_define/page.dart';
 import 'package:fis_ui/index.dart';
 
 import 'package:flutter/material.dart';
@@ -24,8 +25,11 @@ class FMenuButtonGroup extends FStatefulWidget {
   const FMenuButtonGroup({
     Key? key,
     required this.capturePng,
+    required this.businessParent,
   }) : super(key: key);
 
+  final FPage businessParent;
+
   @override
   FState<FMenuButtonGroup> createState() => _FMenuButtonGroupState();
 }
@@ -118,7 +122,7 @@ class _FMenuButtonGroupState extends FState<FMenuButtonGroup> {
         i18nBook.measure.clear.t,
         () => application.clearRecords(),
       ),
-      const OperateTypeChangeButton(),
+      OperateTypeChangeButton(businessParent: widget.businessParent),
       _buildTitleButton(
         measureHandler.fullScreenState
             ? FIcons.fis_full_screen_reduction

+ 4 - 4
pubspec.lock

@@ -166,8 +166,8 @@ packages:
     dependency: "direct main"
     description:
       path: "."
-      ref: e2016d4
-      resolved-ref: e2016d4cf6514df16d0029cb5805b29719bbb11e
+      ref: "71bdfc1d72"
+      resolved-ref: "71bdfc1d72763b9e4ffbba2b3013d8feda76bb06"
       url: "http://git.ius.plus:88/Project-Wing/fis_lib_i18n.git"
     source: git
     version: "0.0.1"
@@ -175,8 +175,8 @@ packages:
     dependency: "direct main"
     description:
       path: "."
-      ref: c241544354
-      resolved-ref: c2415443542df53c78b271e74aff9f51abb8bc80
+      ref: a5257c2
+      resolved-ref: a5257c2fd655599d028714a7ac6d768c014689e1
       url: "http://git.ius.plus:88/Project-Wing/fis_lib_jsonrpc.git"
     source: git
     version: "0.0.1"

+ 2 - 2
pubspec.yaml

@@ -66,7 +66,7 @@ dependencies:
   fis_i18n:
     git:
       url: http://git.ius.plus:88/Project-Wing/fis_lib_i18n.git
-      ref: 822f4c037e
+      ref: 71bdfc1d72
   fis_lib_qrcode:
     git:
       url: http://git.ius.plus/jimmy.jiang/fis_lib_qrcode.git
@@ -96,7 +96,7 @@ dependency_overrides:
   fis_i18n:
     git:
       url: http://git.ius.plus:88/Project-Wing/fis_lib_i18n.git
-      ref: 9a7123b
+      ref: 71bdfc1d72
   fis_jsonrpc:
     git:
       url: http://git.ius.plus:88/Project-Wing/fis_lib_jsonrpc.git