local favorites search page

This commit is contained in:
nyne
2024-11-02 20:29:44 +08:00
parent c4d867db89
commit 49174a7d8e
4 changed files with 74 additions and 26 deletions

View File

@@ -83,7 +83,9 @@ class FavoriteItem implements Comic {
int? get maxPage => null;
@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
double? get stars => null;
@@ -132,21 +134,18 @@ class FavoriteItem implements Comic {
}
}
class FavoriteItemWithFolderInfo {
FavoriteItem comic;
class FavoriteItemWithFolderInfo extends FavoriteItem {
String folder;
FavoriteItemWithFolderInfo(this.comic, this.folder);
@override
bool operator ==(Object other) {
return other is FavoriteItemWithFolderInfo &&
other.comic == comic &&
other.folder == folder;
}
@override
int get hashCode => comic.hashCode ^ folder.hashCode;
FavoriteItemWithFolderInfo(FavoriteItem item, this.folder)
: super(
id: item.id,
name: item.name,
coverPath: item.coverPath,
author: item.author,
type: item.type,
tags: item.tags,
);
}
class LocalFavoritesManager {
@@ -498,11 +497,11 @@ class LocalFavoritesManager {
}
bool test(FavoriteItemWithFolderInfo comic, String keyword) {
if (comic.comic.name.contains(keyword)) {
if (comic.name.contains(keyword)) {
return true;
} else if (comic.comic.author.contains(keyword)) {
} else if (comic.author.contains(keyword)) {
return true;
} else if (comic.comic.tags.any((element) => element.contains(keyword))) {
} else if (comic.tags.any((element) => element.contains(keyword))) {
return true;
}
return false;
@@ -591,8 +590,7 @@ class LocalFavoritesManager {
for (var comic in data["comics"]) {
try {
addComic(folder, FavoriteItem.fromJson(comic));
}
catch(e) {
} catch (e) {
Log.error("Import Data", e.toString());
}
}

View File

@@ -17,6 +17,7 @@ part 'favorite_actions.dart';
part 'side_bar.dart';
part 'local_favorites_page.dart';
part 'network_favorites_page.dart';
part 'local_search_page.dart';
const _kLeftBarWidth = 256.0;

View 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;
},
),
]),
);
}
}

View File

@@ -88,6 +88,13 @@ class _LeftBarState extends State<_LeftBar> implements FolderList {
const SizedBox(width: 12),
Text("Local".tl),
const Spacer(),
IconButton(
icon: const Icon(Icons.search),
color: context.colorScheme.primary,
onPressed: () {
context.to(() => const LocalSearchPage());
},
),
IconButton(
icon: const Icon(Icons.add),
color: context.colorScheme.primary,
@@ -112,6 +119,7 @@ class _LeftBarState extends State<_LeftBar> implements FolderList {
if (index == 0) {
return Container(
padding: const EdgeInsets.symmetric(vertical: 12),
margin: const EdgeInsets.only(top: 8),
decoration: BoxDecoration(
border: Border(
top: BorderSide(