import 'dart:convert'; import 'package:fis_i18n/i18n.dart'; import 'package:fis_jsonrpc/rpc.dart'; import 'package:fis_measure/define.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/has_selected_setting_dialog.dart'; import 'package:fis_measure/view/measure/measure_config/widgets/measure_configuration_style.dart'; import 'package:fis_measure/view/measure/measure_config/widgets/measure_configuration_unit.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: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 savedMeasureList = []; /// 选中的测量项 List chooseMeasureList = []; List itemMetaListGroup = []; String activeName = ''; List measureMode = []; 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 onSubmit() async { /// 判断两个数组是否相同 if (savedMeasureList.toString() != chooseMeasureList.toString() || measureData.itemMetaListConfig.isNotEmpty) { var measureModeSubmitChanged = MeasureModeSubmit( measureData.measureApplicationVersion, application.applicationName, application.categoryName, UserDefinedMeasureModeDTO( modeName: measureData.currentMode, workingGroups: [ UserDefinedMeasureGroupDTO( name: 'General', folders: [ UserDefinedMeasureFolderDTO( name: 'General', workingItemNames: chooseMeasureList, itemMetas: measureData.itemMetaListConfig, ), ], ), ], ), ); measureHandler.measureModeSubmitChanged = measureModeSubmitChanged; await measureData.saveUserDefinedMeasureApplicationAsync .call(measureModeSubmitChanged); getName(); measureMetaController.setAvailableModes(measureData.currentMode); } saveMeasureSystemSettingAsync(); } void onCancel() async { // TODO 关闭时校验【measureSystemSetting】是否发生变更 print('TODO 关闭时校验【measureSystemSetting】是否发生变更,如果发生变化需要询问用户是否保存'); } // 保存修改测量样式 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 = []; if (widget.ifHideConfig) { measureToolsTab = 2; } measureMetaController.measureConfig(); itemMetaListGroup = measureData.itemMetaListGroup; chooseMeasure = measureData.getMeasureApplicationList .where((element) => !MeasureUnsupportedTerms.items.contains(element)) .toList(); // 将原始列表转换为JSON字符串 String jsonString = jsonEncode(measureData.availableModes); // 将JSON字符串转换回对象列表 List jsonList = jsonDecode(jsonString); measureMode = jsonList.map((json) => MeasureModeDTO.fromJson(json)).toList(); savedMeasureList = chooseMeasure.toSet().toList(); chooseMeasureList = chooseMeasure.toSet().toList(); /// TODO 打开时缓存当前的用户测量配置 【measureSystemSetting】,关闭时校验是否发生变更 } @override void dispose() { super.dispose(); } @override FWidget build(BuildContext context) { return FStack( children: [ QuickFWidget( ModalBarrier( color: Colors.black.withOpacity(0.5), onDismiss: () { onCancel(); }, ), ), 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: () { onSubmit(); Get.back(); }, onCancel: () { chooseMeasureList = measureData.getMeasureApplicationList; measureData.availableModes = measureMode; measureMetaController.setMeasureConfigItemMetaList(); onCancel(); 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) _buildTabButton(0, i18nBook.measure.measureToolSelect.t), if (!widget.ifHideConfig) _buildTabButton(1, i18nBook.measure.selectedMeasureTool.t), _buildTabButton(2, i18nBook.measure.measureStyleConfig.t), _buildTabButton(3, i18nBook.measure.measureUnitConfig.t), ], ), ), 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, ), ), FOffstage( offstage: measureToolsTab != 3, child: UnitConfigPage( businessParent: widget, ), ), ], )), ], ), ); } FWidget _buildTabButton(int index, String title) { return FContainer( width: 160, child: FInkWell( onTap: () { changeTab(index); }, child: FContainer( padding: const EdgeInsets.symmetric( vertical: 10, horizontal: 5, ), child: FText( title, style: measureToolsTab == index ? TextStyle( color: FTheme.ins.colorScheme.primary, ) : const TextStyle(), textAlign: TextAlign.end, ), ), ), ); } } class _HasSelectedModulePage extends StatelessWidget implements FWidget { final List chooseMeasureList; /// 数据 final measureData = Get.find(); /// 测量项控制器 final measureMetaController = Get.find(); /// 测量语言包 final measureLanguage = MeasureLanguage(); _HasSelectedModulePage({ required this.chooseMeasureList, }); /// 打开已选测量工具设置 /// /// [itemMeta] 测量的对象 void openHasSelectedSettingDialog(ItemMetaDTO itemMeta) { Get.dialog(HasSelectedSettingDialog(itemMeta: itemMeta)); } @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 FInkWell( onTap: () { var item = measureMetaController .setMeasureConfigItemMetaList() .firstWhere((element) => element.description == chooseMeasureList[index]); openHasSelectedSettingDialog(item); }, child: FContainer( width: 180, height: 60, decoration: BoxDecoration( border: Border.all( width: 0.5, color: FTheme.ins.colorScheme.primary, ), ), child: FColumn( mainAxisAlignment: MainAxisAlignment.center, children: [ if (!i18nBook.isCurrentEnglish) FText( measureLanguage.t( 'measure', chooseMeasureList[index].toString(), ), style: const TextStyle( color: Colors.black, ), ), FText( chooseMeasureList[index].toString(), style: const TextStyle( color: Colors.black, ), ), ], ), // ), ), ); }, ), ), ), ], ), ], ); } }