import 'package:fis_i18n/i18n.dart'; import 'package:fis_measure/define.dart'; import 'package:fis_measure/view/ai_result_modifier/widgets/ai_conclusion_result.dart'; import 'package:fis_measure/view/ai_result_modifier/widgets/ai_index_tag.dart'; import 'package:fis_measure/view/ai_result_modifier/widgets/ai_mode_change_button.dart'; import 'package:fis_measure/view/ai_result_modifier/widgets/ai_one_frame_player.dart'; import 'package:fis_measure/view/ai_result_modifier/widgets/custom_operate_button.dart'; import 'package:fis_ui/index.dart'; import 'package:fis_ui/interface/interactive_container.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:vid/us/vid_us_image.dart'; import 'widgets/ai_result_canvas.dart'; import 'index.dart'; class AiResultModifierDialog extends FisView implements FInteractiveContainer { const AiResultModifierDialog({ Key? key, required this.remedicalCode, required this.currFrameIndex, required this.currFrame, required this.currentLabel, }) : super(key: key); final String remedicalCode; final int currFrameIndex; final int currentLabel; final VidUsImage currFrame; @override String get pageName => "ai_result_modifier"; @override FWidget build(BuildContext context) { return FisBuilder( init: AiResultModifierController( remedicalCode: remedicalCode, currFrameIndex: currFrameIndex, currFrame: currFrame, ), id: "ai_result_modifier", builder: (_) { print("1: current lable is ${currentLabel}"); controller.currentAiDetectedObjectIndex = currentLabel; return FDialog( shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(8), ), clipBehavior: Clip.hardEdge, child: FContainer( width: Get.width * 0.9, height: Get.height * 0.9, color: const Color.fromARGB(255, 54, 55, 56), padding: const EdgeInsets.all(10), child: FColumn( mainAxisSize: MainAxisSize.min, children: [ // _buildTitle(), FExpanded(child: _buildAiResultModifier()), // _buildDebugButtons(), ], ), ), ); }, ); } FWidget _buildAiResult() { return FContainer( width: 400, margin: const EdgeInsets.only( left: 15, ), child: FColumn( children: [ const AiIndexTag(), const FSizedBox(height: 10), FExpanded( child: FisBuilder( id: 'ai_result_panel', builder: (_) { if (_.aiDetectedObjectList.isNotEmpty) { return const AiConclusionResult(); } return const Center( child: CircularProgressIndicator(), ); }, ), ), const FSizedBox(height: 20), _buildOperateButtons(), ], ), ); } FWidget _buildAiResultModifier() { return FRow( children: [ FExpanded(child: _buildImageArea()), _buildAiResult(), ], ); } // 操作按钮 FWidget _buildOperateButtons() { return FContainer( child: FColumn( children: [ _buildModeChangeButtons(), const FSizedBox(height: 20), FSizedBox( height: 50, child: FRow( children: [ FExpanded( child: FCustomOperateButton( text: i18nBook.measure.resetAiResult.t, icon: Icons.restart_alt, highlightColor: const Color.fromRGBO(54, 169, 206, 1), onPressed: () { controller.resetAIResult(); }, ), ), const FSizedBox(width: 20), FExpanded( child: FCustomOperateButton( text: i18nBook.measure.saveEditResult.t, icon: Icons.save, normalColor: Colors.transparent, highlightColor: const Color.fromRGBO(54, 169, 206, 1), onPressed: () { controller.saveAIResult(); }, ), ), ], ), ), ], ), ); } FWidget _buildModeChangeButtons() { return FisBuilder( id: 'ai_mode_change_buttons', builder: (_) { return FColumn( children: [ FAlign( alignment: Alignment.centerLeft, child: FText( i18nBook.measure.editMode.t, style: const TextStyle(color: Colors.white), textAlign: TextAlign.start, ), ), const FSizedBox(height: 10), AiModifierModeChangeButton( isSelected: _.currMode == AiResultModifierMode.drag, mainColor: const Color.fromRGBO(54, 169, 206, 1), modeName: i18nBook.measure.dragMode.t, onClick: () { controller.changeModifierMode(AiResultModifierMode.drag); }, ), AiModifierModeChangeButton( isSelected: _.currMode == AiResultModifierMode.pen, mainColor: const Color.fromRGBO(54, 169, 206, 1), modeName: i18nBook.measure.drawOutlineMode.t, onClick: () { controller.changeModifierMode(AiResultModifierMode.pen); }, ), ], ); }, ); } // 图像区域 FWidget _buildImageArea() { return FContainer( child: FCenter( child: FStack( key: controller.framePlayerKey, children: [ FOneFramePlayer( oneFrame: currFrame, ), FisBuilder( id: 'ai_result_canvas', builder: (_) { return FCenter( child: QuickFWidget( ClipRect( child: RepaintBoundary( key: _.captureAreaKey, child: FCustomPaint( painter: AIResultCanvas( contoursPoints: _.canvasContoursPoints, newContoursPoints: _.canvasNewContoursPoints, keyPoints: _.canvasKeyPoints, highlightKeyPoints: _.canvasAffectedKeyPoints, lesionSizePointsIndexes: _.canvasLesionSizePointsIndexes, penModeKeyPointIndexes: _.canvasPenModeKeyPointIndexes, currMode: _.currMode, ), size: _.aiCanvasSize, ), ), ), ), ); }, ), FisBuilder( id: 'ai_result_modifier_interactive_layer', builder: (_) { return FCenter( child: FMouseRegion( onHover: (event) => _.onMouseHover(event), onExit: (event) => _.onMouseExit(event), child: FGestureDetector( behavior: HitTestBehavior.opaque, businessParent: this, name: "ai_result_modifier_interactive_layer", onPanDown: (e) { _.onMouseDragStart(e); }, onPanUpdate: (e) { _.onMouseDrag(e); }, onPanEnd: (e) { _.onMouseDragEnd(e); }, dragStartBehavior: DragStartBehavior.down, child: FContainer( width: _.aiCanvasSize.width, height: _.aiCanvasSize.height, )), ), ); }, ), ], ), ), ); } }