MenuSorter: initial implementation

* Menus are now sanely configurable
* Custom separator placement for clearer menus
This commit is contained in:
Frans de Jonge
2017-02-28 22:46:32 +01:00
parent f2f0c376fa
commit 5b20106db7
33 changed files with 490 additions and 202 deletions

View File

@@ -9,49 +9,53 @@ local _ = require("gettext")
local ReaderMenu = InputContainer:new{
tab_item_table = nil,
menu_items = {},
registered_widgets = {},
}
function ReaderMenu:init()
self.tab_item_table = {
navi = {
icon = "resources/icons/appbar.page.corner.bookmark.png",
},
typeset = {
icon = "resources/icons/appbar.page.text.png",
},
setting = {
icon = "resources/icons/appbar.settings.png",
},
plugins = {
icon = "resources/icons/appbar.tools.png",
},
search = {
icon = "resources/icons/appbar.magnify.browse.png",
},
filemanager = {
icon = "resources/icons/appbar.cabinet.files.png",
remember = false,
callback = function()
self:onTapCloseMenu()
self.ui:onClose()
local FileManager = require("apps/filemanager/filemanager")
local lastdir = nil
local last_file = G_reader_settings:readSetting("lastfile")
if last_file then
lastdir = last_file:match("(.*)/")
end
if FileManager.instance then
FileManager.instance:reinit(lastdir)
else
FileManager:showFiles(lastdir)
end
end,
},
main = {
icon = "resources/icons/menu-icon.png",
},
self.menu_items["KOMenu:menu_buttons"] = {
-- top menu
}
-- items in top menu
self.menu_items["navi"] = {
icon = "resources/icons/appbar.page.corner.bookmark.png",
}
self.menu_items["typeset"] = {
icon = "resources/icons/appbar.page.text.png",
}
self.menu_items["setting"] = {
icon = "resources/icons/appbar.settings.png",
}
self.menu_items["tools"] = {
icon = "resources/icons/appbar.tools.png",
}
self.menu_items["search"] = {
icon = "resources/icons/appbar.magnify.browse.png",
}
self.menu_items["filemanager"] = {
icon = "resources/icons/appbar.cabinet.files.png",
remember = false,
callback = function()
self:onTapCloseMenu()
self.ui:onClose()
local FileManager = require("apps/filemanager/filemanager")
local lastdir = nil
local last_file = G_reader_settings:readSetting("lastfile")
if last_file then
lastdir = last_file:match("(.*)/")
end
if FileManager.instance then
FileManager.instance:reinit(lastdir)
else
FileManager:showFiles(lastdir)
end
end,
}
self.menu_items["main"] = {
icon = "resources/icons/menu-icon.png",
}
self.registered_widgets = {}
if Device:hasKeys() then
@@ -93,16 +97,13 @@ function ReaderMenu:setUpdateItemTable()
-- settings tab
-- insert common settings
for i, common_setting in ipairs(require("ui/elements/common_settings_menu_table")) do
table.insert(self.tab_item_table.setting, common_setting)
for id, common_setting in pairs(require("ui/elements/common_settings_menu_table")) do
self.menu_items[id] = common_setting
end
-- insert DjVu render mode submenu just before the last entry (show advanced)
-- this is a bit of a hack
if self.ui.document.is_djvu then
table.insert(
self.tab_item_table.setting,
#self.tab_item_table.setting,
self.view:getRenderModeMenuTable())
self.menu_items["djvu_render_mode"] = self.view:getRenderModeMenuTable()
end
if Device:isKobo() and Screensaver:isUsingBookCover() then
@@ -112,7 +113,7 @@ function ReaderMenu:setUpdateItemTable()
local proportional = function()
return self.ui.doc_settings:readSetting("proportional_screensaver") or false
end
table.insert(self.tab_item_table.setting, {
self.menu_items["screensaver"] {
text = _("Screensaver"),
sub_item_table = {
{
@@ -141,16 +142,16 @@ function ReaderMenu:setUpdateItemTable()
end
}
}
})
}
end
-- main menu tab
-- insert common info
for i, common_setting in ipairs(require("ui/elements/common_info_menu_table")) do
table.insert(self.tab_item_table.main, common_setting)
for id, common_setting in pairs(require("ui/elements/common_info_menu_table")) do
self.menu_items[id] = common_setting
end
table.insert(self.tab_item_table.main, {
self.menu_items["exit"] = {
text = _("Exit"),
callback = function()
self:onTapCloseMenu()
@@ -160,12 +161,88 @@ function ReaderMenu:setUpdateItemTable()
FileManager.instance:onClose()
end
end,
})
}
local order = {
["KOMenu:menu_buttons"] = {
"navi",
"typeset",
"setting",
"tools",
"search",
"filemanager",
"main",
},
["navi"] = {
"table_of_contents",
"bookmarks",
"go_to",
"skim_to",
"follow_links",
},
["typeset"] = {
"page_overlap",
"switch_zoom_mode",
"set_render_style",
"floating_punctuation",
"highlight_options",
"change_font",
"hyphenation",
},
["setting"] = {
"read_from_right_to_left",
-- common settings
-- those that don't exist will simply be skipped during menu gen
"frontlight", -- if Device:hasFrontlight()
"night_mode",
"----------------------------",
"network",
"screen",
"screensaver",
"save_document",
"----------------------------",
"language",
"----------------------------",
"djvu_render_mode",
"status_bar",
"show_advanced_options",
},
["tools"] = {
"calibre_wireless_connection",
"evernote",
"goodreads",
"keep_alive",
"statistics",
"storage_stat",
"speed_reading_module_perception_expander",
"synchronize_time",
"progress_sync",
"zsync",
},
["search"] = {
"dictionary_lookup",
"wikipedia_lookup",
"fulltext_search",
},
["filemanager"] = {},
["main"] = {
"history",
"book_status",
"----------------------------",
"ota_update", -- if Device:isKindle() or Device:isKobo() or Device:isPocketBook() or Device:isAndroid()
"version",
"help",
"----------------------------",
"exit",
},
}
local MenuSorter = require("frontend/ui/menusorter")
self.tab_item_table = MenuSorter:sort(self.menu_items, order)
end
function ReaderMenu:onShowReaderMenu()
if #self.tab_item_table.setting == 0 then
if #self.menu_items.setting == 0 then
self:setUpdateItemTable()
end
@@ -180,15 +257,7 @@ function ReaderMenu:onShowReaderMenu()
main_menu = TouchMenu:new{
width = Screen:getWidth(),
last_index = self.last_tab_index,
tab_item_table = {
self.tab_item_table.navi,
self.tab_item_table.typeset,
self.tab_item_table.setting,
self.tab_item_table.plugins,
self.tab_item_table.search,
self.tab_item_table.filemanager,
self.tab_item_table.main,
},
tab_item_table = self.tab_item_table,
show_parent = menu_container,
}
else