Aleksei
Committed by David PHAM-VAN

Implement mouse cursor for web

Add `onZoomChanged` for `PdfPreview`
@@ -16,6 +16,7 @@ @@ -16,6 +16,7 @@
16 16
17 import 'dart:async'; 17 import 'dart:async';
18 18
  19 +import 'package:flutter/foundation.dart';
19 import 'package:flutter/material.dart'; 20 import 'package:flutter/material.dart';
20 import 'package:pdf/pdf.dart'; 21 import 'package:pdf/pdf.dart';
21 22
@@ -51,6 +52,7 @@ class PdfPreviewCustom extends StatefulWidget { @@ -51,6 +52,7 @@ class PdfPreviewCustom extends StatefulWidget {
51 this.shrinkWrap = false, 52 this.shrinkWrap = false,
52 this.pagesBuilder, 53 this.pagesBuilder,
53 this.enableScrollToPage = false, 54 this.enableScrollToPage = false,
  55 + this.onZoomChanged,
54 }) : super(key: key); 56 }) : super(key: key);
55 57
56 /// Pdf paper page format 58 /// Pdf paper page format
@@ -106,6 +108,9 @@ class PdfPreviewCustom extends StatefulWidget { @@ -106,6 +108,9 @@ class PdfPreviewCustom extends StatefulWidget {
106 /// Whether scroll to page functionality enabled. 108 /// Whether scroll to page functionality enabled.
107 final bool enableScrollToPage; 109 final bool enableScrollToPage;
108 110
  111 + /// The zoom mode has changed
  112 + final ValueChanged<bool>? onZoomChanged;
  113 +
109 @override 114 @override
110 PdfPreviewCustomState createState() => PdfPreviewCustomState(); 115 PdfPreviewCustomState createState() => PdfPreviewCustomState();
111 } 116 }
@@ -130,6 +135,8 @@ class PdfPreviewCustomState extends State<PdfPreviewCustom> @@ -130,6 +135,8 @@ class PdfPreviewCustomState extends State<PdfPreviewCustom>
130 135
131 Timer? previewUpdate; 136 Timer? previewUpdate;
132 137
  138 + MouseCursor _mouseCursor = MouseCursor.defer;
  139 +
133 static const _errorMessage = 'Unable to display the document'; 140 static const _errorMessage = 'Unable to display the document';
134 141
135 @override 142 @override
@@ -137,6 +144,7 @@ class PdfPreviewCustomState extends State<PdfPreviewCustom> @@ -137,6 +144,7 @@ class PdfPreviewCustomState extends State<PdfPreviewCustom>
137 144
138 @override 145 @override
139 void dispose() { 146 void dispose() {
  147 + transformationController.dispose();
140 previewUpdate?.cancel(); 148 previewUpdate?.cancel();
141 super.dispose(); 149 super.dispose();
142 } 150 }
@@ -155,6 +163,7 @@ class PdfPreviewCustomState extends State<PdfPreviewCustom> @@ -155,6 +163,7 @@ class PdfPreviewCustomState extends State<PdfPreviewCustom>
155 preview = null; 163 preview = null;
156 updatePosition = null; 164 updatePosition = null;
157 raster(); 165 raster();
  166 + _zoomChanged();
158 } 167 }
159 super.didUpdateWidget(oldWidget); 168 super.didUpdateWidget(oldWidget);
160 } 169 }
@@ -235,7 +244,11 @@ class PdfPreviewCustomState extends State<PdfPreviewCustom> @@ -235,7 +244,11 @@ class PdfPreviewCustomState extends State<PdfPreviewCustom>
235 updatePosition = scrollController.position.pixels; 244 updatePosition = scrollController.position.pixels;
236 preview = index; 245 preview = index;
237 transformationController.value.setIdentity(); 246 transformationController.value.setIdentity();
  247 + if (kIsWeb) {
  248 + _mouseCursor = SystemMouseCursors.grab;
  249 + }
238 }); 250 });
  251 + _zoomChanged();
239 }, 252 },
240 child: PdfPreviewPage( 253 child: PdfPreviewPage(
241 key: key, 254 key: key,
@@ -271,11 +284,22 @@ class PdfPreviewCustomState extends State<PdfPreviewCustom> @@ -271,11 +284,22 @@ class PdfPreviewCustomState extends State<PdfPreviewCustom>
271 } 284 }
272 285
273 Widget _zoomPreview() { 286 Widget _zoomPreview() {
274 - return GestureDetector( 287 + final zoomPreview = GestureDetector(
  288 + onTap: () {
  289 + if (kIsWeb) {
  290 + setState(() {
  291 + _mouseCursor = SystemMouseCursors.grabbing;
  292 + });
  293 + }
  294 + },
275 onDoubleTap: () { 295 onDoubleTap: () {
276 setState(() { 296 setState(() {
277 preview = null; 297 preview = null;
  298 + if (kIsWeb) {
  299 + _mouseCursor = MouseCursor.defer;
  300 + }
278 }); 301 });
  302 + _zoomChanged();
279 }, 303 },
280 child: InteractiveViewer( 304 child: InteractiveViewer(
281 transformationController: transformationController, 305 transformationController: transformationController,
@@ -289,8 +313,13 @@ class PdfPreviewCustomState extends State<PdfPreviewCustom> @@ -289,8 +313,13 @@ class PdfPreviewCustomState extends State<PdfPreviewCustom>
289 ), 313 ),
290 ), 314 ),
291 ); 315 );
  316 + return kIsWeb
  317 + ? MouseRegion(cursor: _mouseCursor, child: zoomPreview)
  318 + : zoomPreview;
292 } 319 }
293 320
  321 + void _zoomChanged() => widget.onZoomChanged?.call(preview != null);
  322 +
294 @override 323 @override
295 Widget build(BuildContext context) { 324 Widget build(BuildContext context) {
296 Widget page; 325 Widget page;
@@ -65,6 +65,7 @@ class PdfPreview extends StatefulWidget { @@ -65,6 +65,7 @@ class PdfPreview extends StatefulWidget {
65 this.dpi, 65 this.dpi,
66 this.actionBarTheme = const PdfActionBarTheme(), 66 this.actionBarTheme = const PdfActionBarTheme(),
67 this.enableScrollToPage = false, 67 this.enableScrollToPage = false,
  68 + this.onZoomChanged,
68 }) : _pagesBuilder = null, 69 }) : _pagesBuilder = null,
69 super(key: key); 70 super(key: key);
70 71
@@ -125,6 +126,7 @@ class PdfPreview extends StatefulWidget { @@ -125,6 +126,7 @@ class PdfPreview extends StatefulWidget {
125 this.actionBarTheme = const PdfActionBarTheme(), 126 this.actionBarTheme = const PdfActionBarTheme(),
126 required CustomPdfPagesBuilder pagesBuilder, 127 required CustomPdfPagesBuilder pagesBuilder,
127 this.enableScrollToPage = false, 128 this.enableScrollToPage = false,
  129 + this.onZoomChanged,
128 }) : _pagesBuilder = pagesBuilder, 130 }) : _pagesBuilder = pagesBuilder,
129 super(key: key); 131 super(key: key);
130 132
@@ -238,6 +240,9 @@ class PdfPreview extends StatefulWidget { @@ -238,6 +240,9 @@ class PdfPreview extends StatefulWidget {
238 /// Whether scroll to page functionality enabled. 240 /// Whether scroll to page functionality enabled.
239 final bool enableScrollToPage; 241 final bool enableScrollToPage;
240 242
  243 + /// The zoom mode has changed
  244 + final ValueChanged<bool>? onZoomChanged;
  245 +
241 @override 246 @override
242 PdfPreviewState createState() => PdfPreviewState(); 247 PdfPreviewState createState() => PdfPreviewState();
243 } 248 }
@@ -411,6 +416,7 @@ class PdfPreviewState extends State<PdfPreview> { @@ -411,6 +416,7 @@ class PdfPreviewState extends State<PdfPreview> {
411 pagesBuilder: widget._pagesBuilder, 416 pagesBuilder: widget._pagesBuilder,
412 dpi: widget.dpi, 417 dpi: widget.dpi,
413 enableScrollToPage: widget.enableScrollToPage, 418 enableScrollToPage: widget.enableScrollToPage,
  419 + onZoomChanged: widget.onZoomChanged,
414 ); 420 );
415 }), 421 }),
416 ), 422 ),