mirror of
https://github.com/venera-app/venera.git
synced 2025-09-27 15:57:25 +00:00
history page, comic menu
This commit is contained in:
133
lib/pages/history_page.dart
Normal file
133
lib/pages/history_page.dart
Normal 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;
|
||||
}
|
||||
}
|
@@ -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: [
|
||||
|
@@ -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();
|
||||
|
@@ -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();
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user