measure_tool_panel.dart 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. import 'package:fis_i18n/i18n.dart';
  2. import 'package:fis_measure/interfaces/enums/annotation.dart';
  3. import 'package:fis_measure/interfaces/enums/operate.dart';
  4. import 'package:fis_measure/interfaces/process/player/play_controller.dart';
  5. import 'package:fis_measure/interfaces/process/workspace/application.dart';
  6. import 'package:fis_measure/interfaces/process/workspace/measure_3d_view_controller.dart';
  7. import 'package:fis_measure/process/workspace/measure_data_controller.dart';
  8. import 'package:fis_measure/process/workspace/measure_handler.dart';
  9. import 'package:fis_measure/process/workspace/measure_3d_view_controller.dart';
  10. import 'package:fis_measure/view/measure/arrow_annotation_button.dart';
  11. import 'package:fis_measure/view/measure/drag_delete_area.dart';
  12. import 'package:fis_measure/view/measure/measure_left_annotation.dart';
  13. import 'package:fis_measure/view/measure/measure_search_input.dart';
  14. import 'package:fis_measure/view/measure/measure_tool.dart';
  15. import 'package:fis_measure/view/measure/carotid_measure_tool.dart';
  16. import 'package:fis_measure/view/measure/measure_tools_title.dart';
  17. import 'package:fis_measure/view/measure/measure_view_controller.dart';
  18. import 'package:fis_measure/view/measure/operate_type_change_button.dart';
  19. import 'package:fis_measure/view/measure/measure_panel_head.dart';
  20. import 'package:fis_ui/index.dart';
  21. import 'package:fis_ui/interface/interactive_container.dart';
  22. import 'package:fis_ui/widgets/layout/offstage.dart';
  23. import 'package:flutter/material.dart';
  24. import 'package:get/get.dart';
  25. /// 测量左侧工具面板
  26. class MeasureToolPanel extends StatefulWidget implements FInteractiveContainer {
  27. const MeasureToolPanel({Key? key}) : super(key: key);
  28. @override
  29. final String pageName = 'MeasureLeftBoard';
  30. @override
  31. State<MeasureToolPanel> createState() => MeasureToolPanelState();
  32. }
  33. class MeasureToolPanelState extends State<MeasureToolPanel> {
  34. final measureHandler = Get.find<MeasureHandler>();
  35. final playerController = Get.find<IPlayerController>();
  36. final measure3DViewController = Get.find<Measure3DViewController>();
  37. /// 数据
  38. late final measureData = Get.find<MeasureDataController>();
  39. /// 测量项控制器
  40. final measureMetaController = Get.find<MeasureMetaController>();
  41. /// 是否显示颈动脉2D指定的测量项
  42. bool showCarotid2DSelectMeasure = false;
  43. /// 是否为魔盒的Vid
  44. bool isThirdPart = Get.find<IApplication>().isThirdPart;
  45. /// 是否显示测量项
  46. bool hideMeasureItems = false;
  47. /// 是否正在拖拽
  48. bool isDragging = false;
  49. bool isMeasureTool = true;
  50. double _width = 300;
  51. bool get isArrowMeasureAnnotationType =>
  52. measureHandler.changedAnnotationType == AnnotationType.arrow;
  53. MeasureOperateType currOperateType = MeasureOperateType.measure;
  54. void _onOperateTypeChanged(
  55. Object sender,
  56. MeasureOperateType e,
  57. ) {
  58. setState(() {
  59. currOperateType = e;
  60. });
  61. }
  62. void _onCurItemMetaListChanged(sender, e) {
  63. if (mounted) {
  64. setState(() {});
  65. }
  66. }
  67. ///图像发生变化
  68. void _onChangeImage(sender, e) {
  69. final application = Get.find<IApplication>();
  70. setState(() {
  71. isThirdPart = application.isThirdPart;
  72. });
  73. }
  74. /// 拖拽状态发生改变
  75. _onDragStateChanged(Object sender, bool e) {
  76. setState(() {
  77. isDragging = e;
  78. });
  79. }
  80. @override
  81. void initState() {
  82. measureHandler.onOperateTypeChanged.addListener(_onOperateTypeChanged);
  83. measure3DViewController.updatePlayerMode.addListener(_onModeChanged);
  84. measureData.curItemMetaListChanged.addListener(_onCurItemMetaListChanged);
  85. measureHandler.onChangeImageLoaded.addListener(_onChangeImage);
  86. measureHandler.onDragStateChanged.addListener(_onDragStateChanged);
  87. super.initState();
  88. }
  89. @override
  90. void dispose() {
  91. measureHandler.onOperateTypeChanged.removeListener(_onOperateTypeChanged);
  92. measure3DViewController.updatePlayerMode.removeListener(_onModeChanged);
  93. measureData.curItemMetaListChanged
  94. .removeListener(_onCurItemMetaListChanged);
  95. measureHandler.onChangeImageLoaded.removeListener(_onChangeImage);
  96. measureHandler.onDragStateChanged.removeListener(_onDragStateChanged);
  97. super.dispose();
  98. }
  99. /// 模式改变触发更新
  100. void _onModeChanged(Object s, MeasureMode mode) {
  101. switch (mode) {
  102. case MeasureMode.vidMode:
  103. final playerController = Get.find<IPlayerController>();
  104. // 通过帧加载完成事件通知,去更新测量项
  105. if (playerController.currentFrame != null) {
  106. playerController.firstFrameLoaded
  107. .emit(this, playerController.currentFrame!);
  108. }
  109. setState(() {
  110. showCarotid2DSelectMeasure = false;
  111. hideMeasureItems = false;
  112. });
  113. break;
  114. case MeasureMode.carotid2DMode:
  115. setState(() {
  116. showCarotid2DSelectMeasure = true;
  117. hideMeasureItems = false;
  118. });
  119. break;
  120. case MeasureMode.carotid3DMode:
  121. setState(() {
  122. showCarotid2DSelectMeasure = true;
  123. hideMeasureItems = true;
  124. });
  125. break;
  126. }
  127. }
  128. bool get hideMeasureTab => (currOperateType == MeasureOperateType.annotation);
  129. bool get hideCommentTab => !hideMeasureTab;
  130. @override
  131. FWidget build(BuildContext context) {
  132. final newPlayerController = Get.find<IPlayerController>();
  133. final mediaQuery = MediaQuery.of(context);
  134. ///屏幕缩放比例
  135. final devicePixelRatio = mediaQuery.devicePixelRatio;
  136. _width = 300 / devicePixelRatio;
  137. return FColumn(
  138. mainAxisSize: MainAxisSize.max,
  139. crossAxisAlignment: CrossAxisAlignment.start,
  140. children: [
  141. FOffstage(
  142. offstage: hideMeasureItems,
  143. child: LeftSiderHold(
  144. ifHideConfig: showCarotid2DSelectMeasure || isThirdPart),
  145. ),
  146. FOffstage(
  147. offstage: hideMeasureItems || hideCommentTab,
  148. child: FContainer(
  149. width: _width,
  150. key: UniqueKey(),
  151. child: const LeftSelectInput(),
  152. ),
  153. ),
  154. FOffstage(
  155. offstage: hideMeasureItems || hideMeasureTab,
  156. child: const LeftMeasureTools(),
  157. ),
  158. FExpanded(
  159. child: FStack(
  160. fit: StackFit.passthrough,
  161. children: [
  162. FOffstage(
  163. offstage: hideMeasureItems || hideMeasureTab,
  164. child: FContainer(
  165. width: _width,
  166. child: showCarotid2DSelectMeasure
  167. ? const CarotidLeftSiderSelectMeasure()
  168. : FContainer(
  169. key: Key(newPlayerController.url),
  170. child: const LeftSiderSelectMeasure()),
  171. ),
  172. ),
  173. FOffstage(
  174. offstage: hideMeasureItems || hideCommentTab,
  175. child: FContainer(
  176. width: _width,
  177. key: UniqueKey(),
  178. child: const MeasureLeftAnnotation(),
  179. ),
  180. ),
  181. ],
  182. ),
  183. ),
  184. FOffstage(
  185. offstage: hideMeasureItems || hideCommentTab || !isDragging,
  186. child: const DragDeleteArea(),
  187. ),
  188. FOffstage(
  189. offstage: hideMeasureItems || hideCommentTab || isDragging,
  190. child: const ArrowAnnotationButton()),
  191. FOffstage(
  192. offstage: !hideMeasureItems,
  193. child: FContainer(
  194. width: _width,
  195. child: FCenter(
  196. child: FElevatedButton(
  197. name: "backToVidMode",
  198. businessParent: widget,
  199. onPressed: () => measure3DViewController.backToVidMode(),
  200. child: FText(
  201. i18nBook.measure.videoMode.t,
  202. style: const TextStyle(color: Colors.white),
  203. ),
  204. ),
  205. ),
  206. ),
  207. ),
  208. ],
  209. );
  210. }
  211. }