Committed by
David PHAM-VAN
Implement mouse cursor for web
Add `onZoomChanged` for `PdfPreview`
Showing
2 changed files
with
36 additions
and
1 deletions
@@ -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 | ), |
-
Please register or login to post a comment