measure_tool_panel.dart 7.4 KB

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