2
0
mirror of https://github.com/koreader/koreader synced 2024-11-18 03:25:46 +00:00
koreader/plugins/movetoarchive.koplugin/main.lua

158 lines
5.5 KiB
Lua
Raw Normal View History

2020-05-02 21:02:36 +00:00
local ConfirmBox = require("ui/widget/confirmbox")
local DataStorage = require("datastorage")
local Dispatcher = require("dispatcher")
2020-05-02 21:02:36 +00:00
local DocSettings = require("docsettings")
local Event = require("ui/event")
2020-05-02 21:02:36 +00:00
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")
Clarify our OOP semantics across the codebase (#9586) Basically: * Use `extend` for class definitions * Use `new` for object instantiations That includes some minor code cleanups along the way: * Updated `Widget`'s docs to make the semantics clearer. * Removed `should_restrict_JIT` (it's been dead code since https://github.com/koreader/android-luajit-launcher/pull/283) * Minor refactoring of LuaSettings/LuaData/LuaDefaults/DocSettings to behave (mostly, they are instantiated via `open` instead of `new`) like everything else and handle inheritance properly (i.e., DocSettings is now a proper LuaSettings subclass). * Default to `WidgetContainer` instead of `InputContainer` for stuff that doesn't actually setup key/gesture events. * Ditto for explicit `*Listener` only classes, make sure they're based on `EventListener` instead of something uselessly fancier. * Unless absolutely necessary, do not store references in class objects, ever; only values. Instead, always store references in instances, to avoid both sneaky inheritance issues, and sneaky GC pinning of stale references. * ReaderUI: Fix one such issue with its `active_widgets` array, with critical implications, as it essentially pinned *all* of ReaderUI's modules, including their reference to the `Document` instance (i.e., that was a big-ass leak). * Terminal: Make sure the shell is killed on plugin teardown. * InputText: Fix Home/End/Del physical keys to behave sensibly. * InputContainer/WidgetContainer: If necessary, compute self.dimen at paintTo time (previously, only InputContainers did, which might have had something to do with random widgets unconcerned about input using it as a baseclass instead of WidgetContainer...). * OverlapGroup: Compute self.dimen at *init* time, because for some reason it needs to do that, but do it directly in OverlapGroup instead of going through a weird WidgetContainer method that it was the sole user of. * ReaderCropping: Under no circumstances should a Document instance member (here, self.bbox) risk being `nil`ed! * Kobo: Minor code cleanups.
2022-10-06 00:14:48 +00:00
local MoveToArchive = WidgetContainer:extend{
name = "movetoarchive",
title = _("Move current book to archive"),
2020-05-02 21:02:36 +00:00
}
function MoveToArchive:onDispatcherRegisterActions()
Dispatcher:registerAction(self.name, {category="none", event="MoveToArchive", title=self.title, reader=true})
end
2020-05-02 21:02:36 +00:00
function MoveToArchive:init()
self:onDispatcherRegisterActions()
2020-05-02 21:02:36 +00:00
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 = self.title,
callback = function() self:onMoveToArchive() end,
2020-05-02 21:02:36 +00:00
enabled_func = function()
return self:isActionEnabled()
end,
},
{
text = _("Copy current book to archive"),
callback = function() self:onMoveToArchive(true) end,
2020-05-02 21:02:36 +00:00
enabled_func = function()
return self:isActionEnabled()
end,
},
{
text = _("Go to archive folder"),
callback = function()
if self.archive_dir_path then
self:openFileBrowser(self.archive_dir_path)
else
2020-05-02 21:02:36 +00:00
self:showNoArchiveConfirmBox()
end
end,
},
{
text = _("Go to last copied/moved from folder"),
callback = function()
if self.last_copied_from_dir then
self:openFileBrowser(self.last_copied_from_dir)
else
2020-05-02 21:02:36 +00:00
UIManager:show(InfoMessage:new{
text = _("No previous folder found.")
})
2020-05-02 21:02:36 +00:00
end
end,
},
{
text = _("Set archive folder"),
2020-05-02 21:02:36 +00:00
keep_menu_open = true,
callback = function()
self:setArchiveDirectory()
end,
},
2020-05-02 21:02:36 +00:00
},
}
end
function MoveToArchive:onMoveToArchive(do_copy)
2020-05-02 21:02:36 +00:00
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)
local dest_file = string.format("%s%s", self.archive_dir_path, filename)
2020-05-02 21:02:36 +00:00
self.settings:saveSetting("last_copied_from_dir", self.last_copied_from_dir)
self.settings:flush()
UIManager:broadcastEvent(Event:new("SetupShowReader"))
2020-05-02 21:02:36 +00:00
self.ui:onClose()
local text
if do_copy then
text = _("Book copied.\nDo you want to open it from the archive folder?")
2020-05-02 21:02:36 +00:00
FileManager:copyFileFromTo(document_full_path, self.archive_dir_path)
else
text = _("Book moved.\nDo you want to open it from the archive folder?")
FileManager:moveFile(document_full_path, self.archive_dir_path)
require("readhistory"):updateItemByPath(document_full_path, dest_file) -- (will update "lastfile" if needed)
require("readcollection"):updateItemByPath(document_full_path, dest_file)
2020-05-02 21:02:36 +00:00
end
DocSettings:updateLocation(document_full_path, dest_file, do_copy)
2020-05-02 21:02:36 +00:00
UIManager:show(ConfirmBox:new{
text = text,
ok_callback = function()
local ReaderUI = require("apps/reader/readerui")
2020-05-02 21:02:36 +00:00
ReaderUI:showReader(dest_file)
end,
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