records_canvas.dart 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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:flutter/material.dart';
  5. import 'package:get/get.dart';
  6. class MeasureRecordsCanvasPanel extends StatefulWidget {
  7. const MeasureRecordsCanvasPanel({Key? key}) : super(key: key);
  8. @override
  9. State<StatefulWidget> createState() => _RecordsCanvasPanelState();
  10. }
  11. class _RecordsCanvasPanelState extends State<MeasureRecordsCanvasPanel> {
  12. late final application = Get.find<IApplication>();
  13. late List<IMeasureItemFeature> measureFeatures = [];
  14. late List<IAnnotationItemFeature> annotationFeatures = [];
  15. bool get hasNoData => measureFeatures.isEmpty && annotationFeatures.isEmpty;
  16. @override
  17. void initState() {
  18. _addListenrs();
  19. super.initState();
  20. }
  21. @override
  22. void dispose() {
  23. _removeListenrs();
  24. super.dispose();
  25. }
  26. @override
  27. Widget build(BuildContext context) {
  28. if (hasNoData) {
  29. return const SizedBox();
  30. }
  31. return LayoutBuilder(builder: (context, constraints) {
  32. return SizedBox(
  33. width: constraints.maxWidth,
  34. height: constraints.maxHeight,
  35. child: RepaintBoundary(
  36. child: CustomPaint(
  37. painter: _PanelPainter(measureFeatures, annotationFeatures),
  38. ),
  39. ),
  40. );
  41. });
  42. }
  43. void _updateFeatures() {
  44. measureFeatures.clear();
  45. for (var item in application.measureItems) {
  46. measureFeatures.addAll(item.measuredFeatures);
  47. }
  48. annotationFeatures.clear();
  49. for (var item in application.annotationItems) {
  50. annotationFeatures.addAll(item.features);
  51. }
  52. }
  53. void _onMeasureRerenderReady(Object sender, void e) {
  54. if (mounted) {
  55. setState(() {
  56. _updateFeatures();
  57. });
  58. }
  59. }
  60. void _addListenrs() {
  61. application.updateRenderReady.addListener(_onMeasureRerenderReady);
  62. }
  63. void _removeListenrs() {
  64. application.updateRenderReady.removeListener(_onMeasureRerenderReady);
  65. }
  66. }
  67. class _PanelPainter extends CustomPainter {
  68. final List<IMeasureItemFeature> measureFeatures;
  69. final List<IAnnotationItemFeature> annotationFeatures;
  70. _PanelPainter(this.measureFeatures, this.annotationFeatures);
  71. @override
  72. void paint(Canvas canvas, Size size) {
  73. for (final feature in measureFeatures) {
  74. feature.paint(canvas, size);
  75. }
  76. for (final feature in annotationFeatures) {
  77. feature.paint(canvas, size);
  78. }
  79. }
  80. @override
  81. bool shouldRepaint(covariant _PanelPainter oldDelegate) {
  82. return oldDelegate.hashCode != hashCode;
  83. }
  84. }