mirror of
https://github.com/koreader/koreader
synced 2024-11-11 19:11:14 +00:00
5a4e70a19d
These changes make the title bar in File manager, History and Collection windows of the same height. The items and book covers thumbnail dimensions in Mosaic and Detailed list display modes are now equal, and up/down scaling of the thumbnails is not needed when switching between File manager, History and Collection.
231 lines
8.0 KiB
Lua
231 lines
8.0 KiB
Lua
local ButtonDialog = require("ui/widget/buttondialog")
|
|
local Device = require("device")
|
|
local DocumentRegistry = require("document/documentregistry")
|
|
local Menu = require("ui/widget/menu")
|
|
local ReadCollection = require("readcollection")
|
|
local UIManager = require("ui/uimanager")
|
|
local WidgetContainer = require("ui/widget/container/widgetcontainer")
|
|
local Screen = require("device").screen
|
|
local filemanagerutil = require("apps/filemanager/filemanagerutil")
|
|
local _ = require("gettext")
|
|
|
|
local FileManagerCollection = WidgetContainer:extend{
|
|
title = _("Favorites"),
|
|
}
|
|
|
|
function FileManagerCollection:init()
|
|
self.ui.menu:registerToMainMenu(self)
|
|
end
|
|
|
|
function FileManagerCollection:addToMainMenu(menu_items)
|
|
menu_items.collections = {
|
|
text = self.title,
|
|
callback = function()
|
|
self:onShowColl()
|
|
end,
|
|
}
|
|
end
|
|
|
|
function FileManagerCollection:updateItemTable()
|
|
local item_table = {}
|
|
for _, item in pairs(ReadCollection.coll[self.coll_menu.collection_name]) do
|
|
table.insert(item_table, item)
|
|
end
|
|
table.sort(item_table, function(v1, v2) return v1.order < v2.order end)
|
|
self.coll_menu:switchItemTable(self.title, item_table, -1)
|
|
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)
|
|
end
|
|
else
|
|
local ReaderUI = require("apps/reader/readerui")
|
|
ReaderUI:showReader(file)
|
|
end
|
|
end
|
|
|
|
function FileManagerCollection:onMenuHold(item)
|
|
local file = item.file
|
|
self.collfile_dialog = nil
|
|
local function close_dialog_callback()
|
|
UIManager:close(self.collfile_dialog)
|
|
end
|
|
local function close_dialog_menu_callback()
|
|
UIManager:close(self.collfile_dialog)
|
|
self._manager.coll_menu.close_callback()
|
|
end
|
|
local function close_dialog_update_callback()
|
|
UIManager:close(self.collfile_dialog)
|
|
self._manager:updateItemTable()
|
|
self._manager.files_updated = true
|
|
end
|
|
local is_currently_opened = file == (self.ui.document and self.ui.document.file)
|
|
|
|
local buttons = {}
|
|
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
|
|
table.insert(buttons, {
|
|
filemanagerutil.genResetSettingsButton(file, close_dialog_update_callback, is_currently_opened),
|
|
{
|
|
text = _("Remove from favorites"),
|
|
callback = function()
|
|
UIManager:close(self.collfile_dialog)
|
|
ReadCollection:removeItem(file, self.collection_name)
|
|
self._manager:updateItemTable()
|
|
end,
|
|
},
|
|
})
|
|
table.insert(buttons, {
|
|
filemanagerutil.genShowFolderButton(file, close_dialog_menu_callback),
|
|
filemanagerutil.genBookInformationButton(file, close_dialog_callback),
|
|
})
|
|
table.insert(buttons, {
|
|
filemanagerutil.genBookCoverButton(file, close_dialog_callback),
|
|
filemanagerutil.genBookDescriptionButton(file, close_dialog_callback),
|
|
})
|
|
|
|
if Device:canExecuteScript(file) then
|
|
table.insert(buttons, {
|
|
filemanagerutil.genExecuteScriptButton(file, close_dialog_menu_callback)
|
|
})
|
|
end
|
|
|
|
self.collfile_dialog = ButtonDialog:new{
|
|
title = item.text,
|
|
title_align = "center",
|
|
buttons = buttons,
|
|
}
|
|
UIManager:show(self.collfile_dialog)
|
|
return true
|
|
end
|
|
|
|
function FileManagerCollection:MenuSetRotationModeHandler(rotation)
|
|
if rotation ~= nil and rotation ~= Screen:getRotationMode() then
|
|
UIManager:close(self._manager.coll_menu)
|
|
if self._manager.ui.view and self._manager.ui.view.onSetRotationMode then
|
|
self._manager.ui.view:onSetRotationMode(rotation)
|
|
elseif self._manager.ui.onSetRotationMode then
|
|
self._manager.ui:onSetRotationMode(rotation)
|
|
else
|
|
Screen:setRotationMode(rotation)
|
|
end
|
|
self._manager:onShowColl()
|
|
end
|
|
return true
|
|
end
|
|
|
|
function FileManagerCollection:onShowColl(collection_name)
|
|
collection_name = collection_name or ReadCollection.default_collection_name
|
|
self.coll_menu = Menu:new{
|
|
ui = self.ui,
|
|
covers_fullscreen = true, -- hint for UIManager:_repaint()
|
|
is_borderless = true,
|
|
is_popout = false,
|
|
-- item and book cover thumbnail dimensions in Mosaic and Detailed list display modes
|
|
-- must be equal in File manager, History and Collection windows to avoid image scaling
|
|
title_bar_fm_style = true,
|
|
title_bar_left_icon = "appbar.menu",
|
|
onLeftButtonTap = function() self:showCollDialog() end,
|
|
onMenuChoice = self.onMenuChoice,
|
|
onMenuHold = self.onMenuHold,
|
|
onSetRotationMode = self.MenuSetRotationModeHandler,
|
|
_manager = self,
|
|
collection_name = collection_name,
|
|
}
|
|
self.coll_menu.close_callback = function()
|
|
if self.files_updated then
|
|
if self.ui.file_chooser then
|
|
self.ui.file_chooser:refreshPath()
|
|
end
|
|
self.files_updated = nil
|
|
end
|
|
UIManager:close(self.coll_menu)
|
|
self.coll_menu = nil
|
|
end
|
|
self:updateItemTable()
|
|
UIManager:show(self.coll_menu)
|
|
return true
|
|
end
|
|
|
|
function FileManagerCollection:showCollDialog()
|
|
local coll_dialog
|
|
local buttons = {
|
|
{{
|
|
text = _("Sort favorites"),
|
|
callback = function()
|
|
UIManager:close(coll_dialog)
|
|
self:sortCollection()
|
|
end,
|
|
}},
|
|
{{
|
|
text = _("Add a book to favorites"),
|
|
callback = function()
|
|
UIManager:close(coll_dialog)
|
|
local PathChooser = require("ui/widget/pathchooser")
|
|
local path_chooser = PathChooser:new{
|
|
path = G_reader_settings:readSetting("home_dir"),
|
|
select_directory = false,
|
|
file_filter = function(file)
|
|
return DocumentRegistry:hasProvider(file)
|
|
end,
|
|
onConfirm = function(file)
|
|
if not ReadCollection:hasFile(file) then
|
|
ReadCollection:addItem(file, self.coll_menu.collection_name)
|
|
self:updateItemTable()
|
|
end
|
|
end,
|
|
}
|
|
UIManager:show(path_chooser)
|
|
end,
|
|
}},
|
|
}
|
|
if self.ui.document then
|
|
local has_file = ReadCollection:hasFile(self.ui.document.file)
|
|
table.insert(buttons, {{
|
|
text_func = function()
|
|
return has_file and _("Remove current book from favorites") or _("Add current book to favorites")
|
|
end,
|
|
callback = function()
|
|
UIManager:close(coll_dialog)
|
|
if has_file then
|
|
ReadCollection:removeItem(self.ui.document.file)
|
|
else
|
|
ReadCollection:addItem(self.ui.document.file, self.coll_menu.collection_name)
|
|
end
|
|
self:updateItemTable()
|
|
end,
|
|
}})
|
|
end
|
|
coll_dialog = ButtonDialog:new{
|
|
buttons = buttons,
|
|
}
|
|
UIManager:show(coll_dialog)
|
|
end
|
|
|
|
function FileManagerCollection:sortCollection()
|
|
local item_table = ReadCollection:getOrderedCollection(self.coll_menu.collection_name)
|
|
local SortWidget = require("ui/widget/sortwidget")
|
|
local sort_widget
|
|
sort_widget = SortWidget:new{
|
|
title = _("Sort favorites"),
|
|
item_table = item_table,
|
|
callback = function()
|
|
ReadCollection:updateCollectionOrder(self.coll_menu.collection_name, sort_widget.item_table)
|
|
self:updateItemTable()
|
|
end
|
|
}
|
|
UIManager:show(sort_widget)
|
|
end
|
|
|
|
function FileManagerCollection:onBookMetadataChanged()
|
|
if self.coll_menu then
|
|
self.coll_menu:updateItems()
|
|
end
|
|
end
|
|
|
|
return FileManagerCollection
|