mirror of
https://github.com/venera-app/venera.git
synced 2025-09-27 15:57:25 +00:00

* feat: 增加图片收藏 * feat: 主体图片收藏页面实现 * feat: 点击打开大图浏览 * feat: 数据结构变更 * feat: 基本完成 * feat: 翻译与bug修复 * feat: 实机测试和问题修复 * feat: jm导入, pica历史记录nhentai有问题, 一键反转 * fix: 大小写不一致, 一个htManga, 一个htmanga * feat: 拉取收藏优化 * feat: 改成以ep为准 * feat: 兜底一些可能报错场景 * chore: 没有用到 * feat: 尽量保证和网络收藏顺序一致 * feat: 支持显示热点tag * feat: 支持双击收藏, 不过此时禁止放大图片 * fix: 自动塞封面逻辑完善, 切换快速收藏图片立刻生效 * Refactor * fix updateValue * feat: 双击功能提示 * fix: 被确定取消收藏的才删除 * Refactor ImageFavoritesPage * translate author * feat: 功能提示改到dialog中 * fix text editing * fix text editing * feat: 功能提示放到邮件或长按菜单中 * fix: 修复tag过滤不生效问题 * Improve image loading * The default value of quickCollectImage should be false. * Refactor DragListener * Refactor ImageFavoriteItem & ImageFavoritePhotoView * Refactor * Fix `ImageFavoriteManager.has` * Fix UI * Improve UI --------- Co-authored-by: nyne <me@nyne.dev>
122 lines
2.8 KiB
Dart
122 lines
2.8 KiB
Dart
part of 'reader.dart';
|
|
|
|
class ReaderWithLoading extends StatefulWidget {
|
|
const ReaderWithLoading({
|
|
super.key,
|
|
required this.id,
|
|
required this.sourceKey,
|
|
this.initialEp,
|
|
this.initialPage,
|
|
});
|
|
|
|
final String id;
|
|
|
|
final String sourceKey;
|
|
|
|
final int? initialEp;
|
|
|
|
final int? initialPage;
|
|
|
|
@override
|
|
State<ReaderWithLoading> createState() => _ReaderWithLoadingState();
|
|
}
|
|
|
|
class _ReaderWithLoadingState
|
|
extends LoadingState<ReaderWithLoading, ReaderProps> {
|
|
@override
|
|
Widget buildContent(BuildContext context, ReaderProps data) {
|
|
return Reader(
|
|
type: data.type,
|
|
cid: data.cid,
|
|
name: data.name,
|
|
chapters: data.chapters,
|
|
history: data.history,
|
|
initialChapter: widget.initialEp ?? data.history.ep,
|
|
initialPage: widget.initialPage ?? data.history.page,
|
|
author: data.author,
|
|
tags: data.tags,
|
|
);
|
|
}
|
|
|
|
@override
|
|
Future<Res<ReaderProps>> loadData() async {
|
|
var comicSource = ComicSource.find(widget.sourceKey);
|
|
var history = HistoryManager().findSync(
|
|
widget.id,
|
|
ComicType.fromKey(widget.sourceKey),
|
|
);
|
|
if (comicSource == null) {
|
|
var localComic = LocalManager().find(
|
|
widget.id,
|
|
ComicType.fromKey(widget.sourceKey),
|
|
);
|
|
if (localComic == null) {
|
|
return Res.error("comic not found");
|
|
}
|
|
return Res(
|
|
ReaderProps(
|
|
type: ComicType.fromKey(widget.sourceKey),
|
|
cid: widget.id,
|
|
name: localComic.title,
|
|
chapters: localComic.chapters,
|
|
history: history ??
|
|
History.fromModel(
|
|
model: localComic,
|
|
ep: 0,
|
|
page: 0,
|
|
),
|
|
author: localComic.subtitle,
|
|
tags: localComic.tags,
|
|
),
|
|
);
|
|
} else {
|
|
var comic = await comicSource.loadComicInfo!(widget.id);
|
|
if (comic.error) {
|
|
return Res.fromErrorRes(comic);
|
|
}
|
|
return Res(
|
|
ReaderProps(
|
|
type: ComicType.fromKey(widget.sourceKey),
|
|
cid: widget.id,
|
|
name: comic.data.title,
|
|
chapters: comic.data.chapters,
|
|
history: history ??
|
|
History.fromModel(
|
|
model: comic.data,
|
|
ep: 0,
|
|
page: 0,
|
|
),
|
|
author: comic.data.findAuthor() ?? "",
|
|
tags: comic.data.plainTags,
|
|
),
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
class ReaderProps {
|
|
final ComicType type;
|
|
|
|
final String cid;
|
|
|
|
final String name;
|
|
|
|
final Map<String, String>? chapters;
|
|
|
|
final History history;
|
|
|
|
final String author;
|
|
|
|
final List<String> tags;
|
|
|
|
const ReaderProps({
|
|
required this.type,
|
|
required this.cid,
|
|
required this.name,
|
|
required this.chapters,
|
|
required this.history,
|
|
required this.author,
|
|
required this.tags,
|
|
});
|
|
}
|