import 'package:fis_measure/interfaces/enums/items.dart'; import 'package:fis_measure/interfaces/process/calculators/values.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/items/terms.dart'; import 'package:fis_measure/interfaces/process/workspace/point_info.dart'; import 'package:fis_measure/process/calcuators/rvsp.dart'; import 'package:fis_measure/process/calcuators/velocity.dart'; import 'package:fis_measure/process/items/top_item.dart'; import 'package:fis_measure/process/items/top_item_feature.dart'; import 'package:vid/us/vid_us_unit.dart'; import 'location.dart'; class Rvsp extends TopMeasureItem { static const String tRVmaxKey = "TR Vmax"; late final Location tRVmax; late final FloatValue _rap; Rvsp(super.meta) { final tRVmaxMeta = meta.getChildByName(tRVmaxKey)!; tRVmax = _TRVmaxLocation(tRVmaxMeta, this); tRVmax.calculator = VelocityCal(tRVmax); childItems.add(tRVmax); final rapOutputMeta = ItemOutputMeta(MeasureTerms.RAP, "RAP", VidUsUnit.mmHg); _rap = FloatValue(rapOutputMeta, 0.0, rapOutputMeta.unit); } FloatValue get rap => _rap; @override bool get repeatableEditable => false; @override bool get finishAfterUnactive => true; @override RvspFeature buildFeature() => RvspFeature(this); @override bool onExecuteMouse(PointInfo args) { if (feature == null) { feature = buildFeature(); listenChildrenUpdate(); } if (args.pointType == PointInfoType.mouseDown) { if (childrenAllDone) { workingChild.clear(); } } feature?.hostVisualArea = args.hostVisualArea; if (!childrenAllDone) { final result = workingChild.execute(args); if (result) { doCalculate(); } return result; } return true; } void updateRap(double val) { _rap.value = val; calculator?.calculate(); update(); } static Rvsp createRvsp( ItemMeta meta, [ IMeasureItem? parent, ]) { Rvsp ins = Rvsp(meta); ins.calculator = RvspCal(ins); return ins; } } class RvspFeature extends TopMeasureItemFeature { RvspFeature( ITopMeasureItem refItem, ) : super(refItem); } class _TRVmaxLocation extends Location { _TRVmaxLocation(super.meta, super.parent); @override bool onExecuteMouse(PointInfo args) { if (state == ItemStates.finished || state == ItemStates.waiting) { if (args.pointType == PointInfoType.mouseDown) { measuredFeatures.clear(); } else if (args.pointType == PointInfoType.mouseMove) { handleMouseMoveWhileFinish(args); } } if (state == ItemStates.running) { if (args.pointType == PointInfoType.mouseUp) return false; feature?.point = args; doCalculate(); if (args.pointType == PointInfoType.mouseDown) { doFeatureFinish(); } } return true; } }