Add new options thumbnailSize

This commit is contained in:
2024-06-08 11:30:53 +00:00
committed by GitHub
parent dfc6057bb5
commit eacff10594
6 changed files with 92 additions and 18 deletions

View File

@@ -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,

View File

@@ -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,

View File

@@ -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) {

View File

@@ -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"
}

View File

@@ -244,5 +244,9 @@
"createExportZipTask": "新建导出为ZIP文件任务",
"outputDir": "输出文件夹",
"copyOriImgUrl": "复制原图链接到剪贴板",
"importTask": "导入任务"
"importTask": "导入任务",
"thumbnailSize": "缩略图大小",
"smail": "小",
"medium": "中",
"big": "大"
}

View File

@@ -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: [