diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index d2acdada..87a19002 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -477,5 +477,14 @@ "mpv_redownload": "Redownload mpv config files", "mpv_redownload_info": "Replaces old config files with new one!", "mpv_download": "MPV config files are required!\nDownload now?", + "custom_buttons": "Custom buttons", + "custom_buttons_info": "Execute Javascript code with custom buttons", + "custom_buttons_edit": "Edit custom buttons", + "custom_buttons_add": "Add custom button", + "custom_buttons_edit": "Add custom button", + "custom_buttons_text": "Button text", + "custom_buttons_js_code": "Javascript code", + "custom_buttons_js_code_long": "Javascript code (on long press)", + "custom_buttons_startup": "On startup", "n_days": "{n} days" } diff --git a/lib/l10n/generated/app_localizations.dart b/lib/l10n/generated/app_localizations.dart index b2162604..0fc30cbd 100644 --- a/lib/l10n/generated/app_localizations.dart +++ b/lib/l10n/generated/app_localizations.dart @@ -2933,6 +2933,54 @@ abstract class AppLocalizations { /// **'MPV config files are required!\nDownload now?'** String get mpv_download; + /// No description provided for @custom_buttons. + /// + /// In en, this message translates to: + /// **'Custom buttons'** + String get custom_buttons; + + /// No description provided for @custom_buttons_info. + /// + /// In en, this message translates to: + /// **'Execute Javascript code with custom buttons'** + String get custom_buttons_info; + + /// No description provided for @custom_buttons_edit. + /// + /// In en, this message translates to: + /// **'Add custom button'** + String get custom_buttons_edit; + + /// No description provided for @custom_buttons_add. + /// + /// In en, this message translates to: + /// **'Add custom button'** + String get custom_buttons_add; + + /// No description provided for @custom_buttons_text. + /// + /// In en, this message translates to: + /// **'Button text'** + String get custom_buttons_text; + + /// No description provided for @custom_buttons_js_code. + /// + /// In en, this message translates to: + /// **'Javascript code'** + String get custom_buttons_js_code; + + /// No description provided for @custom_buttons_js_code_long. + /// + /// In en, this message translates to: + /// **'Javascript code (on long press)'** + String get custom_buttons_js_code_long; + + /// No description provided for @custom_buttons_startup. + /// + /// In en, this message translates to: + /// **'On startup'** + String get custom_buttons_startup; + /// No description provided for @n_days. /// /// In en, this message translates to: diff --git a/lib/l10n/generated/app_localizations_ar.dart b/lib/l10n/generated/app_localizations_ar.dart index 28277592..0ee8e394 100644 --- a/lib/l10n/generated/app_localizations_ar.dart +++ b/lib/l10n/generated/app_localizations_ar.dart @@ -1510,6 +1510,31 @@ class AppLocalizationsAr extends AppLocalizations { @override String get mpv_download => 'MPV config files are required!\nDownload now?'; + @override + String get custom_buttons => 'Custom buttons'; + + @override + String get custom_buttons_info => + 'Execute Javascript code with custom buttons'; + + @override + String get custom_buttons_edit => 'Add custom button'; + + @override + String get custom_buttons_add => 'Add custom button'; + + @override + String get custom_buttons_text => 'Button text'; + + @override + String get custom_buttons_js_code => 'Javascript code'; + + @override + String get custom_buttons_js_code_long => 'Javascript code (on long press)'; + + @override + String get custom_buttons_startup => 'On startup'; + @override String n_days(Object n) { return '$n days'; diff --git a/lib/l10n/generated/app_localizations_de.dart b/lib/l10n/generated/app_localizations_de.dart index 8e7161a9..ca9fbf35 100644 --- a/lib/l10n/generated/app_localizations_de.dart +++ b/lib/l10n/generated/app_localizations_de.dart @@ -1523,6 +1523,31 @@ class AppLocalizationsDe extends AppLocalizations { @override String get mpv_download => 'MPV config files are required!\nDownload now?'; + @override + String get custom_buttons => 'Custom buttons'; + + @override + String get custom_buttons_info => + 'Execute Javascript code with custom buttons'; + + @override + String get custom_buttons_edit => 'Add custom button'; + + @override + String get custom_buttons_add => 'Add custom button'; + + @override + String get custom_buttons_text => 'Button text'; + + @override + String get custom_buttons_js_code => 'Javascript code'; + + @override + String get custom_buttons_js_code_long => 'Javascript code (on long press)'; + + @override + String get custom_buttons_startup => 'On startup'; + @override String n_days(Object n) { return '$n days'; diff --git a/lib/l10n/generated/app_localizations_en.dart b/lib/l10n/generated/app_localizations_en.dart index f366078e..49995069 100644 --- a/lib/l10n/generated/app_localizations_en.dart +++ b/lib/l10n/generated/app_localizations_en.dart @@ -1511,6 +1511,31 @@ class AppLocalizationsEn extends AppLocalizations { @override String get mpv_download => 'MPV config files are required!\nDownload now?'; + @override + String get custom_buttons => 'Custom buttons'; + + @override + String get custom_buttons_info => + 'Execute Javascript code with custom buttons'; + + @override + String get custom_buttons_edit => 'Add custom button'; + + @override + String get custom_buttons_add => 'Add custom button'; + + @override + String get custom_buttons_text => 'Button text'; + + @override + String get custom_buttons_js_code => 'Javascript code'; + + @override + String get custom_buttons_js_code_long => 'Javascript code (on long press)'; + + @override + String get custom_buttons_startup => 'On startup'; + @override String n_days(Object n) { return '$n days'; diff --git a/lib/l10n/generated/app_localizations_es.dart b/lib/l10n/generated/app_localizations_es.dart index f789df01..d01ce663 100644 --- a/lib/l10n/generated/app_localizations_es.dart +++ b/lib/l10n/generated/app_localizations_es.dart @@ -1528,6 +1528,31 @@ class AppLocalizationsEs extends AppLocalizations { @override String get mpv_download => 'MPV config files are required!\nDownload now?'; + @override + String get custom_buttons => 'Custom buttons'; + + @override + String get custom_buttons_info => + 'Execute Javascript code with custom buttons'; + + @override + String get custom_buttons_edit => 'Add custom button'; + + @override + String get custom_buttons_add => 'Add custom button'; + + @override + String get custom_buttons_text => 'Button text'; + + @override + String get custom_buttons_js_code => 'Javascript code'; + + @override + String get custom_buttons_js_code_long => 'Javascript code (on long press)'; + + @override + String get custom_buttons_startup => 'On startup'; + @override String n_days(Object n) { return '$n days'; diff --git a/lib/l10n/generated/app_localizations_fr.dart b/lib/l10n/generated/app_localizations_fr.dart index 49621f8c..f86ffbaf 100644 --- a/lib/l10n/generated/app_localizations_fr.dart +++ b/lib/l10n/generated/app_localizations_fr.dart @@ -1529,6 +1529,31 @@ class AppLocalizationsFr extends AppLocalizations { @override String get mpv_download => 'MPV config files are required!\nDownload now?'; + @override + String get custom_buttons => 'Custom buttons'; + + @override + String get custom_buttons_info => + 'Execute Javascript code with custom buttons'; + + @override + String get custom_buttons_edit => 'Add custom button'; + + @override + String get custom_buttons_add => 'Add custom button'; + + @override + String get custom_buttons_text => 'Button text'; + + @override + String get custom_buttons_js_code => 'Javascript code'; + + @override + String get custom_buttons_js_code_long => 'Javascript code (on long press)'; + + @override + String get custom_buttons_startup => 'On startup'; + @override String n_days(Object n) { return '$n days'; diff --git a/lib/l10n/generated/app_localizations_id.dart b/lib/l10n/generated/app_localizations_id.dart index f568f382..9f0a2b3b 100644 --- a/lib/l10n/generated/app_localizations_id.dart +++ b/lib/l10n/generated/app_localizations_id.dart @@ -1517,6 +1517,31 @@ class AppLocalizationsId extends AppLocalizations { @override String get mpv_download => 'MPV config files are required!\nDownload now?'; + @override + String get custom_buttons => 'Custom buttons'; + + @override + String get custom_buttons_info => + 'Execute Javascript code with custom buttons'; + + @override + String get custom_buttons_edit => 'Add custom button'; + + @override + String get custom_buttons_add => 'Add custom button'; + + @override + String get custom_buttons_text => 'Button text'; + + @override + String get custom_buttons_js_code => 'Javascript code'; + + @override + String get custom_buttons_js_code_long => 'Javascript code (on long press)'; + + @override + String get custom_buttons_startup => 'On startup'; + @override String n_days(Object n) { return '$n days'; diff --git a/lib/l10n/generated/app_localizations_it.dart b/lib/l10n/generated/app_localizations_it.dart index c5740f47..b4049fcb 100644 --- a/lib/l10n/generated/app_localizations_it.dart +++ b/lib/l10n/generated/app_localizations_it.dart @@ -1526,6 +1526,31 @@ class AppLocalizationsIt extends AppLocalizations { @override String get mpv_download => 'MPV config files are required!\nDownload now?'; + @override + String get custom_buttons => 'Custom buttons'; + + @override + String get custom_buttons_info => + 'Execute Javascript code with custom buttons'; + + @override + String get custom_buttons_edit => 'Add custom button'; + + @override + String get custom_buttons_add => 'Add custom button'; + + @override + String get custom_buttons_text => 'Button text'; + + @override + String get custom_buttons_js_code => 'Javascript code'; + + @override + String get custom_buttons_js_code_long => 'Javascript code (on long press)'; + + @override + String get custom_buttons_startup => 'On startup'; + @override String n_days(Object n) { return '$n days'; diff --git a/lib/l10n/generated/app_localizations_pt.dart b/lib/l10n/generated/app_localizations_pt.dart index 41bb0f48..1ffda025 100644 --- a/lib/l10n/generated/app_localizations_pt.dart +++ b/lib/l10n/generated/app_localizations_pt.dart @@ -1525,6 +1525,31 @@ class AppLocalizationsPt extends AppLocalizations { @override String get mpv_download => 'MPV config files are required!\nDownload now?'; + @override + String get custom_buttons => 'Custom buttons'; + + @override + String get custom_buttons_info => + 'Execute Javascript code with custom buttons'; + + @override + String get custom_buttons_edit => 'Add custom button'; + + @override + String get custom_buttons_add => 'Add custom button'; + + @override + String get custom_buttons_text => 'Button text'; + + @override + String get custom_buttons_js_code => 'Javascript code'; + + @override + String get custom_buttons_js_code_long => 'Javascript code (on long press)'; + + @override + String get custom_buttons_startup => 'On startup'; + @override String n_days(Object n) { return '$n days'; diff --git a/lib/l10n/generated/app_localizations_ru.dart b/lib/l10n/generated/app_localizations_ru.dart index 276fa8e2..89cc8dc5 100644 --- a/lib/l10n/generated/app_localizations_ru.dart +++ b/lib/l10n/generated/app_localizations_ru.dart @@ -1527,6 +1527,31 @@ class AppLocalizationsRu extends AppLocalizations { @override String get mpv_download => 'MPV config files are required!\nDownload now?'; + @override + String get custom_buttons => 'Custom buttons'; + + @override + String get custom_buttons_info => + 'Execute Javascript code with custom buttons'; + + @override + String get custom_buttons_edit => 'Add custom button'; + + @override + String get custom_buttons_add => 'Add custom button'; + + @override + String get custom_buttons_text => 'Button text'; + + @override + String get custom_buttons_js_code => 'Javascript code'; + + @override + String get custom_buttons_js_code_long => 'Javascript code (on long press)'; + + @override + String get custom_buttons_startup => 'On startup'; + @override String n_days(Object n) { return '$n days'; diff --git a/lib/l10n/generated/app_localizations_th.dart b/lib/l10n/generated/app_localizations_th.dart index b318b867..0d60364b 100644 --- a/lib/l10n/generated/app_localizations_th.dart +++ b/lib/l10n/generated/app_localizations_th.dart @@ -1511,6 +1511,31 @@ class AppLocalizationsTh extends AppLocalizations { @override String get mpv_download => 'MPV config files are required!\nDownload now?'; + @override + String get custom_buttons => 'Custom buttons'; + + @override + String get custom_buttons_info => + 'Execute Javascript code with custom buttons'; + + @override + String get custom_buttons_edit => 'Add custom button'; + + @override + String get custom_buttons_add => 'Add custom button'; + + @override + String get custom_buttons_text => 'Button text'; + + @override + String get custom_buttons_js_code => 'Javascript code'; + + @override + String get custom_buttons_js_code_long => 'Javascript code (on long press)'; + + @override + String get custom_buttons_startup => 'On startup'; + @override String n_days(Object n) { return '$n days'; diff --git a/lib/l10n/generated/app_localizations_tr.dart b/lib/l10n/generated/app_localizations_tr.dart index 78cf94cd..dd1ec81b 100644 --- a/lib/l10n/generated/app_localizations_tr.dart +++ b/lib/l10n/generated/app_localizations_tr.dart @@ -1517,6 +1517,31 @@ class AppLocalizationsTr extends AppLocalizations { @override String get mpv_download => 'MPV config files are required!\nDownload now?'; + @override + String get custom_buttons => 'Custom buttons'; + + @override + String get custom_buttons_info => + 'Execute Javascript code with custom buttons'; + + @override + String get custom_buttons_edit => 'Add custom button'; + + @override + String get custom_buttons_add => 'Add custom button'; + + @override + String get custom_buttons_text => 'Button text'; + + @override + String get custom_buttons_js_code => 'Javascript code'; + + @override + String get custom_buttons_js_code_long => 'Javascript code (on long press)'; + + @override + String get custom_buttons_startup => 'On startup'; + @override String n_days(Object n) { return '$n days'; diff --git a/lib/l10n/generated/app_localizations_zh.dart b/lib/l10n/generated/app_localizations_zh.dart index 65a9b4a9..060b17ad 100644 --- a/lib/l10n/generated/app_localizations_zh.dart +++ b/lib/l10n/generated/app_localizations_zh.dart @@ -1482,6 +1482,31 @@ class AppLocalizationsZh extends AppLocalizations { @override String get mpv_download => 'MPV config files are required!\nDownload now?'; + @override + String get custom_buttons => 'Custom buttons'; + + @override + String get custom_buttons_info => + 'Execute Javascript code with custom buttons'; + + @override + String get custom_buttons_edit => 'Add custom button'; + + @override + String get custom_buttons_add => 'Add custom button'; + + @override + String get custom_buttons_text => 'Button text'; + + @override + String get custom_buttons_js_code => 'Javascript code'; + + @override + String get custom_buttons_js_code_long => 'Javascript code (on long press)'; + + @override + String get custom_buttons_startup => 'On startup'; + @override String n_days(Object n) { return '$n days'; diff --git a/lib/models/custom_button.dart b/lib/models/custom_button.dart new file mode 100644 index 00000000..0ea64789 --- /dev/null +++ b/lib/models/custom_button.dart @@ -0,0 +1,55 @@ +import 'package:isar/isar.dart'; +part 'custom_button.g.dart'; + +@collection +@Name("CustomButton") +class CustomButton { + Id? id; + + String? title; + + String? codePress; + + String? codeLongPress; + + String? codeStartup; + + bool? isFavourite; + + int? pos; + + int? updatedAt; + + CustomButton({ + this.id = Isar.autoIncrement, + required this.title, + required this.codePress, + this.codeLongPress = "", + this.codeStartup = "", + this.isFavourite = false, + required this.pos, + this.updatedAt = 0, + }); + + CustomButton.fromJson(Map json) { + id = json['id']; + title = json['title']; + codePress = json['codePress']; + codeLongPress = json['codeLongPress']; + codeStartup = json['codeStartup']; + isFavourite = json['isFavourite']; + pos = json['pos']; + updatedAt = json['updatedAt']; + } + + Map toJson() => { + 'id': id, + 'title': title, + 'codePress': codePress, + 'codeLongPress': codeLongPress, + 'codeStartup': codeStartup, + 'isFavourite': isFavourite, + 'pos': pos, + 'updatedAt': updatedAt ?? 0, + }; +} diff --git a/lib/models/custom_button.g.dart b/lib/models/custom_button.g.dart new file mode 100644 index 00000000..a08db717 --- /dev/null +++ b/lib/models/custom_button.g.dart @@ -0,0 +1,1413 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'custom_button.dart'; + +// ************************************************************************** +// IsarCollectionGenerator +// ************************************************************************** + +// coverage:ignore-file +// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types + +extension GetCustomButtonCollection on Isar { + IsarCollection get customButtons => this.collection(); +} + +const CustomButtonSchema = CollectionSchema( + name: r'CustomButton', + id: 3146166780828864477, + properties: { + r'codeLongPress': PropertySchema( + id: 0, + name: r'codeLongPress', + type: IsarType.string, + ), + r'codePress': PropertySchema( + id: 1, + name: r'codePress', + type: IsarType.string, + ), + r'codeStartup': PropertySchema( + id: 2, + name: r'codeStartup', + type: IsarType.string, + ), + r'isFavourite': PropertySchema( + id: 3, + name: r'isFavourite', + type: IsarType.bool, + ), + r'pos': PropertySchema( + id: 4, + name: r'pos', + type: IsarType.long, + ), + r'title': PropertySchema( + id: 5, + name: r'title', + type: IsarType.string, + ), + r'updatedAt': PropertySchema( + id: 6, + name: r'updatedAt', + type: IsarType.long, + ) + }, + estimateSize: _customButtonEstimateSize, + serialize: _customButtonSerialize, + deserialize: _customButtonDeserialize, + deserializeProp: _customButtonDeserializeProp, + idName: r'id', + indexes: {}, + links: {}, + embeddedSchemas: {}, + getId: _customButtonGetId, + getLinks: _customButtonGetLinks, + attach: _customButtonAttach, + version: '3.1.0+1', +); + +int _customButtonEstimateSize( + CustomButton object, + List offsets, + Map> allOffsets, +) { + var bytesCount = offsets.last; + { + final value = object.codeLongPress; + if (value != null) { + bytesCount += 3 + value.length * 3; + } + } + { + final value = object.codePress; + if (value != null) { + bytesCount += 3 + value.length * 3; + } + } + { + final value = object.codeStartup; + if (value != null) { + bytesCount += 3 + value.length * 3; + } + } + { + final value = object.title; + if (value != null) { + bytesCount += 3 + value.length * 3; + } + } + return bytesCount; +} + +void _customButtonSerialize( + CustomButton object, + IsarWriter writer, + List offsets, + Map> allOffsets, +) { + writer.writeString(offsets[0], object.codeLongPress); + writer.writeString(offsets[1], object.codePress); + writer.writeString(offsets[2], object.codeStartup); + writer.writeBool(offsets[3], object.isFavourite); + writer.writeLong(offsets[4], object.pos); + writer.writeString(offsets[5], object.title); + writer.writeLong(offsets[6], object.updatedAt); +} + +CustomButton _customButtonDeserialize( + Id id, + IsarReader reader, + List offsets, + Map> allOffsets, +) { + final object = CustomButton( + codeLongPress: reader.readStringOrNull(offsets[0]), + codePress: reader.readStringOrNull(offsets[1]), + codeStartup: reader.readStringOrNull(offsets[2]), + id: id, + isFavourite: reader.readBoolOrNull(offsets[3]), + pos: reader.readLongOrNull(offsets[4]), + title: reader.readStringOrNull(offsets[5]), + updatedAt: reader.readLongOrNull(offsets[6]), + ); + return object; +} + +P _customButtonDeserializeProp

( + IsarReader reader, + int propertyId, + int offset, + Map> allOffsets, +) { + switch (propertyId) { + case 0: + return (reader.readStringOrNull(offset)) as P; + case 1: + return (reader.readStringOrNull(offset)) as P; + case 2: + return (reader.readStringOrNull(offset)) as P; + case 3: + return (reader.readBoolOrNull(offset)) as P; + case 4: + return (reader.readLongOrNull(offset)) as P; + case 5: + return (reader.readStringOrNull(offset)) as P; + case 6: + return (reader.readLongOrNull(offset)) as P; + default: + throw IsarError('Unknown property with id $propertyId'); + } +} + +Id _customButtonGetId(CustomButton object) { + return object.id ?? Isar.autoIncrement; +} + +List> _customButtonGetLinks(CustomButton object) { + return []; +} + +void _customButtonAttach( + IsarCollection col, Id id, CustomButton object) { + object.id = id; +} + +extension CustomButtonQueryWhereSort + on QueryBuilder { + QueryBuilder anyId() { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(const IdWhereClause.any()); + }); + } +} + +extension CustomButtonQueryWhere + on QueryBuilder { + QueryBuilder idEqualTo(Id id) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(IdWhereClause.between( + lower: id, + upper: id, + )); + }); + } + + QueryBuilder idNotEqualTo( + Id id) { + return QueryBuilder.apply(this, (query) { + if (query.whereSort == Sort.asc) { + return query + .addWhereClause( + IdWhereClause.lessThan(upper: id, includeUpper: false), + ) + .addWhereClause( + IdWhereClause.greaterThan(lower: id, includeLower: false), + ); + } else { + return query + .addWhereClause( + IdWhereClause.greaterThan(lower: id, includeLower: false), + ) + .addWhereClause( + IdWhereClause.lessThan(upper: id, includeUpper: false), + ); + } + }); + } + + QueryBuilder idGreaterThan( + Id id, + {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause( + IdWhereClause.greaterThan(lower: id, includeLower: include), + ); + }); + } + + QueryBuilder idLessThan(Id id, + {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause( + IdWhereClause.lessThan(upper: id, includeUpper: include), + ); + }); + } + + QueryBuilder idBetween( + Id lowerId, + Id upperId, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(IdWhereClause.between( + lower: lowerId, + includeLower: includeLower, + upper: upperId, + includeUpper: includeUpper, + )); + }); + } +} + +extension CustomButtonQueryFilter + on QueryBuilder { + QueryBuilder + codeLongPressIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'codeLongPress', + )); + }); + } + + QueryBuilder + codeLongPressIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'codeLongPress', + )); + }); + } + + QueryBuilder + codeLongPressEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'codeLongPress', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + codeLongPressGreaterThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'codeLongPress', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + codeLongPressLessThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'codeLongPress', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + codeLongPressBetween( + 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'codeLongPress', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + codeLongPressStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'codeLongPress', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + codeLongPressEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'codeLongPress', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + codeLongPressContains(String value, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'codeLongPress', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + codeLongPressMatches(String pattern, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'codeLongPress', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + codeLongPressIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'codeLongPress', + value: '', + )); + }); + } + + QueryBuilder + codeLongPressIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'codeLongPress', + value: '', + )); + }); + } + + QueryBuilder + codePressIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'codePress', + )); + }); + } + + QueryBuilder + codePressIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'codePress', + )); + }); + } + + QueryBuilder + codePressEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'codePress', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + codePressGreaterThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'codePress', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + codePressLessThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'codePress', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + codePressBetween( + 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'codePress', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + codePressStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'codePress', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + codePressEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'codePress', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + codePressContains(String value, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'codePress', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + codePressMatches(String pattern, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'codePress', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + codePressIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'codePress', + value: '', + )); + }); + } + + QueryBuilder + codePressIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'codePress', + value: '', + )); + }); + } + + QueryBuilder + codeStartupIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'codeStartup', + )); + }); + } + + QueryBuilder + codeStartupIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'codeStartup', + )); + }); + } + + QueryBuilder + codeStartupEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'codeStartup', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + codeStartupGreaterThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'codeStartup', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + codeStartupLessThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'codeStartup', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + codeStartupBetween( + 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'codeStartup', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + codeStartupStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'codeStartup', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + codeStartupEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'codeStartup', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + codeStartupContains(String value, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'codeStartup', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + codeStartupMatches(String pattern, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'codeStartup', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + codeStartupIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'codeStartup', + value: '', + )); + }); + } + + QueryBuilder + codeStartupIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'codeStartup', + value: '', + )); + }); + } + + QueryBuilder idIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'id', + )); + }); + } + + QueryBuilder + idIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'id', + )); + }); + } + + QueryBuilder idEqualTo( + Id? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'id', + value: value, + )); + }); + } + + QueryBuilder idGreaterThan( + Id? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'id', + value: value, + )); + }); + } + + QueryBuilder idLessThan( + Id? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'id', + value: value, + )); + }); + } + + QueryBuilder idBetween( + Id? lower, + Id? upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'id', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder + isFavouriteIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'isFavourite', + )); + }); + } + + QueryBuilder + isFavouriteIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'isFavourite', + )); + }); + } + + QueryBuilder + isFavouriteEqualTo(bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'isFavourite', + value: value, + )); + }); + } + + QueryBuilder posIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'pos', + )); + }); + } + + QueryBuilder + posIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'pos', + )); + }); + } + + QueryBuilder posEqualTo( + int? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'pos', + value: value, + )); + }); + } + + QueryBuilder + posGreaterThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'pos', + value: value, + )); + }); + } + + QueryBuilder posLessThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'pos', + value: value, + )); + }); + } + + QueryBuilder posBetween( + int? lower, + int? upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'pos', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder + titleIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'title', + )); + }); + } + + QueryBuilder + titleIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'title', + )); + }); + } + + QueryBuilder titleEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'title', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + titleGreaterThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'title', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder titleLessThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'title', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder titleBetween( + 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'title', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + titleStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'title', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder titleEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'title', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder titleContains( + String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'title', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder titleMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'title', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + titleIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'title', + value: '', + )); + }); + } + + QueryBuilder + titleIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'title', + value: '', + )); + }); + } + + QueryBuilder + updatedAtIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'updatedAt', + )); + }); + } + + QueryBuilder + updatedAtIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'updatedAt', + )); + }); + } + + QueryBuilder + updatedAtEqualTo(int? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'updatedAt', + value: value, + )); + }); + } + + QueryBuilder + updatedAtGreaterThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'updatedAt', + value: value, + )); + }); + } + + QueryBuilder + updatedAtLessThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'updatedAt', + value: value, + )); + }); + } + + QueryBuilder + updatedAtBetween( + int? lower, + int? upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'updatedAt', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } +} + +extension CustomButtonQueryObject + on QueryBuilder {} + +extension CustomButtonQueryLinks + on QueryBuilder {} + +extension CustomButtonQuerySortBy + on QueryBuilder { + QueryBuilder sortByCodeLongPress() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'codeLongPress', Sort.asc); + }); + } + + QueryBuilder + sortByCodeLongPressDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'codeLongPress', Sort.desc); + }); + } + + QueryBuilder sortByCodePress() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'codePress', Sort.asc); + }); + } + + QueryBuilder sortByCodePressDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'codePress', Sort.desc); + }); + } + + QueryBuilder sortByCodeStartup() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'codeStartup', Sort.asc); + }); + } + + QueryBuilder + sortByCodeStartupDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'codeStartup', Sort.desc); + }); + } + + QueryBuilder sortByIsFavourite() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isFavourite', Sort.asc); + }); + } + + QueryBuilder + sortByIsFavouriteDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isFavourite', Sort.desc); + }); + } + + QueryBuilder sortByPos() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'pos', Sort.asc); + }); + } + + QueryBuilder sortByPosDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'pos', Sort.desc); + }); + } + + QueryBuilder sortByTitle() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'title', Sort.asc); + }); + } + + QueryBuilder sortByTitleDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'title', Sort.desc); + }); + } + + QueryBuilder sortByUpdatedAt() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'updatedAt', Sort.asc); + }); + } + + QueryBuilder sortByUpdatedAtDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'updatedAt', Sort.desc); + }); + } +} + +extension CustomButtonQuerySortThenBy + on QueryBuilder { + QueryBuilder thenByCodeLongPress() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'codeLongPress', Sort.asc); + }); + } + + QueryBuilder + thenByCodeLongPressDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'codeLongPress', Sort.desc); + }); + } + + QueryBuilder thenByCodePress() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'codePress', Sort.asc); + }); + } + + QueryBuilder thenByCodePressDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'codePress', Sort.desc); + }); + } + + QueryBuilder thenByCodeStartup() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'codeStartup', Sort.asc); + }); + } + + QueryBuilder + thenByCodeStartupDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'codeStartup', Sort.desc); + }); + } + + QueryBuilder thenById() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'id', Sort.asc); + }); + } + + QueryBuilder thenByIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'id', Sort.desc); + }); + } + + QueryBuilder thenByIsFavourite() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isFavourite', Sort.asc); + }); + } + + QueryBuilder + thenByIsFavouriteDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isFavourite', Sort.desc); + }); + } + + QueryBuilder thenByPos() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'pos', Sort.asc); + }); + } + + QueryBuilder thenByPosDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'pos', Sort.desc); + }); + } + + QueryBuilder thenByTitle() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'title', Sort.asc); + }); + } + + QueryBuilder thenByTitleDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'title', Sort.desc); + }); + } + + QueryBuilder thenByUpdatedAt() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'updatedAt', Sort.asc); + }); + } + + QueryBuilder thenByUpdatedAtDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'updatedAt', Sort.desc); + }); + } +} + +extension CustomButtonQueryWhereDistinct + on QueryBuilder { + QueryBuilder distinctByCodeLongPress( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'codeLongPress', + caseSensitive: caseSensitive); + }); + } + + QueryBuilder distinctByCodePress( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'codePress', caseSensitive: caseSensitive); + }); + } + + QueryBuilder distinctByCodeStartup( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'codeStartup', caseSensitive: caseSensitive); + }); + } + + QueryBuilder distinctByIsFavourite() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'isFavourite'); + }); + } + + QueryBuilder distinctByPos() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'pos'); + }); + } + + QueryBuilder distinctByTitle( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'title', caseSensitive: caseSensitive); + }); + } + + QueryBuilder distinctByUpdatedAt() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'updatedAt'); + }); + } +} + +extension CustomButtonQueryProperty + on QueryBuilder { + QueryBuilder idProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'id'); + }); + } + + QueryBuilder + codeLongPressProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'codeLongPress'); + }); + } + + QueryBuilder codePressProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'codePress'); + }); + } + + QueryBuilder codeStartupProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'codeStartup'); + }); + } + + QueryBuilder isFavouriteProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'isFavourite'); + }); + } + + QueryBuilder posProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'pos'); + }); + } + + QueryBuilder titleProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'title'); + }); + } + + QueryBuilder updatedAtProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'updatedAt'); + }); + } +} diff --git a/lib/models/settings.dart b/lib/models/settings.dart index d9094209..61ebad75 100644 --- a/lib/models/settings.dart +++ b/lib/models/settings.dart @@ -258,7 +258,7 @@ class Settings { bool? rpcShowCoverImage; - bool? useAnime4K; + bool? useMpvConfig; Settings({ this.id = 227, @@ -375,7 +375,7 @@ class Settings { this.rpcShowReadingWatchingProgress = true, this.rpcShowTitle = true, this.rpcShowCoverImage = true, - this.useAnime4K = false, + this.useMpvConfig = false, }); Settings.fromJson(Map json) { @@ -597,7 +597,7 @@ class Settings { rpcShowReadingWatchingProgress = json['rpcShowReadingWatchingProgress']; rpcShowTitle = json['rpcShowTitle']; rpcShowCoverImage = json['rpcShowCoverImage']; - useAnime4K = json['useAnime4K']; + useMpvConfig = json['useMpvConfig']; } Map toJson() => { @@ -736,7 +736,7 @@ class Settings { 'rpcShowReadingWatchingProgress': rpcShowReadingWatchingProgress, 'rpcShowTitle': rpcShowTitle, 'rpcShowCoverImage': rpcShowCoverImage, - 'useAnime4K': useAnime4K, + 'useMpvConfig': useMpvConfig, }; } diff --git a/lib/models/settings.g.dart b/lib/models/settings.g.dart index 927f407c..8a4e5827 100644 --- a/lib/models/settings.g.dart +++ b/lib/models/settings.g.dart @@ -628,14 +628,14 @@ const SettingsSchema = CollectionSchema( name: r'updatedAt', type: IsarType.long, ), - r'useAnime4K': PropertySchema( + r'useLibass': PropertySchema( id: 116, - name: r'useAnime4K', + name: r'useLibass', type: IsarType.bool, ), - r'useLibass': PropertySchema( + r'useMpvConfig': PropertySchema( id: 117, - name: r'useLibass', + name: r'useMpvConfig', type: IsarType.bool, ), r'usePageTapZones': PropertySchema( @@ -1249,8 +1249,8 @@ void _settingsSerialize( writer.writeBool(offsets[113], object.themeIsDark); writer.writeBool(offsets[114], object.updateProgressAfterReading); writer.writeLong(offsets[115], object.updatedAt); - writer.writeBool(offsets[116], object.useAnime4K); - writer.writeBool(offsets[117], object.useLibass); + writer.writeBool(offsets[116], object.useLibass); + writer.writeBool(offsets[117], object.useMpvConfig); writer.writeBool(offsets[118], object.usePageTapZones); writer.writeString(offsets[119], object.userAgent); } @@ -1468,8 +1468,8 @@ Settings _settingsDeserialize( themeIsDark: reader.readBoolOrNull(offsets[113]), updateProgressAfterReading: reader.readBoolOrNull(offsets[114]), updatedAt: reader.readLongOrNull(offsets[115]), - useAnime4K: reader.readBoolOrNull(offsets[116]), - useLibass: reader.readBoolOrNull(offsets[117]), + useLibass: reader.readBoolOrNull(offsets[116]), + useMpvConfig: reader.readBoolOrNull(offsets[117]), usePageTapZones: reader.readBoolOrNull(offsets[118]), userAgent: reader.readStringOrNull(offsets[119]), ); @@ -9591,33 +9591,6 @@ extension SettingsQueryFilter }); } - QueryBuilder useAnime4KIsNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'useAnime4K', - )); - }); - } - - QueryBuilder - useAnime4KIsNotNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'useAnime4K', - )); - }); - } - - QueryBuilder useAnime4KEqualTo( - bool? value) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'useAnime4K', - value: value, - )); - }); - } - QueryBuilder useLibassIsNull() { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(const FilterCondition.isNull( @@ -9644,6 +9617,33 @@ extension SettingsQueryFilter }); } + QueryBuilder useMpvConfigIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'useMpvConfig', + )); + }); + } + + QueryBuilder + useMpvConfigIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'useMpvConfig', + )); + }); + } + + QueryBuilder useMpvConfigEqualTo( + bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'useMpvConfig', + value: value, + )); + }); + } + QueryBuilder usePageTapZonesIsNull() { return QueryBuilder.apply(this, (query) { @@ -11239,18 +11239,6 @@ extension SettingsQuerySortBy on QueryBuilder { }); } - QueryBuilder sortByUseAnime4K() { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'useAnime4K', Sort.asc); - }); - } - - QueryBuilder sortByUseAnime4KDesc() { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'useAnime4K', Sort.desc); - }); - } - QueryBuilder sortByUseLibass() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'useLibass', Sort.asc); @@ -11263,6 +11251,18 @@ extension SettingsQuerySortBy on QueryBuilder { }); } + QueryBuilder sortByUseMpvConfig() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'useMpvConfig', Sort.asc); + }); + } + + QueryBuilder sortByUseMpvConfigDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'useMpvConfig', Sort.desc); + }); + } + QueryBuilder sortByUsePageTapZones() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'usePageTapZones', Sort.asc); @@ -12508,18 +12508,6 @@ extension SettingsQuerySortThenBy }); } - QueryBuilder thenByUseAnime4K() { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'useAnime4K', Sort.asc); - }); - } - - QueryBuilder thenByUseAnime4KDesc() { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'useAnime4K', Sort.desc); - }); - } - QueryBuilder thenByUseLibass() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'useLibass', Sort.asc); @@ -12532,6 +12520,18 @@ extension SettingsQuerySortThenBy }); } + QueryBuilder thenByUseMpvConfig() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'useMpvConfig', Sort.asc); + }); + } + + QueryBuilder thenByUseMpvConfigDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'useMpvConfig', Sort.desc); + }); + } + QueryBuilder thenByUsePageTapZones() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'usePageTapZones', Sort.asc); @@ -13184,18 +13184,18 @@ extension SettingsQueryWhereDistinct }); } - QueryBuilder distinctByUseAnime4K() { - return QueryBuilder.apply(this, (query) { - return query.addDistinctBy(r'useAnime4K'); - }); - } - QueryBuilder distinctByUseLibass() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'useLibass'); }); } + QueryBuilder distinctByUseMpvConfig() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'useMpvConfig'); + }); + } + QueryBuilder distinctByUsePageTapZones() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'usePageTapZones'); @@ -13993,18 +13993,18 @@ extension SettingsQueryProperty }); } - QueryBuilder useAnime4KProperty() { - return QueryBuilder.apply(this, (query) { - return query.addPropertyName(r'useAnime4K'); - }); - } - QueryBuilder useLibassProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'useLibass'); }); } + QueryBuilder useMpvConfigProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'useMpvConfig'); + }); + } + QueryBuilder usePageTapZonesProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'usePageTapZones'); diff --git a/lib/modules/anime/anime_player_view.dart b/lib/modules/anime/anime_player_view.dart index a18d6e99..f923007c 100644 --- a/lib/modules/anime/anime_player_view.dart +++ b/lib/modules/anime/anime_player_view.dart @@ -184,12 +184,12 @@ class _AnimeStreamPageState extends riv.ConsumerState with TickerProviderStateMixin, WidgetsBindingObserver { late final GlobalKey _key = GlobalKey(); late final useLibass = ref.read(useLibassStateProvider); - late final useAnime4K = ref.read(useAnime4KStateProvider); + late final useMpvConfig = ref.read(useMpvConfigStateProvider); late final Player _player = Player( configuration: PlayerConfiguration( libass: useLibass, config: true, - configDir: useAnime4K ? widget.mpvDirectory?.path ?? "" : "", + configDir: useMpvConfig ? widget.mpvDirectory?.path ?? "" : "", observeProperties: { "user-data/aniyomi/show_text": generated.mpv_format.MPV_FORMAT_NODE, "user-data/aniyomi/toggle_ui": generated.mpv_format.MPV_FORMAT_NODE, @@ -329,12 +329,84 @@ class _AnimeStreamPageState extends riv.ConsumerState botToast(text); } break; + case "user-data/aniyomi/toggle_ui": + if (value.ref.format == generated.mpv_format.MPV_FORMAT_STRING) { + final text = value.ref.u.string.cast().toDartString(); + } + break; + case "user-data/aniyomi/show_panel": + if (value.ref.format == generated.mpv_format.MPV_FORMAT_STRING) { + final text = value.ref.u.string.cast().toDartString(); + } + break; + case "user-data/aniyomi/software_keyboard": + if (value.ref.format == generated.mpv_format.MPV_FORMAT_STRING) { + final text = value.ref.u.string.cast().toDartString(); + } + break; + case "user-data/aniyomi/set_button_title": + if (value.ref.format == generated.mpv_format.MPV_FORMAT_STRING) { + final text = value.ref.u.string.cast().toDartString(); + } + break; + case "user-data/aniyomi/reset_button_title": + if (value.ref.format == generated.mpv_format.MPV_FORMAT_STRING) { + final text = value.ref.u.string.cast().toDartString(); + } + break; + case "user-data/aniyomi/toggle_button": + if (value.ref.format == generated.mpv_format.MPV_FORMAT_STRING) { + final text = value.ref.u.string.cast().toDartString(); + } + break; + case "user-data/aniyomi/switch_episode": + if (value.ref.format == generated.mpv_format.MPV_FORMAT_STRING) { + final text = value.ref.u.string.cast().toDartString(); + } + break; + case "user-data/aniyomi/pause": + if (value.ref.format == generated.mpv_format.MPV_FORMAT_STRING) { + final text = value.ref.u.string.cast().toDartString(); + } + break; + case "user-data/aniyomi/seek_by": + if (value.ref.format == generated.mpv_format.MPV_FORMAT_STRING) { + final text = value.ref.u.string.cast().toDartString(); + } + break; + case "user-data/aniyomi/seek_to": + if (value.ref.format == generated.mpv_format.MPV_FORMAT_STRING) { + final text = value.ref.u.string.cast().toDartString(); + } + break; + case "user-data/aniyomi/seek_by_with_text": + if (value.ref.format == generated.mpv_format.MPV_FORMAT_STRING) { + final text = value.ref.u.string.cast().toDartString(); + } + break; + case "user-data/aniyomi/seek_to_with_text": + if (value.ref.format == generated.mpv_format.MPV_FORMAT_STRING) { + final text = value.ref.u.string.cast().toDartString(); + } + break; + case "user-data/aniyomi/launch_int_picker": + if (value.ref.format == generated.mpv_format.MPV_FORMAT_STRING) { + final text = value.ref.u.string.cast().toDartString(); + } + break; case "mangayomi/chapter_titles": if (value.ref.format == generated.mpv_format.MPV_FORMAT_STRING) { final text = value.ref.u.string.cast().toDartString(); final data = jsonDecode(text) as List; _chapterMarks.value = data - .map((e) => (e["title"] as String, (e["time"] as int) * 1000)) + .map( + (e) => ( + e["title"] as String, + e["time"] is double + ? (e["time"] as double).toInt() * 1000 + : (e["time"] as int) * 1000, + ), + ) .toList(); } break; @@ -1177,7 +1249,7 @@ class _AnimeStreamPageState extends riv.ConsumerState onPressed: () => _videoSettingDraggableMenu(context), icon: const Icon(Icons.video_settings, color: Colors.white), ), - if (useAnime4K) + if (useMpvConfig) PopupMenuButton( tooltip: '', // Remove default tooltip "Show menu" for consistency icon: const Icon(Icons.high_quality, color: Colors.white), diff --git a/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart b/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart index ac7f4879..27dd03b3 100644 --- a/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart +++ b/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart @@ -6,7 +6,7 @@ part of 'update_manga_detail_providers.dart'; // RiverpodGenerator // ************************************************************************** -String _$updateMangaDetailHash() => r'769afb98684ba7d53c36d14637a51d1be9e6826d'; +String _$updateMangaDetailHash() => r'33c6bd0f1de57e2e839ae695a0301893b9a94624'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/modules/more/settings/player/custom_button_screen.dart b/lib/modules/more/settings/player/custom_button_screen.dart new file mode 100644 index 00000000..6aced89e --- /dev/null +++ b/lib/modules/more/settings/player/custom_button_screen.dart @@ -0,0 +1,287 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:mangayomi/models/custom_button.dart'; +import 'package:mangayomi/modules/more/settings/player/providers/custom_buttons_provider.dart'; +import 'package:mangayomi/modules/widgets/progress_center.dart'; +import 'package:mangayomi/providers/l10n_providers.dart'; + +class CustomButtonScreen extends ConsumerStatefulWidget { + const CustomButtonScreen({super.key}); + + @override + ConsumerState createState() => _CustomButtonScreenState(); +} + +class _CustomButtonScreenState extends ConsumerState { + List _entries = []; + @override + Widget build(BuildContext context) { + final l10n = context.l10n; + final customButtons = ref.watch(getCustomButtonsStreamProvider); + return Scaffold( + appBar: AppBar(title: Text(l10n.custom_buttons_edit)), + body: customButtons.when( + data: (data) { + if (data.isEmpty) { + _entries = []; + return Center( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + l10n.custom_buttons_edit, + textAlign: TextAlign.center, + ), + ), + ); + } + data.sort((a, b) => (a.pos ?? 0).compareTo(b.pos ?? 0)); + _entries = data; + + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 15), + child: ReorderableListView.builder( + buildDefaultDragHandles: false, + itemCount: _entries.length, + itemBuilder: (context, index) { + final customButton = _entries[index]; + return Row( + key: Key('custom_btn_${customButton.id}'), + children: [ + ReorderableDragStartListener( + index: index, + child: const Icon(Icons.drag_handle), + ), + Expanded( + child: Row( + children: [ + IconButton( + onPressed: () {}, + icon: Icon( + (customButton.isFavourite ?? false) + ? Icons.star + : Icons.star_border, + ), + ), + IconButton( + onPressed: () {}, + icon: Icon(Icons.mode_edit_outlined), + ), + IconButton( + onPressed: () {}, + icon: Icon(Icons.delete_outline), + ), + ], + ), + ), + ], + ); + }, + onReorder: (oldIndex, newIndex) { + /*if (oldIndex < newIndex) { + final draggedItem = navigationOrder[oldIndex]; + for (var i = oldIndex; i < newIndex - 1; i++) { + navigationOrder[i] = navigationOrder[i + 1]; + } + navigationOrder[newIndex - 1] = draggedItem; + } else { + final draggedItem = navigationOrder[oldIndex]; + for (var i = oldIndex; i > newIndex; i--) { + navigationOrder[i] = navigationOrder[i - 1]; + } + navigationOrder[newIndex] = draggedItem; + } + ref + .read(navigationOrderStateProvider.notifier) + .set(navigationOrder);*/ + }, + ), + ); + }, + error: (Object error, StackTrace stackTrace) { + _entries = []; + return Center( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + l10n.custom_buttons_edit, + textAlign: TextAlign.center, + ), + ), + ); + }, + loading: () { + return const ProgressCenter(); + }, + ), + floatingActionButton: FloatingActionButton.extended( + onPressed: () { + bool isExist = false; + final controller = TextEditingController(); + showDialog( + context: context, + builder: (context) { + return SizedBox( + child: StatefulBuilder( + builder: (context, setState) { + return AlertDialog( + title: Text(l10n.add_category), + content: CustomTextFormField( + controller: controller, + entries: _entries, + context: context, + exist: (value) { + setState(() { + isExist = value; + }); + }, + isExist: isExist, + val: (val) {}, + ), + actions: [ + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + TextButton( + onPressed: () { + Navigator.pop(context); + }, + child: Text(l10n.cancel), + ), + const SizedBox(width: 15), + TextButton( + onPressed: controller.text.isEmpty || isExist + ? null + : () async { + /*final category = Category( + forItemType: widget.itemType, + name: controller.text, + updatedAt: DateTime.now() + .millisecondsSinceEpoch, + ); + isar.writeTxnSync(() { + isar.categorys.putSync( + category..pos = category.id, + ); + final categories = isar.categorys + .filter() + .posIsNull() + .findAllSync(); + for (var category in categories) { + isar.categorys.putSync( + category..pos = category.id, + ); + } + });*/ + + if (context.mounted) { + Navigator.pop(context); + } + }, + child: Text( + l10n.add, + style: TextStyle( + color: controller.text.isEmpty || isExist + ? Theme.of( + context, + ).primaryColor.withValues(alpha: 0.2) + : null, + ), + ), + ), + ], + ), + ], + ); + }, + ), + ); + }, + ); + }, + label: Row( + children: [ + const Icon(Icons.add), + const SizedBox(width: 10), + Text(l10n.add), + ], + ), + ), + ); + } +} + +class CustomTextFormField extends StatelessWidget { + final TextEditingController controller; + final List entries; + final BuildContext context; + final Function(bool) exist; + final bool isExist; + final String name; + final Function(String) val; + const CustomTextFormField({ + super.key, + required this.controller, + required this.entries, + required this.context, + required this.exist, + required this.isExist, + this.name = "", + required this.val, + }); + + @override + Widget build(BuildContext context) { + final l10n = l10nLocalizations(context); + return TextFormField( + autofocus: true, + controller: controller, + keyboardType: TextInputType.text, + onChanged: (value) { + if (name != controller.text) { + exist( + entries + .where((element) => element.title == controller.text) + .toList() + .isNotEmpty, + ); + } + val(value); + }, + onFieldSubmitted: (s) {}, + decoration: InputDecoration( + helperText: isExist == true + ? l10n!.add_category_error_exist + : l10n!.category_name_required, + helperStyle: TextStyle(color: isExist == true ? Colors.red : null), + isDense: true, + label: Text( + l10n.name, + style: TextStyle(color: isExist == true ? Colors.red : null), + ), + filled: true, + fillColor: Colors.transparent, + enabledBorder: OutlineInputBorder( + borderSide: BorderSide( + color: isExist == true + ? Colors.red + : Theme.of(context).primaryColor, + ), + ), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide( + color: isExist == true + ? Colors.red + : Theme.of(context).primaryColor, + ), + ), + border: OutlineInputBorder( + borderSide: BorderSide( + color: isExist == true + ? Colors.red + : Theme.of(context).primaryColor, + ), + ), + ), + ); + } +} diff --git a/lib/modules/more/settings/player/player_screen.dart b/lib/modules/more/settings/player/player_screen.dart index 36ccaa98..203882cb 100644 --- a/lib/modules/more/settings/player/player_screen.dart +++ b/lib/modules/more/settings/player/player_screen.dart @@ -4,8 +4,10 @@ import 'dart:io'; import 'package:archive/archive.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; import 'package:http/http.dart' as http; import 'package:mangayomi/modules/more/settings/player/providers/player_state_provider.dart'; +import 'package:mangayomi/modules/more/widgets/list_tile_widget.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; import 'package:mangayomi/providers/storage_provider.dart'; import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; @@ -51,7 +53,7 @@ class _PlayerScreenState extends ConsumerState { final enableAutoSkip = ref.watch(enableAutoSkipStateProvider); final aniSkipTimeoutLength = ref.watch(aniSkipTimeoutLengthStateProvider); final useLibass = ref.watch(useLibassStateProvider); - final useAnime4K = ref.watch(useAnime4KStateProvider); + final useMpvConfig = ref.watch(useMpvConfigStateProvider); final hwdecMode = ref.watch(hwdecModeStateProvider(rawValue: true)); final fullScreenPlayer = ref.watch(fullScreenPlayerStateProvider); @@ -484,7 +486,7 @@ class _PlayerScreenState extends ConsumerState { ], ), SwitchListTile( - value: useAnime4K, + value: useMpvConfig, title: Text(context.l10n.enable_mpv), subtitle: Text( context.l10n.mpv_info, @@ -494,7 +496,7 @@ class _PlayerScreenState extends ConsumerState { if (value && !(await _checkMpvConfig(context))) { return; } - ref.read(useAnime4KStateProvider.notifier).set(value); + ref.read(useMpvConfigStateProvider.notifier).set(value); }, ), ListTile( @@ -507,6 +509,14 @@ class _PlayerScreenState extends ConsumerState { style: TextStyle(fontSize: 11, color: context.secondaryColor), ), ), + ListTileWidget( + onTap: () { + context.push("/customButtonScreen"); + }, + icon: Icons.terminal, + title: context.l10n.custom_buttons, + subtitle: context.l10n.custom_buttons_info, + ), SwitchListTile( value: fullScreenPlayer, title: Text(context.l10n.full_screen_player), diff --git a/lib/modules/more/settings/player/providers/custom_buttons_provider.dart b/lib/modules/more/settings/player/providers/custom_buttons_provider.dart new file mode 100644 index 00000000..f931e92d --- /dev/null +++ b/lib/modules/more/settings/player/providers/custom_buttons_provider.dart @@ -0,0 +1,11 @@ +import 'package:isar/isar.dart'; +import 'package:mangayomi/main.dart'; +import 'package:mangayomi/models/custom_button.dart'; +import 'package:riverpod_annotation/riverpod_annotation.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +part 'custom_buttons_provider.g.dart'; + +@riverpod +Stream> getCustomButtonsStream(Ref ref) async* { + yield* isar.customButtons.filter().idIsNotNull().watch(fireImmediately: true); +} diff --git a/lib/modules/more/settings/player/providers/custom_buttons_provider.g.dart b/lib/modules/more/settings/player/providers/custom_buttons_provider.g.dart new file mode 100644 index 00000000..276a045a --- /dev/null +++ b/lib/modules/more/settings/player/providers/custom_buttons_provider.g.dart @@ -0,0 +1,30 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'custom_buttons_provider.dart'; + +// ************************************************************************** +// RiverpodGenerator +// ************************************************************************** + +String _$getCustomButtonsStreamHash() => + r'463d2142793ffb5a905f6f90c3a756445be8b133'; + +/// See also [getCustomButtonsStream]. +@ProviderFor(getCustomButtonsStream) +final getCustomButtonsStreamProvider = + AutoDisposeStreamProvider>.internal( + getCustomButtonsStream, + name: r'getCustomButtonsStreamProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$getCustomButtonsStreamHash, + dependencies: null, + allTransitiveDependencies: null, +); + +@Deprecated('Will be removed in 3.0. Use Ref instead') +// ignore: unused_element +typedef GetCustomButtonsStreamRef + = AutoDisposeStreamProviderRef>; +// ignore_for_file: type=lint +// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package diff --git a/lib/modules/more/settings/player/providers/player_state_provider.dart b/lib/modules/more/settings/player/providers/player_state_provider.dart index d5c54e45..47494a7d 100644 --- a/lib/modules/more/settings/player/providers/player_state_provider.dart +++ b/lib/modules/more/settings/player/providers/player_state_provider.dart @@ -219,17 +219,17 @@ class UseLibassState extends _$UseLibassState { } @riverpod -class UseAnime4KState extends _$UseAnime4KState { +class UseMpvConfigState extends _$UseMpvConfigState { @override bool build() { - return isar.settings.getSync(227)!.useAnime4K ?? false; + return isar.settings.getSync(227)!.useMpvConfig ?? false; } void set(bool value) { final settings = isar.settings.getSync(227); state = value; isar.writeTxnSync( - () => isar.settings.putSync(settings!..useAnime4K = value), + () => isar.settings.putSync(settings!..useMpvConfig = value), ); } } diff --git a/lib/modules/more/settings/player/providers/player_state_provider.g.dart b/lib/modules/more/settings/player/providers/player_state_provider.g.dart index bd52f1cc..50e47082 100644 --- a/lib/modules/more/settings/player/providers/player_state_provider.g.dart +++ b/lib/modules/more/settings/player/providers/player_state_provider.g.dart @@ -175,22 +175,22 @@ final useLibassStateProvider = ); typedef _$UseLibassState = AutoDisposeNotifier; -String _$useAnime4KStateHash() => r'3902552d399794bf7c78d5f18adcf59f267b3cf6'; +String _$useMpvConfigStateHash() => r'f91e6a7dbd3c5f7674ba74842521ecfca01c78b0'; -/// See also [UseAnime4KState]. -@ProviderFor(UseAnime4KState) -final useAnime4KStateProvider = - AutoDisposeNotifierProvider.internal( - UseAnime4KState.new, - name: r'useAnime4KStateProvider', +/// See also [UseMpvConfigState]. +@ProviderFor(UseMpvConfigState) +final useMpvConfigStateProvider = + AutoDisposeNotifierProvider.internal( + UseMpvConfigState.new, + name: r'useMpvConfigStateProvider', debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') ? null - : _$useAnime4KStateHash, + : _$useMpvConfigStateHash, dependencies: null, allTransitiveDependencies: null, ); -typedef _$UseAnime4KState = AutoDisposeNotifier; +typedef _$UseMpvConfigState = AutoDisposeNotifier; String _$hwdecModeStateHash() => r'8186e3c5f3db0e952f629d56b2e580e546aed65e'; /// Copied from Dart SDK diff --git a/lib/providers/storage_provider.dart b/lib/providers/storage_provider.dart index cc11ce4c..3747ba35 100644 --- a/lib/providers/storage_provider.dart +++ b/lib/providers/storage_provider.dart @@ -6,6 +6,7 @@ import 'package:mangayomi/main.dart'; import 'package:mangayomi/models/category.dart'; import 'package:mangayomi/models/changed.dart'; import 'package:mangayomi/models/chapter.dart'; +import 'package:mangayomi/models/custom_button.dart'; import 'package:mangayomi/models/download.dart'; import 'package:mangayomi/models/update.dart'; import 'package:mangayomi/models/history.dart'; @@ -176,6 +177,7 @@ class StorageProvider { ChangedPartSchema, ChapterSchema, CategorySchema, + CustomButtonSchema, UpdateSchema, HistorySchema, DownloadSchema, @@ -199,6 +201,29 @@ class StorageProvider { }); } + final customButton = await isar.customButtons + .filter() + .idEqualTo(1) + .findFirst(); + if (customButton == null) { + await isar.writeTxn(() async { + isar.customButtons.put( + CustomButton( + title: "+85 s", + codePress: + "var intro_length = mp.get_property_number(\"user-data/current-anime/intro-length\")\naniyomi.right_seek_by(intro_length)", + codeLongPress: + "aniyomi.int_picker(\"Change intro length\", \"%ds\", 0, 255, 1, \"user-data/current-anime/intro-length\")", + codeStartup: + "function update_button(_, length) {\n if (!length || length == 0) {\n aniyomi.hide_button()\n } else {\n aniyomi.show_button()\n }\n aniyomi.set_button_title(\"+\" + length + \" s\")", + isFavourite: true, + pos: 0, + updatedAt: DateTime.now().millisecondsSinceEpoch, + ), + ); + }); + } + return isar; } } diff --git a/lib/router/router.dart b/lib/router/router.dart index a0b24a97..c889dfb8 100644 --- a/lib/router/router.dart +++ b/lib/router/router.dart @@ -16,6 +16,7 @@ import 'package:mangayomi/modules/more/data_and_storage/create_backup.dart'; import 'package:mangayomi/modules/more/data_and_storage/data_and_storage.dart'; import 'package:mangayomi/modules/more/settings/appearance/custom_navigation_settings.dart'; import 'package:mangayomi/modules/more/settings/browse/source_repositories.dart'; +import 'package:mangayomi/modules/more/settings/player/custom_button_screen.dart'; import 'package:mangayomi/modules/more/settings/reader/providers/reader_state_provider.dart'; import 'package:mangayomi/modules/more/statistics/statistics_screen.dart'; import 'package:mangayomi/modules/novel/novel_reader_view.dart'; @@ -214,6 +215,10 @@ class RouterNotifier extends ChangeNotifier { name: "customNavigationSettings", child: const CustomNavigationSettings(), ), + _genericRoute( + name: "customButtonScreen", + child: const CustomButtonScreen(), + ), _genericRoute( name: "migrate", builder: (manga) => MigrationScreen(manga: manga),