import 'package:fis_i18n/i18n.dart'; import 'package:fis_jsonrpc/rpc.dart'; import 'package:fis_measure/interfaces/process/items/terms.dart'; import 'package:fis_measure/interfaces/process/player/play_controller.dart'; import 'package:fis_measure/interfaces/process/workspace/application.dart'; import 'package:fis_measure/process/language/measure_language.dart'; import 'package:fis_measure/process/workspace/measure_data_controller.dart'; import 'package:fis_measure/process/workspace/measure_handler.dart'; import 'package:fis_measure/view/measure/measure_config/widgets/measure_configuration_style.dart'; import 'package:fis_measure/view/measure/measure_config/widgets/measurement_tool_selection.dart'; import 'package:fis_measure/view/measure/measure_view_controller.dart'; import 'package:fis_measure/view/player/controller.dart'; import 'package:fis_theme/theme.dart'; import 'package:fis_ui/index.dart'; import 'package:fis_ui/interface/interactive_container.dart'; import 'package:fis_ui/widgets/layout/offstage.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import '../../gesture/positioned_cursor.dart'; ///条目元数据组 class ItemMetaGroup { ItemMetaGroup( this.itemMetaGroupTitle, this.itemMeta, this.isExpend, ); /// 当前测量组的名称 final String itemMetaGroupTitle; /// 当前测量组的测量数组 final List itemMeta; /// 是否展开 bool? isExpend; } /// 测量工具配置 class MeasureConfigurationPage extends StatefulWidget implements FWidget, FInteractiveContainer { @override final String pageName = 'MeasureConfigurationDialog'; const MeasureConfigurationPage({ Key? key, required this.ifHideConfig, }) : super(key: key); final bool ifHideConfig; @override State createState() => MeasureConfigurationPageState(); } class MeasureConfigurationPageState extends State { int measureToolsTab = 0; /// 切换标签栏 void changeTab(int index) { measureToolsTab = index; setState(() {}); } late final application = Get.find(); late final measureHandler = Get.find(); final playerController = Get.find() as VidPlayerController; /// 数据 final measureData = Get.find(); final mouseState = Get.find(); /// 测量项控制器 final measureMetaController = Get.find(); /// 选中的测量项 List chooseMeasureList = []; List itemMetaListGroup = []; String activeName = ''; /// 打开已选测量工具设置 /// /// [name] 测量的名字 后期改版后应该是一个测量对象 void openHasSelectedSettingDialog(String name) { // state.childItemMeta = state.allItemMeta.firstWhere( // (element) => element.name == name, // ); // router.dialog(() => HasSelectedSettingDialog(name: name)); } Future getName() async { List getModes = []; for (var element in playerController.currentFrame?.visuals[0].modes ?? []) { getModes.add(element.type.toString().split('.')[1]); } var measureModeSelection = MeasureModeSelection( application.applicationName, application.categoryName, application.isThirdPart ? ['TPPTissue'] : getModes, ); measureHandler.measureModeChanged = measureModeSelection; measureData.getMeasureApplicationList = []; var measureApplicationDTO = await measureData.getMeasureApplication.call(measureModeSelection); if (measureApplicationDTO != null) { /// 模式版本 measureData.measureApplicationVersion = measureApplicationDTO.version ?? ''; measureData.availableModes = measureApplicationDTO.availableModes ?? []; measureMetaController.setAvailableModes(measureData.currentMode); activeName = measureData.curItemMetaList[0].name; } } void submit() async { var measureModeSubmitChanged = MeasureModeSubmit( measureData.measureApplicationVersion, application.applicationName, application.categoryName, UserDefinedMeasureModeDTO( modeName: measureData.currentMode, workingGroups: [ UserDefinedMeasureGroupDTO( name: 'General', folders: [ UserDefinedMeasureFolderDTO( name: 'General', workingItemNames: chooseMeasureList, ), ], ), ], ), ); measureHandler.measureModeSubmitChanged = measureModeSubmitChanged; await measureData.saveUserDefinedMeasureApplicationAsync .call(measureModeSubmitChanged); getName(); measureMetaController.setAvailableModes(measureData.currentMode); saveMeasureSystemSettingAsync(); } // 保存修改结果 Future saveMeasureSystemSettingAsync() async { measureData.measureSystemSettingChanged .emit(this, measureData.measureSystemSetting); await measureData .saveMeasureSystemSettingAsync(measureData.measureSystemSetting); mouseState.cursorType = getMeasureSystemSettingCursorType( measureData.measureSystemSetting.cursorType); mouseState.cursorSize = measureData.measureSystemSetting.cursorSize as double; } @override void initState() { super.initState(); List chooseMeasure = []; measureMetaController.measureConfig(); itemMetaListGroup = measureData.itemMetaListGroup; chooseMeasure = measureData.getMeasureApplicationList .where((element) => !MeasureUnsupportedTerms.items.contains(element)) .toList(); chooseMeasureList = chooseMeasure.toSet().toList(); } @override void dispose() { super.dispose(); } @override FWidget build(BuildContext context) { return FSimpleDialog( title: FText( i18nBook.user.setting.t, style: const TextStyle( color: Colors.white, fontSize: 18, ), ), cancelString: i18nBook.common.cancel.t, okString: i18nBook.common.confirm.t, isDefault: true, onOk: () { submit(); }, onCancel: () { chooseMeasureList = measureData.getMeasureApplicationList; Get.back(); setState(() {}); }, children: [ FContainer( width: 830, height: 500, child: _buildMeasureconfiguration(), ), ], ); } FWidget _buildMeasureconfiguration() { return FContainer( padding: const EdgeInsets.symmetric(horizontal: 15), child: FRow( crossAxisAlignment: CrossAxisAlignment.start, children: [ FContainer( width: 170, decoration: const BoxDecoration( border: Border( right: BorderSide( color: Color.fromRGBO(235, 235, 235, 1), width: 1, ), ), ), child: FColumn( crossAxisAlignment: CrossAxisAlignment.end, children: [ const FSizedBox( height: 10, ), if (!widget.ifHideConfig) FContainer( width: 160, child: FInkWell( onTap: () { changeTab(0); }, child: FContainer( padding: const EdgeInsets.symmetric( vertical: 10, horizontal: 5, ), child: FText( i18nBook.measure.measureToolSelect.t, style: measureToolsTab == 0 ? TextStyle( color: FTheme.ins.colorScheme.primary, ) : const TextStyle(), textAlign: TextAlign.end, ), ), ), ), if (!widget.ifHideConfig) FContainer( width: 160, child: FInkWell( onTap: () { changeTab(1); }, child: FContainer( padding: const EdgeInsets.symmetric( vertical: 10, horizontal: 5, ), child: FText( i18nBook.measure.selectedMeasureTool.t, style: measureToolsTab == 1 ? TextStyle( color: FTheme.ins.colorScheme.primary, ) : const TextStyle(), textAlign: TextAlign.end, ), ), ), ), FContainer( width: 160, child: FInkWell( onTap: () { changeTab(2); }, child: FContainer( padding: const EdgeInsets.symmetric( vertical: 10, horizontal: 5, ), child: FText( i18nBook.measure.measureStyleConfig.t, style: measureToolsTab == 2 ? TextStyle( color: FTheme.ins.colorScheme.primary, ) : const TextStyle(), textAlign: TextAlign.end, ), ), ), ), ], ), ), FExpanded( child: FStack( fit: StackFit.passthrough, children: [ FOffstage( offstage: measureToolsTab != 0, child: FSingleChildScrollView( child: SelectModulePage( itemMetaListGroup: itemMetaListGroup, chooseMeasureList: chooseMeasureList, ), ), ), FOffstage( offstage: measureToolsTab != 1, child: _HasSelectedModulePage( chooseMeasureList: chooseMeasureList, ), ), FOffstage( offstage: measureToolsTab != 2, child: StyleConfigPage( businessParent: widget, ), ), ], )), ], ), ); } } class _HasSelectedModulePage extends StatelessWidget implements FWidget { final List chooseMeasureList; /// 数据 final measureData = Get.find(); /// 测量语言包 final measureLanguage = MeasureLanguage(); _HasSelectedModulePage({ required this.chooseMeasureList, }); @override FWidget build(BuildContext context) { return FListView( shrinkWrap: true, children: [ FColumn( crossAxisAlignment: CrossAxisAlignment.start, children: [ FContainer( padding: const EdgeInsets.only(left: 15, top: 15, bottom: 15), child: FWrap( spacing: 16.0, // 主轴(水平)方向间距 runSpacing: 8.0, // 纵轴(垂直)方向间距 direction: Axis.horizontal, crossAlignment: WrapCrossAlignment.center, alignment: WrapAlignment.start, children: List.generate( chooseMeasureList.length, (index) { return FContainer( width: 180, height: 60, decoration: BoxDecoration( border: Border.all( width: 0.5, color: FTheme.ins.colorScheme.primary, ), ), child: FColumn( mainAxisAlignment: MainAxisAlignment.center, children: [ FText( chooseMeasureList[index].toString(), style: const TextStyle( color: Colors.black, ), ), FText( measureLanguage.t( 'measure', chooseMeasureList[index].toString(), ), style: const TextStyle( color: Colors.black, ), ), ], ), // ), ); }, ), ), ), ], ), ], ); } }