configuration.dart 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. import 'dart:convert';
  2. import 'package:fis_common/logger/logger.dart';
  3. import 'package:fis_measure/interfaces/date_types/rect.dart';
  4. import 'package:fis_measure/interfaces/enums/display_mode.dart';
  5. import 'package:fis_measure/interfaces/enums/visual_area_type.dart';
  6. import 'package:fis_measure/interfaces/mode_names.dart';
  7. import 'package:fis_measure/process/layout/layout_config_json.dart';
  8. import 'package:fis_measure/values/strings.dart';
  9. import 'package:flutter/services.dart';
  10. import 'section.dart';
  11. import 'view_port.dart';
  12. /// 视图布局配置
  13. class LayoutConfiguration {
  14. static LayoutConfiguration? _instance;
  15. /// 单例
  16. static LayoutConfiguration get ins {
  17. _instance ??= LayoutConfiguration();
  18. return _instance!;
  19. }
  20. bool _loaded = false;
  21. final List<LayoutSection> _layoutSections = [];
  22. /// 是否已加载
  23. bool get loaded => _loaded;
  24. LayoutConfiguration();
  25. /// 加载数据
  26. Future<void> loadData() async {
  27. try {
  28. if (loaded) return;
  29. // String jsonText =
  30. // await rootBundle.loadString(MeasureStrings.LayoutConfigurationAsset);
  31. final map = jsonDecode(LayoutConfigurationJSON);
  32. final sections = map['LayoutSections'] as List<dynamic>;
  33. _loadSections(sections);
  34. _loaded = true;
  35. } catch (e) {
  36. logger.e("[Measure] init LayoutConfiguration error", e);
  37. }
  38. }
  39. void _loadSections(List<dynamic> sections) {
  40. for (final item in sections) {
  41. final Map<String, dynamic> map = item;
  42. _layoutSections.add(LayoutSection.fromJson(map));
  43. }
  44. if (_layoutSections.isEmpty) {
  45. throw ArgumentError(
  46. "Layout configuration error: LayoutSection not found.");
  47. }
  48. }
  49. /// 获取 AreaType区域
  50. ///
  51. /// [section] 配置名
  52. ///
  53. /// [areaType] 区域类型
  54. ///
  55. /// [displayFormat] 显示模式
  56. DRect getRect(
  57. String section,
  58. VisualAreaTypeEnum areaType,
  59. DisplayModeEnum displayFormat,
  60. ) {
  61. final mode = _findVisualAreaMode(areaType);
  62. final viewPort = _matchViewPort(section, mode, displayFormat);
  63. final rect = DRect(
  64. viewPort.left / 100,
  65. viewPort.top / 100,
  66. (viewPort.right - viewPort.left) / 100,
  67. (viewPort.bottom - viewPort.top) / 100,
  68. );
  69. return rect;
  70. }
  71. LayoutViewPort _matchViewPort(
  72. String section,
  73. String mode,
  74. DisplayModeEnum displayFormat,
  75. ) {
  76. bool found = false;
  77. LayoutViewPort viewPort = LayoutViewPort();
  78. List<LayoutSection> sections = [];
  79. final sectionIdx = _layoutSections.indexWhere((x) => x.name == section);
  80. if (sectionIdx > -1) {
  81. sections.add(_layoutSections[sectionIdx]);
  82. }
  83. sections.add(_layoutSections[0]);
  84. for (final candidate in sections) {
  85. final layoutIdx = candidate.layouts.indexWhere((x) => x.mode == mode);
  86. if (layoutIdx > -1) {
  87. final layout = candidate.layouts[layoutIdx];
  88. int i = -1;
  89. while (++i < layout.viewPorts.length) {
  90. if (layout.viewPorts[i].displayFormat == displayFormat) {
  91. break;
  92. }
  93. }
  94. if (i == layout.viewPorts.length) {
  95. i = 0;
  96. }
  97. viewPort = layout.viewPorts[i];
  98. found = true;
  99. break;
  100. }
  101. }
  102. if (!found) {
  103. logger.w(
  104. "MatchViewPort failed, ViewPort:$viewPort is used. layout section:$section, mode:$mode, display format:${displayFormat.name}.");
  105. }
  106. return viewPort;
  107. }
  108. String _findVisualAreaMode(VisualAreaTypeEnum areaType) {
  109. switch (areaType) {
  110. case VisualAreaTypeEnum.tissue:
  111. case VisualAreaTypeEnum.flow:
  112. return ModeNames.B;
  113. case VisualAreaTypeEnum.timeMotion:
  114. case VisualAreaTypeEnum.tissueTimeMotion:
  115. return ModeNames.TM;
  116. case VisualAreaTypeEnum.doppler:
  117. return ModeNames.Doppler;
  118. case VisualAreaTypeEnum.trace:
  119. return ModeNames.Trace;
  120. case VisualAreaTypeEnum.colorbar:
  121. return ModeNames.P_ColorBar;
  122. case VisualAreaTypeEnum.tissue3D:
  123. return ModeNames.FourD;
  124. case VisualAreaTypeEnum.sweiReliableColorBar:
  125. return ModeNames.P_SweiReliableColorBar;
  126. }
  127. }
  128. }