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