diff --git a/assets/tr.json b/assets/tr.json
index 09de87a..7000efb 100644
--- a/assets/tr.json
+++ b/assets/tr.json
@@ -166,7 +166,8 @@
"Error": "错误",
"Failed to register URL scheme.": "注册URL协议失败",
"Retry": "重试",
- "Network": "网络"
+ "Network": "网络",
+ "Save to gallery": "保存到相册"
},
"zh_TW": {
"Search": "搜索",
@@ -335,6 +336,7 @@
"Error": "錯誤",
"Failed to register URL scheme.": "註冊URL協議失敗",
"Retry": "重試",
- "Network": "網絡"
+ "Network": "網絡",
+ "Save to gallery": "保存到相冊"
}
}
\ No newline at end of file
diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist
index 87ce0f1..dc18ab8 100644
--- a/ios/Runner/Info.plist
+++ b/ios/Runner/Info.plist
@@ -56,5 +56,9 @@
$(PRODUCT_BUNDLE_IDENTIFIER)
+ NSPhotoLibraryAddUsageDescription
+ photo
+ NSPhotoLibraryUsageDescription
+ photo
diff --git a/lib/pages/illust_page.dart b/lib/pages/illust_page.dart
index 856acbe..32c3861 100644
--- a/lib/pages/illust_page.dart
+++ b/lib/pages/illust_page.dart
@@ -60,6 +60,8 @@ class _IllustGalleryPageState extends State {
bool loading = false;
+ late int page = widget.initialPage;
+
@override
void initState() {
illusts = List.from(widget.illusts);
@@ -114,14 +116,16 @@ class _IllustGalleryPageState extends State {
return IllustPage(illusts[index],
nextPage: nextPage, previousPage: previousPage);
},
- onPageChanged: (value) => setState(() {}),
+ onPageChanged: (value) => setState(() {
+ page = value;
+ }),
),
),
- if (controller.page! < length - 1 && length > 1)
+ if (page < length - 1 && length > 1 && App.isDesktop)
Positioned(
- right: 16,
+ right: 0,
top: 0,
- bottom: 0,
+ bottom: 32,
child: Center(
child: IconButton(
icon: const Icon(FluentIcons.chevron_right),
@@ -130,11 +134,11 @@ class _IllustGalleryPageState extends State {
},
)),
),
- if (controller.page != 0 && length > 1)
+ if (page != 0 && length > 1 && App.isDesktop)
Positioned(
- left: 16,
+ left: 0,
top: 0,
- bottom: 0,
+ bottom: 32,
child: Center(
child: IconButton(
icon: const Icon(FluentIcons.chevron_left),
diff --git a/lib/pages/image_page.dart b/lib/pages/image_page.dart
index 5ace32b..735e5be 100644
--- a/lib/pages/image_page.dart
+++ b/lib/pages/image_page.dart
@@ -3,8 +3,10 @@ import 'dart:io';
import 'package:fluent_ui/fluent_ui.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/services.dart';
+import 'package:image_gallery_saver/image_gallery_saver.dart';
import 'package:photo_view/photo_view_gallery.dart';
import 'package:pixes/components/md.dart';
+import 'package:pixes/components/message.dart';
import 'package:pixes/components/page_route.dart';
import 'package:pixes/foundation/app.dart';
import 'package:pixes/foundation/cache_manager.dart';
@@ -89,6 +91,8 @@ class _ImagePageState extends State with WindowListener {
void showMenu() {
menuController.showFlyout(
+ barrierColor: Colors.transparent,
+ position: Offset(context.size!.width, 0),
builder: (context) => MenuFlyout(
items: [
MenuFlyoutItem(
@@ -103,6 +107,23 @@ class _ImagePageState extends State with WindowListener {
saveFile(file, fileName);
}
}),
+ if (App.isMobile)
+ MenuFlyoutItem(
+ text: Text("Save to gallery".tl),
+ onPressed: () async {
+ var file = await getFile();
+ if (file != null) {
+ var fileName = file.path.split('/').last;
+ if (!fileName.contains('.')) {
+ fileName += getExtensionName();
+ }
+ await ImageGallerySaver.saveFile(file.path,
+ name: fileName);
+ if (mounted) {
+ showToast(context, message: "Saved".tl);
+ }
+ }
+ }),
MenuFlyoutItem(
text: Text("Share".tl),
onPressed: () async {
diff --git a/pubspec.yaml b/pubspec.yaml
index f59a5f0..35ee4e0 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -58,6 +58,10 @@ dependencies:
webview_flutter: ^4.7.0
flutter_acrylic: 1.0.0+2
device_info_plus: ^10.1.0
+ image_gallery_saver:
+ git:
+ url: https://github.com/wgh136/image_gallery_saver
+ ref: master
dev_dependencies:
flutter_test:
sdk: flutter