mirror of
https://github.com/lifegpc/eh_downloader_flutter.git
synced 2026-07-08 01:30:28 +08:00
Add mouse scroll to scale image
This commit is contained in:
2
lib/platform/media_query.dart
Normal file
2
lib/platform/media_query.dart
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
export './media_query_none.dart'
|
||||||
|
if (dart.library.html) './media_query_web.dart';
|
||||||
2
lib/platform/media_query_none.dart
Normal file
2
lib/platform/media_query_none.dart
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
bool get pointerIsMouse => false;
|
||||||
|
bool get pointerIsTouch => false;
|
||||||
5
lib/platform/media_query_web.dart
Normal file
5
lib/platform/media_query_web.dart
Normal 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;
|
||||||
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user