|
@@ -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;
|