top_item.dart 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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. TopMeasureItem(ItemMeta meta) : super(meta) {
  13. workingChildChanged = FEventHandler<int>();
  14. }
  15. @override
  16. List<IMeasureItem> get childItems => _childItems;
  17. @override
  18. IMeasureItem get workingChild => _childItems[_childIndex];
  19. /// 子项全部完成
  20. @protected
  21. bool get childrenAllDone =>
  22. _childItems.every((e) => e.measuredFeatures.isNotEmpty);
  23. @override
  24. late final FEventHandler<int> workingChildChanged;
  25. @override
  26. void switchChild(int index) {
  27. if (index == _childIndex) return;
  28. _childIndex = index;
  29. workingChildChanged.emit(this, index);
  30. }
  31. T buildFeature();
  32. @override
  33. bool onExecuteMouse(PointInfo args) {
  34. if (args.pointType == PointInfoType.mouseDown) {
  35. if (feature == null) {
  36. feature = buildFeature();
  37. listenChildrenUpdate();
  38. }
  39. if (childrenAllDone) {
  40. workingChild.clear();
  41. }
  42. }
  43. feature?.hostVisualArea = args.hostVisualArea;
  44. final result = workingChild.execute(args);
  45. if (result) {
  46. doCalculate();
  47. }
  48. return result;
  49. }
  50. @override
  51. bool onExecuteTouch(PointInfo args) {
  52. return workingChild.execute(args);
  53. }
  54. @protected
  55. void nextChild() {
  56. final count = _childItems.length;
  57. int nextIdx = -1;
  58. for (var i = 0; i < count; i++) {
  59. final child = _childItems[i];
  60. if (child.measuredFeatures.isEmpty) {
  61. nextIdx = i;
  62. break;
  63. }
  64. }
  65. if (nextIdx > -1) {
  66. switchChild(nextIdx);
  67. }
  68. }
  69. @protected
  70. void listenChildrenUpdate() {
  71. for (var item in childItems) {
  72. item.featureUpdated.addListener((sender, e) {
  73. _onChildFeatureUpdated();
  74. });
  75. }
  76. }
  77. void _onChildFeatureUpdated() {
  78. if (workingChild.measuredFeatures.isNotEmpty) {
  79. nextChild();
  80. }
  81. doFeatureUpdate();
  82. }
  83. }