CoverBrowser: use bookinfo cache in Classic mode (#11404)

Getting bookinfo from the cache db is much faster than opening a book, let's use it in Classic mode too.

With fallback if no metadata available.
reviewable/pr11424/r1
hius07 3 months ago committed by GitHub
parent b832d43d98
commit d94b819eb1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -269,8 +269,10 @@ function FileManager:setupLayout()
}
if is_file then
self.bookinfo = nil
local has_provider = DocumentRegistry:hasProvider(file)
if has_provider or DocSettings:hasSidecarFile(file) then
self.bookinfo = file_manager.coverbrowser and file_manager.coverbrowser:getBookInfo(file)
table.insert(buttons, filemanagerutil.genStatusButtonsRow(file, close_dialog_refresh_callback))
table.insert(buttons, {}) -- separator
table.insert(buttons, {
@ -286,12 +288,12 @@ function FileManager:setupLayout()
file_manager:showOpenWithDialog(file)
end,
},
filemanagerutil.genBookInformationButton(file, close_dialog_callback),
filemanagerutil.genBookInformationButton(file, self.bookinfo, close_dialog_callback),
})
if has_provider then
table.insert(buttons, {
filemanagerutil.genBookCoverButton(file, close_dialog_callback),
filemanagerutil.genBookDescriptionButton(file, close_dialog_callback),
filemanagerutil.genBookCoverButton(file, self.bookinfo, close_dialog_callback),
filemanagerutil.genBookDescriptionButton(file, self.bookinfo, close_dialog_callback),
})
end
if Device:canExecuteScript(file) then

@ -1,3 +1,4 @@
local BD = require("ui/bidi")
local ButtonDialog = require("ui/widget/buttondialog")
local Device = require("device")
local DocumentRegistry = require("document/documentregistry")
@ -36,20 +37,20 @@ function FileManagerCollection:updateItemTable()
end
function FileManagerCollection:onMenuChoice(item)
local file = item.file
if self.ui.document then
if self.ui.document.file ~= file then
self.ui:switchDocument(file)
if self.ui.document.file ~= item.file then
self.ui:switchDocument(item.file)
end
else
local ReaderUI = require("apps/reader/readerui")
ReaderUI:showReader(file)
self.ui:openFile(item.file)
end
end
function FileManagerCollection:onMenuHold(item)
local file = item.file
self.collfile_dialog = nil
self.bookinfo = self.ui.coverbrowser and self.ui.coverbrowser:getBookInfo(file)
local function close_dialog_callback()
UIManager:close(self.collfile_dialog)
end
@ -81,11 +82,11 @@ function FileManagerCollection:onMenuHold(item)
})
table.insert(buttons, {
filemanagerutil.genShowFolderButton(file, close_dialog_menu_callback),
filemanagerutil.genBookInformationButton(file, close_dialog_callback),
filemanagerutil.genBookInformationButton(file, self.bookinfo, close_dialog_callback),
})
table.insert(buttons, {
filemanagerutil.genBookCoverButton(file, close_dialog_callback),
filemanagerutil.genBookDescriptionButton(file, close_dialog_callback),
filemanagerutil.genBookCoverButton(file, self.bookinfo, close_dialog_callback),
filemanagerutil.genBookDescriptionButton(file, self.bookinfo, close_dialog_callback),
})
if Device:canExecuteScript(file) then
@ -95,7 +96,7 @@ function FileManagerCollection:onMenuHold(item)
end
self.collfile_dialog = ButtonDialog:new{
title = item.text,
title = BD.filename(item.text),
title_align = "center",
buttons = buttons,
}

@ -1,6 +1,5 @@
local ButtonDialog = require("ui/widget/buttondialog")
local CheckButton = require("ui/widget/checkbutton")
local CenterContainer = require("ui/widget/container/centercontainer")
local ConfirmBox = require("ui/widget/confirmbox")
local DocSettings = require("docsettings")
local DocumentRegistry = require("document/documentregistry")
@ -16,7 +15,6 @@ local lfs = require("libs/libkoreader-lfs")
local util = require("util")
local _ = require("gettext")
local N_ = _.ngettext
local Screen = require("device").screen
local T = require("ffi/util").template
local FileSearcher = WidgetContainer:extend{
@ -25,9 +23,6 @@ local FileSearcher = WidgetContainer:extend{
include_metadata = false,
}
function FileSearcher:init()
end
function FileSearcher:onShowFileSearch(search_string)
local search_dialog
local check_button_case, check_button_subfolders, check_button_metadata
@ -225,28 +220,26 @@ function FileSearcher:showSearchResultsMessage(no_results)
end
function FileSearcher:showSearchResults(results)
local menu_container = CenterContainer:new{
dimen = Screen:getSize(),
}
self.search_menu = Menu:new{
title = T(_("Search results (%1)"), #results),
subtitle = T(_("Query: %1"), self.search_string),
item_table = results,
ui = self.ui,
covers_fullscreen = true, -- hint for UIManager:_repaint()
is_borderless = true,
is_popout = false,
show_parent = menu_container,
title_bar_fm_style = true,
onMenuSelect = self.onMenuSelect,
onMenuHold = self.onMenuHold,
handle_hold_on_hold_release = true,
}
table.insert(menu_container, self.search_menu)
self.search_menu.close_callback = function()
UIManager:close(menu_container)
UIManager:close(self.search_menu)
if self.ui.file_chooser then
self.ui.file_chooser:refreshPath()
end
end
self.search_menu:switchItemTable(T(_("Search results (%1)"), #results), results)
UIManager:show(menu_container)
UIManager:show(self.search_menu)
if self.no_metadata_count ~= 0 then
self:showSearchResultsMessage()
end
@ -254,7 +247,7 @@ end
function FileSearcher:onMenuSelect(item)
local file = item.path
local dialog
local bookinfo, dialog
local function close_dialog_callback()
UIManager:close(dialog)
end
@ -266,6 +259,7 @@ function FileSearcher:onMenuSelect(item)
if item.is_file then
local is_currently_opened = self.ui.document and self.ui.document.file == file
if DocumentRegistry:hasProvider(file) or DocSettings:hasSidecarFile(file) then
bookinfo = self.ui.coverbrowser and self.ui.coverbrowser:getBookInfo(file)
local doc_settings_or_file = is_currently_opened and self.ui.doc_settings or file
table.insert(buttons, filemanagerutil.genStatusButtonsRow(doc_settings_or_file, close_dialog_callback))
table.insert(buttons, {}) -- separator
@ -293,7 +287,7 @@ function FileSearcher:onMenuSelect(item)
FileManager:showDeleteFileDialog(file, post_delete_callback)
end,
},
filemanagerutil.genBookInformationButton(file, close_dialog_callback),
filemanagerutil.genBookInformationButton(file, bookinfo, close_dialog_callback),
})
end
table.insert(buttons, {
@ -308,8 +302,17 @@ function FileSearcher:onMenuSelect(item)
end,
},
})
local title = file
if bookinfo then
if bookinfo.title then
title = title .. "\n\n" .. T(_("Title: %1"), bookinfo.title)
end
if bookinfo.authors then
title = title .. "\n" .. T(_("Authors: %1"), bookinfo.authors:gsub("[\n\t]", "|"))
end
end
dialog = ButtonDialog:new{
title = file,
title = title .. "\n",
buttons = buttons,
}
UIManager:show(dialog)

@ -119,13 +119,15 @@ function FileManagerHistory:onMenuChoice(item)
self.ui:switchDocument(item.file)
end
else
local ReaderUI = require("apps/reader/readerui")
ReaderUI:showReader(item.file)
self.ui:openFile(item.file)
end
end
function FileManagerHistory:onMenuHold(item)
local file = item.file
self.histfile_dialog = nil
self.bookinfo = self.ui.coverbrowser and self.ui.coverbrowser:getBookInfo(file)
local function close_dialog_callback()
UIManager:close(self.histfile_dialog)
end
@ -133,7 +135,7 @@ function FileManagerHistory:onMenuHold(item)
UIManager:close(self.histfile_dialog)
self._manager.hist_menu.close_callback()
end
local function status_button_callback()
local function close_dialog_update_callback()
UIManager:close(self.histfile_dialog)
if self._manager.filter ~= "all" then
self._manager:fetchStatuses(false)
@ -143,17 +145,17 @@ function FileManagerHistory:onMenuHold(item)
self._manager:updateItemTable()
self._manager.files_updated = true -- sidecar folder may be created/deleted
end
local is_currently_opened = item.file == (self.ui.document and self.ui.document.file)
local is_currently_opened = file == (self.ui.document and self.ui.document.file)
local buttons = {}
if not item.dim then
local doc_settings_or_file = is_currently_opened and self.ui.doc_settings or item.file
table.insert(buttons, filemanagerutil.genStatusButtonsRow(doc_settings_or_file, status_button_callback))
local doc_settings_or_file = is_currently_opened and self.ui.doc_settings or file
table.insert(buttons, filemanagerutil.genStatusButtonsRow(doc_settings_or_file, close_dialog_update_callback))
table.insert(buttons, {}) -- separator
end
table.insert(buttons, {
filemanagerutil.genResetSettingsButton(item.file, status_button_callback, is_currently_opened),
filemanagerutil.genAddRemoveFavoritesButton(item.file, close_dialog_callback, item.dim),
filemanagerutil.genResetSettingsButton(file, close_dialog_update_callback, is_currently_opened),
filemanagerutil.genAddRemoveFavoritesButton(file, close_dialog_callback, item.dim),
})
table.insert(buttons, {
{
@ -166,7 +168,7 @@ function FileManagerHistory:onMenuHold(item)
self._manager.files_updated = true
end
local FileManager = require("apps/filemanager/filemanager")
FileManager:showDeleteFileDialog(item.file, post_delete_callback)
FileManager:showDeleteFileDialog(file, post_delete_callback)
end,
},
{
@ -179,12 +181,12 @@ function FileManagerHistory:onMenuHold(item)
},
})
table.insert(buttons, {
filemanagerutil.genShowFolderButton(item.file, close_dialog_menu_callback, item.dim),
filemanagerutil.genBookInformationButton(item.file, close_dialog_callback, item.dim),
filemanagerutil.genShowFolderButton(file, close_dialog_menu_callback, item.dim),
filemanagerutil.genBookInformationButton(file, self.bookinfo, close_dialog_callback, item.dim),
})
table.insert(buttons, {
filemanagerutil.genBookCoverButton(item.file, close_dialog_callback, item.dim),
filemanagerutil.genBookDescriptionButton(item.file, close_dialog_callback, item.dim),
filemanagerutil.genBookCoverButton(file, self.bookinfo, close_dialog_callback, item.dim),
filemanagerutil.genBookDescriptionButton(file, self.bookinfo, close_dialog_callback, item.dim),
})
self.histfile_dialog = ButtonDialog:new{

@ -260,38 +260,41 @@ function filemanagerutil.genShowFolderButton(file, caller_callback, button_disab
}
end
function filemanagerutil.genBookInformationButton(file, caller_callback, button_disabled)
function filemanagerutil.genBookInformationButton(file, bookinfo, caller_callback, button_disabled)
return {
text = _("Book information"),
id = "book_information", -- used by covermenu
enabled = not button_disabled,
callback = function()
caller_callback()
require("apps/filemanager/filemanagerbookinfo"):show(file)
local FileManagerBookInfo = require("apps/filemanager/filemanagerbookinfo")
FileManagerBookInfo:show(file, bookinfo and FileManagerBookInfo.extendProps(bookinfo))
end,
}
end
function filemanagerutil.genBookCoverButton(file, caller_callback, button_disabled)
function filemanagerutil.genBookCoverButton(file, bookinfo, caller_callback, button_disabled)
local has_cover = bookinfo and bookinfo.has_cover
return {
text = _("Book cover"),
id = "book_cover", -- used by covermenu
enabled = not button_disabled,
enabled = (not button_disabled and (not bookinfo or has_cover)) and true or false,
callback = function()
caller_callback()
require("apps/filemanager/filemanagerbookinfo"):onShowBookCover(file)
local FileManagerBookInfo = require("apps/filemanager/filemanagerbookinfo")
FileManagerBookInfo:onShowBookCover(file)
end,
}
end
function filemanagerutil.genBookDescriptionButton(file, caller_callback, button_disabled)
function filemanagerutil.genBookDescriptionButton(file, bookinfo, caller_callback, button_disabled)
local description = bookinfo and bookinfo.description
return {
text = _("Book description"),
id = "book_description", -- used by covermenu
enabled = not button_disabled,
-- enabled for deleted books if description is kept in CoverBrowser bookinfo cache
enabled = (not (button_disabled or bookinfo) or description) and true or false,
callback = function()
caller_callback()
require("apps/filemanager/filemanagerbookinfo"):onShowBookDescription(nil, file)
local FileManagerBookInfo = require("apps/filemanager/filemanagerbookinfo")
FileManagerBookInfo:onShowBookDescription(description, file)
end,
}
end

@ -1,6 +1,6 @@
local BD = require("ui/bidi")
local ButtonDialog = require("ui/widget/buttondialog")
local DocSettings = require("docsettings")
local FileManagerBookInfo = require("apps/filemanager/filemanagerbookinfo")
local InfoMessage = require("ui/widget/infomessage")
local Menu = require("ui/widget/menu")
local UIManager = require("ui/uimanager")
@ -232,8 +232,7 @@ function CoverMenu:updateItems(select_number)
-- we replace it by ours.
-- (FileManager may replace file_chooser.showFileDialog after we've been called once, so we need
-- to replace it again if it is not ours)
if not self.showFileDialog_ours -- never replaced
or self.showFileDialog ~= self.showFileDialog_ours then -- it is no more ours
if self.showFileDialog and self.showFileDialog ~= self.showFileDialog_ours then
-- We need to do it at nextTick, once FileManager has instantiated
-- its FileChooser completely
UIManager:nextTick(function()
@ -248,7 +247,7 @@ function CoverMenu:updateItems(select_number)
-- and store it as self.file_dialog, and UIManager:show() it.
self.showFileDialog_orig(self, file)
local bookinfo = BookInfoManager:getBookInfo(file)
local bookinfo = self.bookinfo -- getBookInfo(file) called by FileManager
if not bookinfo or bookinfo._is_directory then
-- If no bookinfo (yet) about this file, or it's a directory, let the original dialog be
return true
@ -292,7 +291,6 @@ function CoverMenu:updateItems(select_number)
table.insert(orig_buttons, {
{ -- Allow a new extraction (multiple interruptions, book replaced)...
text = _("Refresh cached book information"),
enabled = bookinfo and true or false,
callback = function()
-- Wipe the cache
self:updateCache(file)
@ -304,38 +302,11 @@ function CoverMenu:updateItems(select_number)
})
-- Create the new ButtonDialog, and let UIManager show it
-- (all button callback fudging must be done after this block to stick)
local ButtonDialog = require("ui/widget/buttondialog")
self.file_dialog = ButtonDialog:new{
title = orig_title,
title_align = orig_title_align,
buttons = orig_buttons,
}
-- Replace the "Book information" button callback to use directly our bookinfo
local button = self.file_dialog:getButtonById("book_information")
button.callback = function()
FileManagerBookInfo:show(file, FileManagerBookInfo.extendProps(bookinfo))
UIManager:close(self.file_dialog)
end
button = self.file_dialog:getButtonById("book_cover")
if button and not bookinfo.has_cover then
button:disable()
end
button = self.file_dialog:getButtonById("book_description")
if button then
if bookinfo.description then
button.callback = function()
UIManager:close(self.file_dialog)
FileManagerBookInfo:onShowBookDescription(bookinfo.description)
end
else
button:disable()
end
end
UIManager:show(self.file_dialog)
return true
end
@ -355,7 +326,7 @@ function CoverMenu:onHistoryMenuHold(item)
self.onMenuHold_orig(self, item)
local file = item.file
local bookinfo = BookInfoManager:getBookInfo(file)
local bookinfo = self.bookinfo -- getBookInfo(file) called by FileManagerHistory
if not bookinfo then
-- If no bookinfo (yet) about this file, let the original dialog be
return true
@ -398,7 +369,6 @@ function CoverMenu:onHistoryMenuHold(item)
table.insert(orig_buttons, {
{ -- Allow a new extraction (multiple interruptions, book replaced)...
text = _("Refresh cached book information"),
enabled = bookinfo and true or false,
callback = function()
-- Wipe the cache
self:updateCache(file)
@ -410,38 +380,11 @@ function CoverMenu:onHistoryMenuHold(item)
})
-- Create the new ButtonDialog, and let UIManager show it
-- (all button callback replacement must be done after this block to stick)
local ButtonDialog = require("ui/widget/buttondialog")
self.histfile_dialog = ButtonDialog:new{
title = orig_title,
title_align = orig_title_align,
buttons = orig_buttons,
}
-- Replace the "Book information" button callback to use directly our bookinfo
local button = self.histfile_dialog:getButtonById("book_information")
button.callback = function()
FileManagerBookInfo:show(file, FileManagerBookInfo.extendProps(bookinfo))
UIManager:close(self.histfile_dialog)
end
button = self.histfile_dialog:getButtonById("book_cover")
if button and not bookinfo.has_cover then
button:disable()
end
button = self.histfile_dialog:getButtonById("book_description")
if button then
if bookinfo.description then
button.callback = function()
UIManager:close(self.histfile_dialog)
FileManagerBookInfo:onShowBookDescription(bookinfo.description)
end
else
button:disable()
end
end
UIManager:show(self.histfile_dialog)
return true
end
@ -454,7 +397,7 @@ function CoverMenu:onCollectionsMenuHold(item)
self.onMenuHold_orig(self, item)
local file = item.file
local bookinfo = BookInfoManager:getBookInfo(file)
local bookinfo = self.bookinfo -- getBookInfo(file) called by FileManagerCollection
if not bookinfo then
-- If no bookinfo (yet) about this file, let the original dialog be
return true
@ -497,7 +440,6 @@ function CoverMenu:onCollectionsMenuHold(item)
table.insert(orig_buttons, {
{ -- Allow a new extraction (multiple interruptions, book replaced)...
text = _("Refresh cached book information"),
enabled = bookinfo and true or false,
callback = function()
-- Wipe the cache
self:updateCache(file)
@ -509,38 +451,11 @@ function CoverMenu:onCollectionsMenuHold(item)
})
-- Create the new ButtonDialog, and let UIManager show it
-- (all button callback replacement must be done after this block to stick)
local ButtonDialog = require("ui/widget/buttondialog")
self.collfile_dialog = ButtonDialog:new{
title = orig_title,
title_align = orig_title_align,
buttons = orig_buttons,
}
-- Replace the "Book information" button callback to use directly our bookinfo
local button = self.collfile_dialog:getButtonById("book_information")
button.callback = function()
FileManagerBookInfo:show(file, FileManagerBookInfo.extendProps(bookinfo))
UIManager:close(self.collfile_dialog)
end
button = self.collfile_dialog:getButtonById("book_cover")
if button and not bookinfo.has_cover then
button:disable()
end
button = self.collfile_dialog:getButtonById("book_description")
if button then
if bookinfo.description then
button.callback = function()
UIManager:close(self.collfile_dialog)
FileManagerBookInfo:onShowBookDescription(bookinfo.description)
end
else
button:disable()
end
end
UIManager:show(self.collfile_dialog)
return true
end
@ -616,7 +531,6 @@ function CoverMenu:tapPlus()
})
-- Create the new ButtonDialog, and let UIManager show it
local ButtonDialog = require("ui/widget/buttondialog")
self.file_dialog = ButtonDialog:new{
title = orig_title,
title_align = orig_title_align,

Loading…
Cancel
Save