hdr image viewer

update xcode project

use existing asset fetch

pinch zoom

fix xcode

debug scaling
This commit is contained in:
mertalev
2025-09-08 14:14:21 -04:00
parent 23fb2e0fae
commit 56caf6a133
7 changed files with 336 additions and 34 deletions
@@ -19,7 +19,7 @@ import 'package:immich_mobile/presentation/widgets/asset_viewer/bottom_sheet.wid
import 'package:immich_mobile/presentation/widgets/asset_viewer/top_app_bar.widget.dart';
import 'package:immich_mobile/presentation/widgets/asset_viewer/video_viewer.widget.dart';
import 'package:immich_mobile/presentation/widgets/images/image_provider.dart';
import 'package:immich_mobile/presentation/widgets/images/thumbnail.widget.dart';
import 'package:immich_mobile/presentation/widgets/images/native_image.widget.dart';
import 'package:immich_mobile/providers/asset_viewer/is_motion_video_playing.provider.dart';
import 'package:immich_mobile/providers/asset_viewer/video_player_controls_provider.dart';
import 'package:immich_mobile/providers/asset_viewer/video_player_value_provider.dart';
@@ -533,24 +533,21 @@ class _AssetViewerState extends ConsumerState<AssetViewer> {
}
PhotoViewGalleryPageOptions _imageBuilder(BuildContext ctx, BaseAsset asset) {
final size = ctx.sizeData;
return PhotoViewGalleryPageOptions(
key: ValueKey(asset.heroTag),
imageProvider: getFullImageProvider(asset, size: size),
heroAttributes: PhotoViewHeroAttributes(tag: '${asset.heroTag}_$heroOffset'),
filterQuality: FilterQuality.high,
tightMode: true,
disableScaleGestures: showingBottomSheet,
return PhotoViewGalleryPageOptions.customChild(
disableScaleGestures: true,
onDragStart: _onDragStart,
onDragUpdate: _onDragUpdate,
onDragEnd: _onDragEnd,
onTapDown: _onTapDown,
onLongPressStart: asset.isMotionPhoto ? _onLongPress : null,
errorBuilder: (_, __, ___) => Container(
width: size.width,
height: size.height,
color: backgroundColor,
child: Thumbnail.fromAsset(asset: asset, fit: BoxFit.contain),
heroAttributes: PhotoViewHeroAttributes(tag: '${asset.heroTag}_$heroOffset'),
filterQuality: FilterQuality.high,
basePosition: Alignment.center,
child: NativeImageView(
key: _getVideoPlayerKey(asset.heroTag),
assetId: (asset as LocalAsset).id,
width: ctx.width,
height: ctx.height,
),
);
}
@@ -0,0 +1,40 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
class NativeImageView extends StatelessWidget {
final String assetId;
final double width;
final double height;
const NativeImageView({super.key, required this.assetId, required this.width, required this.height});
@override
Widget build(BuildContext context) {
if (defaultTargetPlatform != TargetPlatform.iOS) {
return Container(
width: width,
height: height,
color: Colors.grey,
child: const Center(child: Text('PHAsset view only available on iOS')),
);
}
return SizedBox(
width: width,
height: height,
child: UiKitView(
viewType: 'native_image_view',
layoutDirection: TextDirection.ltr,
creationParams: {'assetId': assetId},
creationParamsCodec: const StandardMessageCodec(),
gestureRecognizers: <Factory<OneSequenceGestureRecognizer>>{
Factory<VerticalDragGestureRecognizer>(() => VerticalDragGestureRecognizer()),
Factory<HorizontalDragGestureRecognizer>(() => HorizontalDragGestureRecognizer()),
Factory<ScaleGestureRecognizer>(() => ScaleGestureRecognizer()),
},
),
);
}
}