Selected files: more actions (#13510)

This commit is contained in:
hius07
2025-04-07 12:56:37 +03:00
committed by GitHub
parent afb33e8518
commit 7453c786de
3 changed files with 168 additions and 76 deletions

View File

@@ -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 = {
{

View File

@@ -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"),

View File

@@ -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