feature: pure black dark mode , refactor code
This commit is contained in:
parent
1403048fc4
commit
6ef6d943c2
22 changed files with 256 additions and 101 deletions
|
|
@ -43,6 +43,7 @@ android {
|
|||
}
|
||||
|
||||
defaultConfig {
|
||||
|
||||
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
|
||||
applicationId "com.kodjodevf.mangayomi"
|
||||
// You can update the following values to match your application needs.
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@ import 'package:mangayomi/models/manga.dart';
|
|||
import 'package:mangayomi/router/router.dart';
|
||||
import 'package:mangayomi/views/more/settings/appearance/providers/blend_level_state_provider.dart';
|
||||
import 'package:mangayomi/views/more/settings/appearance/providers/flex_scheme_color_state_provider.dart';
|
||||
import 'package:mangayomi/views/more/settings/appearance/providers/pure_black_dark_mode_state_provider.dart';
|
||||
import 'package:mangayomi/views/more/settings/appearance/providers/theme_mode_state_provider.dart';
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
import 'package:path/path.dart' as path;
|
||||
|
|
@ -109,6 +110,7 @@ class _MyAppState extends ConsumerState<MyApp> {
|
|||
Widget build(BuildContext context) {
|
||||
final isThemeLight = ref.watch(themeModeStateProvider);
|
||||
final blendLevel = ref.watch(blendLevelStateProvider);
|
||||
final pureBlackDarkMode = ref.watch(pureBlackDarkModeStateProvider);
|
||||
ThemeData themeLight = FlexThemeData.light(
|
||||
colors: ref.watch(flexSchemeColorStateProvider),
|
||||
surfaceMode: FlexSurfaceMode.highScaffoldLevelSurface,
|
||||
|
|
@ -132,6 +134,7 @@ class _MyAppState extends ConsumerState<MyApp> {
|
|||
surfaceMode: FlexSurfaceMode.level,
|
||||
blendLevel: blendLevel.toInt(),
|
||||
appBarOpacity: 0.00,
|
||||
scaffoldBackground: pureBlackDarkMode ? Colors.black : null,
|
||||
subThemesData: const FlexSubThemesData(
|
||||
blendOnLevel: 10,
|
||||
thinBorderWidth: 2.0,
|
||||
|
|
|
|||
|
|
@ -73,6 +73,8 @@ class Settings {
|
|||
|
||||
bool? onlyIncludePinnedSources;
|
||||
|
||||
bool? pureBlackDarkMode;
|
||||
|
||||
Settings(
|
||||
{this.id = 227,
|
||||
this.displayType = DisplayType.compactGrid,
|
||||
|
|
@ -104,7 +106,8 @@ class Settings {
|
|||
this.animatePageTransitions = true,
|
||||
this.doubleTapAnimationSpeed = 1,
|
||||
this.showNSFW = true,
|
||||
this.onlyIncludePinnedSources = false});
|
||||
this.onlyIncludePinnedSources = false,
|
||||
this.pureBlackDarkMode = false});
|
||||
}
|
||||
|
||||
enum DisplayType {
|
||||
|
|
|
|||
|
|
@ -151,40 +151,45 @@ const SettingsSchema = CollectionSchema(
|
|||
type: IsarType.objectList,
|
||||
target: r'PersonalReaderMode',
|
||||
),
|
||||
r'relativeTimesTamps': PropertySchema(
|
||||
r'pureBlackDarkMode': PropertySchema(
|
||||
id: 25,
|
||||
name: r'pureBlackDarkMode',
|
||||
type: IsarType.bool,
|
||||
),
|
||||
r'relativeTimesTamps': PropertySchema(
|
||||
id: 26,
|
||||
name: r'relativeTimesTamps',
|
||||
type: IsarType.long,
|
||||
),
|
||||
r'showNSFW': PropertySchema(
|
||||
id: 26,
|
||||
id: 27,
|
||||
name: r'showNSFW',
|
||||
type: IsarType.bool,
|
||||
),
|
||||
r'showPagesNumber': PropertySchema(
|
||||
id: 27,
|
||||
id: 28,
|
||||
name: r'showPagesNumber',
|
||||
type: IsarType.bool,
|
||||
),
|
||||
r'sortChapterList': PropertySchema(
|
||||
id: 28,
|
||||
id: 29,
|
||||
name: r'sortChapterList',
|
||||
type: IsarType.objectList,
|
||||
target: r'SortChapter',
|
||||
),
|
||||
r'sortLibraryManga': PropertySchema(
|
||||
id: 29,
|
||||
id: 30,
|
||||
name: r'sortLibraryManga',
|
||||
type: IsarType.object,
|
||||
target: r'SortLibraryManga',
|
||||
),
|
||||
r'themeIsDark': PropertySchema(
|
||||
id: 30,
|
||||
id: 31,
|
||||
name: r'themeIsDark',
|
||||
type: IsarType.bool,
|
||||
),
|
||||
r'userAgent': PropertySchema(
|
||||
id: 31,
|
||||
id: 32,
|
||||
name: r'userAgent',
|
||||
type: IsarType.string,
|
||||
)
|
||||
|
|
@ -419,23 +424,24 @@ void _settingsSerialize(
|
|||
PersonalReaderModeSchema.serialize,
|
||||
object.personalReaderModeList,
|
||||
);
|
||||
writer.writeLong(offsets[25], object.relativeTimesTamps);
|
||||
writer.writeBool(offsets[26], object.showNSFW);
|
||||
writer.writeBool(offsets[27], object.showPagesNumber);
|
||||
writer.writeBool(offsets[25], object.pureBlackDarkMode);
|
||||
writer.writeLong(offsets[26], object.relativeTimesTamps);
|
||||
writer.writeBool(offsets[27], object.showNSFW);
|
||||
writer.writeBool(offsets[28], object.showPagesNumber);
|
||||
writer.writeObjectList<SortChapter>(
|
||||
offsets[28],
|
||||
offsets[29],
|
||||
allOffsets,
|
||||
SortChapterSchema.serialize,
|
||||
object.sortChapterList,
|
||||
);
|
||||
writer.writeObject<SortLibraryManga>(
|
||||
offsets[29],
|
||||
offsets[30],
|
||||
allOffsets,
|
||||
SortLibraryMangaSchema.serialize,
|
||||
object.sortLibraryManga,
|
||||
);
|
||||
writer.writeBool(offsets[30], object.themeIsDark);
|
||||
writer.writeString(offsets[31], object.userAgent);
|
||||
writer.writeBool(offsets[31], object.themeIsDark);
|
||||
writer.writeString(offsets[32], object.userAgent);
|
||||
}
|
||||
|
||||
Settings _settingsDeserialize(
|
||||
|
|
@ -498,22 +504,23 @@ Settings _settingsDeserialize(
|
|||
allOffsets,
|
||||
PersonalReaderMode(),
|
||||
),
|
||||
relativeTimesTamps: reader.readLongOrNull(offsets[25]),
|
||||
showNSFW: reader.readBoolOrNull(offsets[26]),
|
||||
showPagesNumber: reader.readBoolOrNull(offsets[27]),
|
||||
pureBlackDarkMode: reader.readBoolOrNull(offsets[25]),
|
||||
relativeTimesTamps: reader.readLongOrNull(offsets[26]),
|
||||
showNSFW: reader.readBoolOrNull(offsets[27]),
|
||||
showPagesNumber: reader.readBoolOrNull(offsets[28]),
|
||||
sortChapterList: reader.readObjectList<SortChapter>(
|
||||
offsets[28],
|
||||
offsets[29],
|
||||
SortChapterSchema.deserialize,
|
||||
allOffsets,
|
||||
SortChapter(),
|
||||
),
|
||||
sortLibraryManga: reader.readObjectOrNull<SortLibraryManga>(
|
||||
offsets[29],
|
||||
offsets[30],
|
||||
SortLibraryMangaSchema.deserialize,
|
||||
allOffsets,
|
||||
),
|
||||
themeIsDark: reader.readBoolOrNull(offsets[30]),
|
||||
userAgent: reader.readStringOrNull(offsets[31]),
|
||||
themeIsDark: reader.readBoolOrNull(offsets[31]),
|
||||
userAgent: reader.readStringOrNull(offsets[32]),
|
||||
);
|
||||
object.chapterFilterBookmarkedList =
|
||||
reader.readObjectList<ChapterFilterBookmarked>(
|
||||
|
|
@ -627,27 +634,29 @@ P _settingsDeserializeProp<P>(
|
|||
PersonalReaderMode(),
|
||||
)) as P;
|
||||
case 25:
|
||||
return (reader.readLongOrNull(offset)) as P;
|
||||
case 26:
|
||||
return (reader.readBoolOrNull(offset)) as P;
|
||||
case 26:
|
||||
return (reader.readLongOrNull(offset)) as P;
|
||||
case 27:
|
||||
return (reader.readBoolOrNull(offset)) as P;
|
||||
case 28:
|
||||
return (reader.readBoolOrNull(offset)) as P;
|
||||
case 29:
|
||||
return (reader.readObjectList<SortChapter>(
|
||||
offset,
|
||||
SortChapterSchema.deserialize,
|
||||
allOffsets,
|
||||
SortChapter(),
|
||||
)) as P;
|
||||
case 29:
|
||||
case 30:
|
||||
return (reader.readObjectOrNull<SortLibraryManga>(
|
||||
offset,
|
||||
SortLibraryMangaSchema.deserialize,
|
||||
allOffsets,
|
||||
)) as P;
|
||||
case 30:
|
||||
return (reader.readBoolOrNull(offset)) as P;
|
||||
case 31:
|
||||
return (reader.readBoolOrNull(offset)) as P;
|
||||
case 32:
|
||||
return (reader.readStringOrNull(offset)) as P;
|
||||
default:
|
||||
throw IsarError('Unknown property with id $propertyId');
|
||||
|
|
@ -2595,6 +2604,34 @@ extension SettingsQueryFilter
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Settings, Settings, QAfterFilterCondition>
|
||||
pureBlackDarkModeIsNull() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(const FilterCondition.isNull(
|
||||
property: r'pureBlackDarkMode',
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Settings, Settings, QAfterFilterCondition>
|
||||
pureBlackDarkModeIsNotNull() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(const FilterCondition.isNotNull(
|
||||
property: r'pureBlackDarkMode',
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Settings, Settings, QAfterFilterCondition>
|
||||
pureBlackDarkModeEqualTo(bool? value) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.equalTo(
|
||||
property: r'pureBlackDarkMode',
|
||||
value: value,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Settings, Settings, QAfterFilterCondition>
|
||||
relativeTimesTampsIsNull() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
|
|
@ -3337,6 +3374,18 @@ extension SettingsQuerySortBy on QueryBuilder<Settings, Settings, QSortBy> {
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Settings, Settings, QAfterSortBy> sortByPureBlackDarkMode() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'pureBlackDarkMode', Sort.asc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Settings, Settings, QAfterSortBy> sortByPureBlackDarkModeDesc() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'pureBlackDarkMode', Sort.desc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Settings, Settings, QAfterSortBy> sortByRelativeTimesTamps() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'relativeTimesTamps', Sort.asc);
|
||||
|
|
@ -3655,6 +3704,18 @@ extension SettingsQuerySortThenBy
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Settings, Settings, QAfterSortBy> thenByPureBlackDarkMode() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'pureBlackDarkMode', Sort.asc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Settings, Settings, QAfterSortBy> thenByPureBlackDarkModeDesc() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'pureBlackDarkMode', Sort.desc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Settings, Settings, QAfterSortBy> thenByRelativeTimesTamps() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'relativeTimesTamps', Sort.asc);
|
||||
|
|
@ -3840,6 +3901,12 @@ extension SettingsQueryWhereDistinct
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Settings, Settings, QDistinct> distinctByPureBlackDarkMode() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addDistinctBy(r'pureBlackDarkMode');
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Settings, Settings, QDistinct> distinctByRelativeTimesTamps() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addDistinctBy(r'relativeTimesTamps');
|
||||
|
|
@ -4052,6 +4119,12 @@ extension SettingsQueryProperty
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Settings, bool?, QQueryOperations> pureBlackDarkModeProperty() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addPropertyName(r'pureBlackDarkMode');
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Settings, int?, QQueryOperations> relativeTimesTampsProperty() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addPropertyName(r'relativeTimesTamps');
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|||
import 'package:go_router/go_router.dart';
|
||||
import 'package:mangayomi/models/chapter.dart';
|
||||
import 'package:mangayomi/models/manga_type.dart';
|
||||
import 'package:mangayomi/services/webview/webview.dart';
|
||||
import 'package:mangayomi/views/webview/webview.dart';
|
||||
import 'package:mangayomi/views/browse/browse_screen.dart';
|
||||
import 'package:mangayomi/views/browse/extension/extension_lang.dart';
|
||||
import 'package:mangayomi/views/browse/global_search_screen.dart';
|
||||
|
|
|
|||
|
|
@ -106,7 +106,7 @@ class Japscan extends MangaYomiServices {
|
|||
{required String source,
|
||||
required int page,
|
||||
required AutoDisposeFutureProviderRef ref}) async {
|
||||
final dom = ref.watch(httpGetProvider(
|
||||
final dom = await ref.watch(httpGetProvider(
|
||||
url: "https://www.japscan.lol/", source: source, resDom: true)
|
||||
.future) as Document?;
|
||||
if (dom!.querySelectorAll('#top_mangas_week > ul > li ').isNotEmpty) {
|
||||
|
|
@ -236,9 +236,12 @@ class Japscan extends MangaYomiServices {
|
|||
.split('')
|
||||
.map((char) => lookupTable[char] ?? char)
|
||||
.join();
|
||||
|
||||
final decoded = utf8.decode(base64.decode(unscrambledData));
|
||||
final data = jsonDecode(decoded);
|
||||
pageUrls = data["imagesLink"].map((it) => it).toList();
|
||||
for (var url in data["imagesLink"]) {
|
||||
pageUrls.add(url);
|
||||
}
|
||||
} catch (_) {}
|
||||
}
|
||||
isOk = true;
|
||||
|
|
|
|||
|
|
@ -14,11 +14,11 @@ class MangaKawaii extends MangaYomiServices {
|
|||
required String source,
|
||||
required AutoDisposeFutureProviderRef ref}) async {
|
||||
final dom = await ref.watch(httpGetProvider(
|
||||
url: 'https://www.mangakawaii.io$url', source: source, resDom: true)
|
||||
url: 'https://www.mangakawaii.io${manga.url}', source: source, resDom: true)
|
||||
.future) as Document?;
|
||||
List detail = [];
|
||||
manga.imageUrl =
|
||||
"https://cdn.mangakawaii.pics/uploads$url/cover/cover_250x350.jpg";
|
||||
"https://cdn.mangakawaii.pics/uploads${manga.url}/cover/cover_250x350.jpg";
|
||||
if (dom!.querySelectorAll('dd.text-justify.text-break').isNotEmpty) {
|
||||
final tt = dom
|
||||
.querySelectorAll('dd.text-justify.text-break')
|
||||
|
|
|
|||
|
|
@ -1,20 +1,22 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
import 'package:mangayomi/providers/storage_provider.dart';
|
||||
import 'package:mangayomi/models/source.dart';
|
||||
import 'package:mangayomi/views/browse/extension/extension_screen.dart';
|
||||
import 'package:mangayomi/views/browse/extension/refresh_source_list_data.dart';
|
||||
import 'package:mangayomi/views/browse/migrate_screen.dart';
|
||||
import 'package:mangayomi/views/browse/sources_screen.dart';
|
||||
import 'package:mangayomi/views/library/search_text_form_field.dart';
|
||||
|
||||
class BrowseScreen extends StatefulWidget {
|
||||
class BrowseScreen extends ConsumerStatefulWidget {
|
||||
const BrowseScreen({super.key});
|
||||
|
||||
@override
|
||||
State<BrowseScreen> createState() => _BrowseScreenState();
|
||||
ConsumerState<BrowseScreen> createState() => _BrowseScreenState();
|
||||
}
|
||||
|
||||
class _BrowseScreenState extends State<BrowseScreen>
|
||||
class _BrowseScreenState extends ConsumerState<BrowseScreen>
|
||||
with TickerProviderStateMixin {
|
||||
late TabController _tabBarController;
|
||||
|
||||
|
|
@ -43,6 +45,7 @@ class _BrowseScreenState extends State<BrowseScreen>
|
|||
bool _isSearch = false;
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
ref.watch(refreshSourceListDataProvider);
|
||||
return DefaultTabController(
|
||||
animationDuration: Duration.zero,
|
||||
length: 3,
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ class ExtensionsLang extends ConsumerWidget {
|
|||
stream:
|
||||
isar.sources.filter().idIsNotNull().watch(fireImmediately: true),
|
||||
builder: (context, snapshot) {
|
||||
List<Source>? entri = snapshot.hasData ? snapshot.data : [];
|
||||
List<Source>? entries = snapshot.hasData ? snapshot.data : [];
|
||||
return ListView.builder(
|
||||
itemCount: language.length,
|
||||
itemBuilder: (context, index) {
|
||||
|
|
@ -28,22 +28,14 @@ class ExtensionsLang extends ConsumerWidget {
|
|||
lang: lang(language[index]),
|
||||
onChanged: (val) {
|
||||
isar.writeTxnSync(() {
|
||||
if (val == true) {
|
||||
for (var source in entri) {
|
||||
if (source.lang == lang(language[index])) {
|
||||
isar.sources.putSync(source..isActive = true);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (var source in entri) {
|
||||
if (source.lang == lang(language[index])) {
|
||||
isar.sources.putSync(source..isActive = false);
|
||||
}
|
||||
for (var source in entries) {
|
||||
if (source.lang == lang(language[index])) {
|
||||
isar.sources.putSync(source..isActive = val == true);
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
value: entri!
|
||||
value: entries!
|
||||
.where((element) =>
|
||||
element.lang == "${lang(language[index])}")
|
||||
.where((element) => element.isActive!)
|
||||
|
|
|
|||
|
|
@ -5,7 +5,6 @@ import 'package:isar/isar.dart';
|
|||
import 'package:mangayomi/main.dart';
|
||||
import 'package:mangayomi/models/source.dart';
|
||||
import 'package:mangayomi/utils/lang.dart';
|
||||
import 'package:mangayomi/views/browse/extension/refresh_filter_data.dart';
|
||||
import 'package:mangayomi/views/browse/extension/widgets/extension_list_tile_widget.dart';
|
||||
import 'package:mangayomi/views/more/settings/browse/providers/browse_state_provider.dart';
|
||||
|
||||
|
|
@ -17,7 +16,6 @@ class ExtensionScreen extends ConsumerWidget {
|
|||
|
||||
@override
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
ref.watch(refreshFilterDataProvider);
|
||||
return Padding(
|
||||
padding: const EdgeInsets.only(top: 10),
|
||||
child: StreamBuilder(
|
||||
|
|
|
|||
|
|
@ -3,10 +3,10 @@ import 'package:mangayomi/main.dart';
|
|||
import 'package:mangayomi/models/source.dart';
|
||||
import 'package:mangayomi/sources/source_list.dart';
|
||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||
part 'refresh_filter_data.g.dart';
|
||||
part 'refresh_source_list_data.g.dart';
|
||||
|
||||
@riverpod
|
||||
refreshFilterData(RefreshFilterDataRef ref) {
|
||||
refreshSourceListData(RefreshSourceListDataRef ref) {
|
||||
isar.writeTxnSync(() {
|
||||
for (var source in sourcesList) {
|
||||
final sourceF = isar.sources
|
||||
|
|
@ -1,24 +1,25 @@
|
|||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||
|
||||
part of 'refresh_filter_data.dart';
|
||||
part of 'refresh_source_list_data.dart';
|
||||
|
||||
// **************************************************************************
|
||||
// RiverpodGenerator
|
||||
// **************************************************************************
|
||||
|
||||
String _$refreshFilterDataHash() => r'60d819be10e6b321283d90070df92cae84fe3489';
|
||||
String _$refreshSourceListDataHash() =>
|
||||
r'f77838cebad50f030d2038d07584199b4509f407';
|
||||
|
||||
/// See also [refreshFilterData].
|
||||
@ProviderFor(refreshFilterData)
|
||||
final refreshFilterDataProvider = AutoDisposeProvider<dynamic>.internal(
|
||||
refreshFilterData,
|
||||
name: r'refreshFilterDataProvider',
|
||||
/// See also [refreshSourceListData].
|
||||
@ProviderFor(refreshSourceListData)
|
||||
final refreshSourceListDataProvider = AutoDisposeProvider<dynamic>.internal(
|
||||
refreshSourceListData,
|
||||
name: r'refreshSourceListDataProvider',
|
||||
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$refreshFilterDataHash,
|
||||
: _$refreshSourceListDataHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
|
||||
typedef RefreshFilterDataRef = AutoDisposeProviderRef<dynamic>;
|
||||
typedef RefreshSourceListDataRef = AutoDisposeProviderRef<dynamic>;
|
||||
// ignore_for_file: unnecessary_raw_strings, subtype_of_sealed_class, invalid_use_of_internal_member, do_not_use_environment, prefer_const_constructors, public_member_api_docs, avoid_private_typedef_functions
|
||||
|
|
@ -9,7 +9,6 @@ import 'package:mangayomi/models/manga_type.dart';
|
|||
import 'package:mangayomi/models/source.dart';
|
||||
import 'package:mangayomi/utils/headers.dart';
|
||||
import 'package:mangayomi/utils/lang.dart';
|
||||
import 'package:mangayomi/views/browse/extension/refresh_filter_data.dart';
|
||||
import 'package:mangayomi/views/more/settings/browse/providers/browse_state_provider.dart';
|
||||
|
||||
class SourcesScreen extends ConsumerWidget {
|
||||
|
|
@ -17,8 +16,6 @@ class SourcesScreen extends ConsumerWidget {
|
|||
|
||||
@override
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
ref.watch(refreshFilterDataProvider);
|
||||
|
||||
return Padding(
|
||||
padding: const EdgeInsets.only(top: 10),
|
||||
child: StreamBuilder(
|
||||
|
|
@ -26,6 +23,8 @@ class SourcesScreen extends ConsumerWidget {
|
|||
.filter()
|
||||
.idIsNotNull()
|
||||
.isAddedEqualTo(true)
|
||||
.and()
|
||||
.isActiveEqualTo(true)
|
||||
.watch(fireImmediately: true),
|
||||
builder: (context, snapshot) {
|
||||
if (!snapshot.hasData) {
|
||||
|
|
|
|||
|
|
@ -46,7 +46,30 @@ class MangaReaderView extends ConsumerWidget {
|
|||
return chapterData.when(
|
||||
data: (data) {
|
||||
if (data.pageUrls.isEmpty) {
|
||||
Navigator.pop(context);
|
||||
return Scaffold(
|
||||
backgroundColor: Theme.of(context).scaffoldBackgroundColor,
|
||||
appBar: AppBar(
|
||||
title: const Text(''),
|
||||
leading: BackButton(
|
||||
onPressed: () {
|
||||
SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual,
|
||||
overlays: SystemUiOverlay.values);
|
||||
Navigator.pop(context);
|
||||
},
|
||||
),
|
||||
),
|
||||
body: WillPopScope(
|
||||
onWillPop: () async {
|
||||
SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual,
|
||||
overlays: SystemUiOverlay.values);
|
||||
Navigator.pop(context);
|
||||
return false;
|
||||
},
|
||||
child: const Center(
|
||||
child: Text("Error"),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
return MangaChapterPageGallery(
|
||||
path: data.path!,
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ import 'package:mangayomi/utils/colors.dart';
|
|||
import 'package:mangayomi/utils/date.dart';
|
||||
import 'package:mangayomi/utils/media_query.dart';
|
||||
import 'package:mangayomi/views/more/settings/appearance/providers/date_format_state_provider.dart';
|
||||
import 'package:mangayomi/views/more/settings/appearance/providers/pure_black_dark_mode_state_provider.dart';
|
||||
import 'package:mangayomi/views/more/settings/appearance/widgets/blend_level_slider.dart';
|
||||
import 'package:mangayomi/views/more/settings/appearance/widgets/dark_mode_button.dart';
|
||||
import 'package:mangayomi/views/more/settings/appearance/widgets/theme_selector.dart';
|
||||
|
|
@ -15,6 +16,7 @@ class AppearanceScreen extends ConsumerWidget {
|
|||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
final dateFormatState = ref.watch(dateFormatStateProvider);
|
||||
final relativeTimestamps = ref.watch(relativeTimesTampsStateProvider);
|
||||
final pureBlackDarkMode = ref.watch(pureBlackDarkModeStateProvider);
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: const Text("Appearance"),
|
||||
|
|
@ -37,7 +39,21 @@ class AppearanceScreen extends ConsumerWidget {
|
|||
),
|
||||
const DarkModeButton(),
|
||||
const ThemeSelector(),
|
||||
const BlendLevelSlider()
|
||||
Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 10),
|
||||
child: SwitchListTile(
|
||||
title: const Text(
|
||||
"Pure black dark mode",
|
||||
style: TextStyle(fontWeight: FontWeight.bold),
|
||||
),
|
||||
value: pureBlackDarkMode,
|
||||
onChanged: (value) {
|
||||
ref
|
||||
.read(pureBlackDarkModeStateProvider.notifier)
|
||||
.set(value);
|
||||
}),
|
||||
),
|
||||
if (!pureBlackDarkMode) const BlendLevelSlider()
|
||||
],
|
||||
),
|
||||
),
|
||||
|
|
@ -112,7 +128,7 @@ class AppearanceScreen extends ConsumerWidget {
|
|||
},
|
||||
title: const Text(
|
||||
"Relative timestamps",
|
||||
style: TextStyle(),
|
||||
style: TextStyle(fontWeight: FontWeight.bold),
|
||||
),
|
||||
subtitle: Text(
|
||||
relativeTimestampsList[relativeTimestamps],
|
||||
|
|
@ -177,7 +193,7 @@ class AppearanceScreen extends ConsumerWidget {
|
|||
},
|
||||
title: const Text(
|
||||
"Date format",
|
||||
style: TextStyle(),
|
||||
style: TextStyle(fontWeight: FontWeight.bold),
|
||||
),
|
||||
subtitle: Text(
|
||||
"$dateFormatState (${dateFormat(DateTime.now().millisecondsSinceEpoch.toString(), useRelativeTimesTamps: false, dateFormat: dateFormatState, ref: ref)})",
|
||||
|
|
|
|||
|
|
@ -0,0 +1,19 @@
|
|||
import 'package:mangayomi/main.dart';
|
||||
import 'package:mangayomi/models/settings.dart';
|
||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||
part 'pure_black_dark_mode_state_provider.g.dart';
|
||||
|
||||
@riverpod
|
||||
class PureBlackDarkModeState extends _$PureBlackDarkModeState {
|
||||
@override
|
||||
bool build() {
|
||||
return isar.settings.getSync(227)!.pureBlackDarkMode!;
|
||||
}
|
||||
|
||||
void set(bool value) {
|
||||
final settings = isar.settings.getSync(227);
|
||||
state = value;
|
||||
isar.writeTxnSync(
|
||||
() => isar.settings.putSync(settings!..pureBlackDarkMode = value));
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||
|
||||
part of 'pure_black_dark_mode_state_provider.dart';
|
||||
|
||||
// **************************************************************************
|
||||
// RiverpodGenerator
|
||||
// **************************************************************************
|
||||
|
||||
String _$pureBlackDarkModeStateHash() =>
|
||||
r'2dd98617810c8677341dc5cc485d226e6d610cf5';
|
||||
|
||||
/// See also [PureBlackDarkModeState].
|
||||
@ProviderFor(PureBlackDarkModeState)
|
||||
final pureBlackDarkModeStateProvider =
|
||||
AutoDisposeNotifierProvider<PureBlackDarkModeState, bool>.internal(
|
||||
PureBlackDarkModeState.new,
|
||||
name: r'pureBlackDarkModeStateProvider',
|
||||
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$pureBlackDarkModeStateHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
|
||||
typedef _$PureBlackDarkModeState = AutoDisposeNotifier<bool>;
|
||||
// ignore_for_file: unnecessary_raw_strings, subtype_of_sealed_class, invalid_use_of_internal_member, do_not_use_environment, prefer_const_constructors, public_member_api_docs, avoid_private_typedef_functions
|
||||
|
|
@ -13,7 +13,7 @@ class BlendLevelSlider extends ConsumerWidget {
|
|||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
const Padding(
|
||||
padding: EdgeInsets.only(left: 22),
|
||||
padding: EdgeInsets.only(left: 18),
|
||||
child: Text(
|
||||
'Color blend Level',
|
||||
style: TextStyle(fontWeight: FontWeight.bold),
|
||||
|
|
|
|||
|
|
@ -16,29 +16,24 @@ class DarkModeButton extends ConsumerStatefulWidget {
|
|||
class _DarkModeButtonState extends ConsumerState<DarkModeButton> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
bool isDark = ref.watch(themeModeStateProvider);
|
||||
|
||||
return ListTile(
|
||||
onTap: () {
|
||||
if (!isDark) {
|
||||
ref.read(themeModeStateProvider.notifier).setLightTheme();
|
||||
} else {
|
||||
ref.read(themeModeStateProvider.notifier).setDarkTheme();
|
||||
}
|
||||
},
|
||||
title: const Text("Dark mode"),
|
||||
subtitle: Text(
|
||||
ref.watch(themeModeStateProvider) ? 'Off' : 'On',
|
||||
style: TextStyle(fontSize: 11, color: secondaryColor(context)),
|
||||
),
|
||||
trailing: Switch(
|
||||
value: !isDark,
|
||||
onChanged: (dd) {
|
||||
if (!isDark) {
|
||||
ref.read(themeModeStateProvider.notifier).setLightTheme();
|
||||
} else {
|
||||
ref.read(themeModeStateProvider.notifier).setDarkTheme();
|
||||
}
|
||||
}));
|
||||
bool isLight = ref.watch(themeModeStateProvider);
|
||||
return SwitchListTile(
|
||||
onChanged: (value) {
|
||||
if (value) {
|
||||
ref.read(themeModeStateProvider.notifier).setLightTheme();
|
||||
} else {
|
||||
ref.read(themeModeStateProvider.notifier).setDarkTheme();
|
||||
}
|
||||
},
|
||||
title: const Text(
|
||||
"Dark mode",
|
||||
style: TextStyle(fontWeight: FontWeight.bold),
|
||||
),
|
||||
subtitle: Text(
|
||||
isLight ? 'Off' : 'On',
|
||||
style: TextStyle(fontSize: 11, color: secondaryColor(context)),
|
||||
),
|
||||
value: isLight,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ class _ThemeSelectorState extends ConsumerState<ThemeSelector> {
|
|||
return SizedBox(
|
||||
height: 130,
|
||||
child: Row(
|
||||
children: <Widget>[
|
||||
children: [
|
||||
Expanded(
|
||||
child: ListView.builder(
|
||||
padding: const EdgeInsetsDirectional.only(start: 8, end: 16),
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ class _MangaWebViewState extends ConsumerState<MangaWebView> {
|
|||
|
||||
double progress = 0;
|
||||
|
||||
InAppWebViewController? webViewController;
|
||||
InAppWebViewController? _webViewController;
|
||||
late String _url = widget.url;
|
||||
late String _title = widget.title;
|
||||
bool _canGoback = false;
|
||||
|
|
@ -37,7 +37,7 @@ class _MangaWebViewState extends ConsumerState<MangaWebView> {
|
|||
return SafeArea(
|
||||
child: WillPopScope(
|
||||
onWillPop: () async {
|
||||
webViewController?.goBack();
|
||||
_webViewController?.goBack();
|
||||
return false;
|
||||
},
|
||||
child: Column(
|
||||
|
|
@ -72,7 +72,7 @@ class _MangaWebViewState extends ConsumerState<MangaWebView> {
|
|||
color: _canGoback ? null : Colors.grey),
|
||||
onPressed: _canGoback
|
||||
? () {
|
||||
webViewController?.goBack();
|
||||
_webViewController?.goBack();
|
||||
}
|
||||
: null,
|
||||
),
|
||||
|
|
@ -81,7 +81,7 @@ class _MangaWebViewState extends ConsumerState<MangaWebView> {
|
|||
color: _canGoForward ? null : Colors.grey),
|
||||
onPressed: _canGoForward
|
||||
? () {
|
||||
webViewController?.goForward();
|
||||
_webViewController?.goForward();
|
||||
}
|
||||
: null,
|
||||
),
|
||||
|
|
@ -97,7 +97,7 @@ class _MangaWebViewState extends ConsumerState<MangaWebView> {
|
|||
];
|
||||
}, onSelected: (value) async {
|
||||
if (value == 0) {
|
||||
webViewController?.reload();
|
||||
_webViewController?.reload();
|
||||
} else if (value == 1) {
|
||||
Share.share(_url);
|
||||
} else if (value == 2) {
|
||||
|
|
@ -117,7 +117,7 @@ class _MangaWebViewState extends ConsumerState<MangaWebView> {
|
|||
child: InAppWebView(
|
||||
key: webViewKey,
|
||||
onWebViewCreated: (controller) async {
|
||||
webViewController = controller;
|
||||
_webViewController = controller;
|
||||
},
|
||||
onLoadStart: (controller, url) async {
|
||||
setState(() {
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
name: mangayomi
|
||||
description: A new Flutter project.
|
||||
description: Free and open source manga reader multi plateform app inspired by Tachiyomi.
|
||||
# The following line prevents the package from being accidentally published to
|
||||
# pub.dev using `flutter pub publish`. This is preferred for private packages.
|
||||
publish_to: 'none' # Remove this line if you wish to publish to pub.dev
|
||||
|
|
|
|||
Loading…
Reference in a new issue