mobile_bottom_menu.dart 7.5 KB

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