import 'package:fis_i18n/i18n.dart'; import 'package:fis_measure/interfaces/enums/annotation.dart'; import 'package:fis_measure/interfaces/process/player/play_controller.dart'; import 'package:fis_measure/interfaces/process/workspace/application.dart'; import 'package:fis_measure/interfaces/process/workspace/mobile_measure_view_state_controller.dart'; import 'package:fis_measure/process/workspace/measure_handler.dart'; import 'package:fis_measure/view/mobile_view/controller/mobile_measure_view_state_controller.dart'; import 'package:fis_measure/view/mobile_view/mobile_control_board/image_params_panel.dart'; import 'package:fis_measure/view/mobile_view/mobile_control_board/mobile_control_board.dart'; import 'package:fis_measure/view/mobile_view/mobile_control_board/next_btn.dart'; import 'package:fis_measure/view/mobile_view/mobile_control_board/play_btn.dart'; import 'package:fis_measure/view/mobile_view/mobile_control_board/prev_btn.dart'; import 'package:fis_measure/view/mobile_view/widgets/icon_btn.dart'; import 'package:fis_measure/view/player/control_board/control_board.dart'; import 'package:fis_measure/view/player/control_board/operate_bar.dart'; import 'package:fis_measure/view/player/controller.dart'; import 'package:fis_measure/view/player/enums.dart'; import 'package:fis_measure/view/player/events.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:vid/us/vid_us_image.dart'; class MobileBottomMenu extends StatefulWidget { const MobileBottomMenu({ Key? key, }) : super(key: key); @override State createState() => _MobileBottomMenuState(); } class _MobileBottomMenuState extends State { final application = Get.find(); late final measureHandler = Get.find(); final mobileMeasureStateController = Get.find(); late final playerController = Get.find(); bool isCanMeasure = true; bool isCanAnnotation = true; /// vid 是否正在播放 bool isVidPlaying = false; @override void initState() { mobileMeasureStateController.onModeChanged.addListener(_onViewModeChanged); if ((playerController as VidPlayerController).totalFramesCount > 1) { setState(() { singleFrame = false; ifShowProgressBar = true; }); } playerController.firstFrameLoaded.addListener(_onFrameLoadedAfterFirst); playerController.eventHandler.addListener(_onVidPlayerEventHandler); super.initState(); } @override void dispose() { mobileMeasureStateController.onModeChanged .removeListener(_onViewModeChanged); playerController.firstFrameLoaded.removeListener(_onFrameLoadedAfterFirst); playerController.eventHandler.removeListener(_onVidPlayerEventHandler); super.dispose(); } void _onFrameLoadedAfterFirst(Object sender, VidUsImage? e) { if (!mounted) return; _initModeBtns(); } /// 播放器事件处理 void _onVidPlayerEventHandler(Object sender, VidPlayerEvent e) { if (e is VidPlayerStatusChangeEvent) { print('VidPlayerStatusChangeEvent: ${e.status}'); switch (e.status) { case VidPlayStatus.play: setState(() { isVidPlaying = true; }); break; case VidPlayStatus.pause: case VidPlayStatus.stop: setState(() { isVidPlaying = false; }); break; default: setState(() { isVidPlaying = false; }); break; } } } void _initModeBtns() { /// 是否允许测量(多幅vid屏蔽测量) if (application.isSingleFrame && application.visuals.length > 1) { isCanMeasure = false; setState(() { ifShowMeasureBtn = false; }); } else { isCanMeasure = true; setState(() { ifShowMeasureBtn = true; }); } /// 是否允许注释(第三方图像屏蔽注释入口) if (application.isThirdPart) { isCanAnnotation = false; setState(() { ifShowAnnotationBtn = false; }); } else { isCanAnnotation = true; setState(() { ifShowAnnotationBtn = true; }); } } bool singleFrame = true; bool ifShowProgressBar = false; bool ifShowMeasureBtn = true; bool ifShowAnnotationBtn = true; bool ifShowParamsPanel = false; void _onViewModeChanged(Object s, MobileMeasureMode mode) { switch (mode) { case MobileMeasureMode.playerMode: setState(() { ifShowProgressBar = !singleFrame; ifShowMeasureBtn = isCanMeasure; ifShowAnnotationBtn = isCanAnnotation; }); break; case MobileMeasureMode.measureMode: setState(() { ifShowProgressBar = false; ifShowMeasureBtn = false; ifShowAnnotationBtn = isCanAnnotation; }); break; case MobileMeasureMode.annotationMode: setState(() { ifShowProgressBar = false; ifShowMeasureBtn = isCanMeasure; ifShowAnnotationBtn = false; }); break; } } @override Widget build(BuildContext context) { return _buildVidPlayerBoard(); } Widget _buildVidPlayerBoard() { return Stack(alignment: Alignment.bottomCenter, children: [ ifShowProgressBar ? SizedBox( height: 150, child: MobileVidControlBoard( playerController as VidPlayerController, ), ) : Container(), SizedBox( height: 75, child: Container( margin: const EdgeInsets.fromLTRB(40, 20, 20, 10), child: Row( children: [ if (ifShowProgressBar) ...[ SinglePrevButton(), const SinglePlayButton(), SingleNextButton(), const SizedBox( width: 20, ), Expanded( child: SizedBox( height: 1, width: MediaQuery.of(context).size.width, ), ), ], if (!isVidPlaying) ...[ SingleIconButton( icon: Icons.tune, onPressed: () { setState(() { ifShowParamsPanel = !ifShowParamsPanel; }); }, ), ifShowMeasureBtn ? SingleIconButton( icon: Icons.straighten, onPressed: () { mobileMeasureStateController.currentMeasureMode = MobileMeasureMode.measureMode; }, ) : Container(), ifShowAnnotationBtn ? SingleIconButton( icon: Icons.more, onPressed: () { measureHandler.changedAnnotationType = AnnotationType.label; application.switchAnnotation(AnnotationType.label); mobileMeasureStateController.currentMeasureMode = MobileMeasureMode.annotationMode; }, ) : Container(), ], if (ifShowProgressBar) ...[ const SizedBox( width: 10, ), LocationInfo(), ] ], ), ), ), ifShowParamsPanel ? GestureDetector( onTap: () { setState(() { ifShowParamsPanel = false; }); }, ) : Container(), ImageParamsPanel( ifShowPanel: ifShowParamsPanel, ) ]); } }