import 'package:fis_measure/interfaces/date_types/rect_region.dart'; import 'package:fis_measure/interfaces/enums/display_mode.dart'; import 'package:fis_measure/interfaces/process/modes/mode.dart'; import 'package:fis_measure/interfaces/enums/visual_area_type.dart'; import 'package:fis_common/event/event_type.dart'; import 'package:fis_measure/interfaces/process/viewports/viewport.dart'; import 'package:fis_measure/interfaces/process/visuals/visual.dart'; import 'package:fis_measure/interfaces/process/visuals/visual_area.dart'; import 'package:fis_measure/process/layout/configuration.dart'; import 'package:fis_measure/process/modes/mode_base.dart'; import 'package:flutter/foundation.dart'; import 'package:vid/us/vid_us_mode.dart'; import 'package:vid/us/vid_us_visual_area_type.dart'; abstract class VisualArea implements IVisualArea { bool _isActive = false; late final IVisual _visual; late final VidUsVisualAreaType _areaType; late final IMode _mode; IViewPort? _viewPort; RectRegion? _layoutRegion; RectRegion _displayRegion = RectRegion.fill(0, 0, 1, 1); VisualArea( IVisual visual, VidUsVisualAreaType areaType, VidUsModeType modeType, ) { _visual = visual; _areaType = areaType; _mode = matchAreaMode(modeType); loadData(); } @override bool get isActive => _isActive; @override set isActive(bool value) { if (value != _isActive) { _isActive = value; isActiveChanged.emit(this, value); } } @override IMode get mode => _mode; @override IVisual get visual => _visual; @override IViewPort? get viewport => _viewPort; @override set viewport(IViewPort? value) { if (value != _viewPort) { _viewPort = value; } } @override RectRegion? get layoutRegion => _layoutRegion; @protected set layoutRegion(RectRegion? value) { if (value != _layoutRegion) { _layoutRegion = value; _updateDisplayRegion(); } } set carotidLayoutRegioin(RectRegion? value) { if (value != _layoutRegion) { _layoutRegion = value; } } @override RectRegion get displayRegion => _displayRegion; @override VidUsVisualAreaType get visualAreaType => _areaType; @override var isActiveChanged = FEventHandler(); /// 加载数据 void loadData(); @protected RectRegion findRegion(String section) { final displayMode = DisplayModeEnum.values[visual.visualData.displayMode.index]; final rect = LayoutConfiguration.ins.getRect( section, VisualAreaTypeEnum.values[_areaType.index], displayMode, ); final areaRegion = RectRegion.rect(rect); return areaRegion; } @protected ModeBase matchAreaMode(VidUsModeType type) { final modeInfo = visual.visualData.modes.firstWhere((e) => e.type == type); final mode = ModeBase( modeInfo.displayName, modeInfo.type, visual, ); return mode; } 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); } }