Files
PiliPlus/lib/common/widgets/image/image_save.dart
dom 7a65b777c9 tweaks
Signed-off-by: dom <githubaccount56556@proton.me>
2026-01-21 21:32:10 +08:00

122 lines
4.2 KiB
Dart

import 'package:PiliPlus/common/constants.dart';
import 'package:PiliPlus/common/widgets/button/icon_button.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/http/user.dart';
import 'package:PiliPlus/utils/image_utils.dart';
import 'package:PiliPlus/utils/platform_utils.dart';
import 'package:flutter/material.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';
void imageSaveDialog({
required String? title,
required String? cover,
dynamic aid,
String? bvid,
}) {
final double imgWidth = MediaQuery.sizeOf(Get.context!).shortestSide - 16;
SmartDialog.show(
animationType: SmartAnimationType.centerScale_otherSlide,
builder: (context) {
const iconSize = 20.0;
final theme = Theme.of(context);
return Container(
width: imgWidth,
margin: const .symmetric(horizontal: StyleString.safeSpace),
decoration: BoxDecoration(
color: theme.colorScheme.surface,
borderRadius: StyleString.mdRadius,
),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Stack(
clipBehavior: Clip.none,
children: [
GestureDetector(
onTap: SmartDialog.dismiss,
child: NetworkImgLayer(
src: cover,
quality: 100,
width: imgWidth,
height: imgWidth / StyleString.aspectRatio16x9,
borderRadius: const .vertical(top: StyleString.imgRadius),
),
),
Positioned(
right: 8,
top: 8,
width: 30,
height: 30,
child: IconButton(
tooltip: '关闭',
style: IconButton.styleFrom(
padding: .zero,
backgroundColor: Colors.black.withValues(alpha: 0.3),
),
onPressed: SmartDialog.dismiss,
icon: const Icon(
Icons.close,
size: 18,
color: Colors.white,
),
),
),
],
),
Padding(
padding: const EdgeInsets.fromLTRB(12, 10, 8, 10),
child: Row(
children: [
if (title != null)
Expanded(
child: SelectableText(
title,
style: theme.textTheme.titleSmall,
),
)
else
const Spacer(),
if (aid != null || bvid != null)
iconButton(
iconSize: iconSize,
tooltip: '稍后再看',
onPressed: () => {
SmartDialog.dismiss(),
UserHttp.toViewLater(aid: aid, bvid: bvid),
},
icon: const Icon(Icons.watch_later_outlined),
),
if (cover != null && cover.isNotEmpty) ...[
if (PlatformUtils.isMobile)
iconButton(
iconSize: iconSize,
tooltip: '分享',
onPressed: () {
SmartDialog.dismiss();
ImageUtils.onShareImg(cover);
},
icon: const Icon(Icons.share),
),
iconButton(
iconSize: iconSize,
tooltip: '保存封面图',
onPressed: () async {
bool saveStatus = await ImageUtils.downloadImg([cover]);
if (saveStatus) {
SmartDialog.dismiss();
}
},
icon: const Icon(Icons.download),
),
],
],
),
),
],
),
);
},
);
}