import 'package:fis_i18n/i18n.dart'; import 'package:fis_jsonrpc/rpc.dart'; import 'package:fis_measure/interfaces/enums/annotation.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/exam_info.dart'; import 'package:fis_measure/interfaces/process/workspace/measure_3d_view_controller.dart'; import 'package:fis_measure/process/layout/configuration.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/view/cursor.dart'; import 'package:fis_measure/view/gesture/positioned_cursor.dart'; import 'package:fis_measure/view/measure/measure_left_annotation.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/tool_chest_title.dart'; import 'package:fis_measure/view/mobile_view/mobile_measure_main_view.dart'; import 'package:fis_measure/view/player/control_board/operate_bar.dart'; import 'package:fis_ui/index.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:flutter/services.dart'; /// 测量主页面 class MobileMeasureMainPage extends StatefulWidget implements FWidget { const MobileMeasureMainPage( this.token, this.recordCode, this.patientCode, this.remedicalCode, {Key? key}) : super(key: key); final String token; final String patientCode; final String remedicalCode; final String recordCode; @override State createState() => _MobileMeasureMainPageState(); } class _MobileMeasureMainPageState extends State { /// 数据 final measureData = Get.find(); late final application = Get.find(); // final mouseState = Get.put(MouseState()); /// 页面loadding bool loaded = false; // /// 图片loadding late bool imageLoaded = false; ///检查图片信息表 List examImageInfoList = []; late final measureHandler = Get.find(); /// 测量控制器 late MeasureController measureController = Get.put(MeasureController( "", imagesFetchFunc: (code) async { return examImageInfoList; }, )); /// 获取测量图片所需的图片组 并且写入控制器中 加载 void getExamImageInfoList(List remedicals) async { for (var element in remedicals) { examImageInfoList.add( ExamImageInfo( element.terminalImages!.imageUrl!, element.terminalImages!.previewUrl!, ), ); } measureController = Get.put(MeasureController( "", imagesFetchFunc: (code) async { return examImageInfoList; }, )); await measureController.load(); int selectedImageIndex = -1; if (examImageInfoList .any((element) => element.url == measureData.itemCurrentImage)) { ExamImageInfo selectedImage = examImageInfoList.firstWhere( (element) => element.url == measureData.itemCurrentImage, ); selectedImageIndex = examImageInfoList.indexOf(selectedImage); measureController.examInfo.selectedImageIndex = selectedImageIndex; } } void changeImage(sender, e) { imageLoaded = e; setState(() {}); } @override void initState() { SystemChrome.setPreferredOrientations([ DeviceOrientation.landscapeLeft, //全屏时旋转方向,左边 ]); SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersive); SystemChrome.setSystemUIChangeCallback((systemOverlaysAreVisible) async { await Future.delayed(const Duration(seconds: 1)); SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersive); }); measureHandler.onChangeImageLoaded.addListener(changeImage); loadLayoutConfig(); getImageInfo(); super.initState(); } void getImageInfo() { measureData.measureImageData = MeasureImageData( patientCode: widget.patientCode, recordCode: widget.recordCode, remedicalCode: widget.remedicalCode, ); } /// 加载图像布局配置 void loadLayoutConfig() async { await LayoutConfiguration.ins.loadData(); setState(() { // 加载图像数据 _initData(); }); } void onImageLoaded(Object sender, ExamImageInfo? e) async { // measureHandler.changeImageLoaded = true; if (!mounted) return; final currentImage = measureData.remedicalList.firstWhereOrNull( (element) => element.terminalImages!.imageUrl == e!.url, ); if (currentImage != null) { /// 获取图片详细信息 var remedicalInfo = await measureData.getImageInfo( currentImage.remedicalCode ?? '', widget.token, ); if (remedicalInfo != null) { measureData.aiResults = remedicalInfo.diagnosisResult ?? ''; /// ai 良恶性 判断是否有ai measureData.diagnosisConclusion = remedicalInfo.diagnosisConclusion; if (remedicalInfo.carotidResult != null) { } else {} try { if (e != null) { Future.delayed(const Duration(milliseconds: 100), () { measureController.playerController.play(); }); setState(() { loaded = true; measureHandler.changeImageLoaded = false; }); } } catch (error) { setState(() { loaded = true; measureHandler.changeImageLoaded = false; }); } } } } @override void dispose() { SystemChrome.setPreferredOrientations([ DeviceOrientation.portraitUp, ]); SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: SystemUiOverlay.values); SystemChrome.setSystemUIChangeCallback((systemOverlaysAreVisible) async { // do nothing }); measureHandler.onChangeImageLoaded.removeListener(changeImage); super.dispose(); } @override FWidget build(BuildContext context) { FWidget body; if (!loaded) { const loadingWidget = FCenter(child: FCircularProgressIndicator()); body = FRow( children: const [ FExpanded( child: loadingWidget, ), ], ); } else { body = FRow( children: [ FExpanded( child: FColumn( mainAxisSize: MainAxisSize.max, children: [ FExpanded( child: imageLoaded ? const FCenter( child: FCircularProgressIndicator(), ) : MobileMeasureMainView( key: ValueKey(measureData.itemCurrentImage), ), ) ], ), ), ], ); } return FCenter( child: FContainer( color: Colors.black, child: body, ), ); } MeasureCursorType _getMeasureSystemSettingCursorType( CursorTypeEnum cursorType, ) { switch (cursorType) { case CursorTypeEnum.CursorType1Icon: return MeasureCursorType.cursor01; case CursorTypeEnum.CursorType2Icon: return MeasureCursorType.cursor02; case CursorTypeEnum.CursorType3Icon: return MeasureCursorType.cursor03; case CursorTypeEnum.CursorType4Icon: return MeasureCursorType.cursor04; case CursorTypeEnum.CursorType5Icon: return MeasureCursorType.cursor05; default: return MeasureCursorType.cursor01; } } /// 初始化卡尺样式部分 // Future _getMeasureSystemSetting() async { // final result = await measureData.getMeasureSystemSettingAsync(); // measureData.measureSystemSetting = result as MeasureSystemSettingDTO; // mouseState.cursorType = _getMeasureSystemSettingCursorType( // measureData.measureSystemSetting.cursorType); // mouseState.cursorSize = // measureData.measureSystemSetting.cursorSize as double; // } void _initData() async { List remedicals = []; loaded = false; var value = await measureData.getRemedicalList.call( widget.patientCode, widget.recordCode, widget.token, ); for (var remedicalItemList in value) { remedicals.addAll(remedicalItemList.remedicalList ?? []); } /// 获取样式 // _getMeasureSystemSetting(); measureData.remedicalList = remedicals; var remedicalInfo = await measureData.getImageInfo.call(widget.remedicalCode, widget.token); if (remedicalInfo != null) { measureData.aiResults = remedicalInfo.diagnosisResult ?? ''; if (remedicalInfo.terminalImages != null) { loaded = true; measureData.itemCurrentImage = remedicalInfo.terminalImages!.imageUrl ?? ''; getExamImageInfoList(remedicals); } } measureController.imageLoaded.removeListener(onImageLoaded); measureController.imageLoaded.addListener(onImageLoaded); } } /// 测量左边操作页面 class _MeasureLeftBoard extends StatefulWidget implements FWidget { @override State<_MeasureLeftBoard> createState() => _MeasureLeftBoardState(); } class _MeasureLeftBoardState extends State<_MeasureLeftBoard> { final measureHandler = Get.find(); late final application = Get.find(); final playerController = Get.find(); // final measure3DViewController = Get.find(); /// 是否显示颈动脉2D指定的测量项 bool showCarotid2DSelectMeasure = false; /// 是否显示测量项 bool showMeasureItems = true; bool get isMeasureTool => measureHandler.changedTab == TagEnum.MeasureTool; bool get isArrowMeasureAnnotationType => measureHandler.changedAnnotationType == AnnotationType.arrow; void onChangedTab( Object sender, TagEnum? e, ) { setState(() {}); } @override void initState() { measureHandler.onChangedTab.addListener(onChangedTab); super.initState(); } @override void dispose() { measureHandler.onChangedTab.removeListener(onChangedTab); super.dispose(); } @override FWidget build(BuildContext context) { return FColumn( mainAxisSize: MainAxisSize.max, crossAxisAlignment: CrossAxisAlignment.start, children: [ const LeftSiderHold(), if (!isMeasureTool) ...[ FExpanded( child: FContainer( width: 300, key: UniqueKey(), child: const MeasureLeftAnnotation(), ), ), // _MeasureArrow(), ] else ...[ FExpanded( child: showMeasureItems ? FContainer( width: 300, key: UniqueKey(), child: showCarotid2DSelectMeasure ? const CarotidLeftSiderSelectMeasure() : const LeftSiderSelectMeasure(), ) : FContainer(), ), const OperateBar(), ] ], ); } }