Add a setting for number of images preloaded. Close #192

This commit is contained in:
2025-02-14 10:58:21 +08:00
parent d179b39b64
commit 350bcf4ffc
4 changed files with 31 additions and 5 deletions

View File

@@ -332,7 +332,8 @@
"Created successfully": "创建成功", "Created successfully": "创建成功",
"name": "名称", "name": "名称",
"Reverse tap to turn Pages": "反转点击翻页", "Reverse tap to turn Pages": "反转点击翻页",
"Show all": "显示全部" "Show all": "显示全部",
"Number of images preloaded": "预加载图片数量"
}, },
"zh_TW": { "zh_TW": {
"Home": "首頁", "Home": "首頁",
@@ -667,6 +668,7 @@
"Created successfully": "創建成功", "Created successfully": "創建成功",
"name": "名稱", "name": "名稱",
"Reverse tap to turn Pages": "反轉點擊翻頁", "Reverse tap to turn Pages": "反轉點擊翻頁",
"Show all": "顯示全部" "Show all": "顯示全部",
"Number of images preloaded": "預加載圖片數量"
} }
} }

View File

@@ -158,6 +158,7 @@ class _Settings with ChangeNotifier {
'sni': true, 'sni': true,
'autoAddLanguageFilter': 'none', // none, chinese, english, japanese 'autoAddLanguageFilter': 'none', // none, chinese, english, japanese
'comicSourceListUrl': "https://cdn.jsdelivr.net/gh/venera-app/venera-configs@latest/index.json", 'comicSourceListUrl': "https://cdn.jsdelivr.net/gh/venera-app/venera-configs@latest/index.json",
'preloadImageCount': 4,
}; };
operator [](String key) { operator [](String key) {

View File

@@ -105,7 +105,7 @@ class _GalleryModeState extends State<_GalleryMode>
late List<bool> cached; late List<bool> cached;
int get preCacheCount => 4; int get preCacheCount => appdata.settings["preloadImageCount"];
var photoViewControllers = <int, PhotoViewController>{}; var photoViewControllers = <int, PhotoViewController>{};
@@ -371,6 +371,9 @@ class _ContinuousModeState extends State<_ContinuousMode>
var fingers = 0; var fingers = 0;
bool disableScroll = false; bool disableScroll = false;
late List<bool> cached;
int get preCacheCount => appdata.settings["preloadImageCount"];
/// Whether the user was scrolling the page. /// Whether the user was scrolling the page.
/// The gesture detector has a delay to detect tap event. /// The gesture detector has a delay to detect tap event.
/// To handle the tap event, we need to know if the user was scrolling before the delay. /// To handle the tap event, we need to know if the user was scrolling before the delay.
@@ -388,6 +391,11 @@ class _ContinuousModeState extends State<_ContinuousMode>
reader = context.reader; reader = context.reader;
reader._imageViewController = this; reader._imageViewController = this;
itemPositionsListener.itemPositions.addListener(onPositionChanged); itemPositionsListener.itemPositions.addListener(onPositionChanged);
cached = List.filled(reader.maxPage + 2, false);
Future.delayed(
const Duration(milliseconds: 100),
() => cacheImages(reader.page),
);
super.initState(); super.initState();
} }
@@ -404,6 +412,7 @@ class _ContinuousModeState extends State<_ContinuousMode>
reader.setPage(page); reader.setPage(page);
context.readerScaffold.update(); context.readerScaffold.update();
} }
cacheImages(page);
} }
double? futurePosition; double? futurePosition;
@@ -443,6 +452,15 @@ class _ContinuousModeState extends State<_ContinuousMode>
} }
} }
void cacheImages(int current) {
for (int i = current + 1; i <= current + preCacheCount; i++) {
if (i <= reader.maxPage && !cached[i]) {
_precacheImage(i, context);
cached[i] = true;
}
}
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Widget widget = ScrollablePositionedList.builder( Widget widget = ScrollablePositionedList.builder(
@@ -473,8 +491,6 @@ class _ContinuousModeState extends State<_ContinuousMode>
width = double.infinity; width = double.infinity;
} }
_precacheImage(index, context);
ImageProvider image = _createImageProvider(index, context); ImageProvider image = _createImageProvider(index, context);
return ComicImage( return ComicImage(

View File

@@ -143,6 +143,13 @@ class _ReaderSettingsState extends State<ReaderSettings> {
callback: () => context.to(() => _CustomImageProcessing()), callback: () => context.to(() => _CustomImageProcessing()),
actionTitle: "Edit".tl, actionTitle: "Edit".tl,
).toSliver(), ).toSliver(),
_SliderSetting(
title: "Number of images preloaded".tl,
settingsIndex: "preloadImageCount",
interval: 1,
min: 1,
max: 16,
).toSliver(),
], ],
); );
} }