mirror of
https://github.com/kodjodevf/mangayomi.git
synced 2026-04-20 19:12:04 +00:00
some fixes
This commit is contained in:
parent
fae4929dcb
commit
2f11f495ac
11 changed files with 416 additions and 380 deletions
|
|
@ -20,7 +20,6 @@ import 'package:mangayomi/modules/more/settings/appearance/providers/pure_black_
|
|||
import 'package:mangayomi/modules/more/settings/appearance/providers/theme_mode_state_provider.dart';
|
||||
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||
import 'package:media_kit/media_kit.dart';
|
||||
import 'package:mangayomi/messages/generated.dart';
|
||||
import 'package:window_manager/window_manager.dart';
|
||||
|
||||
late Isar isar;
|
||||
|
|
@ -28,8 +27,6 @@ late Isar isar;
|
|||
bool hasGPServices = false;
|
||||
|
||||
void main(List<String> args) async {
|
||||
await initializeRust();
|
||||
|
||||
if (Platform.isMacOS) {
|
||||
if (runWebViewTitleBarWidget(args)) {
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -1,9 +0,0 @@
|
|||
import 'package:mangayomi/models/source.dart';
|
||||
|
||||
class MangaType {
|
||||
String? lang;
|
||||
bool? isFullData;
|
||||
Source? source;
|
||||
MangaType(
|
||||
{required this.isFullData, required this.lang, required this.source});
|
||||
}
|
||||
|
|
@ -12,23 +12,30 @@ import 'package:mangayomi/utils/language.dart';
|
|||
import 'package:mangayomi/modules/browse/extension/widgets/extension_list_tile_widget.dart';
|
||||
import 'package:mangayomi/modules/more/settings/browse/providers/browse_state_provider.dart';
|
||||
|
||||
class ExtensionScreen extends ConsumerWidget {
|
||||
class ExtensionScreen extends ConsumerStatefulWidget {
|
||||
final bool isManga;
|
||||
final String query;
|
||||
const ExtensionScreen(
|
||||
{required this.query, required this.isManga, super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
final streamExtensions = ref.watch(getExtensionsStreamProvider(isManga));
|
||||
if (isManga) {
|
||||
ConsumerState<ExtensionScreen> createState() => _ExtensionScreenState();
|
||||
}
|
||||
|
||||
class _ExtensionScreenState extends ConsumerState<ExtensionScreen> {
|
||||
final controller = ScrollController();
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final streamExtensions =
|
||||
ref.watch(getExtensionsStreamProvider(widget.isManga));
|
||||
if (widget.isManga) {
|
||||
ref.watch(fetchMangaSourcesListProvider(id: null, reFresh: false));
|
||||
} else {
|
||||
ref.watch(fetchAnimeSourcesListProvider(id: null, reFresh: false));
|
||||
}
|
||||
final l10n = l10nLocalizations(context)!;
|
||||
return RefreshIndicator(
|
||||
onRefresh: () => isManga
|
||||
onRefresh: () => widget.isManga
|
||||
? ref.refresh(
|
||||
fetchMangaSourcesListProvider(id: null, reFresh: true).future)
|
||||
: ref.refresh(
|
||||
|
|
@ -37,12 +44,12 @@ class ExtensionScreen extends ConsumerWidget {
|
|||
padding: const EdgeInsets.only(top: 10),
|
||||
child: streamExtensions.when(
|
||||
data: (data) {
|
||||
data = query.isEmpty
|
||||
data = widget.query.isEmpty
|
||||
? data
|
||||
: data
|
||||
.where((element) => element.name!
|
||||
.toLowerCase()
|
||||
.contains(query.toLowerCase()))
|
||||
.contains(widget.query.toLowerCase()))
|
||||
.toList();
|
||||
data = data
|
||||
.where((element) => ref.watch(showNSFWStateProvider)
|
||||
|
|
@ -61,108 +68,119 @@ class ExtensionScreen extends ConsumerWidget {
|
|||
.where((element) =>
|
||||
compareVersions(element.version!, element.versionLast!) < 0)
|
||||
.toList();
|
||||
return CustomScrollView(
|
||||
slivers: [
|
||||
if (useTestSourceCode)
|
||||
SliverList.builder(
|
||||
itemCount: testSourceModelList.length,
|
||||
itemBuilder: (context, index) => ExtensionListTileWidget(
|
||||
source: testSourceModelList[index],
|
||||
isTestSource: true,
|
||||
)),
|
||||
SliverGroupedListView<Source, String>(
|
||||
elements: updateEntries,
|
||||
groupBy: (element) => "",
|
||||
groupSeparatorBuilder: (_) => Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 12),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text(
|
||||
l10n.update_pending,
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.bold, fontSize: 13),
|
||||
),
|
||||
ElevatedButton(
|
||||
onPressed: () async {
|
||||
for (var source in updateEntries) {
|
||||
source.isManga!
|
||||
? await ref.watch(
|
||||
fetchMangaSourcesListProvider(
|
||||
id: source.id, reFresh: true)
|
||||
.future)
|
||||
: await ref.watch(
|
||||
fetchAnimeSourcesListProvider(
|
||||
id: source.id, reFresh: true)
|
||||
.future);
|
||||
}
|
||||
},
|
||||
child: Text(l10n.update_all))
|
||||
],
|
||||
return Scrollbar(
|
||||
interactive: true,
|
||||
controller: controller,
|
||||
thickness: 12,
|
||||
radius: const Radius.circular(10),
|
||||
child: CustomScrollView(
|
||||
controller: controller,
|
||||
slivers: [
|
||||
if (useTestSourceCode)
|
||||
SliverList.builder(
|
||||
itemCount: testSourceModelList.length,
|
||||
itemBuilder: (context, index) =>
|
||||
ExtensionListTileWidget(
|
||||
source: testSourceModelList[index],
|
||||
isTestSource: true,
|
||||
)),
|
||||
SliverGroupedListView<Source, String>(
|
||||
elements: updateEntries,
|
||||
groupBy: (element) => "",
|
||||
groupSeparatorBuilder: (_) => Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 12),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text(
|
||||
l10n.update_pending,
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.bold, fontSize: 13),
|
||||
),
|
||||
ElevatedButton(
|
||||
onPressed: () async {
|
||||
for (var source in updateEntries) {
|
||||
source.isManga!
|
||||
? await ref.watch(
|
||||
fetchMangaSourcesListProvider(
|
||||
id: source.id, reFresh: true)
|
||||
.future)
|
||||
: await ref.watch(
|
||||
fetchAnimeSourcesListProvider(
|
||||
id: source.id, reFresh: true)
|
||||
.future);
|
||||
}
|
||||
},
|
||||
child: Text(l10n.update_all))
|
||||
],
|
||||
),
|
||||
),
|
||||
itemBuilder: (context, Source element) {
|
||||
return ExtensionListTileWidget(
|
||||
source: element,
|
||||
);
|
||||
},
|
||||
groupComparator: (group1, group2) =>
|
||||
group1.compareTo(group2),
|
||||
itemComparator: (item1, item2) =>
|
||||
item1.name!.compareTo(item2.name!),
|
||||
order: GroupedListOrder.ASC,
|
||||
),
|
||||
itemBuilder: (context, Source element) {
|
||||
return ExtensionListTileWidget(
|
||||
source: element,
|
||||
);
|
||||
},
|
||||
groupComparator: (group1, group2) => group1.compareTo(group2),
|
||||
itemComparator: (item1, item2) =>
|
||||
item1.name!.compareTo(item2.name!),
|
||||
order: GroupedListOrder.ASC,
|
||||
),
|
||||
SliverGroupedListView<Source, String>(
|
||||
elements: installedEntries,
|
||||
groupBy: (element) => "",
|
||||
groupSeparatorBuilder: (_) => Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 12),
|
||||
child: Text(
|
||||
l10n.installed,
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.bold, fontSize: 13),
|
||||
SliverGroupedListView<Source, String>(
|
||||
elements: installedEntries,
|
||||
groupBy: (element) => "",
|
||||
groupSeparatorBuilder: (_) => Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 12),
|
||||
child: Text(
|
||||
l10n.installed,
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.bold, fontSize: 13),
|
||||
),
|
||||
),
|
||||
itemBuilder: (context, Source element) {
|
||||
return ExtensionListTileWidget(source: element);
|
||||
},
|
||||
groupComparator: (group1, group2) =>
|
||||
group1.compareTo(group2),
|
||||
itemComparator: (item1, item2) =>
|
||||
item1.name!.compareTo(item2.name!),
|
||||
order: GroupedListOrder.ASC,
|
||||
),
|
||||
itemBuilder: (context, Source element) {
|
||||
return ExtensionListTileWidget(source: element);
|
||||
},
|
||||
groupComparator: (group1, group2) => group1.compareTo(group2),
|
||||
itemComparator: (item1, item2) =>
|
||||
item1.name!.compareTo(item2.name!),
|
||||
order: GroupedListOrder.ASC,
|
||||
),
|
||||
SliverGroupedListView<Source, String>(
|
||||
elements: notInstalledEntries,
|
||||
groupBy: (element) =>
|
||||
completeLanguageName(element.lang!.toLowerCase()),
|
||||
groupSeparatorBuilder: (String groupByValue) => Padding(
|
||||
padding: const EdgeInsets.only(left: 12),
|
||||
child: Row(
|
||||
children: [
|
||||
Text(
|
||||
groupByValue,
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.bold, fontSize: 13),
|
||||
),
|
||||
],
|
||||
SliverGroupedListView<Source, String>(
|
||||
elements: notInstalledEntries,
|
||||
groupBy: (element) =>
|
||||
completeLanguageName(element.lang!.toLowerCase()),
|
||||
groupSeparatorBuilder: (String groupByValue) => Padding(
|
||||
padding: const EdgeInsets.only(left: 12),
|
||||
child: Row(
|
||||
children: [
|
||||
Text(
|
||||
groupByValue,
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.bold, fontSize: 13),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
itemBuilder: (context, Source element) {
|
||||
return ExtensionListTileWidget(
|
||||
source: element,
|
||||
);
|
||||
},
|
||||
groupComparator: (group1, group2) =>
|
||||
group1.compareTo(group2),
|
||||
itemComparator: (item1, item2) =>
|
||||
item1.name!.compareTo(item2.name!),
|
||||
order: GroupedListOrder.ASC,
|
||||
),
|
||||
itemBuilder: (context, Source element) {
|
||||
return ExtensionListTileWidget(
|
||||
source: element,
|
||||
);
|
||||
},
|
||||
groupComparator: (group1, group2) => group1.compareTo(group2),
|
||||
itemComparator: (item1, item2) =>
|
||||
item1.name!.compareTo(item2.name!),
|
||||
order: GroupedListOrder.ASC,
|
||||
),
|
||||
],
|
||||
],
|
||||
),
|
||||
);
|
||||
},
|
||||
error: (error, _) => Center(
|
||||
child: ElevatedButton(
|
||||
onPressed: () {
|
||||
if (isManga) {
|
||||
if (widget.isManga) {
|
||||
ref.invalidate(
|
||||
fetchMangaSourcesListProvider(id: null, reFresh: true));
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -10,14 +10,20 @@ import 'package:mangayomi/sources/source_test.dart';
|
|||
import 'package:mangayomi/utils/language.dart';
|
||||
import 'package:mangayomi/modules/more/settings/browse/providers/browse_state_provider.dart';
|
||||
|
||||
class SourcesScreen extends ConsumerWidget {
|
||||
class SourcesScreen extends ConsumerStatefulWidget {
|
||||
final Function(int) tabIndex;
|
||||
final bool isManga;
|
||||
const SourcesScreen(
|
||||
{required this.tabIndex, required this.isManga, super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
ConsumerState<SourcesScreen> createState() => _SourcesScreenState();
|
||||
}
|
||||
|
||||
class _SourcesScreenState extends ConsumerState<SourcesScreen> {
|
||||
final controller = ScrollController();
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final showNSFW = ref.watch(showNSFWStateProvider);
|
||||
final l10n = l10nLocalizations(context)!;
|
||||
return Padding(
|
||||
|
|
@ -30,7 +36,7 @@ class SourcesScreen extends ConsumerWidget {
|
|||
.and()
|
||||
.isActiveEqualTo(true)
|
||||
.and()
|
||||
.isMangaEqualTo(isManga)
|
||||
.isMangaEqualTo(widget.isManga)
|
||||
.watch(fireImmediately: true),
|
||||
builder: (context, snapshot) {
|
||||
if (!snapshot.hasData) {
|
||||
|
|
@ -50,7 +56,8 @@ class SourcesScreen extends ConsumerWidget {
|
|||
Padding(
|
||||
padding: const EdgeInsets.all(8.0),
|
||||
child: ElevatedButton.icon(
|
||||
onPressed: () => tabIndex(isManga ? 2 : 3),
|
||||
onPressed: () =>
|
||||
widget.tabIndex(widget.isManga ? 2 : 3),
|
||||
icon: const Icon(Icons.extension_rounded),
|
||||
label: Text(context.l10n.show_extensions)),
|
||||
)
|
||||
|
|
@ -63,97 +70,104 @@ class SourcesScreen extends ConsumerWidget {
|
|||
sources.where((element) => element.isPinned!).toList();
|
||||
final allEntriesWithoutIspinned =
|
||||
sources.where((element) => !element.isPinned!).toList();
|
||||
return CustomScrollView(
|
||||
slivers: [
|
||||
if (useTestSourceCode)
|
||||
SliverList.builder(
|
||||
itemCount: testSourceModelList.length,
|
||||
itemBuilder: (context, index) => SourceListTile(
|
||||
source: testSourceModelList[index],
|
||||
isManga: isManga)),
|
||||
SliverGroupedListView<Source, String>(
|
||||
elements: lastUsedEntries,
|
||||
groupBy: (element) => "",
|
||||
groupSeparatorBuilder: (String groupByValue) => Padding(
|
||||
padding: const EdgeInsets.only(left: 12),
|
||||
child: Row(
|
||||
children: [
|
||||
Text(
|
||||
l10n.last_used,
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.bold, fontSize: 13),
|
||||
),
|
||||
],
|
||||
return Scrollbar(
|
||||
interactive: true,
|
||||
controller: controller,
|
||||
thickness: 12,
|
||||
radius: const Radius.circular(10),
|
||||
child: CustomScrollView(
|
||||
controller: controller,
|
||||
slivers: [
|
||||
if (useTestSourceCode)
|
||||
SliverList.builder(
|
||||
itemCount: testSourceModelList.length,
|
||||
itemBuilder: (context, index) => SourceListTile(
|
||||
source: testSourceModelList[index],
|
||||
isManga: widget.isManga)),
|
||||
SliverGroupedListView<Source, String>(
|
||||
elements: lastUsedEntries,
|
||||
groupBy: (element) => "",
|
||||
groupSeparatorBuilder: (String groupByValue) => Padding(
|
||||
padding: const EdgeInsets.only(left: 12),
|
||||
child: Row(
|
||||
children: [
|
||||
Text(
|
||||
l10n.last_used,
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.bold, fontSize: 13),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
itemBuilder: (context, Source element) {
|
||||
return SourceListTile(
|
||||
source: element,
|
||||
isManga: widget.isManga,
|
||||
);
|
||||
},
|
||||
groupComparator: (group1, group2) =>
|
||||
group1.compareTo(group2),
|
||||
itemComparator: (item1, item2) =>
|
||||
item1.name!.compareTo(item2.name!),
|
||||
order: GroupedListOrder.ASC,
|
||||
),
|
||||
itemBuilder: (context, Source element) {
|
||||
return SourceListTile(
|
||||
source: element,
|
||||
isManga: isManga,
|
||||
);
|
||||
},
|
||||
groupComparator: (group1, group2) =>
|
||||
group1.compareTo(group2),
|
||||
itemComparator: (item1, item2) =>
|
||||
item1.name!.compareTo(item2.name!),
|
||||
order: GroupedListOrder.ASC,
|
||||
),
|
||||
SliverGroupedListView<Source, String>(
|
||||
elements: isPinnedEntries,
|
||||
groupBy: (element) => "",
|
||||
groupSeparatorBuilder: (String groupByValue) => Padding(
|
||||
padding: const EdgeInsets.only(left: 12),
|
||||
child: Row(
|
||||
children: [
|
||||
Text(
|
||||
l10n.pinned,
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.bold, fontSize: 13),
|
||||
),
|
||||
],
|
||||
SliverGroupedListView<Source, String>(
|
||||
elements: isPinnedEntries,
|
||||
groupBy: (element) => "",
|
||||
groupSeparatorBuilder: (String groupByValue) => Padding(
|
||||
padding: const EdgeInsets.only(left: 12),
|
||||
child: Row(
|
||||
children: [
|
||||
Text(
|
||||
l10n.pinned,
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.bold, fontSize: 13),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
itemBuilder: (context, Source element) {
|
||||
return SourceListTile(
|
||||
source: element,
|
||||
isManga: widget.isManga,
|
||||
);
|
||||
},
|
||||
groupComparator: (group1, group2) =>
|
||||
group1.compareTo(group2),
|
||||
itemComparator: (item1, item2) =>
|
||||
item1.name!.compareTo(item2.name!),
|
||||
order: GroupedListOrder.ASC,
|
||||
),
|
||||
itemBuilder: (context, Source element) {
|
||||
return SourceListTile(
|
||||
source: element,
|
||||
isManga: isManga,
|
||||
);
|
||||
},
|
||||
groupComparator: (group1, group2) =>
|
||||
group1.compareTo(group2),
|
||||
itemComparator: (item1, item2) =>
|
||||
item1.name!.compareTo(item2.name!),
|
||||
order: GroupedListOrder.ASC,
|
||||
),
|
||||
SliverGroupedListView<Source, String>(
|
||||
elements: allEntriesWithoutIspinned,
|
||||
groupBy: (element) =>
|
||||
completeLanguageName(element.lang!.toLowerCase()),
|
||||
groupSeparatorBuilder: (String groupByValue) => Padding(
|
||||
padding: const EdgeInsets.only(left: 12),
|
||||
child: Row(
|
||||
children: [
|
||||
Text(
|
||||
groupByValue,
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.bold, fontSize: 13),
|
||||
),
|
||||
],
|
||||
SliverGroupedListView<Source, String>(
|
||||
elements: allEntriesWithoutIspinned,
|
||||
groupBy: (element) =>
|
||||
completeLanguageName(element.lang!.toLowerCase()),
|
||||
groupSeparatorBuilder: (String groupByValue) => Padding(
|
||||
padding: const EdgeInsets.only(left: 12),
|
||||
child: Row(
|
||||
children: [
|
||||
Text(
|
||||
groupByValue,
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.bold, fontSize: 13),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
itemBuilder: (context, Source element) {
|
||||
return SourceListTile(
|
||||
source: element,
|
||||
isManga: widget.isManga,
|
||||
);
|
||||
},
|
||||
groupComparator: (group1, group2) =>
|
||||
group1.compareTo(group2),
|
||||
itemComparator: (item1, item2) =>
|
||||
item1.name!.compareTo(item2.name!),
|
||||
order: GroupedListOrder.ASC,
|
||||
),
|
||||
itemBuilder: (context, Source element) {
|
||||
return SourceListTile(
|
||||
source: element,
|
||||
isManga: isManga,
|
||||
);
|
||||
},
|
||||
groupComparator: (group1, group2) =>
|
||||
group1.compareTo(group2),
|
||||
itemComparator: (item1, item2) =>
|
||||
item1.name!.compareTo(item2.name!),
|
||||
order: GroupedListOrder.ASC,
|
||||
),
|
||||
],
|
||||
],
|
||||
),
|
||||
);
|
||||
}));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -24,7 +24,6 @@ import 'package:mangayomi/modules/more/settings/appearance/providers/pure_black_
|
|||
import 'package:mangayomi/modules/more/settings/track/widgets/track_listile.dart';
|
||||
import 'package:mangayomi/modules/widgets/custom_draggable_tabbar.dart';
|
||||
import 'package:mangayomi/modules/widgets/custom_extended_image_provider.dart';
|
||||
import 'package:mangayomi/modules/widgets/draggable_scroll_bar.dart';
|
||||
import 'package:mangayomi/providers/l10n_providers.dart';
|
||||
import 'package:mangayomi/providers/storage_provider.dart';
|
||||
import 'package:mangayomi/services/get_source_baseurl.dart';
|
||||
|
|
@ -46,6 +45,7 @@ import 'package:mangayomi/modules/widgets/progress_center.dart';
|
|||
import 'package:photo_view/photo_view.dart';
|
||||
import 'package:photo_view/photo_view_gallery.dart';
|
||||
import 'package:share_plus/share_plus.dart';
|
||||
import 'package:super_sliver_list/super_sliver_list.dart';
|
||||
import 'package:url_launcher/url_launcher.dart';
|
||||
|
||||
import '../../../utils/constant.dart';
|
||||
|
|
@ -537,104 +537,127 @@ class _MangaDetailViewState extends ConsumerState<MangaDetailView>
|
|||
child: _bodyContainer(
|
||||
chapterLength: chapters.length))),
|
||||
Expanded(
|
||||
child: DraggableScrollbarWidget(
|
||||
child: Scrollbar(
|
||||
interactive: true,
|
||||
thickness: 12,
|
||||
radius: const Radius.circular(10),
|
||||
controller: _scrollController,
|
||||
child: ListView.builder(
|
||||
controller: _scrollController,
|
||||
padding: const EdgeInsets.only(top: 0, bottom: 60),
|
||||
itemCount: chapters.length + 1,
|
||||
itemBuilder: (context, index) {
|
||||
final l10n = l10nLocalizations(context)!;
|
||||
int finalIndex = index - 1;
|
||||
if (index == 0) {
|
||||
return context.isTablet
|
||||
? Column(
|
||||
children: [
|
||||
Padding(
|
||||
padding: const EdgeInsets.all(8.0),
|
||||
child: Row(
|
||||
mainAxisAlignment: isLocalArchive
|
||||
? MainAxisAlignment
|
||||
.spaceBetween
|
||||
: MainAxisAlignment.start,
|
||||
child: CustomScrollView(
|
||||
controller: _scrollController,
|
||||
slivers: [
|
||||
SliverPadding(
|
||||
padding:
|
||||
const EdgeInsets.only(top: 0, bottom: 60),
|
||||
sliver: SuperSliverList.builder(
|
||||
itemCount: chapters.length + 1,
|
||||
itemBuilder: (context, index) {
|
||||
final l10n = l10nLocalizations(context)!;
|
||||
int finalIndex = index - 1;
|
||||
if (index == 0) {
|
||||
return context.isTablet
|
||||
? Column(
|
||||
children: [
|
||||
Container(
|
||||
height: chapters.isEmpty
|
||||
? context.height(1)
|
||||
: null,
|
||||
color: Theme.of(context)
|
||||
.scaffoldBackgroundColor,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets
|
||||
.symmetric(
|
||||
horizontal: 8),
|
||||
child: Text(
|
||||
widget.manga!.isManga!
|
||||
? l10n.n_chapters(
|
||||
chapters.length)
|
||||
: l10n.n_episodes(
|
||||
chapters.length),
|
||||
style: const TextStyle(
|
||||
fontWeight:
|
||||
FontWeight.bold),
|
||||
),
|
||||
Padding(
|
||||
padding:
|
||||
const EdgeInsets.all(8.0),
|
||||
child: Row(
|
||||
mainAxisAlignment:
|
||||
isLocalArchive
|
||||
? MainAxisAlignment
|
||||
.spaceBetween
|
||||
: MainAxisAlignment
|
||||
.start,
|
||||
children: [
|
||||
Container(
|
||||
height: chapters.isEmpty
|
||||
? context.height(1)
|
||||
: null,
|
||||
color: Theme.of(context)
|
||||
.scaffoldBackgroundColor,
|
||||
child: Padding(
|
||||
padding:
|
||||
const EdgeInsets
|
||||
.symmetric(
|
||||
horizontal:
|
||||
8),
|
||||
child: Text(
|
||||
widget.manga!
|
||||
.isManga!
|
||||
? l10n.n_chapters(
|
||||
chapters
|
||||
.length)
|
||||
: l10n.n_episodes(
|
||||
chapters
|
||||
.length),
|
||||
style: const TextStyle(
|
||||
fontWeight:
|
||||
FontWeight
|
||||
.bold),
|
||||
),
|
||||
),
|
||||
),
|
||||
if (isLocalArchive)
|
||||
ElevatedButton.icon(
|
||||
style: ElevatedButton.styleFrom(
|
||||
padding:
|
||||
const EdgeInsets
|
||||
.all(5),
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius:
|
||||
BorderRadius
|
||||
.circular(
|
||||
5))),
|
||||
icon: Icon(Icons.add,
|
||||
color: context
|
||||
.secondaryColor),
|
||||
label: Text(
|
||||
widget.manga!.isManga!
|
||||
? l10n
|
||||
.add_chapters
|
||||
: l10n
|
||||
.add_episodes,
|
||||
style: TextStyle(
|
||||
fontWeight:
|
||||
FontWeight
|
||||
.bold,
|
||||
color: context
|
||||
.secondaryColor),
|
||||
),
|
||||
onPressed: () async {
|
||||
await ref.watch(importArchivesFromFileProvider(
|
||||
isManga: widget
|
||||
.manga!
|
||||
.isManga!,
|
||||
widget
|
||||
.manga,
|
||||
init: false)
|
||||
.future);
|
||||
},
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
if (isLocalArchive)
|
||||
ElevatedButton.icon(
|
||||
style: ElevatedButton.styleFrom(
|
||||
padding:
|
||||
const EdgeInsets
|
||||
.all(5),
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius:
|
||||
BorderRadius
|
||||
.circular(
|
||||
5))),
|
||||
icon: Icon(Icons.add,
|
||||
color: context
|
||||
.secondaryColor),
|
||||
label: Text(
|
||||
widget.manga!.isManga!
|
||||
? l10n.add_chapters
|
||||
: l10n.add_episodes,
|
||||
style: TextStyle(
|
||||
fontWeight:
|
||||
FontWeight.bold,
|
||||
color: context
|
||||
.secondaryColor),
|
||||
),
|
||||
onPressed: () async {
|
||||
await ref.watch(
|
||||
importArchivesFromFileProvider(
|
||||
isManga: widget
|
||||
.manga!
|
||||
.isManga!,
|
||||
widget.manga,
|
||||
init: false)
|
||||
.future);
|
||||
},
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
)
|
||||
: _bodyContainer(
|
||||
chapterLength: chapters.length);
|
||||
}
|
||||
int reverseIndex = chapters.length -
|
||||
chapters.reversed.toList().indexOf(
|
||||
chapters.reversed.toList()[finalIndex]) -
|
||||
1;
|
||||
final indexx =
|
||||
reverse ? reverseIndex : finalIndex;
|
||||
return ChapterListTileWidget(
|
||||
chapter: chapters[indexx],
|
||||
chapterList: chapterList,
|
||||
sourceExist: widget.sourceExist,
|
||||
);
|
||||
})),
|
||||
)
|
||||
: _bodyContainer(
|
||||
chapterLength: chapters.length);
|
||||
}
|
||||
int reverseIndex = chapters.length -
|
||||
chapters.reversed.toList().indexOf(
|
||||
chapters.reversed
|
||||
.toList()[finalIndex]) -
|
||||
1;
|
||||
final indexx =
|
||||
reverse ? reverseIndex : finalIndex;
|
||||
return ChapterListTileWidget(
|
||||
chapter: chapters[indexx],
|
||||
chapterList: chapterList,
|
||||
sourceExist: widget.sourceExist,
|
||||
);
|
||||
}),
|
||||
),
|
||||
],
|
||||
)),
|
||||
),
|
||||
],
|
||||
),
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@ import 'package:flutter/material.dart';
|
|||
import 'package:go_router/go_router.dart';
|
||||
import 'package:mangayomi/eval/dart/model/m_bridge.dart';
|
||||
import 'package:mangayomi/main.dart';
|
||||
import 'package:mangayomi/messages/generated.dart';
|
||||
import 'package:mangayomi/models/chapter.dart';
|
||||
import 'package:mangayomi/models/manga.dart';
|
||||
import 'package:mangayomi/models/settings.dart';
|
||||
|
|
@ -155,6 +156,7 @@ class _MangaChapterPageGalleryState
|
|||
SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual,
|
||||
overlays: SystemUiOverlay.values);
|
||||
}
|
||||
finalizeRust();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
|
|
@ -1000,6 +1002,7 @@ class _MangaChapterPageGalleryState
|
|||
_uChapDataPreload.addAll(_chapterUrlModel.uChapDataPreload);
|
||||
_readerController.setMangaHistoryUpdate();
|
||||
await Future.delayed(const Duration(milliseconds: 1));
|
||||
await initializeRust();
|
||||
final fullScreenReader = ref.watch(fullScreenReaderStateProvider);
|
||||
if (fullScreenReader) {
|
||||
if (isDesktop) {
|
||||
|
|
|
|||
|
|
@ -4,9 +4,9 @@ import 'package:mangayomi/main.dart';
|
|||
import 'package:mangayomi/models/chapter.dart';
|
||||
import 'package:mangayomi/modules/manga/reader/providers/push_router.dart';
|
||||
import 'package:mangayomi/modules/manga/reader/providers/reader_controller_provider.dart';
|
||||
import 'package:mangayomi/modules/widgets/draggable_scroll_bar.dart';
|
||||
import 'package:mangayomi/utils/date.dart';
|
||||
import 'package:mangayomi/utils/extensions/build_context_extensions.dart';
|
||||
import 'package:super_sliver_list/super_sliver_list.dart';
|
||||
|
||||
Widget btnToShowChapterListDialog(
|
||||
BuildContext context, String title, Chapter chapter,
|
||||
|
|
@ -60,18 +60,28 @@ class _ChapterListWidgetState extends State<ChapterListWidget> {
|
|||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return DraggableScrollbarWidget(
|
||||
return Scrollbar(
|
||||
interactive: true,
|
||||
thickness: 12,
|
||||
radius: const Radius.circular(10),
|
||||
controller: controller,
|
||||
child: ListView.builder(
|
||||
padding: const EdgeInsets.symmetric(vertical: 2),
|
||||
controller: controller,
|
||||
itemCount: chapterList.length,
|
||||
itemBuilder: (context, index) {
|
||||
final chapter = chapterList[index];
|
||||
final currentChap = chapter == chapterList[currentChapIndex];
|
||||
return ChapterListTile(
|
||||
chapter: chapter, currentChap: currentChap);
|
||||
}));
|
||||
child: CustomScrollView(
|
||||
controller: controller,
|
||||
slivers: [
|
||||
SliverPadding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 2),
|
||||
sliver: SuperSliverList.builder(
|
||||
itemCount: chapterList.length,
|
||||
itemBuilder: (context, index) {
|
||||
final chapter = chapterList[index];
|
||||
final currentChap =
|
||||
chapter == chapterList[currentChapIndex];
|
||||
return ChapterListTile(
|
||||
chapter: chapter, currentChap: currentChap);
|
||||
}),
|
||||
),
|
||||
],
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -3,7 +3,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|||
import 'package:google_fonts/google_fonts.dart';
|
||||
import 'package:mangayomi/modules/more/settings/appearance/providers/app_font_family.dart';
|
||||
import 'package:mangayomi/modules/more/settings/appearance/providers/theme_mode_state_provider.dart';
|
||||
import 'package:mangayomi/modules/widgets/draggable_scroll_bar.dart';
|
||||
import 'package:mangayomi/providers/l10n_providers.dart';
|
||||
import 'package:mangayomi/utils/extensions/build_context_extensions.dart';
|
||||
import 'package:mangayomi/utils/date.dart';
|
||||
|
|
@ -14,6 +13,7 @@ import 'package:mangayomi/modules/more/settings/appearance/widgets/dark_mode_but
|
|||
import 'package:mangayomi/modules/more/settings/appearance/widgets/theme_selector.dart';
|
||||
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||
import 'package:mangayomi/utils/language.dart';
|
||||
import 'package:super_sliver_list/super_sliver_list.dart';
|
||||
|
||||
class AppearanceScreen extends ConsumerWidget {
|
||||
const AppearanceScreen({super.key});
|
||||
|
|
@ -206,32 +206,49 @@ class AppearanceScreen extends ConsumerWidget {
|
|||
textValue.toLowerCase()))
|
||||
.toList();
|
||||
return Flexible(
|
||||
child: DraggableScrollbarWidget(
|
||||
child: Scrollbar(
|
||||
interactive: true,
|
||||
thickness: 12,
|
||||
radius: const Radius.circular(10),
|
||||
controller: controller,
|
||||
child: ListView.builder(
|
||||
child: CustomScrollView(
|
||||
controller: controller,
|
||||
itemCount: values.length,
|
||||
itemBuilder: (context, index) {
|
||||
final value = values[index];
|
||||
return RadioListTile(
|
||||
dense: true,
|
||||
contentPadding:
|
||||
slivers: [
|
||||
SliverPadding(
|
||||
padding:
|
||||
const EdgeInsets.all(0),
|
||||
value: value
|
||||
.value()
|
||||
.fontFamily,
|
||||
groupValue: appFontFamily,
|
||||
onChanged: (value) {
|
||||
ref
|
||||
.read(
|
||||
appFontFamilyProvider
|
||||
.notifier)
|
||||
.set(value);
|
||||
Navigator.pop(context);
|
||||
},
|
||||
title: Text(value.key),
|
||||
);
|
||||
},
|
||||
sliver:
|
||||
SuperSliverList.builder(
|
||||
itemCount: values.length,
|
||||
itemBuilder:
|
||||
(context, index) {
|
||||
final value =
|
||||
values[index];
|
||||
return RadioListTile(
|
||||
dense: true,
|
||||
contentPadding:
|
||||
const EdgeInsets
|
||||
.all(0),
|
||||
value: value
|
||||
.value()
|
||||
.fontFamily,
|
||||
groupValue:
|
||||
appFontFamily,
|
||||
onChanged: (value) {
|
||||
ref
|
||||
.read(appFontFamilyProvider
|
||||
.notifier)
|
||||
.set(value);
|
||||
Navigator.pop(
|
||||
context);
|
||||
},
|
||||
title:
|
||||
Text(value.key),
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
|
|
|
|||
|
|
@ -1,37 +0,0 @@
|
|||
import 'package:draggable_scrollbar/draggable_scrollbar.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:mangayomi/utils/extensions/build_context_extensions.dart';
|
||||
|
||||
class DraggableScrollbarWidget extends StatelessWidget {
|
||||
final ScrollController controller;
|
||||
final BoxScrollView child;
|
||||
const DraggableScrollbarWidget(
|
||||
{super.key, required this.controller, required this.child});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return context.isDesktop
|
||||
? child
|
||||
: DraggableScrollbar(
|
||||
padding: const EdgeInsets.only(right: 7),
|
||||
heightScrollThumb: 48.0,
|
||||
backgroundColor: context.primaryColor,
|
||||
scrollThumbBuilder:
|
||||
(backgroundColor, thumbAnimation, labelAnimation, height,
|
||||
{labelConstraints, labelText}) {
|
||||
return FadeTransition(
|
||||
opacity: thumbAnimation,
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
color: backgroundColor,
|
||||
borderRadius: BorderRadius.circular(20)),
|
||||
height: height,
|
||||
width: 8.0,
|
||||
),
|
||||
);
|
||||
},
|
||||
scrollbarTimeToFade: const Duration(seconds: 2),
|
||||
controller: controller,
|
||||
child: child);
|
||||
}
|
||||
}
|
||||
24
pubspec.lock
24
pubspec.lock
|
|
@ -213,10 +213,10 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: cronet_http
|
||||
sha256: "9b9f00ae48971bc8a8cbdd4528bd35511adce00fb79d1ebf9f9907667056640f"
|
||||
sha256: "013c515e2caf1381fcdc577b0c1a3625021b0df32880c20c06757fc616d375bb"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.2.0"
|
||||
version: "1.2.1"
|
||||
cross_file:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -320,14 +320,6 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.4.1"
|
||||
draggable_scrollbar:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: draggable_scrollbar
|
||||
sha256: a906e27fc1ee056e2942d66989dd0cb5b70a361e7d44af566cfa1b584054eac3
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.1.0"
|
||||
encrypt:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
|
@ -778,10 +770,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: jni
|
||||
sha256: "499558e919997adfc45809a66caf0b95b91393e23289dd2826b152f8f04e6611"
|
||||
sha256: "6f8e04339f96cb32879acb181c60b2c1e2310ff86f3c62bcd1afcfb4b28b665d"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.7.3"
|
||||
version: "0.9.2"
|
||||
js:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -1452,6 +1444,14 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.2.0"
|
||||
super_sliver_list:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: super_sliver_list
|
||||
sha256: b1e1e64d08ce40e459b9bb5d9f8e361617c26b8c9f3bb967760b0f436b6e3f56
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.4.1"
|
||||
synchronized:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
|
|||
|
|
@ -20,7 +20,6 @@ dependencies:
|
|||
flex_color_scheme: ^7.3.1
|
||||
extended_image: ^8.2.0
|
||||
photo_view: ^0.15.0
|
||||
draggable_scrollbar: ^0.1.0
|
||||
grouped_list: ^5.1.2
|
||||
intl: ^0.19.0
|
||||
google_fonts: ^6.1.0
|
||||
|
|
@ -68,7 +67,7 @@ dependencies:
|
|||
git:
|
||||
url: https://github.com/kodjodevf/flutter_qjs.git
|
||||
ref: main
|
||||
cronet_http: ^1.2.0
|
||||
cronet_http: ^1.2.1
|
||||
cupertino_http: ^1.3.0
|
||||
http: ^1.2.1
|
||||
google_api_availability: ^5.0.0
|
||||
|
|
@ -77,6 +76,7 @@ dependencies:
|
|||
highlight: ^0.7.0
|
||||
json_view: ^0.4.2
|
||||
rinf: ^6.9.2
|
||||
super_sliver_list: ^0.4.1
|
||||
|
||||
dependency_overrides:
|
||||
analyzer: ">=5.2.0 <7.0.0"
|
||||
|
|
|
|||
Loading…
Reference in a new issue