records_canvas.dart 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import 'package:fis_measure/interfaces/process/annotations/annotation.dart';
  2. import 'package:fis_measure/interfaces/process/items/item_feature.dart';
  3. import 'package:fis_measure/interfaces/process/workspace/application.dart';
  4. import 'package:fis_measure/process/workspace/measure_data_controller.dart';
  5. import 'package:flutter/material.dart';
  6. import 'package:get/get.dart';
  7. class MeasureRecordsCanvasPanel extends StatefulWidget {
  8. const MeasureRecordsCanvasPanel({Key? key}) : super(key: key);
  9. @override
  10. State<StatefulWidget> createState() => _RecordsCanvasPanelState();
  11. }
  12. class _RecordsCanvasPanelState extends State<MeasureRecordsCanvasPanel> {
  13. late final application = Get.find<IApplication>();
  14. late final measureData = Get.find<MeasureDataController>();
  15. late List<IMeasureItemFeature> measureFeatures = [];
  16. late List<IAnnotationItemFeature> annotationFeatures = [];
  17. bool get hasNoData => measureFeatures.isEmpty && annotationFeatures.isEmpty;
  18. @override
  19. void initState() {
  20. _addListenrs();
  21. super.initState();
  22. }
  23. @override
  24. void dispose() {
  25. _removeListenrs();
  26. super.dispose();
  27. }
  28. @override
  29. Widget build(BuildContext context) {
  30. if (hasNoData) {
  31. return const SizedBox();
  32. }
  33. return LayoutBuilder(builder: (context, constraints) {
  34. return ClipRect(
  35. child: SizedBox(
  36. width: constraints.maxWidth,
  37. height: constraints.maxHeight,
  38. child: RepaintBoundary(
  39. child: CustomPaint(
  40. painter: _PanelPainter(measureFeatures, annotationFeatures),
  41. ),
  42. ),
  43. ),
  44. );
  45. });
  46. }
  47. void _updateFeatures() {
  48. measureFeatures.clear();
  49. for (var item in application.measureItems) {
  50. measureFeatures.addAll(item.measuredFeatures);
  51. }
  52. annotationFeatures.clear();
  53. for (var item in application.annotationItems) {
  54. annotationFeatures.addAll(item.features);
  55. }
  56. }
  57. void _onMeasureRerenderReady(Object sender, void e) {
  58. if (mounted) {
  59. setState(() {
  60. _updateFeatures();
  61. });
  62. }
  63. }
  64. /// 样式更新事件监听
  65. void _onMeasureSystemSettingChanged(_, e) {
  66. setState(() {});
  67. }
  68. void _addListenrs() {
  69. application.updateRenderReady.addListener(_onMeasureRerenderReady);
  70. measureData.measureSystemSettingChanged
  71. .addListener(_onMeasureSystemSettingChanged);
  72. }
  73. void _removeListenrs() {
  74. application.updateRenderReady.removeListener(_onMeasureRerenderReady);
  75. measureData.measureSystemSettingChanged
  76. .removeListener(_onMeasureSystemSettingChanged);
  77. }
  78. }
  79. class _PanelPainter extends CustomPainter {
  80. final List<IMeasureItemFeature> measureFeatures;
  81. final List<IAnnotationItemFeature> annotationFeatures;
  82. _PanelPainter(this.measureFeatures, this.annotationFeatures);
  83. @override
  84. void paint(Canvas canvas, Size size) {
  85. for (final feature in measureFeatures) {
  86. if (feature.checkCanPaint()) {
  87. feature.paint(canvas, size);
  88. }
  89. }
  90. for (final feature in annotationFeatures) {
  91. feature.paint(canvas, size);
  92. }
  93. }
  94. @override
  95. bool shouldRepaint(covariant _PanelPainter oldDelegate) {
  96. return oldDelegate.hashCode != hashCode;
  97. }
  98. }