mobile_bottom_menu.dart 7.8 KB

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