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/workspace/application.dart'; import 'package:fis_measure/interfaces/process/workspace/measure_3d_view_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/measure_3d_view_controller.dart'; import 'package:fis_measure/view/measure/arrow_annotation_button.dart'; import 'package:fis_measure/view/measure/drag_delete_area.dart'; import 'package:fis_measure/view/measure/measure_left_annotation.dart'; import 'package:fis_measure/view/measure/measure_search_input.dart'; import 'package:fis_measure/view/measure/measure_tool.dart'; import 'package:fis_measure/view/measure/carotid_measure_tool.dart'; import 'package:fis_measure/view/measure/measure_tools_title.dart'; import 'package:fis_measure/view/measure/measure_view_controller.dart'; import 'package:fis_measure/view/measure/operate_type_change_button.dart'; import 'package:fis_measure/view/measure/measure_panel_head.dart'; import 'package:fis_ui/index.dart'; import 'package:fis_ui/interface/interactive_container.dart'; import 'package:fis_ui/widgets/layout/offstage.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; /// 测量左侧工具面板 class MeasureToolPanel extends StatefulWidget implements FInteractiveContainer { const MeasureToolPanel({Key? key}) : super(key: key); @override final String pageName = 'MeasureLeftBoard'; @override State createState() => MeasureToolPanelState(); } class MeasureToolPanelState extends State { final measureHandler = Get.find(); final playerController = Get.find(); final measure3DViewController = Get.find(); /// 数据 late final measureData = Get.find(); /// 测量项控制器 final measureMetaController = Get.find(); /// 是否显示颈动脉2D指定的测量项 bool showCarotid2DSelectMeasure = false; /// 是否为魔盒的Vid bool isThirdPart = Get.find().isThirdPart; /// 是否显示测量项 bool hideMeasureItems = false; /// 是否正在拖拽 bool isDragging = false; bool isMeasureTool = true; bool get isArrowMeasureAnnotationType => measureHandler.changedAnnotationType == AnnotationType.arrow; MeasureOperateType currOperateType = MeasureOperateType.measure; void _onOperateTypeChanged( Object sender, MeasureOperateType e, ) { setState(() { currOperateType = e; }); } void _onCurItemMetaListChanged(sender, e) { if (mounted) { setState(() {}); } } ///图像发生变化 void _onChangeImage(sender, e) { final application = Get.find(); setState(() { isThirdPart = application.isThirdPart; }); } /// 拖拽状态发生改变 _onDragStateChanged(Object sender, bool e) { setState(() { isDragging = e; }); } @override void initState() { measureHandler.onOperateTypeChanged.addListener(_onOperateTypeChanged); measure3DViewController.updatePlayerMode.addListener(_onModeChanged); measureData.curItemMetaListChanged.addListener(_onCurItemMetaListChanged); measureHandler.onChangeImageLoaded.addListener(_onChangeImage); measureHandler.onDragStateChanged.addListener(_onDragStateChanged); super.initState(); } @override void dispose() { measureHandler.onOperateTypeChanged.removeListener(_onOperateTypeChanged); measure3DViewController.updatePlayerMode.removeListener(_onModeChanged); measureData.curItemMetaListChanged .removeListener(_onCurItemMetaListChanged); measureHandler.onChangeImageLoaded.removeListener(_onChangeImage); measureHandler.onDragStateChanged.removeListener(_onDragStateChanged); super.dispose(); } /// 模式改变触发更新 void _onModeChanged(Object s, MeasureMode mode) { switch (mode) { case MeasureMode.vidMode: final playerController = Get.find(); // 通过帧加载完成事件通知,去更新测量项 if (playerController.currentFrame != null) { playerController.firstFrameLoaded .emit(this, playerController.currentFrame!); } setState(() { showCarotid2DSelectMeasure = false; hideMeasureItems = false; }); break; case MeasureMode.carotid2DMode: setState(() { showCarotid2DSelectMeasure = true; hideMeasureItems = false; }); break; case MeasureMode.carotid3DMode: setState(() { showCarotid2DSelectMeasure = true; hideMeasureItems = true; }); break; } } bool get hideMeasureTab => (currOperateType == MeasureOperateType.annotation); bool get hideCommentTab => !hideMeasureTab; @override FWidget build(BuildContext context) { final newPlayerController = Get.find(); return FColumn( mainAxisSize: MainAxisSize.max, crossAxisAlignment: CrossAxisAlignment.start, children: [ FOffstage( offstage: hideMeasureItems, child: LeftSiderHold( ifHideConfig: showCarotid2DSelectMeasure || isThirdPart), ), FOffstage( offstage: hideMeasureItems || hideCommentTab, child: FContainer( width: 300, key: UniqueKey(), child: const LeftSelectInput(), ), ), FOffstage( offstage: hideMeasureItems || hideMeasureTab, child: const LeftMeasureTools(), ), FExpanded( child: FStack( fit: StackFit.passthrough, children: [ FOffstage( offstage: hideMeasureItems || hideMeasureTab, child: FContainer( width: 300, child: showCarotid2DSelectMeasure ? const CarotidLeftSiderSelectMeasure() : FContainer( key: Key(newPlayerController.url), child: const LeftSiderSelectMeasure()), ), ), FOffstage( offstage: hideMeasureItems || hideCommentTab, child: FContainer( width: 300, key: UniqueKey(), child: const MeasureLeftAnnotation(), ), ), ], ), ), FOffstage( offstage: hideMeasureItems || hideCommentTab || !isDragging, child: const DragDeleteArea(), ), FOffstage( offstage: hideMeasureItems || hideCommentTab || isDragging, child: const ArrowAnnotationButton()), FOffstage( offstage: !hideMeasureItems, child: FContainer( width: 300, child: FCenter( child: FElevatedButton( name: "backToVidMode", businessParent: widget, onPressed: () => measure3DViewController.backToVidMode(), child: FText( i18nBook.measure.vidMode.t, style: const TextStyle(color: Colors.white), ), ), ), ), ), ], ); } }