feat/source-preference

This commit is contained in:
kodjomoustapha 2023-12-01 23:29:25 +01:00
parent 8aac66ca29
commit 21b6dc437c
22 changed files with 6813 additions and 410 deletions

View file

@ -16,6 +16,7 @@ import 'package:mangayomi/eval/model/m_source.dart';
import 'package:mangayomi/eval/model/m_manga.dart';
import 'package:mangayomi/eval/model/m_provider.dart';
import 'package:mangayomi/models/video.dart';
import 'package:mangayomi/modules/browse/extension/providers/extension_preferences_providers.dart';
class $MProvider extends MProvider with $Bridge<MProvider> {
static $MProvider $construct(
@ -37,45 +38,27 @@ class $MProvider extends MProvider with $Bridge<MProvider> {
BridgeTypeRef(CoreTypes.future, [$MPages.$type])),
params: [
BridgeParameter(
'source',
BridgeTypeAnnotation($MSource.$type),
false,
),
BridgeParameter(
'page',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.int)),
false,
),
'source', BridgeTypeAnnotation($MSource.$type), false),
BridgeParameter('page',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.int)), false),
])),
'getPopular': BridgeMethodDef(BridgeFunctionDef(
returns: BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.future, [$MPages.$type])),
params: [
BridgeParameter(
'source',
BridgeTypeAnnotation($MSource.$type),
false,
),
BridgeParameter(
'page',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.int)),
false,
),
'source', BridgeTypeAnnotation($MSource.$type), false),
BridgeParameter('page',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.int)), false),
])),
'search': BridgeMethodDef(BridgeFunctionDef(
returns: BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.future, [$MPages.$type])),
params: [
BridgeParameter(
'source',
BridgeTypeAnnotation($MSource.$type),
false,
),
BridgeParameter(
'query',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
false,
),
'source', BridgeTypeAnnotation($MSource.$type), false),
BridgeParameter('query',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), false),
BridgeParameter(
'page',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.int)),
@ -87,15 +70,9 @@ class $MProvider extends MProvider with $Bridge<MProvider> {
BridgeTypeRef(CoreTypes.future, [$MManga.$type])),
params: [
BridgeParameter(
'source',
BridgeTypeAnnotation($MManga.$type),
false,
),
BridgeParameter(
'url',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
false,
),
'source', BridgeTypeAnnotation($MManga.$type), false),
BridgeParameter('url',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), false),
])),
'getPageList': BridgeMethodDef(BridgeFunctionDef(
returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.future, [
@ -103,15 +80,9 @@ class $MProvider extends MProvider with $Bridge<MProvider> {
])),
params: [
BridgeParameter(
'source',
BridgeTypeAnnotation($MManga.$type),
false,
),
BridgeParameter(
'url',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
false,
),
'source', BridgeTypeAnnotation($MManga.$type), false),
BridgeParameter('url',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), false),
])),
'getVideoList': BridgeMethodDef(BridgeFunctionDef(
returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.future, [
@ -119,19 +90,24 @@ class $MProvider extends MProvider with $Bridge<MProvider> {
])),
params: [
BridgeParameter(
'source',
BridgeTypeAnnotation($MManga.$type),
false,
),
BridgeParameter(
'url',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
false,
),
'source', BridgeTypeAnnotation($MManga.$type), false),
BridgeParameter('url',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), false),
])),
'getFilterList': BridgeMethodDef(BridgeFunctionDef(
returns: BridgeTypeAnnotation(BridgeTypeRef(
CoreTypes.future, [BridgeTypeRef(CoreTypes.dynamic)])))),
CoreTypes.list, [BridgeTypeRef(CoreTypes.dynamic)])))),
'getSourcePreferences': BridgeMethodDef(BridgeFunctionDef(
returns: BridgeTypeAnnotation(BridgeTypeRef(
CoreTypes.list, [BridgeTypeRef(CoreTypes.dynamic)])))),
'getPreferenceValue': BridgeMethodDef(BridgeFunctionDef(
returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.dynamic)),
params: [
BridgeParameter('sourceId',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.int)), false),
BridgeParameter('key',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), false),
])),
'cryptoHandler': BridgeMethodDef(
BridgeFunctionDef(
returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)),
@ -785,6 +761,16 @@ class $MProvider extends MProvider with $Bridge<MProvider> {
return $Future.wrap(MBridge.http(args[0]!.$reified, args[1]!.$reified)
.then((value) => $String(value)));
}),
'getPreferenceValue' => $Function((_, __, List<$Value?> args) {
final value = getPreferenceValue(
args[1]!.$reified, args[0]!.$reified);
if (value is String) {
return $String(value);
} else if (value is bool) {
return $bool(value);
}
return $List.wrap(value.map((e) => $String(e)).toList());
}),
"cryptoHandler" => $Function((_, __, List<$Value?> args) {
return $String(MBridge.cryptoHandler(args[0]!.$value, args[1]!.$value,
args[2]!.$value, args[3]!.$value));
@ -996,6 +982,15 @@ class $MProvider extends MProvider with $Bridge<MProvider> {
return res;
}
@override
List getSourcePreferences() {
final res = $_invoke('getSourcePreferences', []);
if (res is $List) {
return res.$reified;
}
return res;
}
@override
Future<List<Video>> getVideoList(MSource source, String url) async {
final res =
@ -1022,8 +1017,8 @@ class $MProvider extends MProvider with $Bridge<MProvider> {
_toValueList(List filters) {
return (filters).map((e) {
if (e is SelectFilter) {
return $SelectFilter
.wrap(SelectFilter(e.type, e.name, e.state, _toValueList(e.values)));
return $SelectFilter.wrap(
SelectFilter(e.type, e.name, e.state, _toValueList(e.values)));
} else if (e is TextFilter) {
return $TextFilter.wrap(e);
} else if (e is HeaderFilter) {

View file

@ -0,0 +1,759 @@
import 'package:dart_eval/dart_eval.dart';
import 'package:dart_eval/dart_eval_bridge.dart';
import 'package:dart_eval/stdlib/core.dart';
import 'package:isar/isar.dart';
import 'package:mangayomi/eval/model/source_preference.dart';
class $CheckBoxPreference implements SourcePreference, $Instance {
$CheckBoxPreference.wrap(this.$value) : _superclass = $Object($value);
static const $type = BridgeTypeRef(BridgeTypeSpec(
'package:mangayomi/bridge_lib.dart', 'CheckBoxPreference'));
static const $declaration = BridgeClassDef(BridgeClassType($type),
constructors: {
'': BridgeConstructorDef(BridgeFunctionDef(
returns: BridgeTypeAnnotation($type),
params: [],
namedParams: [
BridgeParameter('key',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), false),
BridgeParameter('title',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), false),
BridgeParameter('summary',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), false),
BridgeParameter('value',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.bool)), false),
]))
},
fields: {
'key': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string))),
'title': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string))),
'summary': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string))),
'value':
BridgeFieldDef(BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.bool))),
},
wrap: true);
static $Value? $new(Runtime runtime, $Value? target, List<$Value?> args) {
return $CheckBoxPreference.wrap(SourcePreference(
key: args[0]!.$value,
checkBoxPreference: CheckBoxPreference(
title: args[1]!.$value,
summary: args[2]!.$value,
value: args[3]!.$value)));
}
@override
final SourcePreference $value;
@override
SourcePreference get $reified => $value;
final $Instance _superclass;
@override
$Value? $getProperty(Runtime runtime, String identifier) {
switch (identifier) {
case 'key':
return $String($value.key!);
case 'title':
return $String($value.checkBoxPreference!.title!);
case 'summary':
return $String($value.checkBoxPreference!.summary!);
case 'value':
return $bool($value.checkBoxPreference!.value!);
default:
return _superclass.$getProperty(runtime, identifier);
}
}
@override
int $getRuntimeType(Runtime runtime) => runtime.lookupType($type.spec!);
@override
void $setProperty(Runtime runtime, String identifier, $Value value) {
switch (identifier) {
default:
_superclass.$setProperty(runtime, identifier, value);
}
}
@override
CheckBoxPreference? get checkBoxPreference => $value.checkBoxPreference;
@override
EditTextPreference? get editTextPreference => $value.editTextPreference;
@override
ListPreference? get listPreference => $value.listPreference;
@override
MultiSelectListPreference? get multiSelectListPreference =>
$value.multiSelectListPreference;
@override
SwitchPreferenceCompat? get switchPreferenceCompat =>
$value.switchPreferenceCompat;
@override
Id? get id => $value.id;
@override
String? get key => $value.key;
@override
int? get sourceId => $value.sourceId;
@override
set checkBoxPreference(CheckBoxPreference? checkBoxPreference) {}
@override
set editTextPreference(EditTextPreference? editTextPreference) {}
@override
set id(Id? id) {}
@override
set key(String? key) {}
@override
set listPreference(ListPreference? listPreference) {}
@override
set multiSelectListPreference(
MultiSelectListPreference? multiSelectListPreference) {}
@override
set sourceId(int? sourceId) {}
@override
set switchPreferenceCompat(SwitchPreferenceCompat? switchPreferenceCompat) {}
@override
Map<String, dynamic> toJson() {
throw UnimplementedError();
}
}
class $SwitchPreferenceCompat implements SourcePreference, $Instance {
$SwitchPreferenceCompat.wrap(this.$value) : _superclass = $Object($value);
static const $type = BridgeTypeRef(BridgeTypeSpec(
'package:mangayomi/bridge_lib.dart', 'SwitchPreferenceCompat'));
static const $declaration = BridgeClassDef(BridgeClassType($type),
constructors: {
'': BridgeConstructorDef(BridgeFunctionDef(
returns: BridgeTypeAnnotation($type),
params: [],
namedParams: [
BridgeParameter('key',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), false),
BridgeParameter('title',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), false),
BridgeParameter('summary',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), false),
BridgeParameter('value',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.bool)), false),
]))
},
fields: {
'key': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string))),
'title': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string))),
'summary': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string))),
'value':
BridgeFieldDef(BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.bool))),
},
wrap: true);
static $Value? $new(Runtime runtime, $Value? target, List<$Value?> args) {
return $SwitchPreferenceCompat.wrap(SourcePreference(
key: args[0]!.$value,
switchPreferenceCompat: SwitchPreferenceCompat(
title: args[1]!.$value,
summary: args[2]!.$value,
value: args[3]!.$value)));
}
@override
final SourcePreference $value;
@override
SourcePreference get $reified => $value;
final $Instance _superclass;
@override
$Value? $getProperty(Runtime runtime, String identifier) {
switch (identifier) {
case 'key':
return $String($value.key!);
case 'title':
return $String($value.checkBoxPreference!.title!);
case 'summary':
return $String($value.checkBoxPreference!.summary!);
case 'value':
return $bool($value.checkBoxPreference!.value!);
default:
return _superclass.$getProperty(runtime, identifier);
}
}
@override
int $getRuntimeType(Runtime runtime) => runtime.lookupType($type.spec!);
@override
void $setProperty(Runtime runtime, String identifier, $Value value) {
switch (identifier) {
default:
_superclass.$setProperty(runtime, identifier, value);
}
}
@override
CheckBoxPreference? get checkBoxPreference => $value.checkBoxPreference;
@override
EditTextPreference? get editTextPreference => $value.editTextPreference;
@override
ListPreference? get listPreference => $value.listPreference;
@override
MultiSelectListPreference? get multiSelectListPreference =>
$value.multiSelectListPreference;
@override
SwitchPreferenceCompat? get switchPreferenceCompat =>
$value.switchPreferenceCompat;
@override
Id? get id => $value.id;
@override
String? get key => $value.key;
@override
int? get sourceId => $value.sourceId;
@override
set checkBoxPreference(CheckBoxPreference? checkBoxPreference) {}
@override
set editTextPreference(EditTextPreference? editTextPreference) {}
@override
set id(Id? id) {}
@override
set key(String? key) {}
@override
set listPreference(ListPreference? listPreference) {}
@override
set multiSelectListPreference(
MultiSelectListPreference? multiSelectListPreference) {}
@override
set sourceId(int? sourceId) {}
@override
set switchPreferenceCompat(SwitchPreferenceCompat? switchPreferenceCompat) {}
@override
Map<String, dynamic> toJson() {
throw UnimplementedError();
}
}
class $ListPreference implements SourcePreference, $Instance {
$ListPreference.wrap(this.$value) : _superclass = $Object($value);
static const $type = BridgeTypeRef(
BridgeTypeSpec('package:mangayomi/bridge_lib.dart', 'ListPreference'));
static const $declaration = BridgeClassDef(BridgeClassType($type),
constructors: {
'': BridgeConstructorDef(BridgeFunctionDef(
returns: BridgeTypeAnnotation($type),
params: [],
namedParams: [
BridgeParameter('key',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), false),
BridgeParameter('title',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), false),
BridgeParameter('summary',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), false),
BridgeParameter('valueIndex',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.int)), false),
BridgeParameter(
'entries',
BridgeTypeAnnotation(BridgeTypeRef(
CoreTypes.list, [BridgeTypeRef(CoreTypes.string)])),
false),
BridgeParameter(
'entryValues',
BridgeTypeAnnotation(BridgeTypeRef(
CoreTypes.list, [BridgeTypeRef(CoreTypes.string)])),
false),
]))
},
fields: {
'key': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string))),
'title': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string))),
'summary': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string))),
'valueIndex':
BridgeFieldDef(BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.int))),
'entries': BridgeFieldDef(BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.list, [BridgeTypeRef(CoreTypes.string)]))),
'entryValues': BridgeFieldDef(BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.list, [BridgeTypeRef(CoreTypes.string)]))),
},
wrap: true);
static $Value? $new(Runtime runtime, $Value? target, List<$Value?> args) {
return $ListPreference.wrap(SourcePreference(
key: args[0]!.$value,
listPreference: ListPreference(
title: args[1]!.$value,
summary: args[2]!.$value,
valueIndex: args[3]!.$value,
entries: (args[4]!.$value as List)
.map((e) => (e is $Value ? e.$reified : e).toString())
.toList(),
entryValues: (args[5]!.$value as List)
.map((e) => (e is $Value ? e.$reified : e).toString())
.toList())));
}
@override
final SourcePreference $value;
@override
SourcePreference get $reified => $value;
final $Instance _superclass;
@override
$Value? $getProperty(Runtime runtime, String identifier) {
switch (identifier) {
case 'key':
return $String($value.key!);
case 'title':
return $String($value.listPreference!.title!);
case 'summary':
return $String($value.listPreference!.summary!);
case 'valueIndex':
return $int($value.listPreference!.valueIndex!);
case 'entries':
return $List.wrap($value.listPreference!.entries!);
case 'entryValues':
return $List.wrap($value.listPreference!.entryValues!);
default:
return _superclass.$getProperty(runtime, identifier);
}
}
@override
int $getRuntimeType(Runtime runtime) => runtime.lookupType($type.spec!);
@override
void $setProperty(Runtime runtime, String identifier, $Value value) {
switch (identifier) {
default:
_superclass.$setProperty(runtime, identifier, value);
}
}
@override
CheckBoxPreference? get checkBoxPreference => $value.checkBoxPreference;
@override
EditTextPreference? get editTextPreference => $value.editTextPreference;
@override
ListPreference? get listPreference => $value.listPreference;
@override
MultiSelectListPreference? get multiSelectListPreference =>
$value.multiSelectListPreference;
@override
SwitchPreferenceCompat? get switchPreferenceCompat =>
$value.switchPreferenceCompat;
@override
Id? get id => $value.id;
@override
String? get key => $value.key;
@override
int? get sourceId => $value.sourceId;
@override
set checkBoxPreference(CheckBoxPreference? checkBoxPreference) {}
@override
set editTextPreference(EditTextPreference? editTextPreference) {}
@override
set id(Id? id) {}
@override
set key(String? key) {}
@override
set listPreference(ListPreference? listPreference) {}
@override
set multiSelectListPreference(
MultiSelectListPreference? multiSelectListPreference) {}
@override
set sourceId(int? sourceId) {}
@override
set switchPreferenceCompat(SwitchPreferenceCompat? switchPreferenceCompat) {}
@override
Map<String, dynamic> toJson() {
throw UnimplementedError();
}
}
class $MultiSelectListPreference implements SourcePreference, $Instance {
$MultiSelectListPreference.wrap(this.$value) : _superclass = $Object($value);
static const $type = BridgeTypeRef(BridgeTypeSpec(
'package:mangayomi/bridge_lib.dart', 'MultiSelectListPreference'));
static const $declaration = BridgeClassDef(BridgeClassType($type),
constructors: {
'': BridgeConstructorDef(BridgeFunctionDef(
returns: BridgeTypeAnnotation($type),
params: [],
namedParams: [
BridgeParameter('key',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), false),
BridgeParameter('title',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), false),
BridgeParameter('summary',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), false),
BridgeParameter(
'entries',
BridgeTypeAnnotation(BridgeTypeRef(
CoreTypes.list, [BridgeTypeRef(CoreTypes.string)])),
false),
BridgeParameter(
'entryValues',
BridgeTypeAnnotation(BridgeTypeRef(
CoreTypes.list, [BridgeTypeRef(CoreTypes.string)])),
false),
BridgeParameter(
'values',
BridgeTypeAnnotation(BridgeTypeRef(
CoreTypes.list, [BridgeTypeRef(CoreTypes.string)])),
false),
]))
},
fields: {
'key': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string))),
'title': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string))),
'summary': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string))),
'entries': BridgeFieldDef(BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.list, [BridgeTypeRef(CoreTypes.string)]))),
'entryValues': BridgeFieldDef(BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.list, [BridgeTypeRef(CoreTypes.string)]))),
'values': BridgeFieldDef(BridgeTypeAnnotation(
BridgeTypeRef(CoreTypes.list, [BridgeTypeRef(CoreTypes.string)]))),
},
wrap: true);
static $Value? $new(Runtime runtime, $Value? target, List<$Value?> args) {
return $MultiSelectListPreference.wrap(SourcePreference(
key: args[0]!.$value,
multiSelectListPreference: MultiSelectListPreference(
title: args[1]!.$value,
summary: args[2]!.$value,
entries: (args[3]!.$value as List)
.map((e) => (e is $Value ? e.$reified : e).toString())
.toList(),
entryValues: (args[4]!.$value as List)
.map((e) => (e is $Value ? e.$reified : e).toString())
.toList(),
values: (args[5]!.$value as List)
.map((e) => (e is $Value ? e.$reified : e).toString())
.toList())));
}
@override
final SourcePreference $value;
@override
SourcePreference get $reified => $value;
final $Instance _superclass;
@override
$Value? $getProperty(Runtime runtime, String identifier) {
switch (identifier) {
case 'key':
return $String($value.key!);
case 'title':
return $String($value.multiSelectListPreference!.title!);
case 'summary':
return $String($value.multiSelectListPreference!.summary!);
case 'entries':
return $List.wrap($value.multiSelectListPreference!.entries!);
case 'entryValues':
return $List.wrap($value.multiSelectListPreference!.entryValues!);
case 'values':
return $List.wrap($value.multiSelectListPreference!.values!);
default:
return _superclass.$getProperty(runtime, identifier);
}
}
@override
int $getRuntimeType(Runtime runtime) => runtime.lookupType($type.spec!);
@override
void $setProperty(Runtime runtime, String identifier, $Value value) {
switch (identifier) {
default:
_superclass.$setProperty(runtime, identifier, value);
}
}
@override
CheckBoxPreference? get checkBoxPreference => $value.checkBoxPreference;
@override
EditTextPreference? get editTextPreference => $value.editTextPreference;
@override
ListPreference? get listPreference => $value.listPreference;
@override
MultiSelectListPreference? get multiSelectListPreference =>
$value.multiSelectListPreference;
@override
SwitchPreferenceCompat? get switchPreferenceCompat =>
$value.switchPreferenceCompat;
@override
Id? get id => $value.id;
@override
String? get key => $value.key;
@override
int? get sourceId => $value.sourceId;
@override
set checkBoxPreference(CheckBoxPreference? checkBoxPreference) {}
@override
set editTextPreference(EditTextPreference? editTextPreference) {}
@override
set id(Id? id) {}
@override
set key(String? key) {}
@override
set listPreference(ListPreference? listPreference) {}
@override
set multiSelectListPreference(
MultiSelectListPreference? multiSelectListPreference) {}
@override
set sourceId(int? sourceId) {}
@override
set switchPreferenceCompat(SwitchPreferenceCompat? switchPreferenceCompat) {}
@override
Map<String, dynamic> toJson() {
throw UnimplementedError();
}
}
class $EditTextPreference implements SourcePreference, $Instance {
$EditTextPreference.wrap(this.$value) : _superclass = $Object($value);
static const $type = BridgeTypeRef(BridgeTypeSpec(
'package:mangayomi/bridge_lib.dart', 'EditTextPreference'));
static const $declaration = BridgeClassDef(BridgeClassType($type),
constructors: {
'': BridgeConstructorDef(BridgeFunctionDef(
returns: BridgeTypeAnnotation($type),
params: [],
namedParams: [
BridgeParameter('key',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), false),
BridgeParameter('title',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), false),
BridgeParameter('summary',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), false),
BridgeParameter('value',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), false),
BridgeParameter('dialogTitle',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), false),
BridgeParameter('dialogMessage',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), false),
BridgeParameter('text',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), false),
]))
},
fields: {
'key': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string))),
'title': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string))),
'summary': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string))),
'value': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string))),
'dialogTitle': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string))),
'dialogMessage': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string))),
'text': BridgeFieldDef(
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string))),
},
wrap: true);
static $Value? $new(Runtime runtime, $Value? target, List<$Value?> args) {
return $EditTextPreference.wrap(SourcePreference(
key: args[0]!.$value,
editTextPreference: EditTextPreference(
title: args[1]!.$value,
summary: args[2]!.$value,
value: args[3]!.$value,
dialogTitle: args[4]!.$value,
dialogMessage: args[5]!.$value,
text: args[6]!.$value)));
}
@override
final SourcePreference $value;
@override
SourcePreference get $reified => $value;
final $Instance _superclass;
@override
$Value? $getProperty(Runtime runtime, String identifier) {
switch (identifier) {
case 'key':
return $String($value.key!);
case 'title':
return $String($value.editTextPreference!.title!);
case 'summary':
return $String($value.editTextPreference!.summary!);
case 'value':
return $String($value.editTextPreference!.value!);
case 'dialogTitle':
return $String($value.editTextPreference!.dialogTitle!);
case 'dialogMessage':
return $String($value.editTextPreference!.dialogMessage!);
case 'text':
return $String($value.editTextPreference!.text!);
default:
return _superclass.$getProperty(runtime, identifier);
}
}
@override
int $getRuntimeType(Runtime runtime) => runtime.lookupType($type.spec!);
@override
void $setProperty(Runtime runtime, String identifier, $Value value) {
switch (identifier) {
default:
_superclass.$setProperty(runtime, identifier, value);
}
}
@override
CheckBoxPreference? get checkBoxPreference => $value.checkBoxPreference;
@override
EditTextPreference? get editTextPreference => $value.editTextPreference;
@override
ListPreference? get listPreference => $value.listPreference;
@override
MultiSelectListPreference? get multiSelectListPreference =>
$value.multiSelectListPreference;
@override
SwitchPreferenceCompat? get switchPreferenceCompat =>
$value.switchPreferenceCompat;
@override
Id? get id => $value.id;
@override
String? get key => $value.key;
@override
int? get sourceId => $value.sourceId;
@override
set checkBoxPreference(CheckBoxPreference? checkBoxPreference) {}
@override
set editTextPreference(EditTextPreference? editTextPreference) {}
@override
set id(Id? id) {}
@override
set key(String? key) {}
@override
set listPreference(ListPreference? listPreference) {}
@override
set multiSelectListPreference(
MultiSelectListPreference? multiSelectListPreference) {}
@override
set sourceId(int? sourceId) {}
@override
set switchPreferenceCompat(SwitchPreferenceCompat? switchPreferenceCompat) {}
@override
Map<String, dynamic> toJson() {
throw UnimplementedError();
}
}

View file

@ -21,4 +21,6 @@ abstract class MProvider {
Future<List<Video>> getVideoList(MSource source, String url);
List<dynamic> getFilterList();
List<dynamic> getSourcePreferences();
}

View file

@ -0,0 +1,196 @@
import 'package:isar/isar.dart';
part 'source_preference.g.dart';
@collection
@Name("SourcePreferences")
class SourcePreference {
Id? id;
int? sourceId;
String? key;
CheckBoxPreference? checkBoxPreference;
SwitchPreferenceCompat? switchPreferenceCompat;
ListPreference? listPreference;
MultiSelectListPreference? multiSelectListPreference;
EditTextPreference? editTextPreference;
SourcePreference(
{this.id = Isar.autoIncrement,
this.sourceId,
this.key,
this.checkBoxPreference,
this.switchPreferenceCompat,
this.listPreference,
this.multiSelectListPreference,
this.editTextPreference});
Map<String, dynamic> toJson() => {
'id': id,
'sourceId': sourceId,
'key': key,
if (checkBoxPreference != null)
'checkBoxPreference': checkBoxPreference!.toJson(),
if (switchPreferenceCompat != null)
'switchPreferenceCompat': switchPreferenceCompat!.toJson(),
if (listPreference != null) 'listPreference': listPreference!.toJson(),
if (multiSelectListPreference != null)
'multiSelectListPreference': multiSelectListPreference!.toJson(),
if (editTextPreference != null)
'editTextPreference': editTextPreference!.toJson()
};
factory SourcePreference.fromJson(Map<String, dynamic> json) {
return SourcePreference(
id: json['id'],
sourceId: json['sourceId'],
key: json['key'],
checkBoxPreference: json['checkBoxPreference'] != null
? CheckBoxPreference.fromJson(json['checkBoxPreference'])
: null,
switchPreferenceCompat: json['switchPreferenceCompat'] != null
? SwitchPreferenceCompat.fromJson(json['switchPreferenceCompat'])
: null,
listPreference: json['listPreference'] != null
? ListPreference.fromJson(json['listPreference'])
: null,
multiSelectListPreference: json['multiSelectListPreference'] != null
? MultiSelectListPreference.fromJson(
json['multiSelectListPreference'])
: null,
editTextPreference: json['editTextPreference'] != null
? EditTextPreference.fromJson(json['editTextPreference'])
: null);
}
}
@embedded
class CheckBoxPreference {
String? title;
String? summary;
bool? value;
CheckBoxPreference({this.title, this.summary, this.value});
Map<String, dynamic> toJson() =>
{'title': title, 'summary': summary, 'value': value};
factory CheckBoxPreference.fromJson(Map<String, dynamic> json) {
return CheckBoxPreference(
title: json['title'], summary: json['summary'], value: json['value']);
}
}
@embedded
class SwitchPreferenceCompat {
String? title;
String? summary;
bool? value;
SwitchPreferenceCompat({this.title, this.summary, this.value});
Map<String, dynamic> toJson() =>
{'title': title, 'summary': summary, 'value': value};
factory SwitchPreferenceCompat.fromJson(Map<String, dynamic> json) {
return SwitchPreferenceCompat(
title: json['title'], summary: json['summary'], value: json['value']);
}
}
@embedded
class ListPreference {
String? title;
String? summary;
int? valueIndex;
List<String>? entries;
List<String>? entryValues;
ListPreference(
{this.title,
this.summary,
this.valueIndex,
this.entries,
this.entryValues});
Map<String, dynamic> toJson() => {
'title': title,
'summary': summary,
'valueIndex': valueIndex,
'entries': entries,
'entryValues': entryValues
};
factory ListPreference.fromJson(Map<String, dynamic> json) {
return ListPreference(
title: json['title'],
summary: json['summary'],
valueIndex: json['valueIndex'],
entries: json['entries']?.cast<String>(),
entryValues: json['entryValues']?.cast<String>());
}
}
@embedded
class MultiSelectListPreference {
String? title;
String? summary;
List<String>? entries;
List<String>? entryValues;
List<String>? values;
MultiSelectListPreference(
{this.title, this.summary, this.entries, this.entryValues, this.values});
Map<String, dynamic> toJson() => {
'title': title,
'summary': summary,
'entries': entries?.cast<String>(),
'entryValues': entryValues?.cast<String>(),
'values': values?.cast<String>()
};
factory MultiSelectListPreference.fromJson(Map<String, dynamic> json) {
return MultiSelectListPreference(
title: json['title'],
summary: json['summary'],
entries: json['entries'],
entryValues: json['entryValues'],
values: json['values']);
}
}
@embedded
class EditTextPreference {
String? title;
String? summary;
String? value;
String? dialogTitle;
String? dialogMessage;
String? text;
EditTextPreference(
{this.title,
this.summary,
this.value,
this.dialogTitle,
this.dialogMessage,
this.text});
Map<String, dynamic> toJson() => {
'title': title,
'summary': summary,
'value': value,
'dialogTitle': dialogTitle,
'dialogMessage': dialogMessage,
'text': text
};
factory EditTextPreference.fromJson(Map<String, dynamic> json) {
return EditTextPreference(
title: json['title'],
summary: json['summary'],
value: json['value'],
dialogTitle: json['dialogTitle'],
dialogMessage: json['dialogMessage'],
text: json['text']);
}
}

File diff suppressed because it is too large Load diff

View file

@ -9,6 +9,7 @@ import 'package:mangayomi/eval/bridge/m_manga.dart';
import 'package:mangayomi/eval/bridge/m_source.dart';
import 'package:mangayomi/eval/bridge/m_track.dart';
import 'package:mangayomi/eval/bridge/m_video.dart';
import 'package:mangayomi/eval/bridge/source_preference.dart';
class MEvalPlugin extends EvalPlugin {
@override
@ -36,6 +37,13 @@ class MEvalPlugin extends EvalPlugin {
registry.defineBridgeClass($CheckBoxFilter.$declaration);
registry.defineBridgeClass($SortState.$declaration);
registry.defineBridgeClass($SelectFilterOption.$declaration);
//SourcePreferences
registry.defineBridgeClass($CheckBoxPreference.$declaration);
registry.defineBridgeClass($SwitchPreferenceCompat.$declaration);
registry.defineBridgeClass($ListPreference.$declaration);
registry.defineBridgeClass($MultiSelectListPreference.$declaration);
registry.defineBridgeClass($CheckBoxPreference.$declaration);
registry.defineBridgeClass($EditTextPreference.$declaration);
}
@override
@ -80,5 +88,16 @@ class MEvalPlugin extends EvalPlugin {
'package:mangayomi/bridge_lib.dart', 'SortState.', $SortState.$new);
runtime.registerBridgeFunc('package:mangayomi/bridge_lib.dart',
'SelectFilterOption.', $SelectFilterOption.$new);
//Sources preferences
runtime.registerBridgeFunc('package:mangayomi/bridge_lib.dart',
'CheckBoxPreference.', $CheckBoxPreference.$new);
runtime.registerBridgeFunc('package:mangayomi/bridge_lib.dart',
'SwitchPreferenceCompat.', $SwitchPreferenceCompat.$new);
runtime.registerBridgeFunc('package:mangayomi/bridge_lib.dart',
'ListPreference.', $ListPreference.$new);
runtime.registerBridgeFunc('package:mangayomi/bridge_lib.dart',
'MultiSelectListPreference.', $MultiSelectListPreference.$new);
runtime.registerBridgeFunc('package:mangayomi/bridge_lib.dart',
'EditTextPreference.', $EditTextPreference.$new);
}
}

View file

@ -535,7 +535,7 @@ class ChapterPageurls {
ChapterPageurls({this.chapterId, this.urls});
ChapterPageurls.fromJson(Map<String, dynamic> json) {
chapterId = json['chapterId'];
urls = json['urls'].cast<String>();
urls = json['urls']?.cast<String>();
}
Map<String, dynamic> toJson() {
@ -638,7 +638,7 @@ class FilterScanlator {
FilterScanlator({this.mangaId, this.scanlators});
FilterScanlator.fromJson(Map<String, dynamic> json) {
mangaId = json['mangaId'];
scanlators = json['scanlators'].cast<String>();
scanlators = json['scanlators']?.cast<String>();
}
Map<String, dynamic> toJson() {

View file

@ -17,113 +17,118 @@ const SourceSchema = CollectionSchema(
name: r'Sources',
id: 897746782445124704,
properties: {
r'apiUrl': PropertySchema(
r'additionalParams': PropertySchema(
id: 0,
name: r'additionalParams',
type: IsarType.string,
),
r'apiUrl': PropertySchema(
id: 1,
name: r'apiUrl',
type: IsarType.string,
),
r'appMinVerReq': PropertySchema(
id: 1,
id: 2,
name: r'appMinVerReq',
type: IsarType.string,
),
r'baseUrl': PropertySchema(
id: 2,
id: 3,
name: r'baseUrl',
type: IsarType.string,
),
r'dateFormat': PropertySchema(
id: 3,
id: 4,
name: r'dateFormat',
type: IsarType.string,
),
r'dateFormatLocale': PropertySchema(
id: 4,
id: 5,
name: r'dateFormatLocale',
type: IsarType.string,
),
r'hasCloudflare': PropertySchema(
id: 5,
id: 6,
name: r'hasCloudflare',
type: IsarType.bool,
),
r'headers': PropertySchema(
id: 6,
id: 7,
name: r'headers',
type: IsarType.string,
),
r'iconUrl': PropertySchema(
id: 7,
id: 8,
name: r'iconUrl',
type: IsarType.string,
),
r'isActive': PropertySchema(
id: 8,
id: 9,
name: r'isActive',
type: IsarType.bool,
),
r'isAdded': PropertySchema(
id: 9,
id: 10,
name: r'isAdded',
type: IsarType.bool,
),
r'isFullData': PropertySchema(
id: 10,
id: 11,
name: r'isFullData',
type: IsarType.bool,
),
r'isManga': PropertySchema(
id: 11,
id: 12,
name: r'isManga',
type: IsarType.bool,
),
r'isNsfw': PropertySchema(
id: 12,
id: 13,
name: r'isNsfw',
type: IsarType.bool,
),
r'isPinned': PropertySchema(
id: 13,
id: 14,
name: r'isPinned',
type: IsarType.bool,
),
r'lang': PropertySchema(
id: 14,
id: 15,
name: r'lang',
type: IsarType.string,
),
r'lastUsed': PropertySchema(
id: 15,
id: 16,
name: r'lastUsed',
type: IsarType.bool,
),
r'name': PropertySchema(
id: 16,
id: 17,
name: r'name',
type: IsarType.string,
),
r'sourceCode': PropertySchema(
id: 17,
id: 18,
name: r'sourceCode',
type: IsarType.string,
),
r'sourceCodeUrl': PropertySchema(
id: 18,
id: 19,
name: r'sourceCodeUrl',
type: IsarType.string,
),
r'typeSource': PropertySchema(
id: 19,
id: 20,
name: r'typeSource',
type: IsarType.string,
),
r'version': PropertySchema(
id: 20,
id: 21,
name: r'version',
type: IsarType.string,
),
r'versionLast': PropertySchema(
id: 21,
id: 22,
name: r'versionLast',
type: IsarType.string,
)
@ -148,6 +153,12 @@ int _sourceEstimateSize(
Map<Type, List<int>> allOffsets,
) {
var bytesCount = offsets.last;
{
final value = object.additionalParams;
if (value != null) {
bytesCount += 3 + value.length * 3;
}
}
{
final value = object.apiUrl;
if (value != null) {
@ -241,28 +252,29 @@ void _sourceSerialize(
List<int> offsets,
Map<Type, List<int>> allOffsets,
) {
writer.writeString(offsets[0], object.apiUrl);
writer.writeString(offsets[1], object.appMinVerReq);
writer.writeString(offsets[2], object.baseUrl);
writer.writeString(offsets[3], object.dateFormat);
writer.writeString(offsets[4], object.dateFormatLocale);
writer.writeBool(offsets[5], object.hasCloudflare);
writer.writeString(offsets[6], object.headers);
writer.writeString(offsets[7], object.iconUrl);
writer.writeBool(offsets[8], object.isActive);
writer.writeBool(offsets[9], object.isAdded);
writer.writeBool(offsets[10], object.isFullData);
writer.writeBool(offsets[11], object.isManga);
writer.writeBool(offsets[12], object.isNsfw);
writer.writeBool(offsets[13], object.isPinned);
writer.writeString(offsets[14], object.lang);
writer.writeBool(offsets[15], object.lastUsed);
writer.writeString(offsets[16], object.name);
writer.writeString(offsets[17], object.sourceCode);
writer.writeString(offsets[18], object.sourceCodeUrl);
writer.writeString(offsets[19], object.typeSource);
writer.writeString(offsets[20], object.version);
writer.writeString(offsets[21], object.versionLast);
writer.writeString(offsets[0], object.additionalParams);
writer.writeString(offsets[1], object.apiUrl);
writer.writeString(offsets[2], object.appMinVerReq);
writer.writeString(offsets[3], object.baseUrl);
writer.writeString(offsets[4], object.dateFormat);
writer.writeString(offsets[5], object.dateFormatLocale);
writer.writeBool(offsets[6], object.hasCloudflare);
writer.writeString(offsets[7], object.headers);
writer.writeString(offsets[8], object.iconUrl);
writer.writeBool(offsets[9], object.isActive);
writer.writeBool(offsets[10], object.isAdded);
writer.writeBool(offsets[11], object.isFullData);
writer.writeBool(offsets[12], object.isManga);
writer.writeBool(offsets[13], object.isNsfw);
writer.writeBool(offsets[14], object.isPinned);
writer.writeString(offsets[15], object.lang);
writer.writeBool(offsets[16], object.lastUsed);
writer.writeString(offsets[17], object.name);
writer.writeString(offsets[18], object.sourceCode);
writer.writeString(offsets[19], object.sourceCodeUrl);
writer.writeString(offsets[20], object.typeSource);
writer.writeString(offsets[21], object.version);
writer.writeString(offsets[22], object.versionLast);
}
Source _sourceDeserialize(
@ -272,29 +284,30 @@ Source _sourceDeserialize(
Map<Type, List<int>> allOffsets,
) {
final object = Source(
apiUrl: reader.readStringOrNull(offsets[0]),
appMinVerReq: reader.readStringOrNull(offsets[1]),
baseUrl: reader.readStringOrNull(offsets[2]),
dateFormat: reader.readStringOrNull(offsets[3]),
dateFormatLocale: reader.readStringOrNull(offsets[4]),
hasCloudflare: reader.readBoolOrNull(offsets[5]),
headers: reader.readStringOrNull(offsets[6]),
iconUrl: reader.readStringOrNull(offsets[7]),
additionalParams: reader.readStringOrNull(offsets[0]),
apiUrl: reader.readStringOrNull(offsets[1]),
appMinVerReq: reader.readStringOrNull(offsets[2]),
baseUrl: reader.readStringOrNull(offsets[3]),
dateFormat: reader.readStringOrNull(offsets[4]),
dateFormatLocale: reader.readStringOrNull(offsets[5]),
hasCloudflare: reader.readBoolOrNull(offsets[6]),
headers: reader.readStringOrNull(offsets[7]),
iconUrl: reader.readStringOrNull(offsets[8]),
id: id,
isActive: reader.readBoolOrNull(offsets[8]),
isAdded: reader.readBoolOrNull(offsets[9]),
isFullData: reader.readBoolOrNull(offsets[10]),
isManga: reader.readBoolOrNull(offsets[11]),
isNsfw: reader.readBoolOrNull(offsets[12]),
isPinned: reader.readBoolOrNull(offsets[13]),
lang: reader.readStringOrNull(offsets[14]),
lastUsed: reader.readBoolOrNull(offsets[15]),
name: reader.readStringOrNull(offsets[16]),
sourceCode: reader.readStringOrNull(offsets[17]),
sourceCodeUrl: reader.readStringOrNull(offsets[18]),
typeSource: reader.readStringOrNull(offsets[19]),
version: reader.readStringOrNull(offsets[20]),
versionLast: reader.readStringOrNull(offsets[21]),
isActive: reader.readBoolOrNull(offsets[9]),
isAdded: reader.readBoolOrNull(offsets[10]),
isFullData: reader.readBoolOrNull(offsets[11]),
isManga: reader.readBoolOrNull(offsets[12]),
isNsfw: reader.readBoolOrNull(offsets[13]),
isPinned: reader.readBoolOrNull(offsets[14]),
lang: reader.readStringOrNull(offsets[15]),
lastUsed: reader.readBoolOrNull(offsets[16]),
name: reader.readStringOrNull(offsets[17]),
sourceCode: reader.readStringOrNull(offsets[18]),
sourceCodeUrl: reader.readStringOrNull(offsets[19]),
typeSource: reader.readStringOrNull(offsets[20]),
version: reader.readStringOrNull(offsets[21]),
versionLast: reader.readStringOrNull(offsets[22]),
);
return object;
}
@ -317,13 +330,13 @@ P _sourceDeserializeProp<P>(
case 4:
return (reader.readStringOrNull(offset)) as P;
case 5:
return (reader.readBoolOrNull(offset)) as P;
case 6:
return (reader.readStringOrNull(offset)) as P;
case 6:
return (reader.readBoolOrNull(offset)) as P;
case 7:
return (reader.readStringOrNull(offset)) as P;
case 8:
return (reader.readBoolOrNull(offset)) as P;
return (reader.readStringOrNull(offset)) as P;
case 9:
return (reader.readBoolOrNull(offset)) as P;
case 10:
@ -335,11 +348,11 @@ P _sourceDeserializeProp<P>(
case 13:
return (reader.readBoolOrNull(offset)) as P;
case 14:
return (reader.readStringOrNull(offset)) as P;
case 15:
return (reader.readBoolOrNull(offset)) as P;
case 16:
case 15:
return (reader.readStringOrNull(offset)) as P;
case 16:
return (reader.readBoolOrNull(offset)) as P;
case 17:
return (reader.readStringOrNull(offset)) as P;
case 18:
@ -350,6 +363,8 @@ P _sourceDeserializeProp<P>(
return (reader.readStringOrNull(offset)) as P;
case 21:
return (reader.readStringOrNull(offset)) as P;
case 22:
return (reader.readStringOrNull(offset)) as P;
default:
throw IsarError('Unknown property with id $propertyId');
}
@ -443,6 +458,157 @@ extension SourceQueryWhere on QueryBuilder<Source, Source, QWhereClause> {
}
extension SourceQueryFilter on QueryBuilder<Source, Source, QFilterCondition> {
QueryBuilder<Source, Source, QAfterFilterCondition> additionalParamsIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'additionalParams',
));
});
}
QueryBuilder<Source, Source, QAfterFilterCondition>
additionalParamsIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'additionalParams',
));
});
}
QueryBuilder<Source, Source, QAfterFilterCondition> additionalParamsEqualTo(
String? value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'additionalParams',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Source, Source, QAfterFilterCondition>
additionalParamsGreaterThan(
String? value, {
bool include = false,
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
include: include,
property: r'additionalParams',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Source, Source, QAfterFilterCondition> additionalParamsLessThan(
String? value, {
bool include = false,
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.lessThan(
include: include,
property: r'additionalParams',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Source, Source, QAfterFilterCondition> additionalParamsBetween(
String? lower,
String? upper, {
bool includeLower = true,
bool includeUpper = true,
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.between(
property: r'additionalParams',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Source, Source, QAfterFilterCondition>
additionalParamsStartsWith(
String value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.startsWith(
property: r'additionalParams',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Source, Source, QAfterFilterCondition> additionalParamsEndsWith(
String value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.endsWith(
property: r'additionalParams',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Source, Source, QAfterFilterCondition> additionalParamsContains(
String value,
{bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.contains(
property: r'additionalParams',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Source, Source, QAfterFilterCondition> additionalParamsMatches(
String pattern,
{bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.matches(
property: r'additionalParams',
wildcard: pattern,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Source, Source, QAfterFilterCondition>
additionalParamsIsEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'additionalParams',
value: '',
));
});
}
QueryBuilder<Source, Source, QAfterFilterCondition>
additionalParamsIsNotEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
property: r'additionalParams',
value: '',
));
});
}
QueryBuilder<Source, Source, QAfterFilterCondition> apiUrlIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
@ -2773,6 +2939,18 @@ extension SourceQueryObject on QueryBuilder<Source, Source, QFilterCondition> {}
extension SourceQueryLinks on QueryBuilder<Source, Source, QFilterCondition> {}
extension SourceQuerySortBy on QueryBuilder<Source, Source, QSortBy> {
QueryBuilder<Source, Source, QAfterSortBy> sortByAdditionalParams() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'additionalParams', Sort.asc);
});
}
QueryBuilder<Source, Source, QAfterSortBy> sortByAdditionalParamsDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'additionalParams', Sort.desc);
});
}
QueryBuilder<Source, Source, QAfterSortBy> sortByApiUrl() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'apiUrl', Sort.asc);
@ -3039,6 +3217,18 @@ extension SourceQuerySortBy on QueryBuilder<Source, Source, QSortBy> {
}
extension SourceQuerySortThenBy on QueryBuilder<Source, Source, QSortThenBy> {
QueryBuilder<Source, Source, QAfterSortBy> thenByAdditionalParams() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'additionalParams', Sort.asc);
});
}
QueryBuilder<Source, Source, QAfterSortBy> thenByAdditionalParamsDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'additionalParams', Sort.desc);
});
}
QueryBuilder<Source, Source, QAfterSortBy> thenByApiUrl() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'apiUrl', Sort.asc);
@ -3317,6 +3507,14 @@ extension SourceQuerySortThenBy on QueryBuilder<Source, Source, QSortThenBy> {
}
extension SourceQueryWhereDistinct on QueryBuilder<Source, Source, QDistinct> {
QueryBuilder<Source, Source, QDistinct> distinctByAdditionalParams(
{bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(r'additionalParams',
caseSensitive: caseSensitive);
});
}
QueryBuilder<Source, Source, QDistinct> distinctByApiUrl(
{bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
@ -3473,6 +3671,12 @@ extension SourceQueryProperty on QueryBuilder<Source, Source, QQueryProperty> {
});
}
QueryBuilder<Source, String?, QQueryOperations> additionalParamsProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'additionalParams');
});
}
QueryBuilder<Source, String?, QQueryOperations> apiUrlProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'apiUrl');

View file

@ -1,10 +1,13 @@
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:mangayomi/eval/model/source_preference.dart';
import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/modules/browse/extension/providers/extension_preferences_providers.dart';
import 'package:mangayomi/modules/browse/extension/widgets/source_preference_widget.dart';
import 'package:mangayomi/providers/l10n_providers.dart';
import 'package:mangayomi/services/get_source_preference.dart';
import 'package:mangayomi/utils/colors.dart';
import 'package:mangayomi/utils/language.dart';
import 'package:mangayomi/utils/media_query.dart';
@ -19,6 +22,11 @@ class ExtensionDetail extends ConsumerStatefulWidget {
class _ExtensionDetailState extends ConsumerState<ExtensionDetail> {
late Source source = widget.source;
late List<SourcePreference> sourcePreference =
getSourcePreference(source: source)
.map((e) => getSourcePreferenceEntry(e.key!, source.id!))
.toList();
@override
Widget build(BuildContext context) {
final l10n = l10nLocalizations(context)!;
@ -178,85 +186,8 @@ class _ExtensionDetailState extends ConsumerState<ExtensionDetail> {
)),
),
),
ref.watch(getMirrorPrefProvider(widget.source.sourceCode!)).when(
data: (data) => data != null
? ListTile(
onTap: () {
showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: Text(
l10n.preferred_domain,
),
content: SizedBox(
width: mediaWidth(context, 0.8),
child: ListView.builder(
shrinkWrap: true,
itemCount: data.entries.length,
itemBuilder: (context, index) {
return RadioListTile(
dense: true,
contentPadding:
const EdgeInsets.all(0),
value: data.entries
.toList()[index]
.value,
groupValue: widget.source.baseUrl!,
onChanged: (value) {
isar.writeTxnSync(() => isar
.sources
.putSync(widget.source
..baseUrl = data.entries
.toList()[index]
.value));
setState(() {
source = isar.sources
.getSync(source.id!)!;
});
Navigator.pop(context);
},
title: Row(
children: [
Text(data.entries
.toList()[index]
.key)
],
),
);
},
)),
actions: [
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
TextButton(
onPressed: () async {
Navigator.pop(context);
},
child: Text(
l10n.cancel,
style: TextStyle(
color: primaryColor(context)),
)),
],
)
],
);
});
},
title: Text(l10n.preferred_domain),
subtitle: Text(
widget.source.baseUrl!,
style: TextStyle(
fontSize: 11, color: secondaryColor(context)),
),
)
: Container(),
error: (error, stackTrace) => Text(error.toString()),
loading: () => Container(),
)
SourcePreferenceWidget(
sourcePreference: sourcePreference, source: source)
],
),
);

View file

@ -7,6 +7,7 @@ import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/modules/browse/extension/providers/fetch_anime_sources.dart';
import 'package:mangayomi/modules/browse/extension/providers/fetch_manga_sources.dart';
import 'package:mangayomi/providers/l10n_providers.dart';
import 'package:mangayomi/sources/source_test.dart';
import 'package:mangayomi/utils/language.dart';
import 'package:mangayomi/modules/browse/extension/widgets/extension_list_tile_widget.dart';
import 'package:mangayomi/modules/more/settings/browse/providers/browse_state_provider.dart';
@ -78,6 +79,10 @@ class ExtensionScreen extends ConsumerWidget {
return SingleChildScrollView(
child: Column(
children: [
if (useTestSourceCode)
ExtensionListTileWidget(
source: testSourceModel,
isTestSource: useTestSourceCode),
GroupedListView<Source, String>(
elements: entries,
groupBy: (element) => "",

View file

@ -1,26 +1,54 @@
import 'package:dart_eval/stdlib/core.dart';
import 'package:mangayomi/eval/compiler/compiler.dart';
import 'package:mangayomi/eval/runtime/runtime.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'extension_preferences_providers.g.dart';
import 'package:isar/isar.dart';
import 'package:mangayomi/eval/model/source_preference.dart';
import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/services/get_source_preference.dart';
import 'package:mangayomi/sources/source_test.dart';
@riverpod
Future<Map<String, String>?> getMirrorPref(
GetMirrorPrefRef ref, String codeSource) async {
try {
final bytecode = compilerEval(codeSource);
final runtime = runtimeEval(bytecode);
var res = await runtime.executeLib(
'package:mangayomi/main.dart',
'getMirrorPref',
);
Map<String, String> headers = {};
if (res is $Map) {
headers = res.$reified
.map((key, value) => MapEntry(key.toString(), value.toString()));
void setPreferenceSetting(SourcePreference sourcePreference, Source source) {
final sourcePref = isar.sourcePreferences
.filter()
.sourceIdEqualTo(source.id)
.keyEqualTo(sourcePreference.key)
.findFirstSync();
isar.writeTxnSync(() {
if (sourcePref != null) {
isar.sourcePreferences.putSync(sourcePreference);
} else {
isar.sourcePreferences.putSync(sourcePreference..sourceId = source.id);
}
return headers;
} catch (_) {
return null;
}
});
}
getPreferenceValue(String key, int sourceId) {
final sourcePreference = getSourcePreferenceEntry(key, sourceId);
if (sourcePreference.listPreference != null) {
final pref = sourcePreference.listPreference!;
return pref.entryValues![pref.valueIndex!];
} else if (sourcePreference.checkBoxPreference != null) {
return sourcePreference.checkBoxPreference!.value;
} else if (sourcePreference.switchPreferenceCompat != null) {
return sourcePreference.switchPreferenceCompat!.value;
} else if (sourcePreference.editTextPreference != null) {
return sourcePreference.editTextPreference!.value;
}
return sourcePreference.multiSelectListPreference!.values;
}
SourcePreference getSourcePreferenceEntry(String key, int sourceId) {
SourcePreference? sourcePreference = isar.sourcePreferences
.filter()
.sourceIdEqualTo(sourceId)
.keyEqualTo(key)
.findFirstSync();
final source =
useTestSourceCode ? testSourceModel : isar.sources.getSync(sourceId)!;
if (sourcePreference == null) {
sourcePreference = getSourcePreference(source: source)
.firstWhere((element) => element.key == key, orElse: () => throw ());
setPreferenceSetting(sourcePreference, source);
}
return sourcePreference;
}

View file

@ -1,160 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'extension_preferences_providers.dart';
// **************************************************************************
// RiverpodGenerator
// **************************************************************************
String _$getMirrorPrefHash() => r'9b39c2c0e06ce4efda23dfd078d4ff96c1441f53';
/// 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));
}
}
/// See also [getMirrorPref].
@ProviderFor(getMirrorPref)
const getMirrorPrefProvider = GetMirrorPrefFamily();
/// See also [getMirrorPref].
class GetMirrorPrefFamily extends Family<AsyncValue<Map<String, String>?>> {
/// See also [getMirrorPref].
const GetMirrorPrefFamily();
/// See also [getMirrorPref].
GetMirrorPrefProvider call(
String codeSource,
) {
return GetMirrorPrefProvider(
codeSource,
);
}
@override
GetMirrorPrefProvider getProviderOverride(
covariant GetMirrorPrefProvider provider,
) {
return call(
provider.codeSource,
);
}
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'getMirrorPrefProvider';
}
/// See also [getMirrorPref].
class GetMirrorPrefProvider
extends AutoDisposeFutureProvider<Map<String, String>?> {
/// See also [getMirrorPref].
GetMirrorPrefProvider(
String codeSource,
) : this._internal(
(ref) => getMirrorPref(
ref as GetMirrorPrefRef,
codeSource,
),
from: getMirrorPrefProvider,
name: r'getMirrorPrefProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$getMirrorPrefHash,
dependencies: GetMirrorPrefFamily._dependencies,
allTransitiveDependencies:
GetMirrorPrefFamily._allTransitiveDependencies,
codeSource: codeSource,
);
GetMirrorPrefProvider._internal(
super._createNotifier, {
required super.name,
required super.dependencies,
required super.allTransitiveDependencies,
required super.debugGetCreateSourceHash,
required super.from,
required this.codeSource,
}) : super.internal();
final String codeSource;
@override
Override overrideWith(
FutureOr<Map<String, String>?> Function(GetMirrorPrefRef provider) create,
) {
return ProviderOverride(
origin: this,
override: GetMirrorPrefProvider._internal(
(ref) => create(ref as GetMirrorPrefRef),
from: from,
name: null,
dependencies: null,
allTransitiveDependencies: null,
debugGetCreateSourceHash: null,
codeSource: codeSource,
),
);
}
@override
AutoDisposeFutureProviderElement<Map<String, String>?> createElement() {
return _GetMirrorPrefProviderElement(this);
}
@override
bool operator ==(Object other) {
return other is GetMirrorPrefProvider && other.codeSource == codeSource;
}
@override
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, codeSource.hashCode);
return _SystemHash.finish(hash);
}
}
mixin GetMirrorPrefRef on AutoDisposeFutureProviderRef<Map<String, String>?> {
/// The parameter `codeSource` of this provider.
String get codeSource;
}
class _GetMirrorPrefProviderElement
extends AutoDisposeFutureProviderElement<Map<String, String>?>
with GetMirrorPrefRef {
_GetMirrorPrefProviderElement(super.provider);
@override
String get codeSource => (origin as GetMirrorPrefProvider).codeSource;
}
// ignore_for_file: type=lint
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member

View file

@ -11,8 +11,12 @@ import 'package:mangayomi/utils/language.dart';
class ExtensionListTileWidget extends ConsumerStatefulWidget {
final Source source;
final bool installed;
final bool isTestSource;
const ExtensionListTileWidget(
{super.key, required this.source, this.installed = false});
{super.key,
required this.source,
this.installed = false,
this.isTestSource = false});
@override
ConsumerState<ExtensionListTileWidget> createState() =>
@ -27,8 +31,10 @@ class _ExtensionListTileWidgetState
BuildContext context,
) {
final l10n = l10nLocalizations(context)!;
final updateAivalable =
compareVersions(widget.source.version!, widget.source.versionLast!) < 0;
final updateAivalable = widget.isTestSource
? false
: compareVersions(widget.source.version!, widget.source.versionLast!) <
0;
final sourceNotEmpty = widget.source.sourceCode != null &&
widget.source.sourceCode!.isNotEmpty;
@ -82,16 +88,13 @@ class _ExtensionListTileWidgetState
subtitle: Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Text(
completeLanguageName(widget.source.lang!.toLowerCase()),
style: const TextStyle(fontWeight: FontWeight.w300, fontSize: 12),
),
Text(completeLanguageName(widget.source.lang!.toLowerCase()),
style:
const TextStyle(fontWeight: FontWeight.w300, fontSize: 12)),
Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
const SizedBox(
width: 4,
),
const SizedBox(width: 4),
Text(widget.source.version!,
style: const TextStyle(
fontWeight: FontWeight.w300, fontSize: 10)),

View file

@ -0,0 +1,294 @@
import 'package:flutter/material.dart';
import 'package:mangayomi/eval/model/source_preference.dart';
import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/modules/browse/extension/providers/extension_preferences_providers.dart';
import 'package:mangayomi/modules/manga/detail/widgets/chapter_filter_list_tile_widget.dart';
import 'package:mangayomi/providers/l10n_providers.dart';
import 'package:mangayomi/utils/colors.dart';
import 'package:mangayomi/utils/media_query.dart';
class SourcePreferenceWidget extends StatefulWidget {
final List<SourcePreference> sourcePreference;
final Source source;
const SourcePreferenceWidget(
{super.key, required this.sourcePreference, required this.source});
@override
State<SourcePreferenceWidget> createState() => _SourcePreferenceWidgetState();
}
class _SourcePreferenceWidgetState extends State<SourcePreferenceWidget> {
@override
Widget build(BuildContext context) {
return ListView.builder(
shrinkWrap: true,
itemCount: widget.sourcePreference.length,
itemBuilder: (context, index) {
final preference = widget.sourcePreference[index];
Widget? w;
if (preference.editTextPreference != null) {
final pref = preference.editTextPreference!;
w = ListTile(
title: Text(pref.title!),
subtitle: Text(pref.summary!,
style:
TextStyle(fontSize: 11, color: secondaryColor(context))),
onTap: () {
showDialog(
context: context,
builder: (context) => EditTextDialogWidget(
text: pref.value!,
onChanged: (value) {
setState(() {
pref.value = value;
});
setPreferenceSetting(preference, widget.source);
},
dialogTitle: pref.dialogTitle!,
dialogMessage: pref.dialogMessage!));
},
);
} else if (preference.checkBoxPreference != null) {
final pref = preference.checkBoxPreference!;
w = CheckboxListTile(
title: Text(pref.title!),
subtitle: Text(pref.summary!,
style:
TextStyle(fontSize: 11, color: secondaryColor(context))),
value: pref.value,
onChanged: (value) {
setState(() {
pref.value = value;
});
setPreferenceSetting(preference, widget.source);
},
controlAffinity: ListTileControlAffinity.trailing,
);
} else if (preference.switchPreferenceCompat != null) {
final pref = preference.switchPreferenceCompat!;
w = SwitchListTile(
title: Text(pref.title!),
subtitle: Text(pref.summary!,
style:
TextStyle(fontSize: 11, color: secondaryColor(context))),
value: pref.value!,
onChanged: (value) {
setState(() {
pref.value = value;
});
setPreferenceSetting(preference, widget.source);
},
controlAffinity: ListTileControlAffinity.trailing,
);
} else if (preference.listPreference != null) {
final pref = preference.listPreference!;
w = ListTile(
title: Text(pref.title!),
subtitle: Text(pref.entries![pref.valueIndex!],
style: TextStyle(
fontSize: 11, color: secondaryColor(context))),
onTap: () async {
final res = await showDialog(
context: context,
builder: (context) => AlertDialog(
title: Text(pref.title!),
content: SizedBox(
width: mediaWidth(context, 0.8),
child: ListView.builder(
shrinkWrap: true,
itemCount: pref.entries!.length,
itemBuilder: (context, index) {
return RadioListTile(
dense: true,
contentPadding: const EdgeInsets.all(0),
value: index,
groupValue: pref.valueIndex,
onChanged: (value) {
Navigator.pop(context, index);
},
title: Row(
children: [Text(pref.entries![index])],
),
);
},
)),
actions: [
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
TextButton(
onPressed: () async {
Navigator.pop(context);
},
child: Text(
context.l10n.cancel,
style:
TextStyle(color: primaryColor(context)),
)),
],
)
],
),
);
if (res != null) {
setState(() {
pref.valueIndex = res;
});
}
setPreferenceSetting(preference, widget.source);
});
} else if (preference.multiSelectListPreference != null) {
final pref = preference.multiSelectListPreference!;
w = ListTile(
title: Text(pref.title!),
subtitle: Text(pref.summary!,
style: TextStyle(
fontSize: 11, color: secondaryColor(context))),
onTap: () {
List<String> indexList = [];
indexList.addAll(pref.values!);
showDialog(
context: context,
builder: (context) {
return StatefulBuilder(
builder: (context, setState) {
return AlertDialog(
title: Text(pref.title!),
content: SizedBox(
width: mediaWidth(context, 0.8),
child: ListView.builder(
shrinkWrap: true,
itemCount: pref.entries!.length,
itemBuilder: (context, index) {
return ListTileChapterFilter(
label: pref.entries![index],
type: indexList.contains(
pref.entryValues![index])
? 1
: 0,
onTap: () {
if (indexList.contains(
pref.entryValues![index])) {
setState(() {
indexList.remove(
pref.entryValues![index]);
pref.values = indexList;
});
} else {
setState(() {
indexList.add(
pref.entryValues![index]);
pref.values = indexList;
});
}
setPreferenceSetting(
preference, widget.source);
});
},
)),
actions: [
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
TextButton(
onPressed: () async {
Navigator.pop(context);
},
child: Text(
context.l10n.cancel,
style: TextStyle(
color: primaryColor(context)),
)),
TextButton(
onPressed: () async {
Navigator.pop(context);
},
child: Text(
context.l10n.ok,
style: TextStyle(
color: primaryColor(context)),
)),
],
)
],
);
},
);
});
});
}
return w ?? Container();
});
}
}
class EditTextDialogWidget extends StatefulWidget {
final String text;
final String dialogTitle;
final String dialogMessage;
final Function(String) onChanged;
const EditTextDialogWidget(
{super.key,
required this.text,
required this.onChanged,
required this.dialogTitle,
required this.dialogMessage});
@override
State<EditTextDialogWidget> createState() => _EditTextDialogWidgetState();
}
class _EditTextDialogWidgetState extends State<EditTextDialogWidget> {
late final _controller = TextEditingController(text: widget.text);
@override
Widget build(BuildContext context) {
return AlertDialog(
title: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(widget.dialogTitle),
Text(widget.dialogMessage, style: const TextStyle(fontSize: 13))
],
),
content: Padding(
padding: const EdgeInsets.only(top: 20),
child: Padding(
padding: const EdgeInsets.all(8.0),
child: TextField(
controller: _controller,
decoration: InputDecoration(
isDense: true,
filled: false,
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(color: secondaryColor(context)),
),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: primaryColor(context)),
),
border: const OutlineInputBorder(borderSide: BorderSide()),
),
))),
actions: [
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
TextButton(
onPressed: () {
Navigator.pop(context);
},
child: Text(context.l10n.cancel)),
const SizedBox(
width: 15,
),
TextButton(
onPressed: () {
widget.onChanged(_controller.text);
Navigator.pop(context);
},
child: Text(context.l10n.ok)),
],
)
],
);
}
}

View file

@ -6,7 +6,7 @@ part of 'migration.dart';
// RiverpodGenerator
// **************************************************************************
String _$migrationHash() => r'6e66a54603736b638f834ffa9e2dbe03ec3f494e';
String _$migrationHash() => r'6b3ff1b28168381079986d619b30c31ce44f341f';
/// See also [migration].
@ProviderFor(migration)

View file

@ -8,6 +8,7 @@ import 'package:mangayomi/modules/manga/detail/providers/update_manga_detail_pro
import 'package:mangayomi/modules/manga/detail/providers/isar_providers.dart';
import 'package:mangayomi/modules/widgets/error_text.dart';
import 'package:mangayomi/modules/widgets/progress_center.dart';
import 'package:mangayomi/sources/source_test.dart';
class MangaReaderDetail extends ConsumerStatefulWidget {
final int mangaId;
@ -61,7 +62,7 @@ class _MangaReaderDetailState extends ConsumerState<MangaReaderDetail> {
final sourceExist = snapshot.hasData && snapshot.data!.isNotEmpty;
return RefreshIndicator(
onRefresh: () async {
if (sourceExist) {
if (sourceExist || useTestSourceCode) {
await ref.read(updateMangaDetailProvider(
mangaId: manga.id, isInit: false)
.future);

View file

@ -6,7 +6,7 @@ part of 'track_state_providers.dart';
// RiverpodGenerator
// **************************************************************************
String _$trackStateHash() => r'dfaf828ad521255297e685ae780e53359abccc90';
String _$trackStateHash() => r'8b3b72900d3f0c39834cabd942200814099b4106';
/// Copied from Dart SDK
class _SystemHash {

View file

@ -4,6 +4,7 @@ import 'package:isar/isar.dart';
import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/chapter.dart';
import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/sources/source_test.dart';
pushMangaReaderView({
required BuildContext context,
@ -22,7 +23,9 @@ pushMangaReaderView({
.isAddedEqualTo(true)
.findAllSync()
.isNotEmpty;
if (sourceExist || chapter.manga.value!.isLocalArchive!) {
if (sourceExist ||
useTestSourceCode ||
chapter.manga.value!.isLocalArchive!) {
if (chapter.manga.value!.isManga!) {
context.push('/mangareaderview', extra: chapter);
} else {

View file

@ -6,7 +6,7 @@ part of 'track_providers.dart';
// RiverpodGenerator
// **************************************************************************
String _$tracksHash() => r'65e6092128a8d24edcecb215287d4a774df1b180';
String _$tracksHash() => r'8fbe5a46115adda0135e97386f4de57f22dc4149';
/// Copied from Dart SDK
class _SystemHash {

View file

@ -1,6 +1,7 @@
// ignore_for_file: depend_on_referenced_packages
import 'dart:io';
import 'package:isar/isar.dart';
import 'package:mangayomi/eval/model/source_preference.dart';
import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/category.dart';
import 'package:mangayomi/models/chapter.dart';
@ -107,7 +108,8 @@ class StorageProvider {
SourceSchema,
SettingsSchema,
TrackPreferenceSchema,
TrackSchema
TrackSchema,
SourcePreferenceSchema
], directory: dir!.path, name: "mangayomiDb", inspector: inspector!);
if (isar.settings.filter().idEqualTo(227).isEmptySync()) {

View file

@ -6,7 +6,7 @@ part of 'router.dart';
// RiverpodGenerator
// **************************************************************************
String _$routerHash() => r'd78592aa99912031c9bd923477bf65e394626d01';
String _$routerHash() => r'50d606dbd2d70fb41bf26613e12475e787990319';
/// See also [router].
@ProviderFor(router)

View file

@ -0,0 +1,26 @@
import 'package:dart_eval/dart_eval_bridge.dart';
import 'package:mangayomi/eval/compiler/compiler.dart';
import 'package:mangayomi/eval/model/m_provider.dart';
import 'package:mangayomi/eval/model/source_preference.dart';
import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/eval/runtime/runtime.dart';
List<SourcePreference> getSourcePreference({required Source source}) {
List<SourcePreference> sourcePreference = [];
try {
final bytecode = compilerEval(source.sourceCode!);
final runtime = runtimeEval(bytecode);
var res = runtime.executeLib('package:mangayomi/main.dart', 'main');
sourcePreference = (res as MProvider)
.getSourcePreferences()
.map((e) => (e is $Value ? e.$reified : e) as SourcePreference)
.toList();
} catch (_) {
return [];
}
return sourcePreference;
}