David PHAM-VAN

Merge branch 'MacDeveloper1-feature/zoom'

@@ -4,6 +4,7 @@ @@ -4,6 +4,7 @@
4 4
5 - Refactor html imports 5 - Refactor html imports
6 - Implement PdfActionBarTheme for actions bar and add method scrollToPage [Aleksei] 6 - Implement PdfActionBarTheme for actions bar and add method scrollToPage [Aleksei]
  7 +- Update cursors in zoom mode for web [Aleksei]
7 8
8 ## 5.11.1 9 ## 5.11.1
9 10
@@ -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,9 @@ class PdfPreviewCustomState extends State<PdfPreviewCustom> @@ -235,7 +244,9 @@ 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 + _updateCursor(SystemMouseCursors.grab);
238 }); 248 });
  249 + _zoomChanged();
239 }, 250 },
240 child: PdfPreviewPage( 251 child: PdfPreviewPage(
241 key: key, 252 key: key,
@@ -271,15 +282,23 @@ class PdfPreviewCustomState extends State<PdfPreviewCustom> @@ -271,15 +282,23 @@ class PdfPreviewCustomState extends State<PdfPreviewCustom>
271 } 282 }
272 283
273 Widget _zoomPreview() { 284 Widget _zoomPreview() {
274 - return GestureDetector( 285 + final zoomPreview = GestureDetector(
275 onDoubleTap: () { 286 onDoubleTap: () {
276 setState(() { 287 setState(() {
277 preview = null; 288 preview = null;
  289 + _updateCursor(MouseCursor.defer);
278 }); 290 });
  291 + _zoomChanged();
279 }, 292 },
  293 + onLongPressCancel:
  294 + kIsWeb ? () => _updateCursor(SystemMouseCursors.grab) : null,
  295 + onLongPressDown:
  296 + kIsWeb ? (_) => _updateCursor(SystemMouseCursors.grabbing) : null,
280 child: InteractiveViewer( 297 child: InteractiveViewer(
281 transformationController: transformationController, 298 transformationController: transformationController,
282 maxScale: 5, 299 maxScale: 5,
  300 + onInteractionEnd:
  301 + kIsWeb ? (_) => _updateCursor(SystemMouseCursors.grab) : null,
283 child: Center( 302 child: Center(
284 child: PdfPreviewPage( 303 child: PdfPreviewPage(
285 pageData: pages[preview!], 304 pageData: pages[preview!],
@@ -289,6 +308,20 @@ class PdfPreviewCustomState extends State<PdfPreviewCustom> @@ -289,6 +308,20 @@ class PdfPreviewCustomState extends State<PdfPreviewCustom>
289 ), 308 ),
290 ), 309 ),
291 ); 310 );
  311 + return MouseRegion(
  312 + cursor: _mouseCursor,
  313 + child: zoomPreview,
  314 + );
  315 + }
  316 +
  317 + void _zoomChanged() => widget.onZoomChanged?.call(preview != null);
  318 +
  319 + void _updateCursor(MouseCursor mouseCursor) {
  320 + if (mouseCursor != _mouseCursor) {
  321 + setState(() {
  322 + _mouseCursor = mouseCursor;
  323 + });
  324 + }
292 } 325 }
293 326
294 @override 327 @override
@@ -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 ),