feat: 添加画廊列表显示模式和合并功能,优化画廊列表卡片组件

This commit is contained in:
2025-03-08 17:11:16 +08:00
parent 5f92d036fa
commit e64910d572
9 changed files with 183 additions and 6 deletions

View File

@@ -5,7 +5,9 @@ import 'package:go_router/go_router.dart';
import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart';
import 'package:logging/logging.dart';
import '../api/client.dart';
import '../api/file.dart';
import '../api/gallery.dart';
import '../components/gallery_list_normal_card.dart';
import '../globals.dart';
import '../main.dart';
@@ -52,6 +54,8 @@ class _GalleriesPage extends State<GalleriesPage>
CancelToken? _tagCancel;
bool _isFetchingTag = false;
bool _fetchedTag = false;
late GalleryThumbnails _thumbnails;
late EhFiles _files;
final PagingController<int, GMeta> _pagingController =
PagingController(firstPageKey: 0);
@@ -66,6 +70,22 @@ class _GalleriesPage extends State<GalleriesPage>
category: widget.category,
tag: widget.tag))
.unwrap();
final thumbnails =
(await api.getGalleriesThumbnail(list.map((e) => e.gid).toList()))
.unwrap();
_thumbnails.merge(thumbnails);
final files = (await api.getFiles(list
.map((e) {
var thumbnail = _thumbnails.thumbnails[e.gid];
if (thumbnail != null && thumbnail.ok) {
return thumbnail.unwrap().token;
}
})
.where((t) => t != null)
.cast<String>()
.toList()))
.unwrap();
_files.merge(files);
final isLastPage = list.length < _pageSize;
if (isLastPage) {
_pagingController.appendLastPage(list);
@@ -118,6 +138,8 @@ class _GalleriesPage extends State<GalleriesPage>
_fetchPage(pageKey);
});
_translatedTag = widget.translatedTag;
_thumbnails = GalleryThumbnails(thumbnails: {});
_files = EhFiles(files: {});
listener.on("user_logined", _onStateChanged);
listener.on("meilisearch_enabled", _onStateChanged);
super.initState();
@@ -212,6 +234,13 @@ class _GalleriesPage extends State<GalleriesPage>
pagingController: _pagingController,
builderDelegate: PagedChildBuilderDelegate<GMeta>(
itemBuilder: (context, item, index) {
final displayMode = GalleryListDisplayMode
.values[prefs.getInt("galleryListDisplayMode") ?? 1];
if (displayMode == GalleryListDisplayMode.normal) {
return GalleryListNormalCard(item,
files: _files,
pMeta: _thumbnails.thumbnails[item.gid]?.unwrapOrNull());
}
return ListTile(
title: Text(item.preferredTitle),
onTap: () {

View File

@@ -30,6 +30,8 @@ class _DisplaySettingsPage extends State<DisplaySettingsPage>
ThumbnailSize _oriThumbnailSize = ThumbnailSize.medium;
ThumbnailGenMethod _oriThumbnailMethod = ThumbnailGenMethod.unknown;
ThumbnailAlign _oriThumbnailAlign = ThumbnailAlign.center;
GalleryListDisplayMode _oriGalleryListDisplayMode =
GalleryListDisplayMode.normal;
bool _displayAd = false;
Lang _lang = Lang.system;
bool _preventScreenCapture = false;
@@ -40,6 +42,8 @@ class _DisplaySettingsPage extends State<DisplaySettingsPage>
ThumbnailSize _thumbnailSize = ThumbnailSize.medium;
ThumbnailGenMethod _thumbnailMethod = ThumbnailGenMethod.unknown;
ThumbnailAlign _thumbnailAlign = ThumbnailAlign.center;
GalleryListDisplayMode _galleryListDisplayMode =
GalleryListDisplayMode.normal;
@override
void initState() {
super.initState();
@@ -127,6 +131,14 @@ class _DisplaySettingsPage extends State<DisplaySettingsPage>
_oriThumbnailAlign = ThumbnailAlign.center;
_thumbnailAlign = ThumbnailAlign.center;
}
try {
_galleryListDisplayMode = GalleryListDisplayMode
.values[prefs.getInt("galleryListDisplayMode") ?? 1];
_oriGalleryListDisplayMode = _galleryListDisplayMode;
} catch (e) {
_log.warning("Failed to get galleryListDisplayMode:", e);
_galleryListDisplayMode = GalleryListDisplayMode.normal;
}
}
void fallback(BuildContext context) {
@@ -148,6 +160,7 @@ class _DisplaySettingsPage extends State<DisplaySettingsPage>
_thumbnailSize = ThumbnailSize.medium;
_thumbnailMethod = ThumbnailGenMethod.unknown;
_thumbnailAlign = ThumbnailAlign.center;
_galleryListDisplayMode = GalleryListDisplayMode.normal;
});
}
@@ -240,6 +253,13 @@ class _DisplaySettingsPage extends State<DisplaySettingsPage>
_oriThumbnailAlign = _thumbnailAlign;
}
}
if (_galleryListDisplayMode != _oriGalleryListDisplayMode) {
if (!await prefs.setInt(
"galleryListDisplayMode", _galleryListDisplayMode.index)) {
re = false;
_log.warning("Failed to save galleryListDisplayMode");
}
}
return re;
}
@@ -455,6 +475,27 @@ class _DisplaySettingsPage extends State<DisplaySettingsPage>
helperText: i18n.thumbnailAlignHelp,
helperMaxLines: 3,
))),
Container(
padding:
const EdgeInsets.symmetric(vertical: 8),
child: DropdownButtonFormField<
GalleryListDisplayMode>(
items: GalleryListDisplayMode.values
.map((e) => DropdownMenuItem(
value: e, child: Text(e.name)))
.toList(),
value: _galleryListDisplayMode,
onChanged: (value) {
if (value != null) {
setState(() {
_galleryListDisplayMode = value;
});
}
},
decoration: InputDecoration(
border: const OutlineInputBorder(),
labelText: i18n.galleryListDisplayMode,
))),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [