mobile_bottom_menu.dart 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. import 'package:fis_i18n/i18n.dart';
  2. import 'package:fis_measure/interfaces/enums/annotation.dart';
  3. import 'package:fis_measure/interfaces/process/items/item_metas.dart';
  4. import 'package:fis_measure/interfaces/process/items/types.dart';
  5. import 'package:fis_measure/interfaces/process/player/play_controller.dart';
  6. import 'package:fis_measure/interfaces/process/workspace/application.dart';
  7. import 'package:fis_measure/interfaces/process/workspace/mobile_measure_view_state_controller.dart';
  8. import 'package:fis_measure/process/workspace/measure_handler.dart';
  9. import 'package:fis_measure/view/mobile_view/controller/mobile_measure_view_state_controller.dart';
  10. import 'package:fis_measure/view/mobile_view/mobile_control_board/image_params_panel.dart';
  11. import 'package:fis_measure/view/mobile_view/mobile_control_board/mobile_control_board.dart';
  12. import 'package:fis_measure/view/mobile_view/mobile_control_board/next_btn.dart';
  13. import 'package:fis_measure/view/mobile_view/mobile_control_board/play_btn.dart';
  14. import 'package:fis_measure/view/mobile_view/mobile_control_board/prev_btn.dart';
  15. import 'package:fis_measure/view/mobile_view/widgets/icon_btn.dart';
  16. import 'package:fis_measure/view/player/control_board/control_board.dart';
  17. import 'package:fis_measure/view/player/control_board/operate_bar.dart';
  18. import 'package:fis_measure/view/player/controller.dart';
  19. import 'package:fis_measure/view/player/enums.dart';
  20. import 'package:fis_measure/view/player/events.dart';
  21. import 'package:flutter/material.dart';
  22. import 'package:get/get.dart';
  23. import 'package:vid/us/vid_us_image.dart';
  24. class MobileBottomMenu extends StatefulWidget {
  25. const MobileBottomMenu({
  26. Key? key,
  27. }) : super(key: key);
  28. @override
  29. State<StatefulWidget> createState() => _MobileBottomMenuState();
  30. }
  31. class _MobileBottomMenuState extends State<MobileBottomMenu> {
  32. final application = Get.find<IApplication>();
  33. late final measureHandler = Get.find<IMeasureHandler>();
  34. final mobileMeasureStateController =
  35. Get.find<MobileMeasureViewStateController>();
  36. late final playerController = Get.find<IPlayerController>();
  37. bool isCanMeasure = true;
  38. bool isCanAnnotation = true;
  39. /// vid 是否正在播放
  40. bool isVidPlaying = false;
  41. @override
  42. void initState() {
  43. mobileMeasureStateController.onModeChanged.addListener(_onViewModeChanged);
  44. if ((playerController as VidPlayerController).totalFramesCount > 1) {
  45. setState(() {
  46. singleFrame = false;
  47. ifShowProgressBar = true;
  48. });
  49. }
  50. playerController.firstFrameLoaded.addListener(_onFrameLoadedAfterFirst);
  51. playerController.eventHandler.addListener(_onVidPlayerEventHandler);
  52. super.initState();
  53. }
  54. @override
  55. void dispose() {
  56. mobileMeasureStateController.onModeChanged
  57. .removeListener(_onViewModeChanged);
  58. playerController.firstFrameLoaded.removeListener(_onFrameLoadedAfterFirst);
  59. playerController.eventHandler.removeListener(_onVidPlayerEventHandler);
  60. super.dispose();
  61. }
  62. void _onFrameLoadedAfterFirst(Object sender, VidUsImage? e) {
  63. if (!mounted) return;
  64. _initModeBtns();
  65. }
  66. /// 播放器事件处理
  67. void _onVidPlayerEventHandler(Object sender, VidPlayerEvent e) {
  68. if (e is VidPlayerStatusChangeEvent) {
  69. print('VidPlayerStatusChangeEvent: ${e.status}');
  70. switch (e.status) {
  71. case VidPlayStatus.play:
  72. setState(() {
  73. isVidPlaying = true;
  74. });
  75. break;
  76. case VidPlayStatus.pause:
  77. case VidPlayStatus.stop:
  78. setState(() {
  79. isVidPlaying = false;
  80. });
  81. break;
  82. default:
  83. setState(() {
  84. isVidPlaying = false;
  85. });
  86. break;
  87. }
  88. }
  89. }
  90. void _initModeBtns() {
  91. /// 是否允许测量(多幅vid屏蔽测量)
  92. if (application.isSingleFrame && application.visuals.length > 1) {
  93. isCanMeasure = false;
  94. setState(() {
  95. ifShowMeasureBtn = false;
  96. });
  97. } else {
  98. isCanMeasure = true;
  99. setState(() {
  100. ifShowMeasureBtn = true;
  101. });
  102. }
  103. /// 是否允许注释(第三方图像屏蔽注释入口)
  104. if (application.isThirdPart) {
  105. isCanAnnotation = false;
  106. setState(() {
  107. ifShowAnnotationBtn = false;
  108. });
  109. } else {
  110. isCanAnnotation = true;
  111. setState(() {
  112. ifShowAnnotationBtn = true;
  113. });
  114. }
  115. }
  116. bool singleFrame = true;
  117. bool ifShowProgressBar = false;
  118. bool ifShowMeasureBtn = true;
  119. bool ifShowAnnotationBtn = true;
  120. bool ifShowParamsPanel = false;
  121. final emptyItem = ItemMeta(
  122. "EmptyItem",
  123. measureType: MeasureTypes.Empty,
  124. description: "",
  125. outputs: [],
  126. );
  127. void _onViewModeChanged(Object s, MobileMeasureMode mode) {
  128. switch (mode) {
  129. case MobileMeasureMode.playerMode:
  130. setState(() {
  131. ifShowProgressBar = !singleFrame;
  132. ifShowMeasureBtn = isCanMeasure;
  133. ifShowAnnotationBtn = isCanAnnotation;
  134. });
  135. break;
  136. case MobileMeasureMode.measureMode:
  137. setState(() {
  138. ifShowProgressBar = false;
  139. ifShowMeasureBtn = false;
  140. ifShowAnnotationBtn = isCanAnnotation;
  141. });
  142. break;
  143. case MobileMeasureMode.annotationMode:
  144. setState(() {
  145. ifShowProgressBar = false;
  146. ifShowMeasureBtn = isCanMeasure;
  147. ifShowAnnotationBtn = false;
  148. });
  149. break;
  150. }
  151. }
  152. @override
  153. Widget build(BuildContext context) {
  154. return _buildVidPlayerBoard();
  155. }
  156. Widget _buildVidPlayerBoard() {
  157. return Stack(alignment: Alignment.bottomCenter, children: [
  158. ifShowProgressBar
  159. ? SizedBox(
  160. height: 150,
  161. child: MobileVidControlBoard(
  162. playerController as VidPlayerController,
  163. ),
  164. )
  165. : Container(),
  166. SizedBox(
  167. height: 75,
  168. child: Container(
  169. margin: const EdgeInsets.fromLTRB(40, 20, 20, 10),
  170. child: Row(
  171. children: [
  172. if (ifShowProgressBar) ...[
  173. SinglePrevButton(),
  174. const SinglePlayButton(),
  175. SingleNextButton(),
  176. const SizedBox(
  177. width: 20,
  178. ),
  179. Expanded(
  180. child: SizedBox(
  181. height: 1,
  182. width: MediaQuery.of(context).size.width,
  183. ),
  184. ),
  185. ],
  186. if (!isVidPlaying) ...[
  187. SingleIconButton(
  188. icon: Icons.tune,
  189. onPressed: () {
  190. setState(() {
  191. ifShowParamsPanel = !ifShowParamsPanel;
  192. });
  193. },
  194. ),
  195. ifShowMeasureBtn
  196. ? SingleIconButton(
  197. icon: Icons.straighten,
  198. onPressed: () {
  199. application.switchItem(emptyItem);
  200. mobileMeasureStateController.currentMeasureMode =
  201. MobileMeasureMode.measureMode;
  202. },
  203. )
  204. : Container(),
  205. ifShowAnnotationBtn
  206. ? SingleIconButton(
  207. icon: Icons.more,
  208. onPressed: () {
  209. measureHandler.changedAnnotationType =
  210. AnnotationType.label;
  211. application.switchAnnotation(AnnotationType.label);
  212. mobileMeasureStateController.currentMeasureMode =
  213. MobileMeasureMode.annotationMode;
  214. },
  215. )
  216. : Container(),
  217. ],
  218. if (ifShowProgressBar) ...[
  219. const SizedBox(
  220. width: 10,
  221. ),
  222. LocationInfo(),
  223. ]
  224. ],
  225. ),
  226. ),
  227. ),
  228. ifShowParamsPanel
  229. ? GestureDetector(
  230. onTap: () {
  231. setState(() {
  232. ifShowParamsPanel = false;
  233. });
  234. },
  235. )
  236. : Container(),
  237. ImageParamsPanel(
  238. ifShowPanel: ifShowParamsPanel,
  239. )
  240. ]);
  241. }
  242. }