item.dart 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  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. @override
  137. void update() {
  138. if (feature == null) return;
  139. doFeatureUpdate();
  140. }
  141. @protected
  142. void onCancelingOnce() {}
  143. @protected
  144. void doFeatureUpdate() {
  145. featureUpdated.emit(this, feature);
  146. }
  147. @protected
  148. void doFeatureFinish() {
  149. if (feature != null) {
  150. feature!.isActive = false;
  151. measuredFeatures.add(feature!);
  152. calculator?.finishOnce();
  153. }
  154. feature = null;
  155. state = ItemStates.finished;
  156. }
  157. @protected
  158. void doCalculate() {
  159. calculator?.calculate();
  160. }
  161. /// 拖动目标是否超出区域
  162. @protected
  163. bool isMoveTargetOutOfRange(PointInfo args) {
  164. if (args.hostVisualArea == null) {
  165. return false;
  166. }
  167. if (args.hostVisualArea!.displayRegion.containsPoint(args)) {
  168. return false;
  169. }
  170. return true;
  171. }
  172. @protected
  173. bool onExecuteMouse(PointInfo args);
  174. @protected
  175. bool onExecuteTouch(PointInfo args);
  176. @override
  177. List<T> get measuredFeatures => _measuredFeatures;
  178. @override
  179. int assignId() {
  180. return application.recorder.newRecordId();
  181. }
  182. }