reader controller & code refactor

This commit is contained in:
kodjodevf 2023-04-10 17:59:14 +01:00
parent 6667edd5d1
commit 2f751044da
12 changed files with 907 additions and 564 deletions

View file

@ -5,4 +5,7 @@ class HiveConstant {
static String get hiveBoxMangaSource => "_manga_box_source_";
static String get hiveBoxMangaFilter => "_manga_box_filter_";
static String get hiveBoxAppSettings => "_app_box_settings_";
static String get hiveBoxReaderSettings => "_reader_box_settings_";
static String get hiveBoxReaderMode =>
"_readerMode_box_settings_";
}

View file

@ -8,7 +8,7 @@ import 'package:mangayomi/models/manga_history.dart';
import 'package:mangayomi/models/model_manga.dart';
import 'package:mangayomi/router/router.dart';
import 'package:mangayomi/source/source_model.dart';
import 'package:mangayomi/views/manga/reader/providers/reader_controller_provider.dart';
import 'views/more/settings/appearance/flex_scheme_color_provider.dart';
import 'views/more/settings/appearance/thememode_provider.dart';
@ -17,9 +17,11 @@ void main() async {
Hive.registerAdapter(ModelMangaAdapter());
Hive.registerAdapter(MangaHistoryModelAdapter());
Hive.registerAdapter(SourceModelAdapter());
Hive.registerAdapter(ReaderModeAdapter());
Hive.registerAdapter(TypeSourceAdapter());
await Hive.openBox<ModelManga>(HiveConstant.hiveBoxManga);
await Hive.openBox<MangaHistoryModel>(HiveConstant.hiveBoxMangaHistory);
await Hive.openBox<ReaderMode>(HiveConstant.hiveBoxReaderMode);
await Hive.openBox<SourceModel>(HiveConstant.hiveBoxMangaSource);
await Hive.openBox(HiveConstant.hiveBoxMangaInfo);
await Hive.openBox(HiveConstant.hiveBoxMangaFilter);
@ -36,7 +38,7 @@ class MyApp extends ConsumerWidget {
ThemeData themeLight = FlexThemeData.light(
colors: ref.watch(flexSchemeColorProvider),
surfaceMode: FlexSurfaceMode.highScaffoldLevelSurface,
blendLevel: 24,
blendLevel: 10,
appBarOpacity: 0.00,
subThemesData: const FlexSubThemesData(
blendOnLevel: 24,

View file

@ -4,6 +4,7 @@ import 'package:mangayomi/constant.dart';
import 'package:mangayomi/models/manga_history.dart';
import 'package:mangayomi/models/model_manga.dart';
import 'package:mangayomi/source/source_model.dart';
import 'package:mangayomi/views/manga/reader/models/reader_model.dart';
final hiveBoxManga = Provider<Box<ModelManga>>((ref) {
return Hive.box<ModelManga>(HiveConstant.hiveBoxManga);
@ -12,10 +13,13 @@ final hiveBoxManga = Provider<Box<ModelManga>>((ref) {
final hiveBoxMangaInfo = Provider<Box>((ref) {
return Hive.box(HiveConstant.hiveBoxMangaInfo);
});
final hiveBoxMangaHistory = Provider<Box<MangaHistoryModel>>((ref) {
return Hive.box<MangaHistoryModel>(HiveConstant.hiveBoxMangaHistory);
});
final hiveBoxReaderMode = Provider<Box<ReaderMode>>((ref) {
return Hive.box<ReaderMode>(HiveConstant.hiveBoxReaderMode);
});
final hiveBoxMangaFilterProvider = Provider<Box>((ref) {
return Hive.box(HiveConstant.hiveBoxMangaFilter);
});

View file

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

View file

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

View file

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

View file

@ -6,7 +6,7 @@ part of 'search_manga.dart';
// RiverpodGenerator
// **************************************************************************
String _$searchMangaHash() => r'18866e3523f085404fecaa91fa3bc1a7149724e6';
String _$searchMangaHash() => r'e84374580686773aa67deb76ab91c00e2e6fab8b';
/// Copied from Dart SDK
class _SystemHash {

View file

@ -29,3 +29,25 @@ class ImageDetailInfo {
}
}
}
double? initScale({
required Size imageSize,
required Size size,
double? initialScale,
}) {
final double n1 = imageSize.height / imageSize.width;
final double n2 = size.height / size.width;
if (n1 > n2) {
final FittedSizes fittedSizes =
applyBoxFit(BoxFit.contain, imageSize, size);
final Size destinationSize = fittedSizes.destination;
return size.width / destinationSize.width;
} else if (n1 / n2 < 1 / 4) {
final FittedSizes fittedSizes =
applyBoxFit(BoxFit.contain, imageSize, size);
final Size destinationSize = fittedSizes.destination;
return size.height / destinationSize.height;
}
return initialScale;
}

View file

@ -54,26 +54,3 @@ class _ImageViewHorizontalState extends State<ImageViewHorizontal> {
}
}
double? initScale({
required Size imageSize,
required Size size,
double? initialScale,
}) {
final double n1 = imageSize.height / imageSize.width;
final double n2 = size.height / size.width;
if (n1 > n2) {
final FittedSizes fittedSizes =
applyBoxFit(BoxFit.contain, imageSize, size);
//final Size sourceSize = fittedSizes.source;
final Size destinationSize = fittedSizes.destination;
return size.width / destinationSize.width;
} else if (n1 / n2 < 1 / 4) {
final FittedSizes fittedSizes =
applyBoxFit(BoxFit.contain, imageSize, size);
//final Size sourceSize = fittedSizes.source;
final Size destinationSize = fittedSizes.destination;
return size.height / destinationSize.height;
}
return initialScale;
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,137 @@
import 'package:mangayomi/models/manga_history.dart';
import 'package:mangayomi/models/manga_reader.dart';
import 'package:mangayomi/models/model_manga.dart';
import 'package:mangayomi/providers/hive_provider.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:hive/hive.dart';
part 'reader_controller_provider.g.dart';
@HiveType(typeId: 5)
enum ReaderMode {
@HiveField(1)
vertical,
@HiveField(2)
ltr,
@HiveField(3)
rtl,
@HiveField(4)
verticalContinuous,
@HiveField(5)
webtoon
}
@riverpod
class CurrentIndex extends _$CurrentIndex {
@override
int build(MangaReaderModel mangaReaderModel) {
return ref.watch(hiveBoxMangaInfo).get(
"${mangaReaderModel.modelManga.source}/${mangaReaderModel.modelManga.name}/${mangaReaderModel.modelManga.chapterTitle![mangaReaderModel.index]}-page_index",
defaultValue: 0);
}
setCurrentIndex(int currentIndex) {
state = currentIndex;
}
}
@riverpod
class ReaderController extends _$ReaderController {
@override
void build({required MangaReaderModel mangaReaderModel}) {}
ModelManga getModelManga() {
return mangaReaderModel.modelManga;
}
ReaderMode getReaderMode() {
return ref.watch(hiveBoxReaderMode).get(
"${getSourceName()}/${getMangaName()}-singleMangaReaderModeValue",
defaultValue: null) !=
null
? ref.watch(hiveBoxReaderMode).get(
"${getSourceName()}/${getMangaName()}-singleMangaReaderModeValue",
)!
: ref
.watch(hiveBoxReaderMode)
.get("globalMangaReaderModeValue", defaultValue: ReaderMode.ltr)!;
}
String getReaderModeValue(ReaderMode readerMode) {
return readerMode == ReaderMode.vertical
? 'Vertical'
: readerMode == ReaderMode.verticalContinuous
? 'Verical continuous'
: readerMode == ReaderMode.ltr
? 'Left to Right'
: readerMode == ReaderMode.rtl
? 'Right to Left'
: 'Webtoon';
}
void setReaderMode(ReaderMode newReaderMode) {
ref.watch(hiveBoxReaderMode).put(
"${getSourceName()}/${getMangaName()}-singleMangaReaderModeValue",
newReaderMode);
}
void setShowPageNumber(bool value) {
ref
.watch(hiveBoxMangaInfo)
.put("${getSourceName()}/${getMangaName()}-showPagesNumber", value);
}
bool getShowPageNumber() {
return ref.watch(hiveBoxMangaInfo).get(
"${getSourceName()}/${getMangaName()}-showPagesNumber",
defaultValue: true);
}
void setMangaHistoryUpdate() {
ref.watch(hiveBoxMangaHistory).put(
mangaReaderModel.modelManga.link,
MangaHistoryModel(
date: DateTime.now().toString(),
modelManga: mangaReaderModel.modelManga));
}
int getChapterIndex() {
return mangaReaderModel.index;
}
void setChapterIndex() {
ref.watch(hiveBoxMangaInfo).put(
"${getSourceName()}/${getMangaName()}-chapter_index",
mangaReaderModel.index.toString());
}
int getPageIndex() {
return ref.watch(hiveBoxMangaInfo).get(
"${getSourceName()}/${getMangaName()}/${getChapterTitle()}-page_index",
defaultValue: 0);
}
int getPageLength() {
final page = ref.watch(hiveBoxMangaInfo).get(
"${getSourceName()}/${getMangaName()}/${getChapterTitle()}-pageurl",
) as List;
return page.length;
}
void setPageIndex(int newIndex) {
ref.watch(hiveBoxMangaInfo).put(
"${getSourceName()}/${getMangaName()}/${getChapterTitle()}-page_index",
newIndex);
}
String getMangaName() {
return mangaReaderModel.modelManga.name!;
}
String getSourceName() {
return mangaReaderModel.modelManga.source!;
}
String getChapterTitle() {
return mangaReaderModel.modelManga.chapterTitle![mangaReaderModel.index];
}
}

View file

@ -0,0 +1,281 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'reader_controller_provider.dart';
// **************************************************************************
// TypeAdapterGenerator
// **************************************************************************
class ReaderModeAdapter extends TypeAdapter<ReaderMode> {
@override
final int typeId = 5;
@override
ReaderMode read(BinaryReader reader) {
switch (reader.readByte()) {
case 1:
return ReaderMode.vertical;
case 2:
return ReaderMode.ltr;
case 3:
return ReaderMode.rtl;
case 4:
return ReaderMode.verticalContinuous;
case 5:
return ReaderMode.webtoon;
default:
return ReaderMode.vertical;
}
}
@override
void write(BinaryWriter writer, ReaderMode obj) {
switch (obj) {
case ReaderMode.vertical:
writer.writeByte(1);
break;
case ReaderMode.ltr:
writer.writeByte(2);
break;
case ReaderMode.rtl:
writer.writeByte(3);
break;
case ReaderMode.verticalContinuous:
writer.writeByte(4);
break;
case ReaderMode.webtoon:
writer.writeByte(5);
break;
}
}
@override
int get hashCode => typeId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is ReaderModeAdapter &&
runtimeType == other.runtimeType &&
typeId == other.typeId;
}
// **************************************************************************
// RiverpodGenerator
// **************************************************************************
String _$currentIndexHash() => r'c7af574deb470887e689579dd1d0d8262f997ba0';
/// Copied from Dart SDK
class _SystemHash {
_SystemHash._();
static int combine(int hash, int value) {
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + value);
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
return hash ^ (hash >> 6);
}
static int finish(int hash) {
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3));
// ignore: parameter_assignments
hash = hash ^ (hash >> 11);
return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
}
}
abstract class _$CurrentIndex extends BuildlessAutoDisposeNotifier<int> {
late final MangaReaderModel mangaReaderModel;
int build(
MangaReaderModel mangaReaderModel,
);
}
/// See also [CurrentIndex].
@ProviderFor(CurrentIndex)
const currentIndexProvider = CurrentIndexFamily();
/// See also [CurrentIndex].
class CurrentIndexFamily extends Family<int> {
/// See also [CurrentIndex].
const CurrentIndexFamily();
/// See also [CurrentIndex].
CurrentIndexProvider call(
MangaReaderModel mangaReaderModel,
) {
return CurrentIndexProvider(
mangaReaderModel,
);
}
@override
CurrentIndexProvider getProviderOverride(
covariant CurrentIndexProvider provider,
) {
return call(
provider.mangaReaderModel,
);
}
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'currentIndexProvider';
}
/// See also [CurrentIndex].
class CurrentIndexProvider
extends AutoDisposeNotifierProviderImpl<CurrentIndex, int> {
/// See also [CurrentIndex].
CurrentIndexProvider(
this.mangaReaderModel,
) : super.internal(
() => CurrentIndex()..mangaReaderModel = mangaReaderModel,
from: currentIndexProvider,
name: r'currentIndexProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$currentIndexHash,
dependencies: CurrentIndexFamily._dependencies,
allTransitiveDependencies:
CurrentIndexFamily._allTransitiveDependencies,
);
final MangaReaderModel mangaReaderModel;
@override
bool operator ==(Object other) {
return other is CurrentIndexProvider &&
other.mangaReaderModel == mangaReaderModel;
}
@override
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, mangaReaderModel.hashCode);
return _SystemHash.finish(hash);
}
@override
int runNotifierBuild(
covariant CurrentIndex notifier,
) {
return notifier.build(
mangaReaderModel,
);
}
}
String _$readerControllerHash() => r'2925877651f6ffa41954e95ae4c4c6499364cfaf';
abstract class _$ReaderController extends BuildlessAutoDisposeNotifier<void> {
late final MangaReaderModel mangaReaderModel;
void build({
required MangaReaderModel mangaReaderModel,
});
}
/// See also [ReaderController].
@ProviderFor(ReaderController)
const readerControllerProvider = ReaderControllerFamily();
/// See also [ReaderController].
class ReaderControllerFamily extends Family<void> {
/// See also [ReaderController].
const ReaderControllerFamily();
/// See also [ReaderController].
ReaderControllerProvider call({
required MangaReaderModel mangaReaderModel,
}) {
return ReaderControllerProvider(
mangaReaderModel: mangaReaderModel,
);
}
@override
ReaderControllerProvider getProviderOverride(
covariant ReaderControllerProvider provider,
) {
return call(
mangaReaderModel: provider.mangaReaderModel,
);
}
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'readerControllerProvider';
}
/// See also [ReaderController].
class ReaderControllerProvider
extends AutoDisposeNotifierProviderImpl<ReaderController, void> {
/// See also [ReaderController].
ReaderControllerProvider({
required this.mangaReaderModel,
}) : super.internal(
() => ReaderController()..mangaReaderModel = mangaReaderModel,
from: readerControllerProvider,
name: r'readerControllerProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$readerControllerHash,
dependencies: ReaderControllerFamily._dependencies,
allTransitiveDependencies:
ReaderControllerFamily._allTransitiveDependencies,
);
final MangaReaderModel mangaReaderModel;
@override
bool operator ==(Object other) {
return other is ReaderControllerProvider &&
other.mangaReaderModel == mangaReaderModel;
}
@override
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, mangaReaderModel.hashCode);
return _SystemHash.finish(hash);
}
@override
void runNotifierBuild(
covariant ReaderController notifier,
) {
return notifier.build(
mangaReaderModel: mangaReaderModel,
);
}
}
// 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