label_drag_target_pannel.dart 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import 'package:fis_measure/interfaces/enums/annotation.dart';
  2. import 'package:fis_measure/interfaces/process/workspace/application.dart';
  3. import 'package:fis_measure/interfaces/process/workspace/point_info.dart';
  4. import 'package:flutter/material.dart';
  5. import 'package:get/get.dart';
  6. import '../positioned_cursor.dart';
  7. /// 文本注释拖拽目标面板
  8. class AnnotationLabelDragTargetPanel extends StatefulWidget {
  9. const AnnotationLabelDragTargetPanel({Key? key}) : super(key: key);
  10. @override
  11. State<StatefulWidget> createState() => _PanelState();
  12. }
  13. class _PanelState extends State<AnnotationLabelDragTargetPanel> {
  14. late final application = Get.find<IApplication>();
  15. final mouseState = Get.find<IMouseState>();
  16. @override
  17. void initState() {
  18. // TODO: implement initState
  19. super.initState();
  20. }
  21. @override
  22. Widget build(BuildContext context) {
  23. return Container(
  24. // color: Colors.green,
  25. child: DragTarget<String>(
  26. builder: (context, candidateData, rejectedData) {
  27. return GestureDetector(
  28. onPanDown: (details) {
  29. application.createPointInfo(
  30. details.localPosition,
  31. PointInfoType.mouseDown,
  32. );
  33. application.switchAnnotation(AnnotationType.input);
  34. },
  35. child: MouseRegion(
  36. cursor: SystemMouseCursors.none,
  37. onHover: (event) {
  38. mouseState.mousePosition = event.localPosition;
  39. },
  40. child: Stack(
  41. children: const [
  42. PositionedCursor(),
  43. ],
  44. ),
  45. ),
  46. );
  47. },
  48. onMove: (details) {
  49. _notifyPosition(context, details.offset, PointInfoType.mouseMove);
  50. },
  51. onAcceptWithDetails: (details) {
  52. _notifyPosition(context, details.offset, PointInfoType.mouseUp);
  53. },
  54. ),
  55. );
  56. }
  57. void _notifyPosition(
  58. BuildContext context,
  59. Offset offset,
  60. PointInfoType type,
  61. ) {
  62. final localOffset = _findLocalPosition(context, offset);
  63. mouseState.mousePosition = localOffset;
  64. application.createPointInfo(localOffset, type);
  65. }
  66. Offset _findLocalPosition(BuildContext context, Offset globalPosition) {
  67. final renderBox = context.findRenderObject() as RenderBox?;
  68. if (renderBox == null) return globalPosition;
  69. return renderBox.globalToLocal(globalPosition);
  70. }
  71. @override
  72. void dispose() {
  73. // TODO: implement dispose
  74. super.dispose();
  75. }
  76. }