From 890a8a44cf8f0af40e393561210c15c3c1a8cfd1 Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Fri, 1 Aug 2025 11:37:56 +0800 Subject: [PATCH] :sparkles: Adjustable zoom in image quaility --- .../content/cloud_file_collection.dart | 21 +++++++++ lib/widgets/post/compose_toolbar.dart | 44 +++++++++---------- 2 files changed, 42 insertions(+), 23 deletions(-) diff --git a/lib/widgets/content/cloud_file_collection.dart b/lib/widgets/content/cloud_file_collection.dart index 1db23f8..887c50b 100644 --- a/lib/widgets/content/cloud_file_collection.dart +++ b/lib/widgets/content/cloud_file_collection.dart @@ -14,6 +14,7 @@ import 'package:island/pods/network.dart'; import 'package:island/widgets/alert.dart'; import 'package:island/widgets/content/cloud_files.dart'; import 'package:island/widgets/content/sheet.dart'; +import 'package:material_symbols_icons/symbols.dart'; import 'package:path/path.dart' show extension; import 'package:path_provider/path_provider.dart'; import 'package:photo_view/photo_view.dart'; @@ -169,6 +170,8 @@ class CloudFileZoomIn extends HookConsumerWidget { final photoViewController = useMemoized(() => PhotoViewController(), []); final rotation = useState(0); + final showOriginal = useState(false); + Future saveToGallery() async { try { // Show loading indicator @@ -332,6 +335,7 @@ class CloudFileZoomIn extends HookConsumerWidget { imageProvider: CloudImageWidget.provider( fileId: item.id, serverUrl: serverUrl, + original: showOriginal.value, ), // Apply rotation transformation customSize: MediaQuery.of(context).size, @@ -365,6 +369,23 @@ class CloudFileZoomIn extends HookConsumerWidget { saveToGallery(); }, ), + IconButton( + onPressed: () { + showOriginal.value = !showOriginal.value; + }, + icon: Icon( + showOriginal.value ? Symbols.raw_on : Symbols.raw_off, + color: Colors.white, + size: 24, + shadows: [ + Shadow( + color: Colors.black54, + blurRadius: 5.0, + offset: Offset(1.0, 1.0), + ), + ], + ), + ), ], ), IconButton( diff --git a/lib/widgets/post/compose_toolbar.dart b/lib/widgets/post/compose_toolbar.dart index b3b4795..ca5a3a2 100644 --- a/lib/widgets/post/compose_toolbar.dart +++ b/lib/widgets/post/compose_toolbar.dart @@ -32,6 +32,25 @@ class ComposeToolbar extends HookConsumerWidget { ComposeLogic.saveDraft(ref, state); } + void showDraftManager() { + showModalBottomSheet( + context: context, + isScrollControlled: true, + builder: + (context) => DraftManagerSheet( + onDraftSelected: (draftId) { + final draft = ref.read(composeStorageNotifierProvider)[draftId]; + if (draft != null) { + state.titleController.text = draft.title ?? ''; + state.descriptionController.text = draft.description ?? ''; + state.contentController.text = draft.content ?? ''; + state.visibility.value = draft.visibility; + } + }, + ), + ); + } + final colorScheme = Theme.of(context).colorScheme; return Material( @@ -64,29 +83,7 @@ class ComposeToolbar extends HookConsumerWidget { IconButton( icon: const Icon(Symbols.draft), color: colorScheme.primary, - onPressed: () { - showModalBottomSheet( - context: context, - isScrollControlled: true, - builder: - (context) => DraftManagerSheet( - onDraftSelected: (draftId) { - final draft = - ref.read( - composeStorageNotifierProvider, - )[draftId]; - if (draft != null) { - state.titleController.text = draft.title ?? ''; - state.descriptionController.text = - draft.description ?? ''; - state.contentController.text = - draft.content ?? ''; - state.visibility.value = draft.visibility; - } - }, - ), - ); - }, + onPressed: showDraftManager, tooltip: 'drafts'.tr(), ) else if (originalPost == null) @@ -94,6 +91,7 @@ class ComposeToolbar extends HookConsumerWidget { icon: const Icon(Symbols.save), color: colorScheme.primary, onPressed: saveDraft, + onLongPress: showDraftManager, tooltip: 'saveDraft'.tr(), ), ],