2013-10-18 20:38:07 +00:00
|
|
|
local CenterContainer = require("ui/widget/container/centercontainer")
|
2017-03-28 22:10:36 +00:00
|
|
|
local CloudStorage = require("apps/cloudstorage/cloudstorage")
|
2014-08-01 04:36:32 +00:00
|
|
|
local ConfirmBox = require("ui/widget/confirmbox")
|
2017-03-28 22:10:36 +00:00
|
|
|
local Device = require("device")
|
2019-03-03 11:43:09 +00:00
|
|
|
local Event = require("ui/event")
|
2017-03-28 22:10:36 +00:00
|
|
|
local InputContainer = require("ui/widget/container/inputcontainer")
|
2018-08-17 18:54:11 +00:00
|
|
|
local PluginLoader = require("pluginloader")
|
2014-08-07 07:14:30 +00:00
|
|
|
local Search = require("apps/filemanager/filemanagersearch")
|
2014-08-11 08:39:08 +00:00
|
|
|
local SetDefaults = require("apps/filemanager/filemanagersetdefaults")
|
2017-03-28 22:10:36 +00:00
|
|
|
local UIManager = require("ui/uimanager")
|
|
|
|
local Screen = Device.screen
|
2017-04-21 09:19:14 +00:00
|
|
|
local dbg = require("dbg")
|
|
|
|
local logger = require("logger")
|
2018-07-05 05:40:40 +00:00
|
|
|
local util = require("util")
|
2017-04-21 09:19:14 +00:00
|
|
|
local _ = require("gettext")
|
2018-05-23 20:25:33 +00:00
|
|
|
local T = require("ffi/util").template
|
2013-10-18 20:38:07 +00:00
|
|
|
|
|
|
|
local FileManagerMenu = InputContainer:extend{
|
2014-03-13 13:52:43 +00:00
|
|
|
tab_item_table = nil,
|
2017-02-28 21:46:32 +00:00
|
|
|
menu_items = {},
|
2016-05-02 02:39:31 +00:00
|
|
|
registered_widgets = nil,
|
2013-08-14 09:29:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function FileManagerMenu:init()
|
2017-03-03 06:41:10 +00:00
|
|
|
self.menu_items = {
|
|
|
|
["KOMenu:menu_buttons"] = {
|
|
|
|
-- top menu
|
|
|
|
},
|
|
|
|
-- items in top menu
|
2018-04-06 09:32:54 +00:00
|
|
|
filemanager_settings = {
|
|
|
|
icon = "resources/icons/appbar.cabinet.files.png",
|
|
|
|
},
|
2017-03-03 06:41:10 +00:00
|
|
|
setting = {
|
|
|
|
icon = "resources/icons/appbar.settings.png",
|
|
|
|
},
|
|
|
|
tools = {
|
|
|
|
icon = "resources/icons/appbar.tools.png",
|
|
|
|
},
|
|
|
|
search = {
|
|
|
|
icon = "resources/icons/appbar.magnify.browse.png",
|
|
|
|
},
|
|
|
|
main = {
|
|
|
|
icon = "resources/icons/menu-icon.png",
|
|
|
|
},
|
2014-03-13 13:52:43 +00:00
|
|
|
}
|
2017-02-28 21:46:32 +00:00
|
|
|
|
2014-03-13 13:52:43 +00:00
|
|
|
self.registered_widgets = {}
|
|
|
|
|
2014-06-10 07:57:10 +00:00
|
|
|
if Device:hasKeys() then
|
2014-03-13 13:52:43 +00:00
|
|
|
self.key_events = {
|
2014-06-05 06:58:53 +00:00
|
|
|
ShowMenu = { { "Menu" }, doc = "show menu" },
|
2014-03-13 13:52:43 +00:00
|
|
|
}
|
|
|
|
end
|
2017-08-08 16:20:46 +00:00
|
|
|
self.activation_menu = G_reader_settings:readSetting("activate_menu")
|
|
|
|
if self.activation_menu == nil then
|
|
|
|
self.activation_menu = "swipe_tap"
|
|
|
|
end
|
2013-08-14 09:29:05 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
function FileManagerMenu:initGesListener()
|
2017-04-15 12:45:56 +00:00
|
|
|
if not Device:isTouchDevice() then return end
|
|
|
|
|
|
|
|
self:registerTouchZones({
|
2017-06-01 16:32:06 +00:00
|
|
|
{
|
|
|
|
id = "filemanager_tap",
|
|
|
|
ges = "tap",
|
|
|
|
screen_zone = {
|
|
|
|
ratio_x = DTAP_ZONE_MENU.x, ratio_y = DTAP_ZONE_MENU.y,
|
|
|
|
ratio_w = DTAP_ZONE_MENU.w, ratio_h = DTAP_ZONE_MENU.h,
|
|
|
|
},
|
|
|
|
handler = function(ges) return self:onTapShowMenu(ges) end,
|
|
|
|
},
|
2017-04-15 12:45:56 +00:00
|
|
|
{
|
|
|
|
id = "filemanager_swipe",
|
|
|
|
ges = "swipe",
|
|
|
|
screen_zone = {
|
|
|
|
ratio_x = DTAP_ZONE_MENU.x, ratio_y = DTAP_ZONE_MENU.y,
|
|
|
|
ratio_w = DTAP_ZONE_MENU.w, ratio_h = DTAP_ZONE_MENU.h,
|
|
|
|
},
|
|
|
|
overrides = { "rolling_swipe", "paging_swipe", },
|
|
|
|
handler = function(ges) return self:onSwipeShowMenu(ges) end,
|
2014-03-13 13:52:43 +00:00
|
|
|
},
|
2017-04-15 12:45:56 +00:00
|
|
|
})
|
2013-08-14 09:29:05 +00:00
|
|
|
end
|
|
|
|
|
2018-05-23 20:25:33 +00:00
|
|
|
function FileManagerMenu:openLastDoc()
|
|
|
|
local last_file = G_reader_settings:readSetting("lastfile")
|
|
|
|
if not last_file or lfs.attributes(last_file, "mode") ~= "file" then
|
|
|
|
local InfoMessage = require("ui/widget/infomessage")
|
|
|
|
UIManager:show(InfoMessage:new{
|
|
|
|
text = _("Cannot open last document"),
|
|
|
|
})
|
|
|
|
return
|
|
|
|
end
|
|
|
|
local ReaderUI = require("apps/reader/readerui")
|
|
|
|
ReaderUI:showReader(last_file)
|
2019-02-22 15:29:19 +00:00
|
|
|
|
|
|
|
-- only close menu if we were called from the menu
|
|
|
|
if self.menu_container then
|
|
|
|
self:onCloseFileManagerMenu()
|
|
|
|
end
|
|
|
|
|
2018-05-23 20:25:33 +00:00
|
|
|
local FileManager = require("apps/filemanager/filemanager")
|
|
|
|
FileManager.instance:onClose()
|
|
|
|
end
|
|
|
|
|
2013-08-14 09:29:05 +00:00
|
|
|
function FileManagerMenu:setUpdateItemTable()
|
2014-03-13 13:52:43 +00:00
|
|
|
for _, widget in pairs(self.registered_widgets) do
|
2017-04-21 09:19:14 +00:00
|
|
|
local ok, err = pcall(widget.addToMainMenu, widget, self.menu_items)
|
|
|
|
if not ok then
|
|
|
|
logger.err("failed to register widget", widget.name, err)
|
|
|
|
end
|
2014-03-13 13:52:43 +00:00
|
|
|
end
|
|
|
|
|
2014-07-27 13:41:38 +00:00
|
|
|
-- setting tab
|
2017-03-03 06:41:10 +00:00
|
|
|
self.menu_items.show_hidden_files = {
|
2014-06-05 11:06:35 +00:00
|
|
|
text = _("Show hidden files"),
|
|
|
|
checked_func = function() return self.ui.file_chooser.show_hidden end,
|
2014-10-30 14:41:49 +00:00
|
|
|
callback = function() self.ui:toggleHiddenFiles() end
|
2017-02-28 21:46:32 +00:00
|
|
|
}
|
2018-01-13 22:38:53 +00:00
|
|
|
self.menu_items.items_per_page = {
|
|
|
|
text = _("Items per page"),
|
2018-09-04 21:55:58 +00:00
|
|
|
help_text = _([[This sets the number of items per page in:
|
|
|
|
- File browser and history in 'classic' display mode
|
|
|
|
- File and directory selection
|
2018-10-08 16:55:21 +00:00
|
|
|
- Table of contents
|
2018-09-04 21:55:58 +00:00
|
|
|
- Bookmarks list]]),
|
|
|
|
keep_menu_open = true,
|
2018-01-13 22:38:53 +00:00
|
|
|
callback = function()
|
|
|
|
local SpinWidget = require("ui/widget/spinwidget")
|
|
|
|
local curr_items = G_reader_settings:readSetting("items_per_page") or 14
|
|
|
|
local items = SpinWidget:new{
|
|
|
|
width = Screen:getWidth() * 0.6,
|
|
|
|
value = curr_items,
|
|
|
|
value_min = 6,
|
|
|
|
value_max = 24,
|
|
|
|
ok_text = _("Set items"),
|
|
|
|
title_text = _("Items per page"),
|
|
|
|
callback = function(spin)
|
|
|
|
G_reader_settings:saveSetting("items_per_page", spin.value)
|
|
|
|
self.ui:onRefresh()
|
|
|
|
end
|
|
|
|
}
|
|
|
|
UIManager:show(items)
|
|
|
|
end
|
|
|
|
}
|
2017-03-03 06:41:10 +00:00
|
|
|
self.menu_items.sort_by = self.ui:getSortingMenuTable()
|
|
|
|
self.menu_items.reverse_sorting = {
|
2014-10-30 14:41:49 +00:00
|
|
|
text = _("Reverse sorting"),
|
|
|
|
checked_func = function() return self.ui.file_chooser.reverse_collate end,
|
|
|
|
callback = function() self.ui:toggleReverseCollate() end
|
2017-02-28 21:46:32 +00:00
|
|
|
}
|
2017-08-14 11:15:12 +00:00
|
|
|
self.menu_items.start_with = self.ui:getStartWithMenuTable()
|
2017-04-13 17:55:31 +00:00
|
|
|
if Device:supportsScreensaver() then
|
2017-03-03 06:41:10 +00:00
|
|
|
self.menu_items.screensaver = {
|
2016-08-01 01:26:26 +00:00
|
|
|
text = _("Screensaver"),
|
2017-12-17 17:27:24 +00:00
|
|
|
sub_item_table = require("ui/elements/screensaver_menu"),
|
2017-02-28 21:46:32 +00:00
|
|
|
}
|
2016-08-01 01:26:26 +00:00
|
|
|
end
|
2014-11-21 14:41:14 +00:00
|
|
|
-- insert common settings
|
2019-03-02 20:45:12 +00:00
|
|
|
for id, common_setting in pairs(dofile("frontend/ui/elements/common_settings_menu_table.lua")) do
|
2017-02-28 21:46:32 +00:00
|
|
|
self.menu_items[id] = common_setting
|
2014-03-13 13:52:43 +00:00
|
|
|
end
|
2014-11-21 14:41:14 +00:00
|
|
|
|
2014-08-11 14:14:15 +00:00
|
|
|
-- tools tab
|
2017-03-03 06:41:10 +00:00
|
|
|
self.menu_items.advanced_settings = {
|
2014-11-26 17:16:54 +00:00
|
|
|
text = _("Advanced settings"),
|
2014-08-11 14:14:15 +00:00
|
|
|
callback = function()
|
|
|
|
SetDefaults:ConfirmEdit()
|
|
|
|
end,
|
|
|
|
hold_callback = function()
|
|
|
|
SetDefaults:ConfirmSave()
|
|
|
|
end,
|
2017-02-28 21:46:32 +00:00
|
|
|
}
|
2018-08-17 18:54:11 +00:00
|
|
|
self.menu_items.plugin_management = {
|
|
|
|
text = _("Plugin management"),
|
|
|
|
sub_item_table = PluginLoader:genPluginManagerSubItem()
|
|
|
|
}
|
|
|
|
|
2017-03-03 06:41:10 +00:00
|
|
|
self.menu_items.opds_catalog = {
|
2014-11-26 17:16:54 +00:00
|
|
|
text = _("OPDS catalog"),
|
2014-08-07 07:14:30 +00:00
|
|
|
callback = function()
|
2014-11-26 17:16:54 +00:00
|
|
|
local OPDSCatalog = require("apps/opdscatalog/opdscatalog")
|
2016-12-05 18:17:49 +00:00
|
|
|
local filemanagerRefresh = function() self.ui:onRefresh() end
|
|
|
|
function OPDSCatalog:onClose()
|
|
|
|
filemanagerRefresh()
|
|
|
|
UIManager:close(self)
|
2014-11-16 11:57:56 +00:00
|
|
|
end
|
2014-11-26 17:16:54 +00:00
|
|
|
OPDSCatalog:showCatalog()
|
|
|
|
end,
|
2017-02-28 21:46:32 +00:00
|
|
|
}
|
2017-03-03 06:41:10 +00:00
|
|
|
self.menu_items.developer_options = {
|
2016-12-03 13:30:08 +00:00
|
|
|
text = _("Developer options"),
|
|
|
|
sub_item_table = {
|
|
|
|
{
|
|
|
|
text = _("Clear readers' caches"),
|
|
|
|
callback = function()
|
|
|
|
UIManager:show(ConfirmBox:new{
|
|
|
|
text = _("Clear cache/ and cr3cache/ ?"),
|
|
|
|
ok_callback = function()
|
|
|
|
local purgeDir = require("ffi/util").purgeDir
|
|
|
|
local DataStorage = require("datastorage")
|
|
|
|
local cachedir = DataStorage:getDataDir() .. "/cache"
|
|
|
|
if lfs.attributes(cachedir, "mode") == "directory" then
|
|
|
|
purgeDir(cachedir)
|
|
|
|
end
|
|
|
|
lfs.mkdir(cachedir)
|
2016-12-12 22:37:48 +00:00
|
|
|
-- Also remove from Cache objet references to
|
|
|
|
-- the cache files we just deleted
|
|
|
|
local Cache = require("cache")
|
|
|
|
Cache.cached = {}
|
|
|
|
local InfoMessage = require("ui/widget/infomessage")
|
|
|
|
UIManager:show(InfoMessage:new{
|
|
|
|
text = _("Caches cleared. Please exit and restart KOReader."),
|
|
|
|
})
|
2016-12-03 13:30:08 +00:00
|
|
|
end,
|
|
|
|
})
|
|
|
|
end,
|
|
|
|
},
|
[feat, Kobo] On Kobo, drop fb to 8bpp on startup (#4637)
* The Great 8bpp Experiment
Swap to 8bpp on Kobo, because we're 'effing grayscale, for pete's sake!
* Always swap to 8bpp, no matter the launch method.
Because it turned out that, even when restarting Nickel, we had to
restore the expected bitdepth ourselves, because pickel/Nickel didn't do
the job completely.
(I'm going to guess the grayscale flag wasn't getting flipped properly).
* Dither every non-transparent icon to the eInk palette
* Make sure hasBGRFrameBuffer is only enabled when the Kobo fb actually is
@ 32bpp...
* Re-process badly grayscaled icons
* And re-grayscale that one w/ gamma correction so the squares show up
better.
* Allow the fbdepth switch to be disabled (in Developer settings).
Also, allow setting debug mode that way.
Also, forcibly disable verbose logging when disabling debug.
* Update setting name to piggyback on the existing check in reader.lua
* Update icons postprocessing info
2019-03-03 11:31:55 +00:00
|
|
|
{
|
|
|
|
text = _("Enable debug logging"),
|
|
|
|
checked_func = function()
|
|
|
|
return G_reader_settings:isTrue("debug")
|
|
|
|
end,
|
|
|
|
callback = function()
|
|
|
|
G_reader_settings:flipNilOrFalse("debug")
|
|
|
|
if G_reader_settings:isTrue("debug") then
|
|
|
|
dbg:turnOn()
|
|
|
|
else
|
|
|
|
dbg:setVerbose(false)
|
|
|
|
dbg:turnOff()
|
2019-03-14 19:58:45 +00:00
|
|
|
G_reader_settings:flipFalse("debug_verbose")
|
[feat, Kobo] On Kobo, drop fb to 8bpp on startup (#4637)
* The Great 8bpp Experiment
Swap to 8bpp on Kobo, because we're 'effing grayscale, for pete's sake!
* Always swap to 8bpp, no matter the launch method.
Because it turned out that, even when restarting Nickel, we had to
restore the expected bitdepth ourselves, because pickel/Nickel didn't do
the job completely.
(I'm going to guess the grayscale flag wasn't getting flipped properly).
* Dither every non-transparent icon to the eInk palette
* Make sure hasBGRFrameBuffer is only enabled when the Kobo fb actually is
@ 32bpp...
* Re-process badly grayscaled icons
* And re-grayscale that one w/ gamma correction so the squares show up
better.
* Allow the fbdepth switch to be disabled (in Developer settings).
Also, allow setting debug mode that way.
Also, forcibly disable verbose logging when disabling debug.
* Update setting name to piggyback on the existing check in reader.lua
* Update icons postprocessing info
2019-03-03 11:31:55 +00:00
|
|
|
end
|
|
|
|
end,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
text = _("Enable verbose debug logging"),
|
|
|
|
enabled_func = function()
|
|
|
|
return G_reader_settings:isTrue("debug")
|
|
|
|
end,
|
|
|
|
checked_func = function()
|
|
|
|
return G_reader_settings:isTrue("debug_verbose")
|
|
|
|
end,
|
|
|
|
callback = function()
|
|
|
|
G_reader_settings:flipNilOrFalse("debug_verbose")
|
|
|
|
if G_reader_settings:isTrue("debug_verbose") then
|
|
|
|
dbg:setVerbose(true)
|
|
|
|
else
|
|
|
|
dbg:setVerbose(false)
|
|
|
|
end
|
|
|
|
end,
|
|
|
|
},
|
2016-12-03 13:30:08 +00:00
|
|
|
}
|
2017-02-28 21:46:32 +00:00
|
|
|
}
|
[feat, Kobo] On Kobo, drop fb to 8bpp on startup (#4637)
* The Great 8bpp Experiment
Swap to 8bpp on Kobo, because we're 'effing grayscale, for pete's sake!
* Always swap to 8bpp, no matter the launch method.
Because it turned out that, even when restarting Nickel, we had to
restore the expected bitdepth ourselves, because pickel/Nickel didn't do
the job completely.
(I'm going to guess the grayscale flag wasn't getting flipped properly).
* Dither every non-transparent icon to the eInk palette
* Make sure hasBGRFrameBuffer is only enabled when the Kobo fb actually is
@ 32bpp...
* Re-process badly grayscaled icons
* And re-grayscale that one w/ gamma correction so the squares show up
better.
* Allow the fbdepth switch to be disabled (in Developer settings).
Also, allow setting debug mode that way.
Also, forcibly disable verbose logging when disabling debug.
* Update setting name to piggyback on the existing check in reader.lua
* Update icons postprocessing info
2019-03-03 11:31:55 +00:00
|
|
|
if Device:isKobo() then
|
|
|
|
table.insert(self.menu_items.developer_options.sub_item_table, {
|
|
|
|
text = _("Disable forced 8-bit color space"),
|
|
|
|
checked_func = function()
|
|
|
|
return G_reader_settings:isTrue("dev_startup_no_fbdepth")
|
|
|
|
end,
|
|
|
|
callback = function()
|
|
|
|
G_reader_settings:flipNilOrFalse("dev_startup_no_fbdepth")
|
|
|
|
end,
|
|
|
|
})
|
|
|
|
end
|
2017-03-03 06:41:10 +00:00
|
|
|
self.menu_items.cloud_storage = {
|
2016-12-20 07:34:00 +00:00
|
|
|
text = _("Cloud storage"),
|
|
|
|
callback = function()
|
|
|
|
local cloud_storage = CloudStorage:new{}
|
|
|
|
UIManager:show(cloud_storage)
|
|
|
|
local filemanagerRefresh = function() self.ui:onRefresh() end
|
|
|
|
function cloud_storage:onClose()
|
|
|
|
filemanagerRefresh()
|
|
|
|
UIManager:close(cloud_storage)
|
|
|
|
end
|
|
|
|
end,
|
2017-02-28 21:46:32 +00:00
|
|
|
}
|
2014-11-26 17:16:54 +00:00
|
|
|
|
|
|
|
-- search tab
|
2017-03-03 06:41:10 +00:00
|
|
|
self.menu_items.find_book_in_calibre_catalog = {
|
2014-11-26 17:16:54 +00:00
|
|
|
text = _("Find a book in calibre catalog"),
|
|
|
|
callback = function()
|
|
|
|
Search:getCalibre()
|
|
|
|
Search:ShowSearch()
|
|
|
|
end
|
2017-02-28 21:46:32 +00:00
|
|
|
}
|
2017-03-03 06:41:10 +00:00
|
|
|
self.menu_items.find_file = {
|
2014-11-26 17:16:54 +00:00
|
|
|
text = _("Find a file"),
|
|
|
|
callback = function()
|
2019-03-03 11:43:09 +00:00
|
|
|
self.ui:handleEvent(Event:new("ShowFileSearch", self.ui.file_chooser.path))
|
2014-08-07 07:14:30 +00:00
|
|
|
end
|
2017-02-28 21:46:32 +00:00
|
|
|
}
|
2014-11-26 17:16:54 +00:00
|
|
|
|
2017-02-25 10:58:39 +00:00
|
|
|
-- main menu tab
|
2017-03-03 06:41:10 +00:00
|
|
|
self.menu_items.open_last_document = {
|
2018-07-05 05:40:40 +00:00
|
|
|
text_func = function()
|
|
|
|
if not G_reader_settings:isTrue("open_last_menu_show_filename") or not G_reader_settings:readSetting("lastfile") then
|
|
|
|
return _("Open last document")
|
|
|
|
end
|
|
|
|
local last_file = G_reader_settings:readSetting("lastfile")
|
|
|
|
local path, file_name = util.splitFilePathName(last_file); -- luacheck: no unused
|
2018-07-07 11:03:33 +00:00
|
|
|
return T(_("Last: %1"), file_name)
|
2018-07-05 05:40:40 +00:00
|
|
|
end,
|
2017-03-05 11:39:38 +00:00
|
|
|
enabled_func = function()
|
|
|
|
return G_reader_settings:readSetting("lastfile") ~= nil
|
|
|
|
end,
|
2014-08-16 20:32:34 +00:00
|
|
|
callback = function()
|
2018-05-23 20:25:33 +00:00
|
|
|
self:openLastDoc()
|
|
|
|
end,
|
|
|
|
hold_callback = function()
|
2017-02-25 10:58:39 +00:00
|
|
|
local last_file = G_reader_settings:readSetting("lastfile")
|
2018-05-23 20:25:33 +00:00
|
|
|
UIManager:show(ConfirmBox:new{
|
|
|
|
text = T(_("Would you like to open the last document: %1?"), last_file),
|
|
|
|
ok_text = _("OK"),
|
|
|
|
ok_callback = function()
|
|
|
|
self:openLastDoc()
|
|
|
|
end,
|
|
|
|
})
|
2014-08-16 20:32:34 +00:00
|
|
|
end
|
2017-02-28 21:46:32 +00:00
|
|
|
}
|
|
|
|
-- insert common info
|
2019-03-02 20:45:12 +00:00
|
|
|
for id, common_setting in pairs(dofile("frontend/ui/elements/common_info_menu_table.lua")) do
|
2017-02-28 21:46:32 +00:00
|
|
|
self.menu_items[id] = common_setting
|
2017-02-25 10:58:39 +00:00
|
|
|
end
|
2017-09-03 13:40:50 +00:00
|
|
|
self.menu_items.exit_menu = {
|
|
|
|
text = _("Exit"),
|
|
|
|
hold_callback = function()
|
|
|
|
self:exitOrRestart()
|
|
|
|
end,
|
|
|
|
}
|
2017-03-03 06:41:10 +00:00
|
|
|
self.menu_items.exit = {
|
2017-02-25 10:58:39 +00:00
|
|
|
text = _("Exit"),
|
|
|
|
callback = function()
|
2017-05-16 09:11:11 +00:00
|
|
|
self:exitOrRestart()
|
|
|
|
end,
|
|
|
|
}
|
|
|
|
self.menu_items.restart_koreader = {
|
|
|
|
text = _("Restart KOReader"),
|
|
|
|
callback = function()
|
|
|
|
self:exitOrRestart(function() UIManager:restartKOReader() end)
|
2017-02-25 10:58:39 +00:00
|
|
|
end,
|
2017-02-28 21:46:32 +00:00
|
|
|
}
|
2019-01-21 21:44:13 +00:00
|
|
|
if Device:isAndroid() then
|
|
|
|
self.menu_items.exit_menu = self.menu_items.exit
|
|
|
|
self.menu_items.exit = nil
|
|
|
|
self.menu_items.restart_koreader = nil
|
|
|
|
end
|
2018-03-26 17:41:50 +00:00
|
|
|
if not Device:isTouchDevice() then
|
|
|
|
--add a shortcut on non touch-device
|
|
|
|
--because this menu is not accessible otherwise
|
|
|
|
self.menu_items.plus_menu = {
|
|
|
|
icon = "resources/icons/appbar.plus.png",
|
|
|
|
remember = false,
|
|
|
|
callback = function()
|
|
|
|
self:onCloseFileManagerMenu()
|
|
|
|
self.ui:tapPlus()
|
|
|
|
end,
|
|
|
|
}
|
|
|
|
end
|
2017-02-28 21:46:32 +00:00
|
|
|
|
2017-03-05 11:46:27 +00:00
|
|
|
local order = require("ui/elements/filemanager_menu_order")
|
2017-02-28 21:46:32 +00:00
|
|
|
|
2017-04-14 18:12:21 +00:00
|
|
|
local MenuSorter = require("ui/menusorter")
|
2017-03-24 20:15:35 +00:00
|
|
|
self.tab_item_table = MenuSorter:mergeAndSort("filemanager", self.menu_items, order)
|
2013-08-14 09:29:05 +00:00
|
|
|
end
|
2017-04-21 09:19:14 +00:00
|
|
|
dbg:guard(FileManagerMenu, 'setUpdateItemTable',
|
|
|
|
function(self)
|
|
|
|
local mock_menu_items = {}
|
|
|
|
for _, widget in pairs(self.registered_widgets) do
|
|
|
|
-- make sure addToMainMenu works in debug mode
|
|
|
|
widget:addToMainMenu(mock_menu_items)
|
|
|
|
end
|
|
|
|
end)
|
2013-08-14 09:29:05 +00:00
|
|
|
|
2017-05-16 09:11:11 +00:00
|
|
|
function FileManagerMenu:exitOrRestart(callback)
|
|
|
|
if SetDefaults.settings_changed then
|
|
|
|
UIManager:show(ConfirmBox:new{
|
|
|
|
text = _("You have unsaved default settings. Save them now?\nTap \"Cancel\" to return to KOReader."),
|
|
|
|
ok_text = _("Save"),
|
|
|
|
ok_callback = function()
|
|
|
|
SetDefaults.settings_changed = false
|
|
|
|
SetDefaults:saveSettings()
|
|
|
|
self:exitOrRestart(callback)
|
|
|
|
end,
|
|
|
|
cancel_text = _("Don't save"),
|
|
|
|
cancel_callback = function()
|
|
|
|
SetDefaults.settings_changed = false
|
|
|
|
self:exitOrRestart(callback)
|
|
|
|
end,
|
|
|
|
other_buttons = {{
|
|
|
|
text = _("Cancel"),
|
|
|
|
}}
|
|
|
|
})
|
|
|
|
else
|
|
|
|
UIManager:close(self.menu_container)
|
|
|
|
self.ui:onClose()
|
|
|
|
if callback then
|
|
|
|
callback()
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2018-03-22 15:04:42 +00:00
|
|
|
function FileManagerMenu:onShowMenu(tab_index)
|
2017-03-05 11:46:27 +00:00
|
|
|
if self.tab_item_table == nil then
|
2014-03-13 13:52:43 +00:00
|
|
|
self:setUpdateItemTable()
|
|
|
|
end
|
|
|
|
|
2018-03-22 15:04:42 +00:00
|
|
|
if not tab_index then
|
|
|
|
tab_index = G_reader_settings:readSetting("filemanagermenu_tab_index") or 1
|
|
|
|
end
|
|
|
|
|
2014-03-13 13:52:43 +00:00
|
|
|
local menu_container = CenterContainer:new{
|
|
|
|
ignore = "height",
|
|
|
|
dimen = Screen:getSize(),
|
|
|
|
}
|
|
|
|
|
2015-04-27 00:49:27 +00:00
|
|
|
local main_menu
|
2018-03-14 21:16:38 +00:00
|
|
|
if Device:isTouchDevice() or Device:hasDPad() then
|
2014-10-25 08:02:42 +00:00
|
|
|
local TouchMenu = require("ui/widget/touchmenu")
|
2014-03-13 13:52:43 +00:00
|
|
|
main_menu = TouchMenu:new{
|
|
|
|
width = Screen:getWidth(),
|
2014-12-01 07:32:12 +00:00
|
|
|
last_index = tab_index,
|
2017-02-28 21:46:32 +00:00
|
|
|
tab_item_table = self.tab_item_table,
|
2014-03-13 13:52:43 +00:00
|
|
|
show_parent = menu_container,
|
|
|
|
}
|
|
|
|
else
|
2014-10-25 08:02:42 +00:00
|
|
|
local Menu = require("ui/widget/menu")
|
2014-03-13 13:52:43 +00:00
|
|
|
main_menu = Menu:new{
|
|
|
|
title = _("File manager menu"),
|
2014-10-25 08:02:42 +00:00
|
|
|
item_table = Menu.itemTableFromTouchMenu(self.tab_item_table),
|
|
|
|
width = Screen:getWidth()-10,
|
|
|
|
show_parent = menu_container,
|
2014-03-13 13:52:43 +00:00
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
main_menu.close_callback = function ()
|
2014-12-01 07:32:12 +00:00
|
|
|
self:onCloseFileManagerMenu()
|
2014-03-13 13:52:43 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
menu_container[1] = main_menu
|
|
|
|
-- maintain a reference to menu_container
|
|
|
|
self.menu_container = menu_container
|
|
|
|
UIManager:show(menu_container)
|
|
|
|
return true
|
2013-08-14 09:29:05 +00:00
|
|
|
end
|
|
|
|
|
2014-09-05 13:02:13 +00:00
|
|
|
function FileManagerMenu:onCloseFileManagerMenu()
|
2014-12-01 07:32:12 +00:00
|
|
|
local last_tab_index = self.menu_container[1].last_index
|
|
|
|
G_reader_settings:saveSetting("filemanagermenu_tab_index", last_tab_index)
|
2014-09-05 13:02:13 +00:00
|
|
|
UIManager:close(self.menu_container)
|
|
|
|
return true
|
|
|
|
end
|
|
|
|
|
2018-03-22 15:04:42 +00:00
|
|
|
function FileManagerMenu:_getTabIndexFromLocation(ges)
|
|
|
|
if self.tab_item_table == nil then
|
|
|
|
self:setUpdateItemTable()
|
|
|
|
end
|
|
|
|
local last_tab_index = G_reader_settings:readSetting("filemanagermenu_tab_index") or 1
|
|
|
|
if not ges then
|
|
|
|
return last_tab_index
|
|
|
|
-- if the start position is far right
|
|
|
|
elseif ges.pos.x > 2 * Screen:getWidth() / 3 then
|
|
|
|
return #self.tab_item_table
|
|
|
|
-- if the start position is far left
|
|
|
|
elseif ges.pos.x < Screen:getWidth() / 3 then
|
|
|
|
return 1
|
|
|
|
-- if center return the last index
|
|
|
|
else
|
|
|
|
return last_tab_index
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-06-01 16:32:06 +00:00
|
|
|
function FileManagerMenu:onTapShowMenu(ges)
|
2017-08-08 16:20:46 +00:00
|
|
|
if self.activation_menu ~= "swipe" then
|
2018-03-22 15:04:42 +00:00
|
|
|
self:onShowMenu(self:_getTabIndexFromLocation(ges))
|
2017-08-08 16:20:46 +00:00
|
|
|
return true
|
|
|
|
end
|
2017-06-01 16:32:06 +00:00
|
|
|
end
|
|
|
|
|
2017-04-15 12:45:56 +00:00
|
|
|
function FileManagerMenu:onSwipeShowMenu(ges)
|
2017-08-08 16:20:46 +00:00
|
|
|
if self.activation_menu ~= "tap" and ges.direction == "south" then
|
2018-03-22 15:04:42 +00:00
|
|
|
self:onShowMenu(self:_getTabIndexFromLocation(ges))
|
2017-04-15 12:45:56 +00:00
|
|
|
return true
|
|
|
|
end
|
2013-08-14 09:29:05 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
function FileManagerMenu:onSetDimensions(dimen)
|
2014-03-13 13:52:43 +00:00
|
|
|
-- update listening according to new screen dimen
|
|
|
|
if Device:isTouchDevice() then
|
|
|
|
self:initGesListener()
|
|
|
|
end
|
2013-08-14 09:29:05 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
function FileManagerMenu:registerToMainMenu(widget)
|
2014-03-13 13:52:43 +00:00
|
|
|
table.insert(self.registered_widgets, widget)
|
2013-08-14 09:29:05 +00:00
|
|
|
end
|
|
|
|
|
2013-10-18 20:38:07 +00:00
|
|
|
return FileManagerMenu
|