import 'package:fis_common/event/event_type.dart'; import 'package:fis_measure/interfaces/process/items/item.dart'; import 'package:fis_measure/interfaces/process/items/item_metas.dart'; import 'package:fis_measure/interfaces/process/workspace/point_info.dart'; import 'package:flutter/foundation.dart'; import 'item.dart'; import 'item_feature.dart'; abstract class TopMeasureItem extends MeasureItem implements ITopMeasureItem { final List _childItems = []; int _childIndex = 0; TopMeasureItem(ItemMeta meta) : super(meta) { workingChildChanged = FEventHandler(); } @override List get childItems => _childItems; @override IMeasureItem get workingChild => _childItems[_childIndex]; /// 子项全部完成 @protected bool get childrenAllDone => _childItems.every((e) => e.measuredFeatures.isNotEmpty); @override late final FEventHandler workingChildChanged; @override void switchChild(int index) { if (index == _childIndex) return; _childIndex = index; workingChildChanged.emit(this, index); } T buildFeature(); @override bool onExecuteMouse(PointInfo args) { if (args.pointType == PointInfoType.mouseDown) { if (feature == null) { feature = buildFeature(); listenChildrenUpdate(); } if (childrenAllDone) { workingChild.clear(); } } feature?.hostVisualArea = args.hostVisualArea; final result = workingChild.execute(args); if (result) { doCalculate(); } return result; } @override bool onExecuteTouch(PointInfo args) { return workingChild.execute(args); } @protected void nextChild() { final count = _childItems.length; int nextIdx = -1; for (var i = 0; i < count; i++) { final child = _childItems[i]; if (child.measuredFeatures.isEmpty) { nextIdx = i; break; } } if (nextIdx > -1) { switchChild(nextIdx); } } @protected void listenChildrenUpdate() { for (var item in childItems) { item.featureUpdated.addListener((sender, e) { _onChildFeatureUpdated(); }); } } void _onChildFeatureUpdated() { if (workingChild.measuredFeatures.isNotEmpty) { nextChild(); } doFeatureUpdate(); } }