item.dart 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. import 'package:fis_common/event/event_type.dart';
  2. import 'package:fis_measure/interfaces/enums/items.dart';
  3. import 'package:fis_measure/interfaces/process/calculators/calculator.dart';
  4. import 'package:fis_measure/interfaces/process/items/item.dart';
  5. import 'package:fis_measure/interfaces/process/items/item_feature.dart';
  6. import 'package:fis_measure/interfaces/process/items/item_metas.dart';
  7. import 'package:fis_measure/interfaces/process/workspace/application.dart';
  8. import 'package:fis_measure/interfaces/process/workspace/point_info.dart';
  9. import 'package:flutter/foundation.dart';
  10. import 'package:get/get.dart';
  11. import 'item_feature.dart';
  12. import 'top_item.dart';
  13. abstract class MeasureItem<T extends MeasureItemFeature> extends IMeasureItem {
  14. late final ItemMeta _meta;
  15. late final IMeasureItem? _parent;
  16. ItemStates _state = ItemStates.waiting;
  17. ICalculator? _calculator;
  18. T? _feature;
  19. final List<T> _measuredFeatures = [];
  20. final application = Get.find<IApplication>();
  21. MeasureItem(ItemMeta meta, [IMeasureItem? parent]) {
  22. _parent = parent;
  23. _meta = meta;
  24. }
  25. @override
  26. String get displayName {
  27. if (briefAnnotation.isNotEmpty) {
  28. return briefAnnotation;
  29. }
  30. if (description.isNotEmpty) {
  31. return description;
  32. }
  33. return meta.name;
  34. }
  35. @override
  36. String get briefAnnotation => meta.briefAnnotation;
  37. @override
  38. String get description => meta.description;
  39. @override
  40. T? get feature => _feature;
  41. @protected
  42. set feature(T? value) {
  43. if (value != _feature) {
  44. _feature = value;
  45. }
  46. }
  47. @override
  48. ICalculator? get calculator => _calculator;
  49. @protected
  50. set calculator(ICalculator? value) {
  51. if (value != _calculator) {
  52. _calculator = value;
  53. }
  54. }
  55. @override
  56. IMeasureItem? get parent => _parent;
  57. @override
  58. ItemMeta get meta => _meta;
  59. @override
  60. ItemStates get state => _state;
  61. @protected
  62. set state(ItemStates value) {
  63. if (value != _state) {
  64. _state = value;
  65. }
  66. }
  67. @override
  68. double get scaleRatio => application.displayScaleRatio;
  69. @override
  70. late final featureUpdated = FEventHandler<IMeasureItemFeature?>();
  71. @override
  72. bool execute(PointInfo args) {
  73. bool hasFeatureBefore = feature != null;
  74. bool result = false;
  75. if (state == ItemStates.waiting ||
  76. state == ItemStates.running ||
  77. state == ItemStates.finished ||
  78. state == ItemStates.idle) {
  79. switch (args.pointType) {
  80. case PointInfoType.mouseUp:
  81. case PointInfoType.mouseDown:
  82. case PointInfoType.mouseMove:
  83. result = onExecuteMouse(args);
  84. break;
  85. case PointInfoType.touchUp:
  86. case PointInfoType.touchDown:
  87. case PointInfoType.touchMove:
  88. result = onExecuteTouch(args);
  89. break;
  90. }
  91. }
  92. if (result) {
  93. /// 未创建测量,不通知刷新
  94. if (feature == null && !hasFeatureBefore) return result;
  95. /// 通知刷新
  96. doFeatureUpdate();
  97. }
  98. return result;
  99. }
  100. @override
  101. void clear() {
  102. feature = null;
  103. if (calculator != null) {
  104. calculator!.finishOnce();
  105. }
  106. measuredFeatures.clear();
  107. }
  108. @override
  109. void finishOnce() {
  110. doFeatureFinish();
  111. }
  112. @override
  113. void cancelOnce() {
  114. if (this is TopMeasureItem) {
  115. final that = this as TopMeasureItem;
  116. for (var item in that.childItems) {
  117. item.cancelOnce();
  118. item.measuredFeatures.clear();
  119. }
  120. that.switchChild(0);
  121. }
  122. feature = null;
  123. state = ItemStates.waiting;
  124. onCancelingOnce();
  125. doFeatureUpdate();
  126. }
  127. @protected
  128. void onCancelingOnce() {}
  129. @protected
  130. void doFeatureUpdate() {
  131. featureUpdated.emit(this, feature);
  132. }
  133. @protected
  134. void doFeatureFinish() {
  135. if (feature != null) {
  136. feature!.isActive = false;
  137. measuredFeatures.add(feature!);
  138. calculator?.finishOnce();
  139. }
  140. feature = null;
  141. state = ItemStates.finished;
  142. }
  143. @protected
  144. void doCalculate() {
  145. calculator?.calculate();
  146. }
  147. @protected
  148. bool onExecuteMouse(PointInfo args);
  149. @protected
  150. bool onExecuteTouch(PointInfo args);
  151. @override
  152. List<T> get measuredFeatures => _measuredFeatures;
  153. @override
  154. int assignId() {
  155. return application.recorder.newRecordId();
  156. }
  157. }