Browse Source

fix topitem recorder remove bug

melon.yin 2 years ago
parent
commit
0a5715540f

+ 18 - 7
lib/process/items/item.dart

@@ -10,6 +10,7 @@ import 'package:flutter/foundation.dart';
 import 'package:get/get.dart';
 
 import 'item_feature.dart';
+import 'top_item.dart';
 
 abstract class MeasureItem<T extends MeasureItemFeature> extends IMeasureItem {
   late final ItemMeta _meta;
@@ -118,7 +119,23 @@ abstract class MeasureItem<T extends MeasureItemFeature> extends IMeasureItem {
   }
 
   @override
-  void cancelOnce() {}
+  void cancelOnce() {
+    if (this is TopMeasureItem) {
+      final that = this as TopMeasureItem;
+      for (var item in that.childItems) {
+        item.cancelOnce();
+        item.measuredFeatures.clear();
+      }
+    }
+
+    feature = null;
+    state = ItemStates.waiting;
+    onCancelingOnce();
+    doFeatureUpdate();
+  }
+
+  @protected
+  void onCancelingOnce() {}
 
   @protected
   void doFeatureUpdate() {
@@ -131,7 +148,6 @@ abstract class MeasureItem<T extends MeasureItemFeature> extends IMeasureItem {
       feature!.isActive = false;
       measuredFeatures.add(feature!);
       calculator?.finishOnce();
-      _recordHistory();
     }
     feature = null;
     state = ItemStates.finished;
@@ -154,9 +170,4 @@ abstract class MeasureItem<T extends MeasureItemFeature> extends IMeasureItem {
   int assignId() {
     return application.recorder.newRecordId();
   }
-
-  void _recordHistory() {
-    final recorder = application.recorder;
-    recorder.recordMeasureItem(meta.name);
-  }
 }

+ 8 - 0
lib/process/items/item_feature.dart

@@ -37,6 +37,7 @@ abstract class MeasureItemFeature implements IMeasureItemFeature {
     }
 
     _innerPoints = [];
+    _recordHistory();
   }
 
   int get activeIndex => _activeIndex;
@@ -197,4 +198,11 @@ abstract class MeasureItemFeature implements IMeasureItemFeature {
     )..layout(maxWidth: maxWidth);
     return textPainter.size;
   }
+
+  void _recordHistory() {
+    if (refItem.parent == null) {
+      final recorder = refItem.application.recorder;
+      recorder.recordMeasureItem(refItem.meta.name);
+    }
+  }
 }

+ 8 - 3
lib/process/primitives/combos/lwh_straightline.dart

@@ -29,18 +29,20 @@ class LWHStraightLine extends TopMeasureItem<LWHStraightlineFeature> {
     childItems.add(l);
     childItems.add(w);
     childItems.add(h);
-    listenChildrenUpdate();
-    feature = LWHStraightlineFeature(this);
   }
 
   @override
   bool onExecuteMouse(PointInfo args) {
     if (args.pointType == PointInfoType.mouseDown) {
+      if (feature == null) {
+        feature = LWHStraightlineFeature(this);
+        listenChildrenUpdate();
+      }
       if (childrenAllDone) {
         workingChild.clear();
       }
     }
-    feature!.hostVisualArea = args.hostVisualArea;
+    feature?.hostVisualArea = args.hostVisualArea;
     final result = workingChild.execute(args);
     doCalculate();
     return result;
@@ -51,6 +53,9 @@ class LWHStraightLine extends TopMeasureItem<LWHStraightlineFeature> {
     return workingChild.execute(args);
   }
 
+  @override
+  void onCancelingOnce() {}
+
   static LWHStraightLine createVolume(ItemMeta meta, [IMeasureItem? parent]) {
     if (meta.measureType != MeasureTypes.Volume || meta.multiMethod != "LWH") {
       throw ArgumentError();

+ 17 - 2
lib/process/workspace/recorder.dart

@@ -46,6 +46,7 @@ class MeasureRecorder implements IMeasureRecorder {
     }
     if (removed) {
       _records.removeLast();
+      _checkResetId();
     }
     return removed;
   }
@@ -66,11 +67,13 @@ class MeasureRecorder implements IMeasureRecorder {
     final count = matchs.length;
     for (var i = count - 1; i >= 0; i--) {
       final item = matchs.elementAt(i);
-      if (item.measuredFeatures.isNotEmpty) {
+      if (item.feature != null) {
+        item.cancelOnce();
+      } else if (item.measuredFeatures.isNotEmpty) {
         item.measuredFeatures.removeLast();
         item.calculator?.outputs.removeLast();
-        return true;
       }
+      return true;
     }
 
     return false;
@@ -93,6 +96,18 @@ class MeasureRecorder implements IMeasureRecorder {
   void _increaseId() {
     _lastId++;
   }
+
+  void _checkResetId() {
+    if (_application.measureItems.isEmpty) {
+      _resetId();
+    } else {
+      final isFeatureEmpty = _application.measureItems
+          .every((e) => e.measuredFeatures.isEmpty && e.feature == null);
+      if (isFeatureEmpty) {
+        _resetId();
+      }
+    }
+  }
 }
 
 class _MeasureModel extends _RecordModelBase {