From ce3bf473da8e7b15a981f58e5a28959e1fe41ba6 Mon Sep 17 00:00:00 2001 From: mwoz123 <4487025+mwoz123@users.noreply.github.com> Date: Sat, 2 May 2020 23:02:36 +0200 Subject: [PATCH] Add move to archive plugin (#6101) --- frontend/apps/filemanager/filemanager.lua | 18 +- .../ui/elements/filemanager_menu_order.lua | 1 + frontend/ui/elements/reader_menu_order.lua | 1 + plugins/movetoarchive.koplugin/_meta.lua | 6 + plugins/movetoarchive.koplugin/main.lua | 161 ++++++++++++++++++ 5 files changed, 183 insertions(+), 4 deletions(-) create mode 100644 plugins/movetoarchive.koplugin/_meta.lua create mode 100644 plugins/movetoarchive.koplugin/main.lua diff --git a/frontend/apps/filemanager/filemanager.lua b/frontend/apps/filemanager/filemanager.lua index 9a919f032..951f9b960 100644 --- a/frontend/apps/filemanager/filemanager.lua +++ b/frontend/apps/filemanager/filemanager.lua @@ -1044,14 +1044,24 @@ function FileManager:showFiles(path, focused_file) self.instance = file_manager end ---[[ -A shortcut to execute mv command (self.mv_bin) with from and to as parameters. -Returns a boolean value to indicate the result of mv command. ---]] +--- A shortcut to execute mv. +-- @treturn boolean result of mv command function FileManager:moveFile(from, to) return BaseUtil.execute(self.mv_bin, from, to) == 0 end +--- A shortcut to execute cp. +-- @treturn boolean result of cp command +function FileManager:copyFileFromTo(from, to) + return BaseUtil.execute(self.cp_bin, from, to) == 0 +end + +--- A shortcut to execute cp recursively. +-- @treturn boolean result of cp command +function FileManager:copyRecursive(from, to) + return BaseUtil.execute(self.cp_bin, "-r", from, to ) == 0 +end + function FileManager:onHome() return self:goHome() end diff --git a/frontend/ui/elements/filemanager_menu_order.lua b/frontend/ui/elements/filemanager_menu_order.lua index 16f89c37e..1f3484d02 100644 --- a/frontend/ui/elements/filemanager_menu_order.lua +++ b/frontend/ui/elements/filemanager_menu_order.lua @@ -91,6 +91,7 @@ local order = { "calibre_wireless_connection", "evernote", "statistics", + "move_to_archive", "cloud_storage", "read_timer", "wallabag", diff --git a/frontend/ui/elements/reader_menu_order.lua b/frontend/ui/elements/reader_menu_order.lua index 23ec76848..0aad5ab18 100644 --- a/frontend/ui/elements/reader_menu_order.lua +++ b/frontend/ui/elements/reader_menu_order.lua @@ -116,6 +116,7 @@ local order = { "evernote", "statistics", "progress_sync", + "move_to_archive", "wallabag", "zsync", "news_downloader", diff --git a/plugins/movetoarchive.koplugin/_meta.lua b/plugins/movetoarchive.koplugin/_meta.lua new file mode 100644 index 000000000..0f5f1a581 --- /dev/null +++ b/plugins/movetoarchive.koplugin/_meta.lua @@ -0,0 +1,6 @@ +local _ = require("gettext") +return { + name = "move_to_archive", + fullname = _("Move to archive"), + description = _([[Moves/copies current book to archive folder]]), +} diff --git a/plugins/movetoarchive.koplugin/main.lua b/plugins/movetoarchive.koplugin/main.lua new file mode 100644 index 000000000..f575a8498 --- /dev/null +++ b/plugins/movetoarchive.koplugin/main.lua @@ -0,0 +1,161 @@ +local ConfirmBox = require("ui/widget/confirmbox") +local DataStorage = require("datastorage") +local DocSettings = require("docsettings") +local ReadCollection = require("readcollection") +local ReadHistory = require("readhistory") +local ReaderUI = require("apps/reader/readerui") +local FileManager = require("apps/filemanager/filemanager") +local InfoMessage = require("ui/widget/infomessage") +local LuaSettings = require("frontend/luasettings") +local UIManager = require("ui/uimanager") +local WidgetContainer = require("ui/widget/container/widgetcontainer") +local util = require("frontend/util") +local BaseUtil = require("ffi/util") +local _ = require("gettext") + +local MoveToArchive = WidgetContainer:new{ + name = "move2archive", +} + +function MoveToArchive:init() + self.ui.menu:registerToMainMenu(self) + self.settings = LuaSettings:open(("%s/%s"):format(DataStorage:getSettingsDir(), "move_to_archive_settings.lua")) + self.archive_dir_path = self.settings:readSetting("archive_dir") + self.last_copied_from_dir = self.settings:readSetting("last_copied_from_dir") +end + +function MoveToArchive:addToMainMenu(menu_items) + menu_items.move_to_archive = { + text = _("Move to archive"), + sub_item_table = { + { + text = _("Move current book to archive"), + callback = function() self:moveToArchive() end, + enabled_func = function() + return self:isActionEnabled() + end, + }, + { + text = _("Copy current book to archive"), + callback = function() self:copyToArchive() end, + enabled_func = function() + return self:isActionEnabled() + end, + }, + { + text = _("Go to archive folder"), + callback = function() + if not self.archive_dir_path then + self:showNoArchiveConfirmBox() + return + end + self:openFileBrowser(self.archive_dir_path) + end, + }, + { + text = _("Go to last copied/moved from folder"), + callback = function() + if not self.last_copied_from_dir then + UIManager:show(InfoMessage:new{ + text = _("No previous folder found.") + }) + return + end + self:openFileBrowser(self.last_copied_from_dir) + end, + }, + { + text = _("Set archive directory"), + keep_menu_open = true, + callback = function() + self:setArchiveDirectory() + end, + } + }, + } +end + +function MoveToArchive:moveToArchive() + local move_done_text = _("Book moved.\nDo you want to open it from the archive folder?") + self:commonProcess(true, move_done_text) +end + +function MoveToArchive:copyToArchive() + local copy_done_text = _("Book copied.\nDo you want to open it from the archive folder?") + self:commonProcess(false, copy_done_text) +end + +function MoveToArchive:commonProcess(is_move_process, moved_done_text) + if not self.archive_dir_path then + self:showNoArchiveConfirmBox() + return + end + local document_full_path = self.ui.document.file + local filename + self.last_copied_from_dir, filename = util.splitFilePathName(document_full_path) + + self.settings:saveSetting("last_copied_from_dir", self.last_copied_from_dir) + self.settings:flush() + + self.ui:onClose() + if is_move_process then + FileManager:moveFile(document_full_path, self.archive_dir_path) + FileManager:moveFile(DocSettings:getSidecarDir(document_full_path), self.archive_dir_path) + else + FileManager:copyFileFromTo(document_full_path, self.archive_dir_path) + FileManager:copyRecursive(DocSettings:getSidecarDir(document_full_path), self.archive_dir_path) + end + local dest_file = string.format("%s%s", self.archive_dir_path, filename) + ReadHistory:updateItemByPath(document_full_path, dest_file) + ReadCollection:updateItemByPath(document_full_path, dest_file) + -- Update last open file. + if G_reader_settings:readSetting("lastfile") == document_full_path then + G_reader_settings:saveSetting("lastfile", dest_file) + end + UIManager:show(ConfirmBox:new{ + text = moved_done_text, + ok_callback = function () + ReaderUI:showReader(dest_file) + end, + cancel_callback = function () + self:openFileBrowser(self.last_copied_from_dir) + end, + }) +end + +function MoveToArchive:setArchiveDirectory() + require("ui/downloadmgr"):new{ + onConfirm = function(path) + self.archive_dir_path = ("%s/"):format(path) + self.settings:saveSetting("archive_dir", self.archive_dir_path) + self.settings:flush() + end, + }:chooseDir() +end + +function MoveToArchive:showNoArchiveConfirmBox() + UIManager:show(ConfirmBox:new{ + text = _("No archive directory.\nDo you want to set it now?"), + ok_text = _("Set archive folder"), + ok_callback = function() + self:setArchiveDirectory() + end, + }) +end + +function MoveToArchive:isActionEnabled() + return self.ui.document ~= nil and ((BaseUtil.dirname(self.ui.document.file) .. "/") ~= self.archive_dir_path ) +end + +function MoveToArchive:openFileBrowser(path) + if self.ui.document then + self.ui:onClose() + end + if FileManager.instance then + FileManager.instance:reinit(path) + else + FileManager:showFiles(path) + end +end + +return MoveToArchive