history page, comic menu

This commit is contained in:
nyne
2024-10-09 17:09:28 +08:00
parent 90b9265ca0
commit b68d52dfd7
10 changed files with 300 additions and 91 deletions

133
lib/pages/history_page.dart Normal file
View File

@@ -0,0 +1,133 @@
import 'package:flutter/material.dart';
import 'package:venera/components/components.dart';
import 'package:venera/foundation/app.dart';
import 'package:venera/foundation/comic_source/comic_source.dart';
import 'package:venera/foundation/comic_type.dart';
import 'package:venera/foundation/history.dart';
import 'package:venera/utils/translations.dart';
class HistoryPage extends StatefulWidget {
const HistoryPage({super.key});
@override
State<HistoryPage> createState() => _HistoryPageState();
}
class _HistoryPageState extends State<HistoryPage> {
@override
void initState() {
HistoryManager().addListener(onUpdate);
super.initState();
}
@override
void dispose() {
HistoryManager().removeListener(onUpdate);
super.dispose();
}
void onUpdate() {
setState(() {
comics = HistoryManager().getAll();
});
}
var comics = HistoryManager().getAll();
var controller = FlyoutController();
@override
Widget build(BuildContext context) {
return Scaffold(
body: SmoothCustomScrollView(
slivers: [
SliverAppbar(
title: Text('History'.tl),
actions: [
Tooltip(
message: 'Clear History'.tl,
child: Flyout(
controller: controller,
flyoutBuilder: (context) {
return FlyoutContent(
title: 'Clear History'.tl,
content: Text(
'Are you sure you want to clear your history?'.tl),
actions: [
Button.filled(
color: context.colorScheme.error,
onPressed: () {
HistoryManager().clearHistory();
context.pop();
},
child: Text('Clear'.tl),
),
],
);
},
child: IconButton(
icon: const Icon(Icons.clear_all),
onPressed: () {
controller.show();
},
),
),
)
],
),
SliverGridComics(
comics: comics.map(
(e) {
return Comic(
e.title,
e.cover,
e.id,
e.subtitle,
null,
getDescription(e),
e.type.comicSource?.key ?? "Invalid",
null,
);
},
).toList(),
badgeBuilder: (c) {
return ComicSource.find(c.sourceKey)?.name;
},
menuBuilder: (c) {
return [
MenuEntry(
icon: Icons.remove,
text: 'Remove'.tl,
onClick: () {
HistoryManager().remove(
c.id,
ComicType(c.sourceKey.hashCode),
);
},
),
];
},
),
],
),
);
}
String getDescription(History h) {
var res = "";
if (h.ep >= 1) {
res += "Chapter @ep".tlParams({
"ep": h.ep,
});
}
if (h.page >= 1) {
if (h.ep >= 1) {
res += " - ";
}
res += "Page @page".tlParams({
"page": h.page,
});
}
return res;
}
}

View File

@@ -11,6 +11,7 @@ import 'package:venera/foundation/local.dart';
import 'package:venera/foundation/log.dart';
import 'package:venera/pages/comic_page.dart';
import 'package:venera/pages/comic_source_page.dart';
import 'package:venera/pages/history_page.dart';
import 'package:venera/pages/search_page.dart';
import 'package:venera/utils/io.dart';
import 'package:venera/utils/translations.dart';
@@ -113,7 +114,9 @@ class _HistoryState extends State<_History> {
),
child: InkWell(
borderRadius: BorderRadius.circular(8),
onTap: () {},
onTap: () {
context.to(() => const HistoryPage());
},
child: Column(
mainAxisSize: MainAxisSize.min,
children: [

View File

@@ -178,26 +178,26 @@ class _ReaderGestureDetectorState extends State<_ReaderGestureDetector> {
}
void onSecondaryTapUp(Offset location) {
showDesktopMenu(
showMenuX(
context,
location,
[
DesktopMenuEntry(
MenuEntry(
text: "Settings".tl,
onClick: () {
context.readerScaffold.openSetting();
}),
DesktopMenuEntry(
MenuEntry(
text: "Chapters".tl,
onClick: () {
context.readerScaffold.openChapterDrawer();
}),
DesktopMenuEntry(
MenuEntry(
text: "Fullscreen".tl,
onClick: () {
context.reader.fullscreen();
}),
DesktopMenuEntry(
MenuEntry(
text: "Exit".tl,
onClick: () {
context.pop();

View File

@@ -102,6 +102,7 @@ class _ReaderState extends State<Reader> with _ReaderLocation, _ReaderWindow {
chapter = widget.initialChapter ?? 1;
mode = ReaderMode.fromKey(appdata.settings['readerMode']);
history = widget.history;
updateHistory();
super.initState();
}