top_item.dart 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. import 'package:fis_common/event/event_type.dart';
  2. import 'package:fis_measure/interfaces/process/items/item.dart';
  3. import 'package:fis_measure/interfaces/process/items/item_metas.dart';
  4. import 'package:fis_measure/interfaces/process/workspace/point_info.dart';
  5. import 'package:flutter/foundation.dart';
  6. import 'item.dart';
  7. import 'item_feature.dart';
  8. abstract class TopMeasureItem<T extends MeasureItemFeature>
  9. extends MeasureItem<T> implements ITopMeasureItem {
  10. final List<IMeasureItem> _childItems = [];
  11. int _childIndex = 0;
  12. bool get ifAutoFinish => false;
  13. TopMeasureItem(ItemMeta meta) : super(meta) {
  14. workingChildChanged = FEventHandler<int>();
  15. }
  16. @override
  17. List<IMeasureItem> get childItems => _childItems;
  18. @override
  19. IMeasureItem get workingChild => _childItems[_childIndex];
  20. /// 子项全部完成
  21. @protected
  22. bool get childrenAllDone =>
  23. _childItems.every((e) => e.measuredFeatures.isNotEmpty);
  24. @override
  25. late final FEventHandler<int> workingChildChanged;
  26. @override
  27. void switchChild(int index) {
  28. if (index == _childIndex) return;
  29. _childIndex = index;
  30. workingChildChanged.emit(this, index);
  31. }
  32. T buildFeature();
  33. @override
  34. bool onExecuteMouse(PointInfo args) {
  35. if (args.pointType == PointInfoType.mouseDown) {
  36. if (feature == null) {
  37. feature = buildFeature();
  38. listenChildrenUpdate();
  39. }
  40. if (childrenAllDone) {
  41. workingChild.clear();
  42. }
  43. }
  44. feature?.hostVisualArea = args.hostVisualArea;
  45. final result = workingChild.execute(args);
  46. if (result) {
  47. doCalculate();
  48. }
  49. //TODO:[Gavin] Sometimes Need Auto Finish
  50. if (ifAutoFinish) {
  51. if (args.pointType == PointInfoType.mouseDown) {
  52. if (childrenAllDone) {
  53. print("此时应该结束测量");
  54. }
  55. }
  56. }
  57. return result;
  58. }
  59. @override
  60. bool onExecuteTouch(PointInfo args) {
  61. return workingChild.execute(args);
  62. }
  63. @protected
  64. void nextChild() {
  65. final count = _childItems.length;
  66. int nextIdx = -1;
  67. for (var i = 0; i < count; i++) {
  68. final child = _childItems[i];
  69. if (child.measuredFeatures.isEmpty) {
  70. nextIdx = i;
  71. break;
  72. }
  73. }
  74. if (nextIdx > -1) {
  75. switchChild(nextIdx);
  76. }
  77. }
  78. @protected
  79. void listenChildrenUpdate() {
  80. for (var item in childItems) {
  81. item.featureUpdated.addListener((sender, e) {
  82. _onChildFeatureUpdated();
  83. });
  84. }
  85. }
  86. void _onChildFeatureUpdated() {
  87. if (workingChild.measuredFeatures.isNotEmpty) {
  88. nextChild();
  89. }
  90. doFeatureUpdate();
  91. }
  92. }