configuration.dart 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. import 'package:fis_common/logger/logger.dart';
  2. import 'package:fis_measure/interfaces/date_types/rect.dart';
  3. import 'package:fis_measure/interfaces/enums/display_mode.dart';
  4. import 'package:fis_measure/interfaces/enums/visual_area_type.dart';
  5. import 'package:fis_measure/interfaces/mode_names.dart';
  6. import 'section.dart';
  7. import 'view_port.dart';
  8. class LayoutConfiguration {
  9. static LayoutConfiguration? _instance;
  10. static LayoutConfiguration get ins {
  11. _instance ??= LayoutConfiguration();
  12. return _instance!;
  13. }
  14. bool _loaded = false;
  15. final List<LayoutSection> _layoutSections = [];
  16. bool get loaded => _loaded;
  17. LayoutConfiguration();
  18. void loadData(List<dynamic> data) {
  19. for (final item in data) {
  20. final Map<String, dynamic> map = item;
  21. _layoutSections.add(LayoutSection.fromJson(map));
  22. }
  23. if (_layoutSections.isEmpty) {
  24. throw ArgumentError(
  25. "Layout configuration error: LayoutSection not found.");
  26. }
  27. _loaded = true;
  28. }
  29. DRect getRect(
  30. String section,
  31. VisualAreaTypeEnum areaType,
  32. DisplayModeEnum displayFormat,
  33. ) {
  34. String mode;
  35. switch (areaType) {
  36. case VisualAreaTypeEnum.tissue:
  37. case VisualAreaTypeEnum.flow:
  38. mode = ModeNames.B;
  39. break;
  40. case VisualAreaTypeEnum.timeMotion:
  41. case VisualAreaTypeEnum.tissueTimeMotion:
  42. mode = ModeNames.TM;
  43. break;
  44. case VisualAreaTypeEnum.doppler:
  45. mode = ModeNames.Doppler;
  46. break;
  47. case VisualAreaTypeEnum.trace:
  48. mode = ModeNames.Trace;
  49. break;
  50. case VisualAreaTypeEnum.colorbar:
  51. mode = ModeNames.P_ColorBar;
  52. break;
  53. case VisualAreaTypeEnum.tissue3D:
  54. mode = ModeNames.FourD;
  55. break;
  56. case VisualAreaTypeEnum.sweiReliableColorBar:
  57. mode = ModeNames.P_SweiReliableColorBar;
  58. break;
  59. }
  60. final viewPort = _matchViewPort(section, mode, displayFormat);
  61. final rect = DRect(
  62. viewPort.left / 100,
  63. viewPort.top / 100,
  64. (viewPort.right - viewPort.left) / 100,
  65. (viewPort.bottom - viewPort.top) / 100);
  66. return rect;
  67. }
  68. LayoutViewPort _matchViewPort(
  69. String name,
  70. String layoutKey,
  71. DisplayModeEnum displayFormat,
  72. ) {
  73. bool found = false;
  74. LayoutViewPort viewPort = LayoutViewPort();
  75. List<LayoutSection> sections = [];
  76. final sectionIdx = _layoutSections.indexWhere((x) => x.key == name);
  77. if (sectionIdx > -1) {
  78. sections.add(_layoutSections[sectionIdx]);
  79. }
  80. sections.add(_layoutSections[0]);
  81. for (final candidate in sections) {
  82. final layoutIdx = candidate.layouts.indexWhere((x) => x.key == layoutKey);
  83. if (layoutIdx > -1) {
  84. final layout = candidate.layouts[layoutIdx];
  85. int i = -1;
  86. while (++i < layout.viewPorts.length) {
  87. if (layout.viewPorts[i].displayFormat == displayFormat) {
  88. break;
  89. }
  90. }
  91. if (i == layout.viewPorts.length) {
  92. i = 0;
  93. }
  94. viewPort = layout.viewPorts[i];
  95. found = true;
  96. break;
  97. }
  98. }
  99. if (!found) {
  100. logger.w(
  101. "MatchViewPort failed, ViewPort:$viewPort is used. layout section:$name, layout key:$layoutKey, display format:${displayFormat.name}.");
  102. }
  103. return viewPort;
  104. }
  105. }