diff --git a/frontend/ui/widget/pagebrowserwidget.lua b/frontend/ui/widget/pagebrowserwidget.lua index 29fb786e4..2b2770bd4 100644 --- a/frontend/ui/widget/pagebrowserwidget.lua +++ b/frontend/ui/widget/pagebrowserwidget.lua @@ -611,6 +611,9 @@ function PageBrowserWidget:update() UIManager:setDirty(self, function() return "ui", self.dimen end) + if G_reader_settings:isTrue("page_browser_preload_thumbnails") then + self:preloadNextPrevScreenThumbnails() + end end function PageBrowserWidget:paintTo(bb, x, y) @@ -733,6 +736,57 @@ function PageBrowserWidget:showTile(grid_idx, page, tile, do_refresh) end end +function PageBrowserWidget:preloadNextPrevScreenThumbnails() + -- We're here with the page painted - and possibly some thumbnails + -- not yet there and being generated and going to be updated. + -- self.ui.thumbnail takes care of serializing tile requests, and + -- cancelling scheduled ones when new requests come. + -- So, we can just launch many getPageThumbnail() for the next and + -- previous PageBrowser views (which will be nearly no-op if the + -- thumbnail is already cached). + -- We first preload the next and prev rows, before preloading the + -- remaining thumbnails of the next and prev pages - so users + -- browsing per-row can have them before. + + -- Pre-generate the thumbnails for the next row + local next_grid_page_start = self.focus_page - self.focus_page_shift + self.nb_grid_items + for idx=1, self.nb_cols do + local p = next_grid_page_start + idx - 1 + if p >= 1 or p < self.nb_pages then + logger.dbg("preload next line", p) + -- We provide a dummy callback as we don't care about the tile + self.ui.thumbnail:getPageThumbnail(p, self.grid_item_width, self.grid_item_height, self.requests_batch_id, function() end) + end + end + -- Pre-generate the thumbnails for the prev row + local prev_line_page_start = self.focus_page - self.focus_page_shift - self.nb_cols + for idx=1, self.nb_cols do + local p = prev_line_page_start + idx - 1 + if p >= 1 or p < self.nb_pages then + logger.dbg("preload prev line", p) + self.ui.thumbnail:getPageThumbnail(p, self.grid_item_width, self.grid_item_height, self.requests_batch_id, function() end) + end + end + -- Pre-generate the thumbnails for the next page (minus its top row, already done) + for idx=self.nb_cols+1, self.nb_grid_items do + local p = next_grid_page_start + idx - 1 + if p >= 1 or p < self.nb_pages then + logger.dbg("preload next page remainings", p) + -- We provide a dummy callback as we don't care about the tile + self.ui.thumbnail:getPageThumbnail(p, self.grid_item_width, self.grid_item_height, self.requests_batch_id, function() end) + end + end + -- Pre-generate the thumbnails for the prev page (minus its bottom row, already done) + local prev_grid_page_start = self.focus_page - self.focus_page_shift - self.nb_grid_items + for idx=self.nb_grid_items - self.nb_cols, 1, -1 do + local p = prev_grid_page_start + idx - 1 + if p >= 1 or p < self.nb_pages then + logger.dbg("preload prev page remainings", p) + self.ui.thumbnail:getPageThumbnail(p, self.grid_item_width, self.grid_item_height, self.requests_batch_id, function() end) + end + end +end + function PageBrowserWidget:showMenu() local button_dialog -- Width of our -/+ buttons, so it looks fine with Button's default font size of 20 @@ -752,6 +806,36 @@ function PageBrowserWidget:showMenu() self:showGestures() end, }}, + {{ + text_func = function(no_size_trick) + -- A bit tricky to update the text in the callback, as this button, + -- being sized by ButtonTable, can't be rebuilt. We will update its + -- text, and we want to be sure it will fit in the initial width, + -- which may be with the checkmark or not. + local text = _("Preload next/prev thumbnails") + if G_reader_settings:isTrue("page_browser_preload_thumbnails") then + text = text .. " \u{2713}" -- checkmark + else + if not no_size_trick then + -- Initial call, make it wide enough so the checkmark text will fit + text = text .. " \u{2003}" -- wide em space + end + -- Otherwise, keep it small without the checkmark, which will fit + end + return text + end, + id = "preload_thumbnails", + align = "left", + callback = function() + G_reader_settings:flipTrue("page_browser_preload_thumbnails") + local b = button_dialog:getButtonById("preload_thumbnails") + b:setText(b.text_func(true), b.width) + b:refresh() + if G_reader_settings:isTrue("page_browser_preload_thumbnails") then + self:preloadNextPrevScreenThumbnails() + end + end, + }}, { { text = _("Thumbnail columns"),