measure_configuation_page.dart 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402
  1. import 'package:fis_i18n/i18n.dart';
  2. import 'package:fis_jsonrpc/rpc.dart';
  3. import 'package:fis_measure/interfaces/process/items/terms.dart';
  4. import 'package:fis_measure/interfaces/process/player/play_controller.dart';
  5. import 'package:fis_measure/interfaces/process/workspace/application.dart';
  6. import 'package:fis_measure/process/language/measure_language.dart';
  7. import 'package:fis_measure/process/workspace/measure_data_controller.dart';
  8. import 'package:fis_measure/process/workspace/measure_handler.dart';
  9. import 'package:fis_measure/view/measure/measure_config/widgets/measure_configuration_style.dart';
  10. import 'package:fis_measure/view/measure/measure_config/widgets/measurement_tool_selection.dart';
  11. import 'package:fis_measure/view/measure/measure_view_controller.dart';
  12. import 'package:fis_measure/view/player/controller.dart';
  13. import 'package:fis_theme/theme.dart';
  14. import 'package:fis_ui/index.dart';
  15. import 'package:fis_ui/interface/interactive_container.dart';
  16. import 'package:fis_ui/widgets/layout/offstage.dart';
  17. import 'package:flutter/material.dart';
  18. import 'package:get/get.dart';
  19. import '../../gesture/positioned_cursor.dart';
  20. ///条目元数据组
  21. class ItemMetaGroup {
  22. ItemMetaGroup(
  23. this.itemMetaGroupTitle,
  24. this.itemMeta,
  25. this.isExpend,
  26. );
  27. /// 当前测量组的名称
  28. final String itemMetaGroupTitle;
  29. /// 当前测量组的测量数组
  30. final List<ItemMetaDTO> itemMeta;
  31. /// 是否展开
  32. bool? isExpend;
  33. }
  34. /// 测量工具配置
  35. class MeasureConfigurationPage extends StatefulWidget
  36. implements FWidget, FInteractiveContainer {
  37. @override
  38. final String pageName = 'MeasureConfigurationDialog';
  39. const MeasureConfigurationPage({
  40. Key? key,
  41. required this.ifHideConfig,
  42. }) : super(key: key);
  43. final bool ifHideConfig;
  44. @override
  45. State<MeasureConfigurationPage> createState() =>
  46. MeasureConfigurationPageState();
  47. }
  48. class MeasureConfigurationPageState extends State<MeasureConfigurationPage> {
  49. int measureToolsTab = 0;
  50. /// 切换标签栏
  51. void changeTab(int index) {
  52. measureToolsTab = index;
  53. setState(() {});
  54. }
  55. late final application = Get.find<IApplication>();
  56. late final measureHandler = Get.find<MeasureHandler>();
  57. final playerController = Get.find<IPlayerController>() as VidPlayerController;
  58. /// 数据
  59. final measureData = Get.find<MeasureDataController>();
  60. final mouseState = Get.find<IMouseState>();
  61. /// 测量项控制器
  62. final measureMetaController = Get.find<MeasureMetaController>();
  63. /// 选中的测量项
  64. List<String> chooseMeasureList = [];
  65. List<ItemMetaGroup> itemMetaListGroup = [];
  66. String activeName = '';
  67. /// 打开已选测量工具设置
  68. ///
  69. /// [name] 测量的名字 后期改版后应该是一个测量对象
  70. void openHasSelectedSettingDialog(String name) {
  71. // state.childItemMeta = state.allItemMeta.firstWhere(
  72. // (element) => element.name == name,
  73. // );
  74. // router.dialog(() => HasSelectedSettingDialog(name: name));
  75. }
  76. Future<void> getName() async {
  77. List<String> getModes = [];
  78. for (var element in playerController.currentFrame?.visuals[0].modes ?? []) {
  79. getModes.add(element.type.toString().split('.')[1]);
  80. }
  81. var measureModeSelection = MeasureModeSelection(
  82. application.applicationName,
  83. application.categoryName,
  84. application.isThirdPart ? ['TPPTissue'] : getModes,
  85. );
  86. measureHandler.measureModeChanged = measureModeSelection;
  87. measureData.getMeasureApplicationList = [];
  88. var measureApplicationDTO =
  89. await measureData.getMeasureApplication.call(measureModeSelection);
  90. if (measureApplicationDTO != null) {
  91. /// 模式版本
  92. measureData.measureApplicationVersion =
  93. measureApplicationDTO.version ?? '';
  94. measureData.availableModes = measureApplicationDTO.availableModes ?? [];
  95. measureMetaController.setAvailableModes(measureData.currentMode);
  96. activeName = measureData.curItemMetaList[0].name;
  97. }
  98. }
  99. void submit() async {
  100. var measureModeSubmitChanged = MeasureModeSubmit(
  101. measureData.measureApplicationVersion,
  102. application.applicationName,
  103. application.categoryName,
  104. UserDefinedMeasureModeDTO(
  105. modeName: measureData.currentMode,
  106. workingGroups: [
  107. UserDefinedMeasureGroupDTO(
  108. name: 'General',
  109. folders: [
  110. UserDefinedMeasureFolderDTO(
  111. name: 'General',
  112. workingItemNames: chooseMeasureList,
  113. ),
  114. ],
  115. ),
  116. ],
  117. ),
  118. );
  119. measureHandler.measureModeSubmitChanged = measureModeSubmitChanged;
  120. await measureData.saveUserDefinedMeasureApplicationAsync
  121. .call(measureModeSubmitChanged);
  122. getName();
  123. measureMetaController.setAvailableModes(measureData.currentMode);
  124. saveMeasureSystemSettingAsync();
  125. }
  126. // 保存修改结果
  127. Future<void> saveMeasureSystemSettingAsync() async {
  128. measureData.measureSystemSettingChanged
  129. .emit(this, measureData.measureSystemSetting);
  130. await measureData
  131. .saveMeasureSystemSettingAsync(measureData.measureSystemSetting);
  132. mouseState.cursorType = getMeasureSystemSettingCursorType(
  133. measureData.measureSystemSetting.cursorType);
  134. mouseState.cursorSize =
  135. measureData.measureSystemSetting.cursorSize as double;
  136. }
  137. @override
  138. void initState() {
  139. super.initState();
  140. List<String> chooseMeasure = [];
  141. measureMetaController.measureConfig();
  142. itemMetaListGroup = measureData.itemMetaListGroup;
  143. chooseMeasure = measureData.getMeasureApplicationList
  144. .where((element) => !MeasureUnsupportedTerms.items.contains(element))
  145. .toList();
  146. chooseMeasureList = chooseMeasure.toSet().toList();
  147. }
  148. @override
  149. void dispose() {
  150. super.dispose();
  151. }
  152. @override
  153. FWidget build(BuildContext context) {
  154. return FSimpleDialog(
  155. title: FText(
  156. i18nBook.user.setting.t,
  157. style: const TextStyle(
  158. color: Colors.white,
  159. fontSize: 18,
  160. ),
  161. ),
  162. cancelString: i18nBook.common.cancel.t,
  163. okString: i18nBook.common.confirm.t,
  164. isDefault: true,
  165. onOk: () {
  166. submit();
  167. },
  168. onCancel: () {
  169. chooseMeasureList = measureData.getMeasureApplicationList;
  170. Get.back();
  171. setState(() {});
  172. },
  173. children: [
  174. FContainer(
  175. width: 830,
  176. height: 500,
  177. child: _buildMeasureconfiguration(),
  178. ),
  179. ],
  180. );
  181. }
  182. FWidget _buildMeasureconfiguration() {
  183. return FContainer(
  184. padding: const EdgeInsets.symmetric(horizontal: 15),
  185. child: FRow(
  186. crossAxisAlignment: CrossAxisAlignment.start,
  187. children: [
  188. FContainer(
  189. width: 170,
  190. decoration: const BoxDecoration(
  191. border: Border(
  192. right: BorderSide(
  193. color: Color.fromRGBO(235, 235, 235, 1),
  194. width: 1,
  195. ),
  196. ),
  197. ),
  198. child: FColumn(
  199. crossAxisAlignment: CrossAxisAlignment.end,
  200. children: [
  201. const FSizedBox(
  202. height: 10,
  203. ),
  204. if (!widget.ifHideConfig)
  205. FContainer(
  206. width: 160,
  207. child: FInkWell(
  208. onTap: () {
  209. changeTab(0);
  210. },
  211. child: FContainer(
  212. padding: const EdgeInsets.symmetric(
  213. vertical: 10,
  214. horizontal: 5,
  215. ),
  216. child: FText(
  217. i18nBook.measure.measureToolSelect.t,
  218. style: measureToolsTab == 0
  219. ? TextStyle(
  220. color: FTheme.ins.colorScheme.primary,
  221. )
  222. : const TextStyle(),
  223. textAlign: TextAlign.end,
  224. ),
  225. ),
  226. ),
  227. ),
  228. if (!widget.ifHideConfig)
  229. FContainer(
  230. width: 160,
  231. child: FInkWell(
  232. onTap: () {
  233. changeTab(1);
  234. },
  235. child: FContainer(
  236. padding: const EdgeInsets.symmetric(
  237. vertical: 10,
  238. horizontal: 5,
  239. ),
  240. child: FText(
  241. i18nBook.measure.selectedMeasureTool.t,
  242. style: measureToolsTab == 1
  243. ? TextStyle(
  244. color: FTheme.ins.colorScheme.primary,
  245. )
  246. : const TextStyle(),
  247. textAlign: TextAlign.end,
  248. ),
  249. ),
  250. ),
  251. ),
  252. FContainer(
  253. width: 160,
  254. child: FInkWell(
  255. onTap: () {
  256. changeTab(2);
  257. },
  258. child: FContainer(
  259. padding: const EdgeInsets.symmetric(
  260. vertical: 10,
  261. horizontal: 5,
  262. ),
  263. child: FText(
  264. i18nBook.measure.measureStyleConfig.t,
  265. style: measureToolsTab == 2
  266. ? TextStyle(
  267. color: FTheme.ins.colorScheme.primary,
  268. )
  269. : const TextStyle(),
  270. textAlign: TextAlign.end,
  271. ),
  272. ),
  273. ),
  274. ),
  275. ],
  276. ),
  277. ),
  278. FExpanded(
  279. child: FStack(
  280. fit: StackFit.passthrough,
  281. children: [
  282. FOffstage(
  283. offstage: measureToolsTab != 0,
  284. child: FSingleChildScrollView(
  285. child: SelectModulePage(
  286. itemMetaListGroup: itemMetaListGroup,
  287. chooseMeasureList: chooseMeasureList,
  288. ),
  289. ),
  290. ),
  291. FOffstage(
  292. offstage: measureToolsTab != 1,
  293. child: _HasSelectedModulePage(
  294. chooseMeasureList: chooseMeasureList,
  295. ),
  296. ),
  297. FOffstage(
  298. offstage: measureToolsTab != 2,
  299. child: StyleConfigPage(
  300. businessParent: widget,
  301. ),
  302. ),
  303. ],
  304. )),
  305. ],
  306. ),
  307. );
  308. }
  309. }
  310. class _HasSelectedModulePage extends StatelessWidget implements FWidget {
  311. final List<String> chooseMeasureList;
  312. /// 数据
  313. final measureData = Get.find<MeasureDataController>();
  314. /// 测量语言包
  315. final measureLanguage = MeasureLanguage();
  316. _HasSelectedModulePage({
  317. required this.chooseMeasureList,
  318. });
  319. @override
  320. FWidget build(BuildContext context) {
  321. return FListView(
  322. shrinkWrap: true,
  323. children: [
  324. FColumn(
  325. crossAxisAlignment: CrossAxisAlignment.start,
  326. children: [
  327. FContainer(
  328. padding: const EdgeInsets.only(left: 15, top: 15, bottom: 15),
  329. child: FWrap(
  330. spacing: 16.0, // 主轴(水平)方向间距
  331. runSpacing: 8.0, // 纵轴(垂直)方向间距
  332. direction: Axis.horizontal,
  333. crossAlignment: WrapCrossAlignment.center,
  334. alignment: WrapAlignment.start,
  335. children: List<FWidget>.generate(
  336. chooseMeasureList.length,
  337. (index) {
  338. return FContainer(
  339. width: 180,
  340. height: 60,
  341. decoration: BoxDecoration(
  342. border: Border.all(
  343. width: 0.5,
  344. color: FTheme.ins.colorScheme.primary,
  345. ),
  346. ),
  347. child: FColumn(
  348. mainAxisAlignment: MainAxisAlignment.center,
  349. children: [
  350. FText(
  351. chooseMeasureList[index].toString(),
  352. style: const TextStyle(
  353. color: Colors.black,
  354. ),
  355. ),
  356. FText(
  357. measureLanguage.t(
  358. 'measure',
  359. chooseMeasureList[index].toString(),
  360. ),
  361. style: const TextStyle(
  362. color: Colors.black,
  363. ),
  364. ),
  365. ],
  366. ),
  367. // ),
  368. );
  369. },
  370. ),
  371. ),
  372. ),
  373. ],
  374. ),
  375. ],
  376. );
  377. }
  378. }