diff --git a/lib/widgets/content/file_viewer_contents.dart b/lib/widgets/content/file_viewer_contents.dart index f586511a..3f925ec7 100644 --- a/lib/widgets/content/file_viewer_contents.dart +++ b/lib/widgets/content/file_viewer_contents.dart @@ -1,5 +1,6 @@ import 'dart:io'; import 'dart:math' as math; +import 'dart:ui'; import 'package:file_saver/file_saver.dart'; import 'package:flutter/material.dart'; @@ -89,19 +90,39 @@ class ImageFileContent extends HookConsumerWidget { return Stack( children: [ Positioned.fill( - child: PhotoView( - backgroundDecoration: BoxDecoration( - color: Colors.black.withOpacity(0.9), + child: Listener( + onPointerSignal: (pointerSignal) { + try { + // Handle mouse wheel zoom - cast to dynamic to access scrollDelta + final delta = + (pointerSignal as dynamic).scrollDelta.dy as double?; + if (delta != null && delta != 0) { + final currentScale = photoViewController.scale ?? 1.0; + // Adjust scale based on scroll direction (invert for natural zoom) + final newScale = + delta > 0 ? currentScale * 0.9 : currentScale * 1.1; + // Clamp scale to reasonable bounds + final clampedScale = newScale.clamp(0.1, 10.0); + photoViewController.scale = clampedScale; + } + } catch (e) { + // Ignore non-scroll events + } + }, + child: PhotoView( + backgroundDecoration: BoxDecoration( + color: Colors.black.withOpacity(0.9), + ), + controller: photoViewController, + imageProvider: CloudImageWidget.provider( + fileId: item.id, + serverUrl: ref.watch(serverUrlProvider), + original: showOriginal.value, + ), + customSize: MediaQuery.of(context).size, + basePosition: Alignment.center, + filterQuality: FilterQuality.high, ), - controller: photoViewController, - imageProvider: CloudImageWidget.provider( - fileId: item.id, - serverUrl: ref.watch(serverUrlProvider), - original: showOriginal.value, - ), - customSize: MediaQuery.of(context).size, - basePosition: Alignment.center, - filterQuality: FilterQuality.high, ), ), // Controls overlay