diff --git a/frontend/apps/filemanager/filemanager.lua b/frontend/apps/filemanager/filemanager.lua index ce9b09070..ddfbff6a2 100644 --- a/frontend/apps/filemanager/filemanager.lua +++ b/frontend/apps/filemanager/filemanager.lua @@ -196,14 +196,6 @@ function FileManager:setupLayout() local buttons = { { - { - text = C_("File", "Copy"), - enabled = is_not_parent_folder, - callback = function() - UIManager:close(self.file_dialog) - file_manager:copyFile(file) - end, - }, { text = C_("File", "Paste"), enabled = file_manager.clipboard and true or false, @@ -224,16 +216,16 @@ function FileManager:setupLayout() end end, }, - }, - { { - text = _("Cut"), + text = _("Rename"), enabled = is_not_parent_folder, callback = function() UIManager:close(self.file_dialog) - file_manager:cutFile(file) + file_manager:showRenameFileDialog(file, is_file) end, }, + }, + { { text = _("Delete"), enabled = is_not_parent_folder, @@ -243,13 +235,21 @@ function FileManager:setupLayout() end, }, { - text = _("Rename"), + text = _("Cut"), enabled = is_not_parent_folder, callback = function() UIManager:close(self.file_dialog) - file_manager:showRenameFileDialog(file, is_file) + file_manager:cutFile(file) end, - } + }, + { + text = C_("File", "Copy"), + enabled = is_not_parent_folder, + callback = function() + UIManager:close(self.file_dialog) + file_manager:copyFile(file) + end, + }, }, {}, -- separator } @@ -525,12 +525,13 @@ function FileManager:tapPlus() local function close_dialog_callback() UIManager:close(plus_dialog) end - local function refresh_titlebar_callback() - self:updateTitleBarPath() - end local title, buttons if self.selected_files then + local function close_dialog_toggle_select_mode_callback() + UIManager:close(plus_dialog) + self:onToggleSelectMode(true) + end local function toggle_select_mode_callback() self:onToggleSelectMode(true) end @@ -540,55 +541,6 @@ function FileManager:tapPlus() or _("No files selected") buttons = { { - self.collections:genAddToCollectionButton(self.selected_files, close_dialog_callback, toggle_select_mode_callback), - }, - { - { - text = _("Show selected files list"), - enabled = actions_enabled, - callback = function() - UIManager:close(plus_dialog) - self:showSelectedFilesList() - end, - }, - { - text = _("Copy"), - enabled = actions_enabled, - callback = function() - self.cutfile = false - self:showCopyMoveSelectedFilesDialog(close_dialog_callback) - end, - }, - }, - { - { - text = _("Select all files in folder"), - callback = function() - UIManager:close(plus_dialog) - self.file_chooser:selectAllFilesInFolder(true) - end, - }, - { - text = _("Move"), - enabled = actions_enabled, - callback = function() - self.cutfile = true - self:showCopyMoveSelectedFilesDialog(close_dialog_callback) - end, - }, - }, - { - { - text = _("Deselect all"), - enabled = actions_enabled, - callback = function() - UIManager:close(plus_dialog) - for file in pairs (self.selected_files) do - self.selected_files[file] = nil - end - self.file_chooser:selectAllFilesInFolder(false) -- undim - end, - }, { text = _("Delete"), enabled = actions_enabled, @@ -603,6 +555,62 @@ function FileManager:tapPlus() }) end, }, + { + text = _("Move"), + enabled = actions_enabled, + callback = function() + self.cutfile = true + self:showCopyMoveSelectedFilesDialog(close_dialog_callback) + end, + }, + { + text = _("Copy"), + enabled = actions_enabled, + callback = function() + self.cutfile = false + self:showCopyMoveSelectedFilesDialog(close_dialog_callback) + end, + }, + }, + {}, -- separator + filemanagerutil.genMultipleStatusButtonsRow(self.selected_files, + close_dialog_toggle_select_mode_callback, not actions_enabled), + {}, -- separator + { + filemanagerutil.genMultipleResetSettingsButton(self.selected_files, + close_dialog_toggle_select_mode_callback, not actions_enabled), + self.collections:genAddToCollectionButton(self.selected_files, + close_dialog_callback, toggle_select_mode_callback, not actions_enabled), + }, + { + { + text = _("Export highlights"), + enabled = (actions_enabled and self.exporter) and true or false, + callback = function() + self.exporter:exportFilesNotes(self.selected_files) + end, + }, + }, + {}, -- separator + { + { + text = _("Deselect all"), + enabled = actions_enabled, + callback = function() + UIManager:close(plus_dialog) + for file in pairs (self.selected_files) do + self.selected_files[file] = nil + end + self.file_chooser:selectAllFilesInFolder(false) -- undim + end, + }, + { + text = _("Select all files in folder"), + callback = function() + UIManager:close(plus_dialog) + self.file_chooser:selectAllFilesInFolder(true) + end, + }, }, { { @@ -613,10 +621,11 @@ function FileManager:tapPlus() end, }, { - text = _("Export highlights"), - enabled = (actions_enabled and self.exporter) and true or false, + text = _("Show selected files list"), + enabled = actions_enabled, callback = function() - self.exporter:exportFilesNotes(self.selected_files) + UIManager:close(plus_dialog) + self:showSelectedFilesList() end, }, }, @@ -632,7 +641,17 @@ function FileManager:tapPlus() self.folder_shortcuts:genShowFolderShortcutsButton(close_dialog_callback), }, } - else + + local refresh_button = self.coverbrowser + and self.coverbrowser:genMultipleRefreshBookInfoButton(close_dialog_toggle_select_mode_callback, not actions_enabled) + if refresh_button ~= nil then + table.insert(buttons, 7, refresh_button) -- before 'select mode' buttons + end + + else -- no selected files + local function refresh_titlebar_callback() + self:updateTitleBarPath() + end title = BD.dirpath(filemanagerutil.abbreviate(self.file_chooser.path)) buttons = { { diff --git a/frontend/apps/filemanager/filemanagerutil.lua b/frontend/apps/filemanager/filemanagerutil.lua index 5d2aa9936..965ca4837 100644 --- a/frontend/apps/filemanager/filemanagerutil.lua +++ b/frontend/apps/filemanager/filemanagerutil.lua @@ -4,6 +4,8 @@ This module contains miscellaneous helper functions for FileManager local BD = require("ui/bidi") local BookList = require("ui/widget/booklist") +local CheckButton = require("ui/widget/checkbutton") +local ConfirmBox = require("ui/widget/confirmbox") local Device = require("device") local DocSettings = require("docsettings") local Event = require("ui/event") @@ -139,6 +141,36 @@ function filemanagerutil.genStatusButtonsRow(doc_settings_or_file, caller_callba } end +function filemanagerutil.genMultipleStatusButtonsRow(files, caller_callback, button_disabled) + local function genStatusButton(to_status) + return { + text = BookList.getBookStatusString(to_status, false, true), + enabled = not button_disabled, + callback = function() + UIManager:show(ConfirmBox:new{ + text = _("Set selected documents status?"), + ok_text = _("Set"), + ok_callback = function() + for file in pairs(files) do + local doc_settings = BookList.getDocSettings(file) + local summary = doc_settings:readSetting("summary") or {} + summary.status = to_status + filemanagerutil.saveSummary(doc_settings, summary) + BookList.setBookInfoCacheProperty(file, "status", to_status) + end + caller_callback() + end, + }) + end, + } + end + return { + genStatusButton("reading"), + genStatusButton("abandoned"), + genStatusButton("complete"), + } +end + -- Generate "Reset" file dialog button function filemanagerutil.genResetSettingsButton(doc_settings_or_file, caller_callback, button_disabled) local doc_settings, file, has_sidecar_file @@ -158,8 +190,6 @@ function filemanagerutil.genResetSettingsButton(doc_settings_or_file, caller_cal text = _("Reset"), enabled = not button_disabled and (has_sidecar_file or has_custom_metadata_file or has_custom_cover_file), callback = function() - local CheckButton = require("ui/widget/checkbutton") - local ConfirmBox = require("ui/widget/confirmbox") local check_button_settings, check_button_cover, check_button_metadata local confirmbox = ConfirmBox:new{ text = T(_("Reset this document?") .. "\n\n%1\n\n" .. @@ -209,6 +239,31 @@ function filemanagerutil.genResetSettingsButton(doc_settings_or_file, caller_cal } end +function filemanagerutil.genMultipleResetSettingsButton(files, caller_callback, button_disabled) + return { + text = _("Reset"), + enabled = not button_disabled, + callback = function() + UIManager:show(ConfirmBox:new{ + text = _("Reset selected documents?") .. "\n" .. + _("Information will be permanently lost."), + ok_text = _("Reset"), + ok_callback = function() + for file in pairs(files) do + if BookList.hasBookBeenOpened(file) then + DocSettings:open(file):purge() + UIManager:broadcastEvent(Event:new("InvalidateMetadataCache", file)) + BookList.setBookInfoCacheProperty(file, "been_opened", false) + require("readhistory"):fileSettingsPurged(file) + end + end + caller_callback() + end, + }) + end, + } +end + function filemanagerutil.genShowFolderButton(file, caller_callback, button_disabled) return { text = _("Show folder"), diff --git a/plugins/coverbrowser.koplugin/main.lua b/plugins/coverbrowser.koplugin/main.lua index bff627d4e..74b099ef7 100644 --- a/plugins/coverbrowser.koplugin/main.lua +++ b/plugins/coverbrowser.koplugin/main.lua @@ -96,8 +96,8 @@ function CoverBrowser:init() end self:setupFileManagerDisplayMode(BookInfoManager:getSetting("filemanager_display_mode")) - CoverBrowser.setupWidgetDisplayMode("history") - CoverBrowser.setupWidgetDisplayMode("collections") + CoverBrowser.setupWidgetDisplayMode("history", true) + CoverBrowser.setupWidgetDisplayMode("collections", true) series_mode = BookInfoManager:getSetting("series_mode") init_done = true BookInfoManager:closeDbConnection() -- will be re-opened if needed @@ -518,6 +518,22 @@ function CoverBrowser:genExtractBookInfoButton(close_dialog_callback) -- for Fil } end +function CoverBrowser:genMultipleRefreshBookInfoButton(close_dialog_toggle_select_mode_callback, button_disabled) + return curr_display_modes["filemanager"] and { + { + text = _("Refresh cached book information"), + enabled = not button_disabled, + callback = function() + for file in pairs(self.ui.selected_files) do + BookInfoManager:deleteBookInfo(file) + self.ui.file_chooser.resetBookInfoCache(file) + end + close_dialog_toggle_select_mode_callback() + end, + }, + } +end + function CoverBrowser.initGrid(menu, display_mode) if menu == nil then return end if menu.nb_cols_portrait == nil then @@ -679,7 +695,9 @@ function CoverBrowser:setupFileManagerDisplayMode(display_mode) end function CoverBrowser.setupWidgetDisplayMode(widget_id, display_mode) - display_mode = display_mode or BookInfoManager:getSetting(display_mode_db_names[widget_id]) + if display_mode == true then -- init + display_mode = BookInfoManager:getSetting(display_mode_db_names[widget_id]) + end if not DISPLAY_MODES[display_mode] then display_mode = nil -- unknown mode, fallback to classic end