123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233 |
- import 'dart:convert';
- import 'package:fis_common/event/event_type.dart';
- import 'package:fis_lib_business_components/components/white_board/utils.dart';
- import 'package:fis_lib_business_components/components/white_board/structure.dart';
- import 'package:fis_lib_business_components/components/white_board/white_board_painter.dart';
- import 'package:fis_ui/index.dart';
- import 'package:flutter/material.dart';
- class FWhiteBoard extends StatefulWidget implements FWidget {
- const FWhiteBoard({
- key,
- required this.initData,
- required this.userId,
- required this.patientColor,
- required this.paintType,
- required this.sendData,
- required this.onReceiveData,
- required this.onClearCanavs,
- });
-
- final List<String> initData;
-
- final String userId;
-
- final Color patientColor;
-
- final PaintType paintType;
-
- final void Function(String data) sendData;
-
- final FEventHandler<String> onReceiveData;
-
- final FEventHandler<String> onClearCanavs;
- @override
- State<FWhiteBoard> createState() => _FWhiteBoardState();
- }
- class _FWhiteBoardState extends State<FWhiteBoard> {
-
- late double canvasWidth = 0.0;
- late double canvasHeight = 0.0;
-
- WhiteBoardPen myPen = WhiteBoardPen();
-
- Color get myPenColor => widget.patientColor;
-
- static const double strokeWidth = 3.0;
-
- List<String> _asyncDrawQueue = [];
-
- bool _asyncDrawLock = false;
- @override
- void initState() {
- super.initState();
- widget.onReceiveData.addListener((sender, data) {
- _onReceiveDrawData(data);
- });
- widget.onClearCanavs.addListener((sender, userId) {
- _clearUserLines(userId);
- });
-
- WidgetsBinding.instance.addPostFrameCallback((_) {
- _paintInitData();
- });
- }
- @override
- Widget build(BuildContext context) {
- canvasWidth = MediaQuery.of(context).size.width;
- canvasHeight = MediaQuery.of(context).size.height;
- return MouseRegion(
- cursor: SystemMouseCursors.click,
- child: GestureDetector(
- onPanDown: _onPanDown,
- onPanUpdate: _onPanUpdate,
- onPanEnd: _onPanEnd,
- onPanCancel: _onPanCancel,
- onDoubleTap: myPen.clear,
- child: CustomPaint(
- size: MediaQuery.of(context).size,
- painter: WhiteBoardPainter(
- pen: myPen,
- width: canvasWidth,
- height: canvasHeight,
- ),
- ),
- ),
- );
- }
-
- void _onPanDown(DragDownDetails details) {
- Line line = Line(
- color: myPenColor,
- strokeWidth: strokeWidth,
- paintType: widget.paintType,
- userId: widget.userId,
- );
- myPen.pushLine(line);
- }
-
- void _onPanUpdate(DragUpdateDetails details) {
- myPen.pushPoint(Point.fromOffset(
- details.localPosition,
- canvasWidth,
- canvasHeight,
- ));
- }
-
- void _onPanEnd(DragEndDetails details) {
- _sentDrawAction();
- myPen.doneLine();
- }
-
- void _paintInitData() {
- for (int i = 0; i < widget.initData.length; i++) {
- _onReceiveDrawDataImmediately(widget.initData[i]);
- }
- }
-
- void _sentDrawAction() {
- List<List<double>> pointsList = [];
- for (int i = 0; i < myPen.activeLine.points.length; i++) {
- pointsList.add(myPen.activeLine.points[i].toList());
- }
- widget.sendData(jsonEncode({
- "u_Id": widget.userId,
- "l_Id": "",
- "color": widget.patientColor.toString(),
- "points": PointsUtil.compressPointsList(pointsList),
- }));
- }
- Color parseColor(String colorString) {
- if (colorString == null || !colorString.startsWith('Color(')) {
- return Colors.black54;
- }
- final String valueString = colorString.substring(6, colorString.length - 1);
- List<String> parts = valueString.split(',');
- if (parts.length != 4) {
- return Colors.black54;
- }
- try {
- int alpha = int.parse(parts[0]);
- int red = int.parse(parts[1]);
- int green = int.parse(parts[2]);
- int blue = int.parse(parts[3]);
- return Color.fromARGB(alpha, red, green, blue);
- } catch (e) {
- return Colors.black54;
- }
- }
-
- void _onReceiveDrawData(String jsonData) async {
- if (_asyncDrawLock) {
- _asyncDrawQueue.add(jsonData);
- return;
- }
- _asyncDrawLock = true;
- var data = jsonDecode(jsonData);
- List<dynamic> pointsList = PointsUtil.decompressPointsList(data["points"]);
- Line line = Line(
- color: parseColor(data["color"]),
- strokeWidth: strokeWidth,
- userId: data["u_Id"],
- );
- myPen.pushLine(line);
- for (int i = 0; i < pointsList.length; i++) {
- myPen.pushPoint(Point.fromList(
- pointsList[i],
- ));
- await Future.delayed(const Duration(milliseconds: 2));
- }
- myPen.doneLine();
- _asyncDrawLock = false;
-
- if (_asyncDrawQueue.isNotEmpty) {
- _onReceiveDrawData(_asyncDrawQueue.removeAt(0));
- }
- }
-
- void _onReceiveDrawDataImmediately(String jsonData) {
- var data = jsonDecode(jsonData);
- List<dynamic> pointsList = PointsUtil.decompressPointsList(data["points"]);
- Line line = Line(
- color: ColorUtil.generateColor(data["u_Id"]),
- strokeWidth: strokeWidth,
- userId: data["u_Id"],
- );
- myPen.pushLine(line);
- for (int i = 0; i < pointsList.length; i++) {
- myPen.pushPoint(Point.fromList(
- pointsList[i],
- ));
- }
- myPen.doneLine();
- }
- void _clearUserLines(String userId) {
- myPen.clearCurrectUserLines(userId);
- }
- void _onPanCancel() {
- myPen.removeEmpty();
- }
- }
|