measure_tool_panel.dart 8.0 KB

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