mirror of
https://github.com/venera-app/venera.git
synced 2025-09-27 15:57:25 +00:00
local favorites search page
This commit is contained in:
@@ -83,7 +83,9 @@ class FavoriteItem implements Comic {
|
|||||||
int? get maxPage => null;
|
int? get maxPage => null;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get sourceKey => type == ComicType.local ? 'local' : type.comicSource?.key ?? "Unknown:${type.value}";
|
String get sourceKey => type == ComicType.local
|
||||||
|
? 'local'
|
||||||
|
: type.comicSource?.key ?? "Unknown:${type.value}";
|
||||||
|
|
||||||
@override
|
@override
|
||||||
double? get stars => null;
|
double? get stars => null;
|
||||||
@@ -132,21 +134,18 @@ class FavoriteItem implements Comic {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class FavoriteItemWithFolderInfo {
|
class FavoriteItemWithFolderInfo extends FavoriteItem {
|
||||||
FavoriteItem comic;
|
|
||||||
String folder;
|
String folder;
|
||||||
|
|
||||||
FavoriteItemWithFolderInfo(this.comic, this.folder);
|
FavoriteItemWithFolderInfo(FavoriteItem item, this.folder)
|
||||||
|
: super(
|
||||||
@override
|
id: item.id,
|
||||||
bool operator ==(Object other) {
|
name: item.name,
|
||||||
return other is FavoriteItemWithFolderInfo &&
|
coverPath: item.coverPath,
|
||||||
other.comic == comic &&
|
author: item.author,
|
||||||
other.folder == folder;
|
type: item.type,
|
||||||
}
|
tags: item.tags,
|
||||||
|
);
|
||||||
@override
|
|
||||||
int get hashCode => comic.hashCode ^ folder.hashCode;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class LocalFavoritesManager {
|
class LocalFavoritesManager {
|
||||||
@@ -498,11 +497,11 @@ class LocalFavoritesManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool test(FavoriteItemWithFolderInfo comic, String keyword) {
|
bool test(FavoriteItemWithFolderInfo comic, String keyword) {
|
||||||
if (comic.comic.name.contains(keyword)) {
|
if (comic.name.contains(keyword)) {
|
||||||
return true;
|
return true;
|
||||||
} else if (comic.comic.author.contains(keyword)) {
|
} else if (comic.author.contains(keyword)) {
|
||||||
return true;
|
return true;
|
||||||
} else if (comic.comic.tags.any((element) => element.contains(keyword))) {
|
} else if (comic.tags.any((element) => element.contains(keyword))) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -591,8 +590,7 @@ class LocalFavoritesManager {
|
|||||||
for (var comic in data["comics"]) {
|
for (var comic in data["comics"]) {
|
||||||
try {
|
try {
|
||||||
addComic(folder, FavoriteItem.fromJson(comic));
|
addComic(folder, FavoriteItem.fromJson(comic));
|
||||||
}
|
} catch (e) {
|
||||||
catch(e) {
|
|
||||||
Log.error("Import Data", e.toString());
|
Log.error("Import Data", e.toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -17,6 +17,7 @@ part 'favorite_actions.dart';
|
|||||||
part 'side_bar.dart';
|
part 'side_bar.dart';
|
||||||
part 'local_favorites_page.dart';
|
part 'local_favorites_page.dart';
|
||||||
part 'network_favorites_page.dart';
|
part 'network_favorites_page.dart';
|
||||||
|
part 'local_search_page.dart';
|
||||||
|
|
||||||
const _kLeftBarWidth = 256.0;
|
const _kLeftBarWidth = 256.0;
|
||||||
|
|
||||||
|
41
lib/pages/favorites/local_search_page.dart
Normal file
41
lib/pages/favorites/local_search_page.dart
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
part of 'favorites_page.dart';
|
||||||
|
|
||||||
|
class LocalSearchPage extends StatefulWidget {
|
||||||
|
const LocalSearchPage({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<LocalSearchPage> createState() => _LocalSearchPageState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _LocalSearchPageState extends State<LocalSearchPage> {
|
||||||
|
String keyword = '';
|
||||||
|
|
||||||
|
var comics = <FavoriteItemWithFolderInfo>[];
|
||||||
|
|
||||||
|
late final SearchBarController controller;
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
controller = SearchBarController(onSearch: (text) {
|
||||||
|
keyword = text;
|
||||||
|
comics = LocalFavoritesManager().search(keyword);
|
||||||
|
setState(() {});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Scaffold(
|
||||||
|
body: SmoothCustomScrollView(slivers: [
|
||||||
|
SliverSearchBar(controller: controller),
|
||||||
|
SliverGridComics(
|
||||||
|
comics: comics,
|
||||||
|
badgeBuilder: (c) {
|
||||||
|
return (c as FavoriteItemWithFolderInfo).folder;
|
||||||
|
},
|
||||||
|
),
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@@ -88,6 +88,13 @@ class _LeftBarState extends State<_LeftBar> implements FolderList {
|
|||||||
const SizedBox(width: 12),
|
const SizedBox(width: 12),
|
||||||
Text("Local".tl),
|
Text("Local".tl),
|
||||||
const Spacer(),
|
const Spacer(),
|
||||||
|
IconButton(
|
||||||
|
icon: const Icon(Icons.search),
|
||||||
|
color: context.colorScheme.primary,
|
||||||
|
onPressed: () {
|
||||||
|
context.to(() => const LocalSearchPage());
|
||||||
|
},
|
||||||
|
),
|
||||||
IconButton(
|
IconButton(
|
||||||
icon: const Icon(Icons.add),
|
icon: const Icon(Icons.add),
|
||||||
color: context.colorScheme.primary,
|
color: context.colorScheme.primary,
|
||||||
@@ -112,6 +119,7 @@ class _LeftBarState extends State<_LeftBar> implements FolderList {
|
|||||||
if (index == 0) {
|
if (index == 0) {
|
||||||
return Container(
|
return Container(
|
||||||
padding: const EdgeInsets.symmetric(vertical: 12),
|
padding: const EdgeInsets.symmetric(vertical: 12),
|
||||||
|
margin: const EdgeInsets.only(top: 8),
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
border: Border(
|
border: Border(
|
||||||
top: BorderSide(
|
top: BorderSide(
|
||||||
|
Reference in New Issue
Block a user