input_image.dart 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. import 'package:fis_lib_report/converts/alignment_convert.dart';
  2. import 'package:fis_lib_report/converts/margin_convert.dart';
  3. import 'package:fis_lib_report/converts/pt_to_px_converter.dart';
  4. import 'package:fis_lib_report/pages/components/vid_image.dart';
  5. import 'package:fis_lib_report/pages/helpler.dart';
  6. import 'package:fis_lib_report/report/inputImage.dart';
  7. import 'package:fis_lib_report/report/inputImageList.dart';
  8. import 'package:fis_lib_report/report_info/input_image_info.dart';
  9. import 'package:fis_lib_report/report_info/input_image_list_info.dart';
  10. import 'package:fis_lib_report/report_info/report_info.dart';
  11. import 'package:flutter/cupertino.dart';
  12. import 'package:flutter/material.dart';
  13. class RInputImage extends StatefulWidget {
  14. final InputImage inputImage;
  15. RInputImage(this.inputImage);
  16. @override
  17. State<StatefulWidget> createState() {
  18. return _RInputImageState();
  19. }
  20. }
  21. class _RInputImageState extends State<RInputImage> {
  22. late final InputImage inputImage;
  23. InputImageInfo? inputImageInfo;
  24. _RInputImageState();
  25. Color _borderColor = Colors.grey;
  26. bool _isSelected = false;
  27. bool _hasImageBorder = false;
  28. String _imageUrl = '';
  29. Widget _child = const Text('请点击此处后选择右侧图片');
  30. @override
  31. initState() {
  32. inputImage = widget.inputImage;
  33. _hasImageBorder = inputImage.hasImageBorder!;
  34. final element = ReportInfo.instance.getElementInfo(inputImage);
  35. if (element != null) {
  36. inputImageInfo = element as InputImageInfo;
  37. inputImageInfo!.onSelect!.addListener((sender, e) {
  38. setState(() {
  39. if (_imageUrl != e) {
  40. _imageUrl = e;
  41. _child = _getChild();
  42. } else {
  43. _imageUrl = '';
  44. _child = const Text('请点击此处后选择右侧图片');
  45. }
  46. });
  47. });
  48. }
  49. super.initState();
  50. }
  51. @override
  52. Widget build(BuildContext context) {
  53. return MouseRegion(
  54. cursor: SystemMouseCursors.click,
  55. child: GestureDetector(
  56. onTap: () {
  57. if (_isSelected) {
  58. setState(() {
  59. _borderColor = Colors.grey;
  60. _isSelected = false;
  61. _hasImageBorder = false;
  62. if (inputImageInfo != null) {
  63. inputImageInfo!.isSelected = false;
  64. }
  65. });
  66. } else {
  67. setState(() {
  68. _borderColor = const Color.fromARGB(255, 64, 159, 248);
  69. _isSelected = true;
  70. _hasImageBorder = true;
  71. if (inputImageInfo != null) {
  72. inputImageInfo!.isSelected = true;
  73. }
  74. });
  75. }
  76. },
  77. child: Row(
  78. mainAxisAlignment: AlignmentConvert.horizontalToMainConvert(
  79. inputImage.horizontalAlignment),
  80. children: [
  81. Container(
  82. padding: const EdgeInsets.all(3),
  83. height: PtToPxConverter.ptToPx(inputImage.imageHeight!) + 6,
  84. width: PtToPxConverter.ptToPx(inputImage.imageWidth!) + 6,
  85. alignment: Alignment.center,
  86. margin: MarginConvert.marginConvert(inputImage.margin),
  87. decoration: BoxDecoration(
  88. border: _hasImageBorder
  89. ? Border.all(
  90. width: 0.5,
  91. color: _borderColor,
  92. )
  93. : null,
  94. color: Colors.transparent),
  95. child: _child,
  96. ),
  97. ],
  98. ),
  99. ),
  100. );
  101. }
  102. Widget _getChild() {
  103. if (_imageUrl.isNotEmpty) {
  104. return VidImageView.network(
  105. _imageUrl,
  106. fit: BoxFit.fill,
  107. height: PtToPxConverter.ptToPx(inputImage.imageHeight!),
  108. width: PtToPxConverter.ptToPx(inputImage.imageWidth!),
  109. );
  110. }
  111. return const Text('请点击此处后选择右侧图片');
  112. }
  113. }