Adjustable zoom in image quaility

This commit is contained in:
2025-08-01 11:37:56 +08:00
parent 8e3583f57a
commit 890a8a44cf
2 changed files with 42 additions and 23 deletions

View File

@@ -14,6 +14,7 @@ import 'package:island/pods/network.dart';
import 'package:island/widgets/alert.dart'; import 'package:island/widgets/alert.dart';
import 'package:island/widgets/content/cloud_files.dart'; import 'package:island/widgets/content/cloud_files.dart';
import 'package:island/widgets/content/sheet.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/path.dart' show extension;
import 'package:path_provider/path_provider.dart'; import 'package:path_provider/path_provider.dart';
import 'package:photo_view/photo_view.dart'; import 'package:photo_view/photo_view.dart';
@@ -169,6 +170,8 @@ class CloudFileZoomIn extends HookConsumerWidget {
final photoViewController = useMemoized(() => PhotoViewController(), []); final photoViewController = useMemoized(() => PhotoViewController(), []);
final rotation = useState(0); final rotation = useState(0);
final showOriginal = useState(false);
Future<void> saveToGallery() async { Future<void> saveToGallery() async {
try { try {
// Show loading indicator // Show loading indicator
@@ -332,6 +335,7 @@ class CloudFileZoomIn extends HookConsumerWidget {
imageProvider: CloudImageWidget.provider( imageProvider: CloudImageWidget.provider(
fileId: item.id, fileId: item.id,
serverUrl: serverUrl, serverUrl: serverUrl,
original: showOriginal.value,
), ),
// Apply rotation transformation // Apply rotation transformation
customSize: MediaQuery.of(context).size, customSize: MediaQuery.of(context).size,
@@ -365,6 +369,23 @@ class CloudFileZoomIn extends HookConsumerWidget {
saveToGallery(); 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( IconButton(

View File

@@ -32,6 +32,25 @@ class ComposeToolbar extends HookConsumerWidget {
ComposeLogic.saveDraft(ref, state); 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; final colorScheme = Theme.of(context).colorScheme;
return Material( return Material(
@@ -64,29 +83,7 @@ class ComposeToolbar extends HookConsumerWidget {
IconButton( IconButton(
icon: const Icon(Symbols.draft), icon: const Icon(Symbols.draft),
color: colorScheme.primary, color: colorScheme.primary,
onPressed: () { onPressed: 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;
}
},
),
);
},
tooltip: 'drafts'.tr(), tooltip: 'drafts'.tr(),
) )
else if (originalPost == null) else if (originalPost == null)
@@ -94,6 +91,7 @@ class ComposeToolbar extends HookConsumerWidget {
icon: const Icon(Symbols.save), icon: const Icon(Symbols.save),
color: colorScheme.primary, color: colorScheme.primary,
onPressed: saveDraft, onPressed: saveDraft,
onLongPress: showDraftManager,
tooltip: 'saveDraft'.tr(), tooltip: 'saveDraft'.tr(),
), ),
], ],