2020-05-02 21:02:36 +00:00
|
|
|
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{
|
2020-05-03 20:31:02 +00:00
|
|
|
name = "movetoarchive",
|
2020-05-02 21:02:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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,
|
|
|
|
},
|
|
|
|
{
|
2021-02-22 17:44:16 +00:00
|
|
|
text = _("Set archive folder"),
|
2020-05-02 21:02:36 +00:00
|
|
|
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()
|
|
|
|
|
ReaderUI: Saner FM/RD lifecycle
* Ensure that going from one to the other tears down the former and
its plugins before instantiating the latter and its plugins.
UIManager: Unify Event sending & broadcasting
* Make the two behave the same way (walk the widget stack from top to
bottom), and properly handle the window stack shrinking shrinking
*and* growing.
Previously, broadcasting happened bottom-to-top and didn't really
handle the list shrinking/growing, while sending only handled the list
shrinking by a single element, and hopefully that element being the one
the event was just sent to.
These two items combined allowed us to optimize suboptimal
refresh behavior with Menu and other Menu classes when
opening/closing a document.
e.g., the "opening document" Notification is now properly regional,
and the "open last doc" option no longer flashes like a crazy person
anymore.
Plugins: Allow optimizing Menu refresh with custom menus, too.
Requires moving Menu's close_callback *after* onMenuSelect, which, eh,
probably makes sense, and is probably harmless in the grand scheme of
things.
2021-05-01 16:53:04 +00:00
|
|
|
local Event = require("ui/event")
|
|
|
|
UIManager:broadcastEvent(Event:new("SetupShowReader"))
|
|
|
|
|
2020-05-02 21:02:36 +00:00
|
|
|
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)
|
2020-05-06 19:11:34 +00:00
|
|
|
ReadHistory:updateItemByPath(document_full_path, dest_file) -- (will update "lastfile" if needed)
|
2020-05-02 21:02:36 +00:00
|
|
|
ReadCollection:updateItemByPath(document_full_path, dest_file)
|
|
|
|
UIManager:show(ConfirmBox:new{
|
|
|
|
text = moved_done_text,
|
ReaderUI: Saner FM/RD lifecycle
* Ensure that going from one to the other tears down the former and
its plugins before instantiating the latter and its plugins.
UIManager: Unify Event sending & broadcasting
* Make the two behave the same way (walk the widget stack from top to
bottom), and properly handle the window stack shrinking shrinking
*and* growing.
Previously, broadcasting happened bottom-to-top and didn't really
handle the list shrinking/growing, while sending only handled the list
shrinking by a single element, and hopefully that element being the one
the event was just sent to.
These two items combined allowed us to optimize suboptimal
refresh behavior with Menu and other Menu classes when
opening/closing a document.
e.g., the "opening document" Notification is now properly regional,
and the "open last doc" option no longer flashes like a crazy person
anymore.
Plugins: Allow optimizing Menu refresh with custom menus, too.
Requires moving Menu's close_callback *after* onMenuSelect, which, eh,
probably makes sense, and is probably harmless in the grand scheme of
things.
2021-05-01 16:53:04 +00:00
|
|
|
ok_callback = function()
|
2020-05-02 21:02:36 +00:00
|
|
|
ReaderUI:showReader(dest_file)
|
|
|
|
end,
|
ReaderUI: Saner FM/RD lifecycle
* Ensure that going from one to the other tears down the former and
its plugins before instantiating the latter and its plugins.
UIManager: Unify Event sending & broadcasting
* Make the two behave the same way (walk the widget stack from top to
bottom), and properly handle the window stack shrinking shrinking
*and* growing.
Previously, broadcasting happened bottom-to-top and didn't really
handle the list shrinking/growing, while sending only handled the list
shrinking by a single element, and hopefully that element being the one
the event was just sent to.
These two items combined allowed us to optimize suboptimal
refresh behavior with Menu and other Menu classes when
opening/closing a document.
e.g., the "opening document" Notification is now properly regional,
and the "open last doc" option no longer flashes like a crazy person
anymore.
Plugins: Allow optimizing Menu refresh with custom menus, too.
Requires moving Menu's close_callback *after* onMenuSelect, which, eh,
probably makes sense, and is probably harmless in the grand scheme of
things.
2021-05-01 16:53:04 +00:00
|
|
|
cancel_callback = function()
|
2020-05-02 21:02:36 +00:00
|
|
|
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
|