Add mouse scroll to scale image

This commit is contained in:
2024-02-03 13:01:03 +08:00
parent 4d7bcb1226
commit dd486c3e50
4 changed files with 40 additions and 2 deletions

View File

@@ -0,0 +1,2 @@
export './media_query_none.dart'
if (dart.library.html) './media_query_web.dart';

View File

@@ -0,0 +1,2 @@
bool get pointerIsMouse => false;
bool get pointerIsTouch => false;

View File

@@ -0,0 +1,5 @@
// ignore: avoid_web_libraries_in_flutter
import 'dart:html';
bool get pointerIsMouse => window.matchMedia('(pointer: fine)').matches;
bool get pointerIsTouch => window.matchMedia('(pointer: coarse)').matches;

View File

@@ -1,6 +1,7 @@
import 'package:dio/dio.dart'; import 'package:dio/dio.dart';
import 'package:dio_image_provider/dio_image_provider.dart'; import 'package:dio_image_provider/dio_image_provider.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart'; import 'package:flutter/scheduler.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
@@ -14,6 +15,7 @@ import '../api/file.dart';
import '../api/gallery.dart'; import '../api/gallery.dart';
import '../components/fit_text.dart'; import '../components/fit_text.dart';
import '../globals.dart'; import '../globals.dart';
import '../platform/media_query.dart';
final _log = Logger("SinglePageViewer"); final _log = Logger("SinglePageViewer");
@@ -51,6 +53,7 @@ class _SinglePageViewer extends State<SinglePageViewer>
Object? _error; Object? _error;
bool _inited = false; bool _inited = false;
bool _showMenu = false; bool _showMenu = false;
late PhotoViewController _photoViewController;
void _updatePages() { void _updatePages() {
if (_data == null) return; if (_data == null) return;
final displayAd = prefs.getBool("displayAd") ?? false; final displayAd = prefs.getBool("displayAd") ?? false;
@@ -70,6 +73,7 @@ class _SinglePageViewer extends State<SinglePageViewer>
_updatePages(); _updatePages();
_files = widget.files; _files = widget.files;
_back = "/gallery/${widget.gid}"; _back = "/gallery/${widget.gid}";
_photoViewController = PhotoViewController();
super.initState(); super.initState();
} }
@@ -77,6 +81,7 @@ class _SinglePageViewer extends State<SinglePageViewer>
void dispose() { void dispose() {
_cancel?.cancel(); _cancel?.cancel();
_pageController.dispose(); _pageController.dispose();
_photoViewController.dispose();
super.dispose(); super.dispose();
} }
@@ -125,6 +130,9 @@ class _SinglePageViewer extends State<SinglePageViewer>
builder: (BuildContext context, int index) { builder: (BuildContext context, int index) {
final data = _pages![index]; final data = _pages![index];
final f = _files!.files[data.token]!.first; final f = _files!.files[data.token]!.first;
if (_index != index) {
_photoViewController.reset();
}
return PhotoViewGalleryPageOptions( return PhotoViewGalleryPageOptions(
imageProvider: DioImage.string( imageProvider: DioImage.string(
api.getFileUrl(f.id), api.getFileUrl(f.id),
@@ -136,6 +144,7 @@ class _SinglePageViewer extends State<SinglePageViewer>
transitionOnUserGestures: true, transitionOnUserGestures: true,
), ),
filterQuality: FilterQuality.high, filterQuality: FilterQuality.high,
controller: _photoViewController,
); );
}, },
onPageChanged: (index) { onPageChanged: (index) {
@@ -184,10 +193,30 @@ class _SinglePageViewer extends State<SinglePageViewer>
); );
} }
Widget _buildWithScrollSupport(BuildContext context,
{required Widget child}) {
if (kIsWeb && pointerIsTouch) {
return child;
}
return Listener(
onPointerSignal: (event) {
if (event is PointerScrollEvent &&
event.kind == PointerDeviceKind.mouse) {
if (_photoViewController.scale != null) {
_photoViewController.scale = _photoViewController.scale! *
(1 - event.scrollDelta.dy / MediaQuery.of(context).size.height);
}
}
},
child: child,
);
}
Widget _buildViewer(BuildContext context) { Widget _buildViewer(BuildContext context) {
return _buildWithTap(context, return _buildWithTap(context,
child: child: _buildWithKeyboardSupport(context,
_buildWithKeyboardSupport(context, child: _buildGallery(context))); child: _buildWithScrollSupport(context,
child: _buildGallery(context))));
} }
Widget _buildTopAppBar(BuildContext context) { Widget _buildTopAppBar(BuildContext context) {