some fixes

This commit is contained in:
kodjomoustapha 2024-05-22 18:41:53 +01:00
parent fae4929dcb
commit 2f11f495ac
11 changed files with 416 additions and 380 deletions

View file

@ -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;

View file

@ -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});
}

View file

@ -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 {

View file

@ -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,
),
],
],
),
);
}));
}

View file

@ -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,
);
}),
),
],
)),
),
],
),

View file

@ -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) {

View file

@ -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);
}),
),
],
));
}
}

View file

@ -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),
);
},
),
),
],
),
),
);

View file

@ -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);
}
}

View file

@ -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:

View file

@ -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"