add chapter sort

This commit is contained in:
kodjodevf 2023-05-02 18:51:08 +01:00
parent 0d7fbf3ca6
commit 9961d59c17
8 changed files with 474 additions and 55 deletions

View file

@ -7,7 +7,7 @@ part of 'get_manga_chapter_url.dart';
// **************************************************************************
String _$getMangaChapterUrlHash() =>
r'af6919ddfaafdafc0e8c2fa0fa0f686dfccd934a';
r'6b40f393d25504e820401a92e7b5387fd07ab973';
/// Copied from Dart SDK
class _SystemHash {

View file

@ -6,7 +6,7 @@ part of 'get_manga_detail.dart';
// RiverpodGenerator
// **************************************************************************
String _$getMangaDetailHash() => r'8cc750dd5a207747b8e97db82ce6c1b141c8419a';
String _$getMangaDetailHash() => r'ded3d41646d56c670699614c7ab01069ddc52b8d';
/// Copied from Dart SDK
class _SystemHash {

View file

@ -6,7 +6,7 @@ part of 'get_popular_manga.dart';
// RiverpodGenerator
// **************************************************************************
String _$getPopularMangaHash() => r'87a02e32e79c310e6717e7ae95bf54fdd13b2a00';
String _$getPopularMangaHash() => r'cf3f1c29feafa93591a44549b5d81f25ff65bf4f';
/// Copied from Dart SDK
class _SystemHash {

View file

@ -508,4 +508,3 @@ class LibraryShowContinueReadingButtonState
.put('libraryShowContinueReadingButton', value);
}
}

View file

@ -75,8 +75,8 @@ class _MangaDetailViewState extends ConsumerState<MangaDetailView>
.length +
1;
final reverse =
ref.watch(reverseMangaStateProvider(modelManga: widget.modelManga!));
bool reverse = ref.watch(
reverseChapterStateProvider(modelManga: widget.modelManga!))["reverse"];
return NotificationListener<UserScrollNotification>(
onNotification: (notification) {
@ -394,7 +394,7 @@ class _MangaDetailViewState extends ConsumerState<MangaDetailView>
barItem: Container(),
uiType: DraggableMenuUiType.classic,
expandable: false,
maxHeight: mediaHeight(context, 0.36),
maxHeight: 240,
fastDrag: false,
minimizeBeforeFastDrag: false,
child: DefaultTabController(
@ -459,20 +459,33 @@ class _MangaDetailViewState extends ConsumerState<MangaDetailView>
);
}),
Consumer(builder: (context, ref, chil) {
final reverse = ref.watch(reverseMangaStateProvider(
modelManga: widget.modelManga!));
final reverse = ref
.read(reverseChapterStateProvider(
modelManga: widget.modelManga!)
.notifier)
.isReverse();
final reverseChapter = ref.watch(
reverseChapterStateProvider(
modelManga: widget.modelManga!));
return Column(
children: [
ListTileChapterSort(
label: "By upload date",
for (var i = 0; i < 3; i++)
ListTileChapterSort(
label: i == 0
? "By source"
: i == 1
? "By chapter number"
: "By upload date",
reverse: reverse,
onTap: () {
ref
.read(reverseMangaStateProvider(
.read(reverseChapterStateProvider(
modelManga: widget.modelManga!)
.notifier)
.update(!reverse);
}),
.set(i);
},
showLeading: reverseChapter['index'] == i,
),
],
);
}),

View file

@ -1,3 +1,5 @@
import 'dart:convert';
import 'package:mangayomi/models/model_manga.dart';
import 'package:mangayomi/providers/hive_provider.dart';
import 'package:mangayomi/views/manga/download/providers/download_provider.dart';
@ -92,20 +94,54 @@ class IsExtendedState extends _$IsExtendedState {
}
@riverpod
class ReverseMangaState extends _$ReverseMangaState {
class ReverseChapterState extends _$ReverseChapterState {
@override
bool build({required ModelManga modelManga}) {
dynamic build({required ModelManga modelManga}) {
return ref.watch(hiveBoxSettingsProvider).get(
"${modelManga.source}/${modelManga.name}-reverseChapter",
defaultValue: false);
"${modelManga.source}/${modelManga.name}-reverseChapterMap",
defaultValue: {"reverse": false, "index": 0});
}
void update(bool value) {
ref
.watch(hiveBoxSettingsProvider)
.put("${modelManga.source}/${modelManga.name}-reverseChapter", value);
void update(bool reverse, int index) {
var value = {
"reverse": state['index'] == index ? !reverse : reverse,
"index": index
};
ref.watch(hiveBoxSettingsProvider).put(
"${modelManga.source}/${modelManga.name}-reverseChapterMap", value);
state = value;
}
void set(int index) {
final reverse = ref
.read(reverseChapterStateProvider(modelManga: modelManga).notifier)
.isReverse();
final sortBySource =
ref.watch(sortBySourceStateProvider(modelManga: modelManga));
final sortByChapterNumber =
ref.watch(sortByChapterNumberStateProvider(modelManga: modelManga));
final sortByUploadDate =
ref.watch(sortByUploadDateStateProvider(modelManga: modelManga));
update(reverse, index);
if (index == 0) {
ref
.read(sortBySourceStateProvider(modelManga: modelManga).notifier)
.update(!sortBySource);
} else if (index == 1) {
ref
.read(
sortByChapterNumberStateProvider(modelManga: modelManga).notifier)
.update(!sortByChapterNumber);
} else {
ref
.read(sortByUploadDateStateProvider(modelManga: modelManga).notifier)
.update(!sortByUploadDate);
}
}
bool isReverse() {
return state["reverse"];
}
}
@riverpod
@ -329,6 +365,8 @@ class ChapterFilterBookmarkedState extends _$ChapterFilterBookmarkedState {
class ChapterFilterResultState extends _$ChapterFilterResultState {
@override
ModelManga build({required ModelManga modelManga}) {
int indexSelected =
ref.watch(reverseChapterStateProvider(modelManga: modelManga))["index"];
final data1 = ref
.read(chapterFilterDownloadedStateProvider(modelManga: modelManga)
.notifier)
@ -341,7 +379,25 @@ class ChapterFilterResultState extends _$ChapterFilterResultState {
final data3 = ref
.read(chapterFilterBookmarkedStateProvider(modelManga: data2).notifier)
.getData();
if (indexSelected == 0) {
data3.chapters!.sort(
(a, b) {
return b.scanlator!.compareTo(a.scanlator!);
},
);
} else if (indexSelected == 1) {
// data3.chapters!.sort(
// (a, b) {
// return a.dateUpload!.compareTo(b.dateUpload!);
// },
// );
} else {
data3.chapters!.sort(
(a, b) {
return a.dateUpload!.compareTo(b.dateUpload!);
},
);
}
return data3;
}
@ -450,3 +506,53 @@ class ChapterSetDownloadState extends _$ChapterSetDownloadState {
}
}
}
@riverpod
class SortByUploadDateState extends _$SortByUploadDateState {
@override
bool build({required ModelManga modelManga}) {
return ref.watch(hiveBoxSettingsProvider).get(
"${modelManga.source}/${modelManga.name}-sortByUploadDateChapter",
defaultValue: false);
}
void update(bool value) {
ref.watch(hiveBoxSettingsProvider).put(
"${modelManga.source}/${modelManga.name}-sortByUploadDateChapter",
value);
state = value;
}
}
@riverpod
class SortBySourceState extends _$SortBySourceState {
@override
bool build({required ModelManga modelManga}) {
return ref.watch(hiveBoxSettingsProvider).get(
"${modelManga.source}/${modelManga.name}-sortBySourceChapter",
defaultValue: false);
}
void update(bool value) {
ref.watch(hiveBoxSettingsProvider).put(
"${modelManga.source}/${modelManga.name}-sortBySourceChapter", value);
state = value;
}
}
@riverpod
class SortByChapterNumberState extends _$SortByChapterNumberState {
@override
bool build({required ModelManga modelManga}) {
return ref.watch(hiveBoxSettingsProvider).get(
"${modelManga.source}/${modelManga.name}-sortByChapterNumberChapter",
defaultValue: false);
}
void update(bool value) {
ref.watch(hiveBoxSettingsProvider).put(
"${modelManga.source}/${modelManga.name}-sortByChapterNumberChapter",
value);
state = value;
}
}

View file

@ -72,7 +72,8 @@ final isExtendedStateProvider =
);
typedef _$IsExtendedState = AutoDisposeNotifier<bool>;
String _$reverseMangaStateHash() => r'27a74f99810dac3d27d428a107a397e03eb2835d';
String _$reverseChapterStateHash() =>
r'7fb5d8f60f32377ca365eb328f989e31569c8b19';
/// Copied from Dart SDK
class _SystemHash {
@ -95,35 +96,36 @@ class _SystemHash {
}
}
abstract class _$ReverseMangaState extends BuildlessAutoDisposeNotifier<bool> {
abstract class _$ReverseChapterState
extends BuildlessAutoDisposeNotifier<dynamic> {
late final ModelManga modelManga;
bool build({
dynamic build({
required ModelManga modelManga,
});
}
/// See also [ReverseMangaState].
@ProviderFor(ReverseMangaState)
const reverseMangaStateProvider = ReverseMangaStateFamily();
/// See also [ReverseChapterState].
@ProviderFor(ReverseChapterState)
const reverseChapterStateProvider = ReverseChapterStateFamily();
/// See also [ReverseMangaState].
class ReverseMangaStateFamily extends Family<bool> {
/// See also [ReverseMangaState].
const ReverseMangaStateFamily();
/// See also [ReverseChapterState].
class ReverseChapterStateFamily extends Family<dynamic> {
/// See also [ReverseChapterState].
const ReverseChapterStateFamily();
/// See also [ReverseMangaState].
ReverseMangaStateProvider call({
/// See also [ReverseChapterState].
ReverseChapterStateProvider call({
required ModelManga modelManga,
}) {
return ReverseMangaStateProvider(
return ReverseChapterStateProvider(
modelManga: modelManga,
);
}
@override
ReverseMangaStateProvider getProviderOverride(
covariant ReverseMangaStateProvider provider,
ReverseChapterStateProvider getProviderOverride(
covariant ReverseChapterStateProvider provider,
) {
return call(
modelManga: provider.modelManga,
@ -142,33 +144,34 @@ class ReverseMangaStateFamily extends Family<bool> {
_allTransitiveDependencies;
@override
String? get name => r'reverseMangaStateProvider';
String? get name => r'reverseChapterStateProvider';
}
/// See also [ReverseMangaState].
class ReverseMangaStateProvider
extends AutoDisposeNotifierProviderImpl<ReverseMangaState, bool> {
/// See also [ReverseMangaState].
ReverseMangaStateProvider({
/// See also [ReverseChapterState].
class ReverseChapterStateProvider
extends AutoDisposeNotifierProviderImpl<ReverseChapterState, dynamic> {
/// See also [ReverseChapterState].
ReverseChapterStateProvider({
required this.modelManga,
}) : super.internal(
() => ReverseMangaState()..modelManga = modelManga,
from: reverseMangaStateProvider,
name: r'reverseMangaStateProvider',
() => ReverseChapterState()..modelManga = modelManga,
from: reverseChapterStateProvider,
name: r'reverseChapterStateProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$reverseMangaStateHash,
dependencies: ReverseMangaStateFamily._dependencies,
: _$reverseChapterStateHash,
dependencies: ReverseChapterStateFamily._dependencies,
allTransitiveDependencies:
ReverseMangaStateFamily._allTransitiveDependencies,
ReverseChapterStateFamily._allTransitiveDependencies,
);
final ModelManga modelManga;
@override
bool operator ==(Object other) {
return other is ReverseMangaStateProvider && other.modelManga == modelManga;
return other is ReverseChapterStateProvider &&
other.modelManga == modelManga;
}
@override
@ -180,8 +183,8 @@ class ReverseMangaStateProvider
}
@override
bool runNotifierBuild(
covariant ReverseMangaState notifier,
dynamic runNotifierBuild(
covariant ReverseChapterState notifier,
) {
return notifier.build(
modelManga: modelManga,
@ -883,4 +886,298 @@ class ChapterSetDownloadStateProvider
);
}
}
String _$sortByUploadDateStateHash() =>
r'a86bc258687f71a0364874e8f6f0401f9fb1a1ee';
abstract class _$SortByUploadDateState
extends BuildlessAutoDisposeNotifier<bool> {
late final ModelManga modelManga;
bool build({
required ModelManga modelManga,
});
}
/// See also [SortByUploadDateState].
@ProviderFor(SortByUploadDateState)
const sortByUploadDateStateProvider = SortByUploadDateStateFamily();
/// See also [SortByUploadDateState].
class SortByUploadDateStateFamily extends Family<bool> {
/// See also [SortByUploadDateState].
const SortByUploadDateStateFamily();
/// See also [SortByUploadDateState].
SortByUploadDateStateProvider call({
required ModelManga modelManga,
}) {
return SortByUploadDateStateProvider(
modelManga: modelManga,
);
}
@override
SortByUploadDateStateProvider getProviderOverride(
covariant SortByUploadDateStateProvider provider,
) {
return call(
modelManga: provider.modelManga,
);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@override
Iterable<ProviderOrFamily>? get dependencies => _dependencies;
static const Iterable<ProviderOrFamily>? _allTransitiveDependencies = null;
@override
Iterable<ProviderOrFamily>? get allTransitiveDependencies =>
_allTransitiveDependencies;
@override
String? get name => r'sortByUploadDateStateProvider';
}
/// See also [SortByUploadDateState].
class SortByUploadDateStateProvider
extends AutoDisposeNotifierProviderImpl<SortByUploadDateState, bool> {
/// See also [SortByUploadDateState].
SortByUploadDateStateProvider({
required this.modelManga,
}) : super.internal(
() => SortByUploadDateState()..modelManga = modelManga,
from: sortByUploadDateStateProvider,
name: r'sortByUploadDateStateProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$sortByUploadDateStateHash,
dependencies: SortByUploadDateStateFamily._dependencies,
allTransitiveDependencies:
SortByUploadDateStateFamily._allTransitiveDependencies,
);
final ModelManga modelManga;
@override
bool operator ==(Object other) {
return other is SortByUploadDateStateProvider &&
other.modelManga == modelManga;
}
@override
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, modelManga.hashCode);
return _SystemHash.finish(hash);
}
@override
bool runNotifierBuild(
covariant SortByUploadDateState notifier,
) {
return notifier.build(
modelManga: modelManga,
);
}
}
String _$sortBySourceStateHash() => r'77181a7c4e07a7714a0e3230f84830e66e36a40f';
abstract class _$SortBySourceState extends BuildlessAutoDisposeNotifier<bool> {
late final ModelManga modelManga;
bool build({
required ModelManga modelManga,
});
}
/// See also [SortBySourceState].
@ProviderFor(SortBySourceState)
const sortBySourceStateProvider = SortBySourceStateFamily();
/// See also [SortBySourceState].
class SortBySourceStateFamily extends Family<bool> {
/// See also [SortBySourceState].
const SortBySourceStateFamily();
/// See also [SortBySourceState].
SortBySourceStateProvider call({
required ModelManga modelManga,
}) {
return SortBySourceStateProvider(
modelManga: modelManga,
);
}
@override
SortBySourceStateProvider getProviderOverride(
covariant SortBySourceStateProvider provider,
) {
return call(
modelManga: provider.modelManga,
);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@override
Iterable<ProviderOrFamily>? get dependencies => _dependencies;
static const Iterable<ProviderOrFamily>? _allTransitiveDependencies = null;
@override
Iterable<ProviderOrFamily>? get allTransitiveDependencies =>
_allTransitiveDependencies;
@override
String? get name => r'sortBySourceStateProvider';
}
/// See also [SortBySourceState].
class SortBySourceStateProvider
extends AutoDisposeNotifierProviderImpl<SortBySourceState, bool> {
/// See also [SortBySourceState].
SortBySourceStateProvider({
required this.modelManga,
}) : super.internal(
() => SortBySourceState()..modelManga = modelManga,
from: sortBySourceStateProvider,
name: r'sortBySourceStateProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$sortBySourceStateHash,
dependencies: SortBySourceStateFamily._dependencies,
allTransitiveDependencies:
SortBySourceStateFamily._allTransitiveDependencies,
);
final ModelManga modelManga;
@override
bool operator ==(Object other) {
return other is SortBySourceStateProvider && other.modelManga == modelManga;
}
@override
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, modelManga.hashCode);
return _SystemHash.finish(hash);
}
@override
bool runNotifierBuild(
covariant SortBySourceState notifier,
) {
return notifier.build(
modelManga: modelManga,
);
}
}
String _$sortByChapterNumberStateHash() =>
r'68dc6bdf97aa6938fe2896d244aac3a77900ee2e';
abstract class _$SortByChapterNumberState
extends BuildlessAutoDisposeNotifier<bool> {
late final ModelManga modelManga;
bool build({
required ModelManga modelManga,
});
}
/// See also [SortByChapterNumberState].
@ProviderFor(SortByChapterNumberState)
const sortByChapterNumberStateProvider = SortByChapterNumberStateFamily();
/// See also [SortByChapterNumberState].
class SortByChapterNumberStateFamily extends Family<bool> {
/// See also [SortByChapterNumberState].
const SortByChapterNumberStateFamily();
/// See also [SortByChapterNumberState].
SortByChapterNumberStateProvider call({
required ModelManga modelManga,
}) {
return SortByChapterNumberStateProvider(
modelManga: modelManga,
);
}
@override
SortByChapterNumberStateProvider getProviderOverride(
covariant SortByChapterNumberStateProvider provider,
) {
return call(
modelManga: provider.modelManga,
);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@override
Iterable<ProviderOrFamily>? get dependencies => _dependencies;
static const Iterable<ProviderOrFamily>? _allTransitiveDependencies = null;
@override
Iterable<ProviderOrFamily>? get allTransitiveDependencies =>
_allTransitiveDependencies;
@override
String? get name => r'sortByChapterNumberStateProvider';
}
/// See also [SortByChapterNumberState].
class SortByChapterNumberStateProvider
extends AutoDisposeNotifierProviderImpl<SortByChapterNumberState, bool> {
/// See also [SortByChapterNumberState].
SortByChapterNumberStateProvider({
required this.modelManga,
}) : super.internal(
() => SortByChapterNumberState()..modelManga = modelManga,
from: sortByChapterNumberStateProvider,
name: r'sortByChapterNumberStateProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$sortByChapterNumberStateHash,
dependencies: SortByChapterNumberStateFamily._dependencies,
allTransitiveDependencies:
SortByChapterNumberStateFamily._allTransitiveDependencies,
);
final ModelManga modelManga;
@override
bool operator ==(Object other) {
return other is SortByChapterNumberStateProvider &&
other.modelManga == modelManga;
}
@override
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, modelManga.hashCode);
return _SystemHash.finish(hash);
}
@override
bool runNotifierBuild(
covariant SortByChapterNumberState notifier,
) {
return notifier.build(
modelManga: modelManga,
);
}
}
// ignore_for_file: unnecessary_raw_strings, subtype_of_sealed_class, invalid_use_of_internal_member, do_not_use_environment, prefer_const_constructors, public_member_api_docs, avoid_private_typedef_functions

View file

@ -4,11 +4,13 @@ class ListTileChapterSort extends StatelessWidget {
final String label;
final bool reverse;
final VoidCallback onTap;
final bool showLeading;
const ListTileChapterSort(
{super.key,
required this.label,
required this.reverse,
required this.onTap});
required this.onTap,
required this.showLeading});
@override
Widget build(BuildContext context) {
@ -17,7 +19,9 @@ class ListTileChapterSort extends StatelessWidget {
dense: true,
leading: Icon(
reverse ? Icons.arrow_downward_sharp : Icons.arrow_upward_sharp,
color: Theme.of(context).hintColor),
color: showLeading
? Theme.of(context).primaryColor
: Colors.transparent),
title: Text(
label,
style: const TextStyle(fontSize: 14),