✨ Adjustable zoom in image quaility
This commit is contained in:
@@ -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(
|
||||||
|
@@ -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(),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
Reference in New Issue
Block a user