item.dart 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  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. featureUpdated = FEventHandler<IMeasureItemFeature?>();
  25. }
  26. @override
  27. String get displayName {
  28. if (briefAnnotation.isNotEmpty) {
  29. return briefAnnotation;
  30. }
  31. if (description.isNotEmpty) {
  32. return description;
  33. }
  34. return meta.name;
  35. }
  36. @override
  37. String get briefAnnotation => meta.briefAnnotation;
  38. @override
  39. String get description => meta.description;
  40. @override
  41. T? get feature => _feature;
  42. @protected
  43. set feature(T? value) {
  44. if (value != _feature) {
  45. _feature = value;
  46. }
  47. }
  48. @override
  49. ICalculator? get calculator => _calculator;
  50. @protected
  51. set calculator(ICalculator? value) {
  52. if (value != _calculator) {
  53. _calculator = value;
  54. }
  55. }
  56. @override
  57. IMeasureItem? get parent => _parent;
  58. @override
  59. ItemMeta get meta => _meta;
  60. @override
  61. ItemStates get state => _state;
  62. @protected
  63. set state(ItemStates value) {
  64. if (value != _state) {
  65. _state = value;
  66. onItemStatesChanged.emit(this, value);
  67. }
  68. }
  69. @override
  70. double get scaleRatio => application.displayScaleRatio;
  71. @override
  72. bool get finishAfterUnactive => true;
  73. @override
  74. bool get repeatableEditable => false;
  75. @override
  76. late final FEventHandler<IMeasureItemFeature?> featureUpdated;
  77. @override
  78. final FEventHandler<ItemStates?> onItemStatesChanged =
  79. FEventHandler<ItemStates?>();
  80. @override
  81. bool execute(PointInfo args) {
  82. bool hasFeatureBefore = feature != null;
  83. bool result = false;
  84. if (state == ItemStates.waiting ||
  85. state == ItemStates.running ||
  86. state == ItemStates.finished ||
  87. state == ItemStates.idle) {
  88. switch (args.pointType) {
  89. case PointInfoType.mouseUp:
  90. case PointInfoType.mouseDown:
  91. case PointInfoType.mouseMove:
  92. result = onExecuteMouse(args);
  93. break;
  94. case PointInfoType.touchUp:
  95. case PointInfoType.touchDown:
  96. case PointInfoType.touchMove:
  97. result = onExecuteTouch(args);
  98. break;
  99. }
  100. }
  101. if (result) {
  102. /// 未创建测量,不通知刷新
  103. if (feature == null && !hasFeatureBefore) return result;
  104. /// 通知刷新
  105. doFeatureUpdate();
  106. }
  107. return result;
  108. }
  109. @override
  110. void clear() {
  111. feature = null;
  112. if (calculator != null) {
  113. calculator!.finishOnce();
  114. }
  115. measuredFeatures.clear();
  116. }
  117. @override
  118. void finishOnce() {
  119. doFeatureFinish();
  120. }
  121. @override
  122. void cancelOnce() {
  123. if (this is TopMeasureItem) {
  124. final that = this as TopMeasureItem;
  125. for (var item in that.childItems) {
  126. item.cancelOnce();
  127. item.measuredFeatures.clear();
  128. }
  129. that.switchChild(0);
  130. }
  131. feature = null;
  132. state = ItemStates.waiting;
  133. onCancelingOnce();
  134. doFeatureUpdate();
  135. }
  136. @protected
  137. void onCancelingOnce() {}
  138. @protected
  139. void doFeatureUpdate() {
  140. featureUpdated.emit(this, feature);
  141. }
  142. @protected
  143. void doFeatureFinish() {
  144. if (feature != null) {
  145. feature!.isActive = false;
  146. measuredFeatures.add(feature!);
  147. calculator?.finishOnce();
  148. }
  149. feature = null;
  150. state = ItemStates.finished;
  151. }
  152. @protected
  153. void doCalculate() {
  154. calculator?.calculate();
  155. }
  156. @protected
  157. bool onExecuteMouse(PointInfo args);
  158. @protected
  159. bool onExecuteTouch(PointInfo args);
  160. @override
  161. List<T> get measuredFeatures => _measuredFeatures;
  162. @override
  163. int assignId() {
  164. return application.recorder.newRecordId();
  165. }
  166. }