[Comic Source] New model PageJumpTarget. All page jump operations now use PageJumpTarget.

This commit is contained in:
2025-04-04 22:47:43 +08:00
parent 971fc1da92
commit 463ad5b5bc
12 changed files with 266 additions and 226 deletions

View File

@@ -34,24 +34,28 @@ class CategoryButtonData {
});
}
class CategoryItem {
final String label;
final PageJumpTarget target;
const CategoryItem(this.label, this.target);
}
abstract class BaseCategoryPart {
String get title;
List<String> get categories;
List<String>? get categoryParams => null;
List<CategoryItem> get categories;
bool get enableRandom;
String get categoryType;
/// Data class for building a part of category page.
const BaseCategoryPart();
}
class FixedCategoryPart extends BaseCategoryPart {
@override
final List<String> categories;
final List<CategoryItem> categories;
@override
bool get enableRandom => false;
@@ -59,19 +63,12 @@ class FixedCategoryPart extends BaseCategoryPart {
@override
final String title;
@override
final String categoryType;
@override
final List<String>? categoryParams;
/// A [BaseCategoryPart] that show fixed tags on category page.
const FixedCategoryPart(this.title, this.categories, this.categoryType,
[this.categoryParams]);
const FixedCategoryPart(this.title, this.categories);
}
class RandomCategoryPart extends BaseCategoryPart {
final List<String> tags;
final List<CategoryItem> all;
final int randomNumber;
@@ -81,67 +78,23 @@ class RandomCategoryPart extends BaseCategoryPart {
@override
bool get enableRandom => true;
@override
final String categoryType;
List<String> _categories() {
if (randomNumber >= tags.length) {
return tags;
List<CategoryItem> _categories() {
if (randomNumber >= all.length) {
return all;
}
var start = math.Random().nextInt(tags.length - randomNumber);
return tags.sublist(start, start + randomNumber);
var start = math.Random().nextInt(all.length - randomNumber);
return all.sublist(start, start + randomNumber);
}
@override
List<String> get categories => _categories();
List<CategoryItem> get categories => _categories();
/// A [BaseCategoryPart] that show random tags on category page.
/// A [BaseCategoryPart] that show a part of random tags on category page.
const RandomCategoryPart(
this.title, this.tags, this.randomNumber, this.categoryType);
}
class RandomCategoryPartWithRuntimeData extends BaseCategoryPart {
final Iterable<String> Function() loadTags;
final int randomNumber;
@override
final String title;
@override
bool get enableRandom => true;
@override
final String categoryType;
static final random = math.Random();
List<String> _categories() {
var tags = loadTags();
if (randomNumber >= tags.length) {
return tags.toList();
}
final start = random.nextInt(tags.length - randomNumber);
var res = List.filled(randomNumber, '');
int index = -1;
for (var s in tags) {
index++;
if (start > index) {
continue;
} else if (index == start + randomNumber) {
break;
}
res[index - start] = s;
}
return res;
}
@override
List<String> get categories => _categories();
/// A [BaseCategoryPart] that show random tags on category page.
RandomCategoryPartWithRuntimeData(
this.title, this.loadTags, this.randomNumber, this.categoryType);
this.title,
this.all,
this.randomNumber,
);
}
CategoryData getCategoryDataWithKey(String key) {