decouple UI from core document code

pull/4273/head
Qingping Hou 6 years ago
parent 76a3d20f01
commit a72f8b6338

@ -274,7 +274,7 @@ function FileManager:init()
and #(DocumentRegistry:getProviders(file)) > 1, and #(DocumentRegistry:getProviders(file)) > 1,
callback = function() callback = function()
UIManager:close(self.file_dialog) UIManager:close(self.file_dialog)
DocumentRegistry:showSetProviderButtons(file, FileManager.instance, self, ReaderUI) self:showSetProviderButtons(file, FileManager.instance, ReaderUI)
end, end,
}, },
{ {

@ -2,14 +2,9 @@
This is a registry for document providers This is a registry for document providers
]]-- ]]--
local ConfirmBox = require("ui/widget/confirmbox")
local OpenWithDialog = require("ui/widget/openwithdialog")
local UIManager = require("ui/uimanager")
local logger = require("logger") local logger = require("logger")
local lfs = require("libs/libkoreader-lfs") local lfs = require("libs/libkoreader-lfs")
local util = require("util") local util = require("util")
local _ = require("gettext")
local T = require("ffi/util").template
local DocumentRegistry = { local DocumentRegistry = {
registry = {}, registry = {},
@ -147,85 +142,6 @@ function DocumentRegistry:setProvider(file, provider, all)
end end
end end
function DocumentRegistry:showSetProviderButtons(file, filemanager_instance, ui, reader_ui)
local __, filename_pure = util.splitFilePathName(file)
local filename_suffix = util.getFileNameSuffix(file)
local buttons = {}
local radio_buttons = {}
local providers = self:getProviders(file)
for ___, provider in ipairs(providers) do
-- we have no need for extension, mimetype, weights, etc. here
provider = provider.provider
table.insert(radio_buttons, {
{
text = provider.provider_name,
checked = self:getProvider(file) == provider,
provider = provider,
},
})
end
table.insert(buttons, {
{
text = _("Cancel"),
callback = function()
UIManager:close(self.set_provider_dialog)
end,
},
{
text = _("Open"),
is_enter_default = true,
callback = function()
local provider = self.set_provider_dialog.radio_button_table.checked_button.provider
-- always for this file
if self.set_provider_dialog._check_file_button.checked then
UIManager:show(ConfirmBox:new{
text = T(_("Always open '%2' with %1?"),
provider.provider_name, filename_pure),
ok_text = _("Always"),
ok_callback = function()
self:setProvider(file, provider, false)
filemanager_instance:onClose()
reader_ui:showReader(file, provider)
UIManager:close(self.set_provider_dialog)
end,
})
-- always for all files of this file type
elseif self.set_provider_dialog._check_global_button.checked then
UIManager:show(ConfirmBox:new{
text = T(_("Always open %2 files with %1?"),
provider.provider_name, filename_suffix),
ok_text = _("Always"),
ok_callback = function()
self:setProvider(file, provider, true)
filemanager_instance:onClose()
reader_ui:showReader(file, provider)
UIManager:close(self.set_provider_dialog)
end,
})
else
-- just once
filemanager_instance:onClose()
reader_ui:showReader(file, provider)
UIManager:close(self.set_provider_dialog)
end
end,
},
})
self.set_provider_dialog = OpenWithDialog:new{
title = T(_("Open %1 with:"), filename_pure),
radio_buttons = radio_buttons,
buttons = buttons,
}
UIManager:show(self.set_provider_dialog)
end
function DocumentRegistry:openDocument(file, provider) function DocumentRegistry:openDocument(file, provider)
-- force a GC, so that any previous document used memory can be reused -- force a GC, so that any previous document used memory can be reused
-- immediately by this new document without having to wait for the -- immediately by this new document without having to wait for the

@ -1,17 +1,21 @@
local Device = require("device") local Device = require("device")
local DocSettings = require("docsettings") local DocSettings = require("docsettings")
local DocumentRegistry = require("document/documentregistry") local DocumentRegistry = require("document/documentregistry")
local OpenWithDialog = require("ui/widget/openwithdialog")
local ConfirmBox = require("ui/widget/confirmbox")
local Font = require("ui/font") local Font = require("ui/font")
local Menu = require("ui/widget/menu") local Menu = require("ui/widget/menu")
local UIManager = require("ui/uimanager") local UIManager = require("ui/uimanager")
local ffi = require("ffi") local ffi = require("ffi")
local lfs = require("libs/libkoreader-lfs") local lfs = require("libs/libkoreader-lfs")
local util = require("ffi/util") local ffiUtil = require("ffi/util")
local T = ffiUtil.template
local C = ffi.C local C = ffi.C
local _ = require("gettext") local _ = require("gettext")
local Screen = Device.screen local Screen = Device.screen
local getFileNameSuffix = require("util").getFileNameSuffix local util = require("util")
local getFriendlySize = require("util").getFriendlySize local getFileNameSuffix = util.getFileNameSuffix
local getFriendlySize = util.getFriendlySize
ffi.cdef[[ ffi.cdef[[
int strcoll (const char *str1, const char *str2); int strcoll (const char *str1, const char *str2);
@ -210,7 +214,7 @@ function FileChooser:genItemTableFromPath(path)
if num_items == 1 then if num_items == 1 then
istr = _("1 item") istr = _("1 item")
else else
istr = util.template(_("%1 items"), num_items) istr = ffiUtil.template(_("%1 items"), num_items)
end end
local text local text
if dir.name == ".." then if dir.name == ".." then
@ -267,7 +271,7 @@ function FileChooser:genItemTableFromPath(path)
if ffi.os == "Windows" then if ffi.os == "Windows" then
for k, v in pairs(item_table) do for k, v in pairs(item_table) do
if v.text then if v.text then
v.text = util.multiByteToUTF8(v.text) or "" v.text = ffiUtil.multiByteToUTF8(v.text) or ""
end end
end end
end end
@ -283,7 +287,7 @@ end
function FileChooser:refreshPath() function FileChooser:refreshPath()
local itemmatch = nil local itemmatch = nil
local _, folder_name = require("util").splitFilePathName(self.path) local _, folder_name = util.splitFilePathName(self.path)
Screen:setWindowTitle(folder_name) Screen:setWindowTitle(folder_name)
if self.focused_path then if self.focused_path then
@ -298,7 +302,7 @@ function FileChooser:refreshPath()
end end
function FileChooser:changeToPath(path, focused_path) function FileChooser:changeToPath(path, focused_path)
path = util.realpath(path) path = ffiUtil.realpath(path)
self.path = path self.path = path
if focused_path then if focused_path then
@ -383,4 +387,83 @@ function FileChooser:getNextFile(curr_file)
return next_file return next_file
end end
function FileChooser:showSetProviderButtons(file, filemanager_instance, reader_ui)
local __, filename_pure = util.splitFilePathName(file)
local filename_suffix = util.getFileNameSuffix(file)
local buttons = {}
local radio_buttons = {}
local providers = DocumentRegistry:getProviders(file)
for ___, provider in ipairs(providers) do
-- we have no need for extension, mimetype, weights, etc. here
provider = provider.provider
table.insert(radio_buttons, {
{
text = provider.provider_name,
checked = DocumentRegistry:getProvider(file) == provider,
provider = provider,
},
})
end
table.insert(buttons, {
{
text = _("Cancel"),
callback = function()
UIManager:close(self.set_provider_dialog)
end,
},
{
text = _("Open"),
is_enter_default = true,
callback = function()
local provider = self.set_provider_dialog.radio_button_table.checked_button.provider
-- always for this file
if self.set_provider_dialog._check_file_button.checked then
UIManager:show(ConfirmBox:new{
text = T(_("Always open '%2' with %1?"),
provider.provider_name, filename_pure),
ok_text = _("Always"),
ok_callback = function()
DocumentRegistry:setProvider(file, provider, false)
filemanager_instance:onClose()
reader_ui:showReader(file, provider)
UIManager:close(self.set_provider_dialog)
end,
})
-- always for all files of this file type
elseif self.set_provider_dialog._check_global_button.checked then
UIManager:show(ConfirmBox:new{
text = T(_("Always open %2 files with %1?"),
provider.provider_name, filename_suffix),
ok_text = _("Always"),
ok_callback = function()
DocumentRegistry:setProvider(file, provider, true)
filemanager_instance:onClose()
reader_ui:showReader(file, provider)
UIManager:close(self.set_provider_dialog)
end,
})
else
-- just once
filemanager_instance:onClose()
reader_ui:showReader(file, provider)
UIManager:close(self.set_provider_dialog)
end
end,
},
})
self.set_provider_dialog = OpenWithDialog:new{
title = T(_("Open %1 with:"), filename_pure),
radio_buttons = radio_buttons,
buttons = buttons,
}
UIManager:show(self.set_provider_dialog)
end
return FileChooser return FileChooser

Loading…
Cancel
Save