Przeglądaj źródła

处理area切换

melon.yin 2 lat temu
rodzic
commit
13ad1891f3

+ 7 - 0
lib/interfaces/date_types/rect_region.dart

@@ -60,6 +60,13 @@ class RectRegion {
   DPoint get bottomLeft => DPoint(left, bottom);
   DPoint get bottomRight => DPoint(right, bottom);
 
+  /// 是否包含点
+  ///
+  /// [point] 指定点
+  bool containsPoint(DPoint point) {
+    return topLeft <= point && bottomRight >= point;
+  }
+
   @override
   bool operator ==(Object other) {
     return other is RectRegion &&

+ 3 - 0
lib/interfaces/process/visuals/visual.dart

@@ -33,6 +33,9 @@ abstract class IVisual {
   /// 是否活动
   bool get isActive;
 
+  /// 设置为非活动状态
+  void setUnAcitve();
+
   /// 是否活动变化事件
   late FEventHandler<bool> activeChanged;
 }

+ 5 - 2
lib/interfaces/process/visuals/visual_area.dart

@@ -21,8 +21,11 @@ abstract class IVisualArea {
   /// 区域类型
   VidUsVisualAreaType get visualAreaType;
 
-  /// 显示区域
-  RectRegion? get displayRegion;
+  /// 布局区域
+  RectRegion? get layoutRegion;
+
+  /// 整体显示区域
+  RectRegion get displayRegion;
 
   /// 模式
   IMode get mode;

+ 1 - 1
lib/process/visual/time_motion_area.dart

@@ -19,7 +19,7 @@ class TimeMotionArea extends VisualArea implements ITimeMotionArea {
   @override
   void loadData() {
     final visualData = visual.visualData as VidUs2DVisual;
-    displayRegion = findRegion(LayoutSections.general);
+    layoutRegion = findRegion(LayoutSections.general);
 
     ITimeMotionPhysicalCoordiante? physical;
     // TODO: 动态创建

+ 1 - 1
lib/process/visual/tissue_area.dart

@@ -21,7 +21,7 @@ class TissueArea extends VisualArea implements ITissueArea {
   @override
   void loadData() {
     final visualData = visual.visualData as VidUs2DVisual;
-    displayRegion = findRegion(LayoutSections.general);
+    layoutRegion = findRegion(LayoutSections.general);
 
     ITissuePhysicalCoordinate? physical;
     // TODO: 动态创建

+ 9 - 1
lib/process/visual/visual.dart

@@ -20,7 +20,7 @@ import 'visual_area.dart';
 
 abstract class VisualBase implements IVisual {
   late final VidUsVisual _visualData;
-  late final List<IVisualArea> _visualAreas;
+  late final List<IVisualArea> _visualAreas = [];
   late final RectRegion _region;
 
   VisualBase(VidUsVisual visualData, RectRegion region) {
@@ -46,6 +46,7 @@ abstract class VisualBase implements IVisual {
   @override
   List<IVisualArea> get visualAreas => _visualAreas;
 
+  @override
   RectRegion get region => _region;
 
   @override
@@ -58,6 +59,13 @@ abstract class VisualBase implements IVisual {
   @override
   var activeChanged = FEventHandler<bool>();
 
+  @override
+  void setUnAcitve() {
+    for (var area in visualAreas) {
+      area.isActive = false;
+    }
+  }
+
   @protected
   ModeBase matchAreaMode(VidUsModeType type) {
     final modeInfo = visualData.modes.firstWhere((e) => e.type == type);

+ 23 - 5
lib/process/visual/visual_area.dart

@@ -16,7 +16,8 @@ abstract class VisualArea<T extends IViewPort> implements IVisualArea {
   late final VidUsVisualAreaType _areaType;
   late final IMode _mode;
   IViewPort? _viewPort;
-  RectRegion? _displayRegion;
+  RectRegion? _layoutRegion;
+  RectRegion _displayRegion = RectRegion.fill(0, 0, 1, 1);
 
   VisualArea(IVisual visual, IMode mode) {
     _visual = visual;
@@ -52,14 +53,18 @@ abstract class VisualArea<T extends IViewPort> implements IVisualArea {
   }
 
   @override
-  RectRegion? get displayRegion => _displayRegion;
+  RectRegion? get layoutRegion => _layoutRegion;
   @protected
-  set displayRegion(RectRegion? value) {
-    if (value != _displayRegion) {
-      _displayRegion = value;
+  set layoutRegion(RectRegion? value) {
+    if (value != _layoutRegion) {
+      _layoutRegion = value;
+      _updateDisplayRegion();
     }
   }
 
+  @override
+  RectRegion get displayRegion => _displayRegion;
+
   @override
   VidUsVisualAreaType get visualAreaType => _areaType;
 
@@ -79,4 +84,17 @@ abstract class VisualArea<T extends IViewPort> implements IVisualArea {
     final areaRegion = RectRegion.rect(rect);
     return areaRegion;
   }
+
+  void _updateDisplayRegion() {
+    if (layoutRegion == null) {
+      _displayRegion = RectRegion.fill(0, 0, 1, 1);
+    }
+    final parent = visual.region;
+    final child = layoutRegion!;
+    final x = parent.left + child.left * parent.width;
+    final y = parent.top + child.top * parent.height;
+    final width = child.width * parent.width;
+    final height = child.height * parent.height;
+    _displayRegion = RectRegion.fill(x, y, width, height);
+  }
 }

+ 16 - 1
lib/process/workspace/application.dart

@@ -1,3 +1,4 @@
+import 'package:fis_measure/interfaces/date_types/point.dart';
 import 'package:fis_measure/interfaces/enums/annotation.dart';
 import 'package:fis_measure/interfaces/enums/operate.dart';
 import 'package:fis_measure/interfaces/process/annotations/annotation.dart';
@@ -221,7 +222,7 @@ class Application implements IApplication {
     final y = offset.dy / height;
     final percentOffset = Offset(x, y);
     final info = PointInfo.fromOffset(percentOffset, type);
-    info.hostVisualArea = visuals.first.visualAreas.first; // TODO: 找区域
+    info.hostVisualArea = _attchVisualArea(info);
     if (isAnnotationWorking) {
       activeAnnotationItem?.execute(info);
     } else {
@@ -385,4 +386,18 @@ class Application implements IApplication {
   void _clearVisuals() {
     _visuals = [];
   }
+
+  IVisualArea? _attchVisualArea(PointInfo point) {
+    for (var visual in visuals) {
+      visual.setUnAcitve();
+      for (var area in visual.visualAreas) {
+        if (area.displayRegion.containsPoint(point)) {
+          area.isActive = true;
+          visualAreaChanged.emit(this, area);
+          return area;
+        }
+      }
+    }
+    return null;
+  }
 }