mirror of
https://github.com/lifegpc/eh_downloader_flutter.git
synced 2026-06-06 05:49:03 +08:00
Add new options thumbnailSize
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
import 'dart:math';
|
||||
import 'dart:ui';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
@@ -65,7 +66,18 @@ class _GalleryInfo extends State<GalleryInfo> with ThemeModeWidget {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
bool useMobile = MediaQuery.of(context).size.width <= 810;
|
||||
final maxWidth = MediaQuery.of(context).size.width;
|
||||
bool useMobile = maxWidth <= 810;
|
||||
final thumb = prefs.getInt("thumbnailSize") ?? 1;
|
||||
final tsize = (thumb >= 0 && thumb < ThumbnailSize.values.length
|
||||
? ThumbnailSize.values[thumb]
|
||||
: ThumbnailSize.medium)
|
||||
.size;
|
||||
final max = maxWidth > 810
|
||||
? tsize
|
||||
: maxWidth >= 400
|
||||
? min(tsize, ThumbnailSize.medium.size)
|
||||
: ThumbnailSize.smail.size;
|
||||
final firstPage = widget.gData.pages.firstOrNull;
|
||||
final int? firstFileId = widget.files != null && firstPage != null
|
||||
? widget.files!.files[firstPage!.token]!.firstOrNull?.id
|
||||
@@ -134,14 +146,11 @@ class _GalleryInfo extends State<GalleryInfo> with ThemeModeWidget {
|
||||
: SliverToBoxAdapter(child: Container()),
|
||||
ThumbnailGridView(
|
||||
widget.gData,
|
||||
useMobile
|
||||
? const SliverGridDelegateWithFixedCrossAxisCount(
|
||||
crossAxisCount: 2)
|
||||
: const SliverGridDelegateWithMaxCrossAxisExtent(
|
||||
maxCrossAxisExtent: 400,
|
||||
childAspectRatio: 1,
|
||||
crossAxisSpacing: 10,
|
||||
mainAxisSpacing: 10),
|
||||
SliverGridDelegateWithMaxCrossAxisExtent(
|
||||
maxCrossAxisExtent: max.toDouble(),
|
||||
childAspectRatio: 1,
|
||||
crossAxisSpacing: 10,
|
||||
mainAxisSpacing: 10),
|
||||
files: widget.files,
|
||||
gid: widget.gData.meta.gid,
|
||||
isSelectMode: widget.isSelectMode,
|
||||
|
||||
@@ -15,7 +15,7 @@ class ThumbnailGridView extends StatelessWidget {
|
||||
final GalleryData gdata;
|
||||
final int? gid;
|
||||
final EhFiles? files;
|
||||
final SliverGridDelegate gridDelegate;
|
||||
final SliverGridDelegateWithMaxCrossAxisExtent gridDelegate;
|
||||
final bool isSelectMode;
|
||||
final List<String>? selected;
|
||||
final Function? onSelectedChange;
|
||||
@@ -25,12 +25,7 @@ class ThumbnailGridView extends StatelessWidget {
|
||||
final displayAd = prefs.getBool("displayAd") ?? false;
|
||||
final npages =
|
||||
displayAd ? gdata.pages : gdata.pages.where((e) => !e.isAd).toList();
|
||||
final maxWidth = MediaQuery.of(context).size.width;
|
||||
final baseSize = maxWidth > 810
|
||||
? 400
|
||||
: maxWidth < 400
|
||||
? 200
|
||||
: 300;
|
||||
final baseSize = gridDelegate.maxCrossAxisExtent.toInt();
|
||||
final max = (baseSize * MediaQuery.of(context).devicePixelRatio).toInt();
|
||||
return SliverGrid.builder(
|
||||
gridDelegate: gridDelegate,
|
||||
|
||||
@@ -339,6 +339,27 @@ enum Lang {
|
||||
}
|
||||
}
|
||||
|
||||
enum ThumbnailSize {
|
||||
smail(200),
|
||||
medium(300),
|
||||
big(400);
|
||||
|
||||
const ThumbnailSize(this.size);
|
||||
final int size;
|
||||
|
||||
String localText(BuildContext context) {
|
||||
final i18n = AppLocalizations.of(context)!;
|
||||
switch (this) {
|
||||
case ThumbnailSize.smail:
|
||||
return i18n.smail;
|
||||
case ThumbnailSize.medium:
|
||||
return i18n.medium;
|
||||
case ThumbnailSize.big:
|
||||
return i18n.big;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
final _authLog = Logger("AuthLog");
|
||||
|
||||
void clearAllStates(BuildContext context) {
|
||||
|
||||
@@ -244,5 +244,9 @@
|
||||
"createExportZipTask": "Create export as ZIP file task",
|
||||
"outputDir": "Output directory",
|
||||
"copyOriImgUrl": "Copy original image URL to clipboard",
|
||||
"importTask": "Import task"
|
||||
"importTask": "Import task",
|
||||
"thumbnailSize": "Thumbnail size",
|
||||
"smail": "smail",
|
||||
"medium": "medium",
|
||||
"big": "big"
|
||||
}
|
||||
|
||||
@@ -244,5 +244,9 @@
|
||||
"createExportZipTask": "新建导出为ZIP文件任务",
|
||||
"outputDir": "输出文件夹",
|
||||
"copyOriImgUrl": "复制原图链接到剪贴板",
|
||||
"importTask": "导入任务"
|
||||
"importTask": "导入任务",
|
||||
"thumbnailSize": "缩略图大小",
|
||||
"smail": "小",
|
||||
"medium": "中",
|
||||
"big": "大"
|
||||
}
|
||||
|
||||
@@ -26,6 +26,7 @@ class _DisplaySettingsPage extends State<DisplaySettingsPage>
|
||||
bool _oriShowTranslatedTag = false;
|
||||
bool _oriUseTitleJpn = false;
|
||||
bool _oriDlUseAvgSpeed = false;
|
||||
ThumbnailSize _oriThumbnailSize = ThumbnailSize.medium;
|
||||
bool _displayAd = false;
|
||||
Lang _lang = Lang.system;
|
||||
bool _preventScreenCapture = false;
|
||||
@@ -33,6 +34,7 @@ class _DisplaySettingsPage extends State<DisplaySettingsPage>
|
||||
bool _showTranslatedTag = false;
|
||||
bool _useTitleJpn = false;
|
||||
bool _dlUseAvgSpeed = false;
|
||||
ThumbnailSize _thumbnailSize = ThumbnailSize.medium;
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
@@ -93,6 +95,15 @@ class _DisplaySettingsPage extends State<DisplaySettingsPage>
|
||||
_oriDlUseAvgSpeed = false;
|
||||
_dlUseAvgSpeed = false;
|
||||
}
|
||||
try {
|
||||
_oriThumbnailSize =
|
||||
ThumbnailSize.values[prefs.getInt("thumbnailSize") ?? 1];
|
||||
_thumbnailSize = _oriThumbnailSize;
|
||||
} catch (e) {
|
||||
_log.warning("Failed to get thumbnailSize:", e);
|
||||
_oriThumbnailSize = ThumbnailSize.medium;
|
||||
_thumbnailSize = ThumbnailSize.medium;
|
||||
}
|
||||
}
|
||||
|
||||
void fallback(BuildContext context) {
|
||||
@@ -111,6 +122,7 @@ class _DisplaySettingsPage extends State<DisplaySettingsPage>
|
||||
_showTranslatedTag = _oriLang.toLocale().languageCode == "zh";
|
||||
_preventScreenCapture = false;
|
||||
_dlUseAvgSpeed = false;
|
||||
_thumbnailSize = ThumbnailSize.medium;
|
||||
});
|
||||
}
|
||||
|
||||
@@ -179,6 +191,14 @@ class _DisplaySettingsPage extends State<DisplaySettingsPage>
|
||||
_oriDlUseAvgSpeed = _dlUseAvgSpeed;
|
||||
}
|
||||
}
|
||||
if (_thumbnailSize != _oriThumbnailSize) {
|
||||
if (!await prefs.setInt("thumbnailSize", _thumbnailSize.index)) {
|
||||
re = false;
|
||||
_log.warning("Failed to save thumbnailSize");
|
||||
} else {
|
||||
_oriThumbnailSize = _thumbnailSize;
|
||||
}
|
||||
}
|
||||
return re;
|
||||
}
|
||||
|
||||
@@ -328,6 +348,27 @@ class _DisplaySettingsPage extends State<DisplaySettingsPage>
|
||||
child: Text(i18n.dlUseAvgSpeed),
|
||||
),
|
||||
),
|
||||
Container(
|
||||
padding:
|
||||
const EdgeInsets.symmetric(vertical: 8),
|
||||
child: DropdownMenu<ThumbnailSize>(
|
||||
initialSelection: _thumbnailSize,
|
||||
onSelected: (value) {
|
||||
if (value != null) {
|
||||
setState(() {
|
||||
_thumbnailSize = value;
|
||||
});
|
||||
}
|
||||
},
|
||||
label: Text(i18n.thumbnailSize),
|
||||
dropdownMenuEntries: ThumbnailSize.values
|
||||
.map((e) => DropdownMenuEntry(
|
||||
value: e,
|
||||
label: e.localText(context)))
|
||||
.toList(),
|
||||
leadingIcon: const Icon(Icons.photo_rounded),
|
||||
width: 250,
|
||||
)),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
|
||||
Reference in New Issue
Block a user