measure_controller.dart 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. import 'package:fis_measure/interfaces/process/workspace/exam_info.dart';
  2. import 'package:fis_measure/interfaces/process/workspace/measure_controller.dart';
  3. import 'package:fis_measure/process/workspace/application.dart';
  4. import 'package:fis_measure/process/workspace/third_part/application.dart';
  5. import 'package:fis_measure/view/player/controller.dart';
  6. import 'package:fis_measure/view/player/enums.dart';
  7. import 'package:fis_measure/view/player/events.dart';
  8. import 'package:fis_vid/data_host/data_host.dart';
  9. import 'package:fis_measure/interfaces/process/workspace/application.dart';
  10. import 'package:fis_measure/interfaces/process/player/play_controller.dart';
  11. import 'package:fis_measure/interfaces/process/config/style_config.dart';
  12. import 'package:fis_common/event/event_type.dart';
  13. import 'package:flutter/foundation.dart';
  14. import 'package:get/get.dart';
  15. import 'package:vid/us/vid_us_image.dart';
  16. import 'package:fis_vid_ext/vid_extended_data.dart';
  17. typedef MeasureImagesFetchFunc = Future<List<ExamImageInfo>> Function(
  18. String code);
  19. class MeasureController implements IMeasureController {
  20. late final ExamInfo _examInfo;
  21. VidDataHost? _vidDataHost;
  22. IPlayerController? _playerController;
  23. IApplication? _application;
  24. late final MeasureImagesFetchFunc _imagesFetchFunc;
  25. MeasureController(String code,
  26. {required MeasureImagesFetchFunc imagesFetchFunc}) {
  27. _examInfo = ExamInfo(code);
  28. _imagesFetchFunc = imagesFetchFunc;
  29. }
  30. @override
  31. ExamInfo get examInfo => _examInfo;
  32. @override
  33. String get currentVidUrl => examInfo.selectedImage.url;
  34. @override
  35. VidDataHost get dataHost => _vidDataHost!;
  36. @override
  37. bool get canDoMeasure => playerController.status == VidPlayStatus.pause;
  38. @override
  39. IPlayerController get playerController => _playerController!;
  40. @override
  41. // TODO: implement styleConfiguration
  42. IStyeConfiguration get styleConfiguration => throw UnimplementedError();
  43. @override
  44. IApplication get workingApplication => _application!;
  45. @override
  46. var imageLoaded = FEventHandler<ExamImageInfo?>();
  47. @override
  48. Future<void> load() async {
  49. final images = await _imagesFetchFunc.call(examInfo.code);
  50. examInfo.images.addAll(images);
  51. examInfo.selectedImageChanged.addListener(_onExamImageSelectedChanged);
  52. // // 加载第一张图像
  53. // examInfo.selectedImageIndex = 0;
  54. }
  55. @override
  56. void dispose() {
  57. examInfo.selectedImageChanged.removeListener(_onExamImageSelectedChanged);
  58. _playerController?.dispose();
  59. Get.delete<IApplication>();
  60. Get.delete<IPlayerController>();
  61. _vidDataHost?.release();
  62. }
  63. void _onExamImageSelectedChanged(Object sender, int index) {
  64. final url = currentVidUrl;
  65. _playerController?.dispose();
  66. _vidDataHost?.frameLoaded.dispose();
  67. Get.delete<IPlayerController>();
  68. Get.delete<IApplication>();
  69. _vidDataHost = VidDataHost(url);
  70. _playerController =
  71. Get.put<IPlayerController>(VidPlayerController(dataHost: dataHost));
  72. dataHost.frameLoaded.addListener(_onFrameLoaded);
  73. playerController.load().then((_) async {
  74. if (playerController.status != VidPlayStatus.ready) {
  75. throw FlutterError("Vid file load fail.");
  76. }
  77. playerController.eventHandler.addListener(_onPlayerEnvent);
  78. // 构建应用
  79. await _buildApplication();
  80. // 立即播放
  81. Future.delayed(const Duration(milliseconds: 100), () {
  82. playerController.play();
  83. });
  84. // 通知图像加载完成
  85. imageLoaded.emit(sender, examInfo.selectedImage);
  86. });
  87. }
  88. void _onFrameLoaded(Object sender, VidUsImage frame) {
  89. workingApplication.loadFrame(frame);
  90. }
  91. void _onPlayerEnvent(Object sender, VidPlayerEvent e) {
  92. if (e is VidPlayerStatusChangeEvent) {
  93. workingApplication.canOperate = e.status == VidPlayStatus.pause;
  94. }
  95. }
  96. Future<void> _buildApplication() async {
  97. final is3rd = dataHost.probe.name == Application.C_VID_THIRDPART_NAME;
  98. IApplication app;
  99. if (is3rd) {
  100. final vidData = await dataHost.getData();
  101. app = ThirdPartApplication(dataHost.probe, vidData!.extendedData);
  102. } else {
  103. app = Application(dataHost.probe);
  104. }
  105. _application = Get.put<IApplication>(app);
  106. }
  107. }