measure_images_bar.dart 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. import 'package:fis_jsonrpc/rpc.dart';
  2. import 'package:fis_measure/interfaces/process/workspace/exam_info.dart';
  3. import 'package:fis_measure/process/workspace/measure_controller.dart';
  4. import 'package:fis_measure/process/workspace/measure_data_controller.dart';
  5. import 'package:fis_measure/process/workspace/measure_handler.dart';
  6. import 'package:fis_measure/view/measure/measure_images_bar.dart';
  7. export 'package:fis_lib_business_components/index.dart';
  8. import 'package:fis_ui/index.dart';
  9. import 'package:flutter/material.dart';
  10. import 'package:get/get.dart';
  11. class MeasureImagesBar extends StatefulWidget implements FWidget {
  12. const MeasureImagesBar({Key? key}) : super(key: key);
  13. @override
  14. State<MeasureImagesBar> createState() => _MeasureImagesBarState();
  15. }
  16. class _MeasureImagesBarState extends State<MeasureImagesBar> {
  17. /// 图片滑动控制器
  18. ScrollController scrollController = ScrollController();
  19. /// 数据
  20. final measureData = Get.find<MeasureDataController>();
  21. /// 当前可滑动的范围宽度
  22. late double width = 0;
  23. /// 是否滑到最后
  24. bool _isEnd = false;
  25. /// 计算下标
  26. int _currentIndex = 0;
  27. /// 左边能否滑动
  28. bool get isLeftCanScroll => _currentIndex <= 0;
  29. /// 右边能否滑动
  30. bool get isRightCanScroll => _isEnd;
  31. /// 滑动区域的key值
  32. final GlobalKey globalKey = GlobalKey();
  33. /// 图片左划事件
  34. void onLeftMoveImage() async {
  35. if (_currentIndex > 0) {
  36. _currentIndex--;
  37. await scrollController.animateTo(
  38. (160 * _currentIndex).toDouble(),
  39. duration: const Duration(milliseconds: 300),
  40. curve: Curves.linear,
  41. );
  42. }
  43. }
  44. /// 图片右划事件
  45. void onRightMoveImage() async {
  46. if (!isRightCanScroll) {
  47. _currentIndex++;
  48. await scrollController.animateTo(
  49. (160 * _currentIndex).toDouble(),
  50. duration: const Duration(milliseconds: 300),
  51. curve: Curves.linear,
  52. );
  53. }
  54. }
  55. @override
  56. Widget build(BuildContext context) {
  57. return FContainer(
  58. height: 120,
  59. margin: const EdgeInsets.symmetric(
  60. vertical: 15,
  61. ),
  62. child: FRow(
  63. children: [
  64. _buildImageListIcon(
  65. FIcons.fis_left_arrow,
  66. isLeftCanScroll,
  67. onLeftMoveImage,
  68. ),
  69. FExpanded(
  70. child: LeftSiderImageList(
  71. scrollController: scrollController,
  72. globalKey: globalKey,
  73. remedicalList: measureData.remedicalList,
  74. ),
  75. ),
  76. _buildImageListIcon(
  77. FIcons.fis_right_arrow,
  78. isRightCanScroll,
  79. onRightMoveImage,
  80. ),
  81. ],
  82. ),
  83. );
  84. }
  85. @override
  86. void initState() {
  87. scrollController.addListener(
  88. () async {
  89. // 如果滑动到最右边
  90. if (scrollController.position.pixels ==
  91. scrollController.position.maxScrollExtent) {
  92. setState(() {
  93. _isEnd = true;
  94. });
  95. } else {
  96. setState(
  97. () {
  98. _isEnd = false;
  99. },
  100. );
  101. }
  102. },
  103. );
  104. super.initState();
  105. }
  106. @override
  107. void didChangeDependencies() {
  108. super.didChangeDependencies();
  109. WidgetsBinding.instance?.addPostFrameCallback(
  110. (mag) {
  111. width = globalKey.currentContext!.size!.width;
  112. setState(
  113. () {
  114. _isEnd = width >= measureData.remedicalList.length * 160;
  115. },
  116. );
  117. },
  118. );
  119. }
  120. @override
  121. void dispose() {
  122. super.dispose();
  123. }
  124. FWidget _buildImageListIcon(
  125. IconData iconsData, bool isCanClick, Function onIconTap) {
  126. return FInkWell(
  127. onTap: () => onIconTap.call(),
  128. child: FContainer(
  129. width: 100,
  130. child: FIcon(
  131. iconsData,
  132. color: isCanClick ? Colors.grey : Colors.white,
  133. size: 30,
  134. ),
  135. ),
  136. );
  137. }
  138. }
  139. /// 当前测量组的所有图片
  140. class LeftSiderImageList extends StatefulWidget implements FWidget {
  141. LeftSiderImageList({
  142. required this.scrollController,
  143. required this.globalKey,
  144. required this.remedicalList,
  145. });
  146. /// 图片滑动控制器
  147. late ScrollController scrollController;
  148. late GlobalKey globalKey;
  149. final List<RemedicalInfoDTO> remedicalList;
  150. @override
  151. State<LeftSiderImageList> createState() => _LeftSiderImageListState();
  152. }
  153. class _LeftSiderImageListState extends State<LeftSiderImageList> {
  154. /// 当前测量的图片
  155. // final measureCurrentImage = Get.put(MeasureGetCurrentImage());
  156. /// 测量AI数据
  157. final measureData = Get.find<MeasureDataController>();
  158. late final measureController = Get.find<MeasureController>();
  159. late final measureHandler = Get.put(MeasureHandler());
  160. int selectedImageIndex = -1;
  161. /// 获取图片地址
  162. void onChangeImage(
  163. String imageUrl,
  164. String remedicalCode,
  165. ) async {
  166. measureHandler.changeImageLoaded = true;
  167. measureHandler.imageChanged = ChangeImageInfo(
  168. imageUrl,
  169. remedicalCode,
  170. );
  171. ExamImageInfo selectedImage = measureController.examInfo.images.firstWhere(
  172. (element) => element.url == imageUrl,
  173. );
  174. selectedImageIndex =
  175. measureController.examInfo.images.indexOf(selectedImage);
  176. measureData.itemCurrentImage = imageUrl;
  177. measureController.examInfo.selectedImageIndex = selectedImageIndex;
  178. setState(() {});
  179. }
  180. @override
  181. void initState() {
  182. super.initState();
  183. }
  184. @override
  185. void dispose() {
  186. super.dispose();
  187. }
  188. @override
  189. FWidget build(BuildContext context) {
  190. return FContainer(
  191. key: ValueKey(measureData.itemCurrentImage),
  192. alignment: Alignment.topCenter,
  193. child: _buildImageList(widget.remedicalList),
  194. );
  195. }
  196. FWidget _buildImageList(List<RemedicalInfoDTO> remedicalItemList) {
  197. return FContainer(
  198. key: widget.globalKey,
  199. child: FListView.builder(
  200. scrollDirection: Axis.horizontal,
  201. shrinkWrap: true,
  202. controller: widget.scrollController,
  203. itemCount: remedicalItemList.toList().length,
  204. itemBuilder: (BuildContext context, int index) {
  205. final FWidget image = ContentImage(
  206. remedicalInfo: remedicalItemList[index],
  207. fileDataType: remedicalItemList[index].fileDataType,
  208. terminalImage: TerminalImage(
  209. previewUrl: remedicalItemList[index].terminalImages!.previewUrl,
  210. ),
  211. isMeasure: true,
  212. onTap: () => onChangeImage(
  213. remedicalItemList[index].terminalImages!.imageUrl!,
  214. remedicalItemList[index].remedicalCode!,
  215. ),
  216. );
  217. return FContainer(
  218. key: ValueKey(measureData.itemCurrentImage),
  219. width: 160,
  220. alignment: Alignment.center,
  221. decoration: BoxDecoration(
  222. border: Border.all(
  223. width: 3,
  224. color: remedicalItemList[index].terminalImages!.imageUrl! !=
  225. measureData.itemCurrentImage
  226. ? Colors.grey
  227. : Colors.blue,
  228. ),
  229. ),
  230. child: image,
  231. );
  232. },
  233. ),
  234. );
  235. }
  236. }