MenuSorter: initial implementation

* Menus are now sanely configurable
* Custom separator placement for clearer menus
pull/2677/head
Frans de Jonge 7 years ago
parent f2f0c376fa
commit 5b20106db7

@ -21,12 +21,12 @@ end
function FileManagerHistory:addToMainMenu(tab_item_table)
-- insert table to main tab of filemanager menu
table.insert(tab_item_table.main, {
self.ui.menu.menu_items["history"] = {
text = self.hist_menu_title,
callback = function()
self:onShowHist()
end,
})
}
end
function FileManagerHistory:updateItemTable()

@ -16,27 +16,28 @@ local CloudStorage = require("apps/cloudstorage/cloudstorage")
local FileManagerMenu = InputContainer:extend{
tab_item_table = nil,
menu_items = {},
registered_widgets = nil,
}
function FileManagerMenu:init()
self.tab_item_table = {
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",
},
self.menu_items["KOMenu:menu_buttons"] = {
-- top menu
}
-- items in top menu
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["main"] = {
icon = "resources/icons/menu-icon.png",
}
-- For backward compatibility, plugins look for plugins tab, which should be tools tab in file
-- manager.
self.tab_item_table.plugins = self.tab_item_table.tools
self.registered_widgets = {}
if Device:hasKeys() then
@ -68,18 +69,18 @@ function FileManagerMenu:setUpdateItemTable()
end
-- setting tab
table.insert(self.tab_item_table.setting, {
self.menu_items["show_hidden_files"] = {
text = _("Show hidden files"),
checked_func = function() return self.ui.file_chooser.show_hidden end,
callback = function() self.ui:toggleHiddenFiles() end
})
table.insert(self.tab_item_table.setting, self.ui:getSortingMenuTable())
table.insert(self.tab_item_table.setting, {
}
self.menu_items["sort_by"] = self.ui:getSortingMenuTable()
self.menu_items["reverse_sorting"] = {
text = _("Reverse sorting"),
checked_func = function() return self.ui.file_chooser.reverse_collate end,
callback = function() self.ui:toggleReverseCollate() end
})
table.insert(self.tab_item_table.setting, {
}
self.menu_items["start_with_last_opened_file"] = {
text = _("Start with last opened file"),
checked_func = function() return
G_reader_settings:readSetting("open_last")
@ -92,9 +93,9 @@ function FileManagerMenu:setUpdateItemTable()
G_reader_settings:saveSetting("open_last", not open_last)
G_reader_settings:flush()
end
})
}
if Device.isKobo() then
table.insert(self.tab_item_table.setting, {
self.menu_items["screensaver"] = {
text = _("Screensaver"),
sub_item_table = {
{
@ -148,15 +149,15 @@ function FileManagerMenu:setUpdateItemTable()
end,
},
}
})
}
end
-- 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
-- tools tab
table.insert(self.tab_item_table.tools, {
self.menu_items["advanced_settings"] = {
text = _("Advanced settings"),
callback = function()
SetDefaults:ConfirmEdit()
@ -164,8 +165,8 @@ function FileManagerMenu:setUpdateItemTable()
hold_callback = function()
SetDefaults:ConfirmSave()
end,
})
table.insert(self.tab_item_table.tools, {
}
self.menu_items["opds_catalog"] = {
text = _("OPDS catalog"),
callback = function()
local OPDSCatalog = require("apps/opdscatalog/opdscatalog")
@ -176,8 +177,8 @@ function FileManagerMenu:setUpdateItemTable()
end
OPDSCatalog:showCatalog()
end,
})
table.insert(self.tab_item_table.tools, {
}
self.menu_items["developer_options"] = {
text = _("Developer options"),
sub_item_table = {
{
@ -206,8 +207,8 @@ function FileManagerMenu:setUpdateItemTable()
end,
},
}
})
table.insert(self.tab_item_table.tools, {
}
self.menu_items["cloud_storage"] = {
text = _("Cloud storage"),
callback = function()
local cloud_storage = CloudStorage:new{}
@ -218,26 +219,25 @@ function FileManagerMenu:setUpdateItemTable()
UIManager:close(cloud_storage)
end
end,
})
}
-- search tab
table.insert(self.tab_item_table.search, {
self.menu_items["find_book_in_calibre_catalog"] = {
text = _("Find a book in calibre catalog"),
callback = function()
Search:getCalibre()
Search:ShowSearch()
end
})
table.insert(self.tab_item_table.search, {
}
self.menu_items["find_file"] = {
text = _("Find a file"),
callback = function()
FileSearcher:init(self.ui.file_chooser.path)
end
})
}
-- main menu tab
-- insert common info
table.insert(self.tab_item_table.main, {
self.menu_items["open_last_document"] = {
text = _("Open last document"),
enabled_func = function()
return G_reader_settings:readSetting("lastfile") ~= nil
@ -255,11 +255,12 @@ function FileManagerMenu:setUpdateItemTable()
ReaderUI:showReader(last_file)
self:onCloseFileManagerMenu()
end
})
for i, common_setting in ipairs(require("ui/elements/common_info_menu_table")) do
table.insert(self.tab_item_table.main, common_setting)
}
-- insert common info
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()
if SetDefaults.settings_changed then
@ -275,12 +276,76 @@ function FileManagerMenu:setUpdateItemTable()
self.ui:onClose()
end
end,
})
}
local order = {
["KOMenu:menu_buttons"] = {
"setting",
"tools",
"search",
"main",
},
["setting"] = {
"show_hidden_files",
"----------------------------",
"sort_by",
"reverse_sorting",
"----------------------------",
"start_with_last_opened_file",
"screensaver",
"----------------------------",
-- common settings
-- those that don't exist will simply be skipped during menu gen
"frontlight", -- if Device:hasFrontlight()
"night_mode",
"----------------------------",
"network",
"screen",
"save_document",
"----------------------------",
"language",
"----------------------------",
"show_advanced_options",
-- end common settings
},
["tools"] = {
"calibre_wireless_connection",
"evernote",
"goodreads",
"keep_alive",
"statistics",
"storage_stat",
"cloud_storage",
"----------------------------",
"advanced_settings",
"developer_options",
},
["search"] = {
"dictionary_lookup",
"find_book_in_calibre_catalog",
"find_file",
"----------------------------",
"opds_catalog",
},
["main"] = {
"history",
"open_last_document",
"----------------------------",
"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 FileManagerMenu:onShowMenu()
local tab_index = G_reader_settings:readSetting("filemanagermenu_tab_index") or 1
if #self.tab_item_table.setting == 0 then
if #self.menu_items.setting == 0 then
self:setUpdateItemTable()
end
@ -295,12 +360,7 @@ function FileManagerMenu:onShowMenu()
main_menu = TouchMenu:new{
width = Screen:getWidth(),
last_index = tab_index,
tab_item_table = {
self.tab_item_table.setting,
self.tab_item_table.tools,
self.tab_item_table.search,
self.tab_item_table.main,
},
tab_item_table = self.tab_item_table,
show_parent = menu_container,
}
else

@ -45,12 +45,12 @@ end
function ReaderBookmark:addToMainMenu(tab_item_table)
-- insert table to main reader menu
table.insert(tab_item_table.navi, {
self.ui.menu.menu_items["bookmarks"] = {
text = self.bm_menu_title,
callback = function()
self:onShowBookmark()
end,
})
}
end
function ReaderBookmark:isBookmarkInTimeOrder(a, b)

@ -24,7 +24,7 @@ function ReaderDictionary:init()
end
function ReaderDictionary:addToMainMenu(tab_item_table)
table.insert(tab_item_table.search, {
self.ui.menu.menu_items["dictionary_lookup"] = {
text = _("Dictionary lookup"),
tap_input = {
title = _("Enter a word to look up"),
@ -33,7 +33,7 @@ function ReaderDictionary:addToMainMenu(tab_item_table)
self:onLookupWord(input)
end,
},
})
}
end
function ReaderDictionary:onLookupWord(word, box, highlight)

@ -225,10 +225,10 @@ end
function ReaderFont:addToMainMenu(tab_item_table)
-- insert table to main reader menu
table.insert(tab_item_table.typeset, {
self.ui.menu.menu_items["change_font"] = {
text = self.font_menu_title,
sub_item_table = self.face_table,
})
}
end
return ReaderFont

@ -325,10 +325,10 @@ local option_titles = {
function ReaderFooter:addToMainMenu(tab_item_table)
local sub_items = {}
table.insert(tab_item_table.setting, {
self.ui.menu.menu_items["status_bar"] = {
text = _("Status bar"),
sub_item_table = sub_items,
})
}
-- menu item to fake footer tapping when touch area is disabled
if Geom:new{

@ -16,18 +16,18 @@ end
function ReaderGoto:addToMainMenu(tab_item_table)
-- insert goto command to main reader menu
table.insert(tab_item_table.navi, {
self.ui.menu.menu_items["go_to"] = {
text = self.goto_menu_title,
callback = function()
self:onShowGotoDialog()
end,
})
table.insert(tab_item_table.navi, {
}
self.ui.menu.menu_items["skim_to"] = {
text = self.skim_menu_title,
callback = function()
self:onShowSkimtoDialog()
end,
})
}
end
function ReaderGoto:onShowGotoDialog()

@ -66,10 +66,10 @@ end
function ReaderHighlight:addToMainMenu(tab_item_table)
-- insert table to main reader menu
table.insert(tab_item_table.typeset, {
self.ui.menu.menu_items["highlight_options"] = {
text = _("Highlight options"),
sub_item_table = self:genHighlightDrawerMenu(),
})
}
end
local highlight_style = {

@ -119,10 +119,10 @@ end
function ReaderHyphenation:addToMainMenu(tab_item_table)
-- insert table to main reader menu
table.insert(tab_item_table.typeset, {
self.ui.menu.menu_items["hyphenation"] = {
text = self.hyph_menu_title,
sub_item_table = self.hyph_table,
})
}
end
return ReaderHyphenation

@ -69,7 +69,7 @@ end
function ReaderLink:addToMainMenu(tab_item_table)
-- insert table to main reader menu
table.insert(tab_item_table.navi, {
self.ui.menu.menu_items["follow_links"] = {
text = _("Follow links"),
sub_item_table = {
{
@ -103,7 +103,7 @@ function ReaderLink:addToMainMenu(tab_item_table)
end,
},
}
})
}
end
function ReaderLink:onSetDimensions(dimen)

@ -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

@ -201,22 +201,22 @@ function ReaderPaging:addToMainMenu(tab_item_table)
for _, menu_entry in ipairs(self.view:genOverlapStyleMenu()) do
table.insert(page_overlap_menu, menu_entry)
end
table.insert(tab_item_table.typeset, {
self.ui.menu.menu_items["page_overlap"] = {
text = _("Page overlap"),
enabled_func = function()
return not self.view.page_scroll and self.zoom_mode ~= "page"
and not self.zoom_mode:find("height")
end,
sub_item_table = page_overlap_menu,
})
table.insert(tab_item_table.setting, {
}
self.ui.menu.menu_items["read_from_right_to_left"] = {
text = _("Read from right to left"),
checked_func = function() return self.inverse_reading_order end,
callback = function()
self.inverse_reading_order = not self.inverse_reading_order
self:setupTapTouchZones()
end,
})
}
end
--[[

@ -258,11 +258,11 @@ function ReaderRolling:addToMainMenu(tab_item_table)
for _, menu_entry in ipairs(self.view:genOverlapStyleMenu()) do
table.insert(page_overlap_menu, menu_entry)
end
table.insert(tab_item_table.typeset, {
self.ui.menu.menu_items["page_overlap"] = {
text = _("Page overlap"),
enabled_func = function() return self.view.view_mode ~= "page" end,
sub_item_table = page_overlap_menu,
})
}
end
function ReaderRolling:getLastPercent()

@ -14,7 +14,7 @@ function ReaderSearch:init()
end
function ReaderSearch:addToMainMenu(tab_item_table)
table.insert(tab_item_table.search, {
self.ui.menu.menu_items["fulltext_search"] = {
text = _("Fulltext search"),
tap_input = {
title = _("Input text to search for"),
@ -23,7 +23,7 @@ function ReaderSearch:addToMainMenu(tab_item_table)
self:onShowSearchDialog(input)
end,
},
})
}
end
function ReaderSearch:onShowSearchDialog(text)

@ -33,12 +33,12 @@ function ReaderStatus:init()
end
function ReaderStatus:addToMainMenu(tab_item_table)
table.insert(tab_item_table.main, {
self.ui.menu.menu_items["book_status"] = {
text = _("Book status"),
callback = function()
self:showStatus()
end,
})
}
end
function ReaderStatus:showStatus()

@ -436,12 +436,12 @@ end
function ReaderToc:addToMainMenu(tab_item_table)
-- insert table to main reader menu
table.insert(tab_item_table.navi, 1, {
self.ui.menu.menu_items["table_of_contents"] = {
text = self.toc_menu_title,
callback = function()
self:onShowToc()
end,
})
}
end
return ReaderToc

@ -142,11 +142,11 @@ end
function ReaderTypeset:addToMainMenu(tab_item_table)
-- insert table to main reader menu
table.insert(tab_item_table.typeset, {
self.ui.menu.menu_items["set_render_style"] = {
text = self.css_menu_title,
sub_item_table = self:genStyleSheetMenu(),
})
table.insert(tab_item_table.typeset, {
}
self.ui.menu.menu_items["floating_punctuation"] = {
text = _("Floating punctuation"),
checked_func = function() return self.floating_punctuation == 1 end,
callback = function()
@ -154,7 +154,7 @@ function ReaderTypeset:addToMainMenu(tab_item_table)
self:toggleFloatingPunctuation(self.floating_punctuation)
end,
hold_callback = function() self:makeDefaultFloatingPunctuation() end,
})
}
end
function ReaderTypeset:makeDefaultFloatingPunctuation()

@ -49,7 +49,7 @@ function ReaderWikipedia:lookupInput()
end
function ReaderWikipedia:addToMainMenu(tab_item_table)
table.insert(tab_item_table.search, {
self.ui.menu.menu_items["wikipedia_lookup"] = {
text = _("Wikipedia lookup"),
callback = function()
if NetworkMgr:isOnline() then
@ -58,7 +58,7 @@ function ReaderWikipedia:addToMainMenu(tab_item_table)
NetworkMgr:promptWifiOn()
end
end
})
}
end
function ReaderWikipedia:initLanguages(word)

@ -310,7 +310,7 @@ end
function ReaderZooming:addToMainMenu(tab_item_table)
if self.ui.document.info.has_pages then
table.insert(tab_item_table.typeset, {
self.ui.menu.menu_items["switch_zoom_mode"] = {
text = _("Switch zoom mode"),
enabled_func = function()
return self.ui.document.configurable.text_wrap ~= 1
@ -353,7 +353,7 @@ function ReaderZooming:addToMainMenu(tab_item_table)
hold_callback = function() self:makeDefault("page") end,
},
}
})
}
end
end

@ -8,23 +8,23 @@ local common_info = {}
if Device:isKindle() or Device:isKobo() or Device:isPocketBook()
or Device:isAndroid() then
local OTAManager = require("ui/otamanager")
table.insert(common_info, OTAManager:getOTAMenuTable())
common_info["ota_update"] = OTAManager:getOTAMenuTable()
end
table.insert(common_info, {
common_info["version"] = {
text = _("Version"),
callback = function()
UIManager:show(InfoMessage:new{
text = io.open("git-rev", "r"):read(),
})
end
})
table.insert(common_info, {
}
common_info["help"] = {
text = _("Help"),
callback = function()
UIManager:show(InfoMessage:new{
text = _("Please report bugs to \nhttps://github.com/koreader/koreader/issues"),
})
end
})
}
return common_info

@ -9,15 +9,15 @@ local common_settings = {}
if Device:hasFrontlight() then
local ReaderFrontLight = require("apps/reader/modules/readerfrontlight")
table.insert(common_settings, {
common_settings["frontlight"] = {
text = _("Frontlight"),
callback = function()
ReaderFrontLight:onShowFlDialog()
end,
})
}
end
table.insert(common_settings, {
common_settings["night_mode"] = {
text = _("Night mode"),
checked_func = function() return G_reader_settings:readSetting("night_mode") end,
callback = function()
@ -26,12 +26,12 @@ table.insert(common_settings, {
UIManager:setDirty(nil, "full")
G_reader_settings:saveSetting("night_mode", not night_mode)
end
})
table.insert(common_settings, {
}
common_settings["network"] = {
text = _("Network"),
sub_item_table = NetworkMgr:getMenuTable()
})
table.insert(common_settings, {
}
common_settings["screen"] = {
text = _("Screen"),
sub_item_table = {
require("ui/elements/screen_dpi_menu_table"),
@ -39,8 +39,8 @@ table.insert(common_settings, {
require("ui/elements/screen_disable_double_tap_table"),
require("ui/elements/refresh_menu_table"),
},
})
table.insert(common_settings, {
}
common_settings["save_document"] = {
text = _("Save document"),
sub_item_table = {
{
@ -74,15 +74,17 @@ table.insert(common_settings, {
end,
},
},
})
table.insert(common_settings, Language:getLangMenuTable())
table.insert(common_settings, {
}
common_settings["language"] = Language:getLangMenuTable()
common_settings["show_advanced_options"] = {
text = _("Show advanced options"),
checked_func = function() return G_reader_settings:readSetting("show_advanced") end,
callback = function()
local show_advanced = G_reader_settings:readSetting("show_advanced") or false
G_reader_settings:saveSetting("show_advanced", not show_advanced)
end
})
}
return common_settings

@ -0,0 +1,150 @@
local DataStorage = require("datastorage")
local DEBUG = require("dbg")
local MenuSorter = {
menu_table = {},
sub_menus = {},
separator = {
text = "KOMenu:separator",
},
sub_menu_position,
}
-- thanks to http://stackoverflow.com/a/4991602/2470572
-- no need to load lfs here
local function file_exists(name)
local f=io.open(name,"r")
if f~=nil then io.close(f) return true else return false end
end
function MenuSorter:readMSSettings(table)
local menu_order = DataStorage:getSettingsDir().."/menu_order"
if file_exists(menu_order..".lua") then
return require(menu_order) or {}
else
return {}
end
end
function MenuSorter:sort(item_table, order)
DEBUG(item_table, order)
--local menu_table = {}
--local separator = {
--text = "KOMenu:separator",
--}
DEBUG("menu before user order", order)
-- take care of user customizations
local user_order = self:readMSSettings(item_table_name)
if user_order then
for user_order_id,user_order_item in pairs(user_order) do
for order_id, order_item in pairs (order) do
if user_order_id == order_id then
order[order_id] = user_order[order_id]
end
end
end
end
DEBUG("menu after user order", order)
--self.menu_table = self:magic(item_table, order)
self:magic(item_table, order)
DEBUG("after sort",self.menu_table["KOMenu:menu_buttons"])
-- deal with leftovers
return self.menu_table["KOMenu:menu_buttons"]
end
function MenuSorter:magic(item_table, order)
local tmp_menu_table = {}
-- the actual sorting of menu items
for order_id, order_item in pairs (order) do
DEBUG("order_id",order_id)
DEBUG("order_item",order_item)
DEBUG("item_table[order_id]",item_table[order_id])
-- user might define non-existing menu item
if item_table[order_id] ~= nil then
--menu_table[order_id] = item_table[order_id]
--item_table[order_id] = nil
self.menu_table[order_id] = item_table[order_id]
self.menu_table[order_id].id = order_id
--item_table[order_id].processed = true
DEBUG("self.menu_table[order_id]",self.menu_table[order_id])
for order_number,order_number_id in ipairs(order_item) do
DEBUG("order_number,order_number_id", order_number,order_number_id)
-- this is a submenu, mark it for later
if order[order_number_id] then
table.insert(self.sub_menus, order_number_id)
self.menu_table[order_id][order_number] = {
id = order_number_id,
--sub = true,
}
-- regular, just insert a menu action
else
--self.menu_table[order_id] = tmp_menu_table[order_id]
if order_number_id == "----------------------------" then
-- it's a separator
self.menu_table[order_id][order_number] = self.separator
elseif item_table[order_number_id] ~= nil then
item_table[order_number_id].id = order_number_id
self.menu_table[order_id][order_number] = item_table[order_number_id]
item_table[order_number_id] = nil
end
end
end
else
DEBUG("menu id not found:", order_id)
end
end
--attach orphans based on menu_hint
-- now do the submenus
DEBUG("SUBMENUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUS")
DEBUG("self.sub_menus", self.sub_menus)
for i,sub_menu in ipairs(self.sub_menus) do
self.sub_menu_position = {}
self:findById(self.menu_table["KOMenu:menu_buttons"], sub_menu)
if self.sub_menu_position and self.sub_menu_position.id then
self.sub_menu_position.sub_item_table = self.menu_table[sub_menu]
self.menu_table[sub_menu] = nil
end
end
-- @TODO avoid this extra mini-loop
-- cleanup, top-level items shouldn't have sub_item_table
for i,top_menu in ipairs(self.menu_table["KOMenu:menu_buttons"]) do
self.menu_table["KOMenu:menu_buttons"][i] = self.menu_table["KOMenu:menu_buttons"][i].sub_item_table
end
end
function MenuSorter:findById(tbl, needle_id, result)
--DEBUG("TBL given",tbl)
for k,v in pairs(tbl) do
if #self.sub_menu_position == 1 then
break
end
--DEBUG("FINDBYID:", needle_id, "current:", k,v)
if type(k) == "number" or k == "sub_item_table" then
if v.id == needle_id then
DEBUG("FOUND IT FOUND IT FOUND IT FOUND IT FOUND IT FOUND IT FOUND IT FOUND IT FOUND IT FOUND IT ", v.id)
self.sub_menu_position = v
break
elseif type(v) == "table" and v.id then
DEBUG("GOING DEEPER", v.id)
self:findById(v, needle_id)
end
end
end
end
return MenuSorter

@ -203,7 +203,7 @@ function TouchMenuBar:init()
local icon_sep = LineWidget:new{
style = k == 1 and "solid" or "none",
dimen = Geom:new{
w = Screen:scaleBySize(2),
w = icon_sep_width,
h = self.height,
}
}
@ -437,19 +437,26 @@ function TouchMenu:updateItems()
-- calculate index in item_table
local i = (self.page - 1) * self.perpage + c
if i <= #self.item_table then
local item_tmp = TouchMenuItem:new{
item = self.item_table[i],
menu = self,
dimen = Geom:new{
w = self.item_width,
h = self.item_height,
},
show_parent = self.show_parent,
}
table.insert(self.item_group, item_tmp)
-- insert split line
if c ~= self.perpage then
table.insert(self.item_group, self.split_line)
local item = self.item_table[i]
-- due to the menu ordering system index can be missing
if item then
if item.text == "KOMenu:separator" then
if c ~= self.perpage then
-- insert split line
table.insert(self.item_group, self.split_line)
end
else
local item_tmp = TouchMenuItem:new{
item = item,
menu = self,
dimen = Geom:new{
w = self.item_width,
h = self.item_height,
},
show_parent = self.show_parent,
}
table.insert(self.item_group, item_tmp)
end
end
else
-- item not enough to fill the whole page, break out of loop

@ -80,7 +80,7 @@ function CalibreCompanion:find_calibre_server()
end
function CalibreCompanion:addToMainMenu(tab_item_table)
table.insert(tab_item_table.plugins, {
self.ui.menu.menu_items["calibre_wireless_connection"] = {
text = _("Calibre wireless connection"),
sub_item_table = {
{
@ -98,7 +98,7 @@ function CalibreCompanion:addToMainMenu(tab_item_table)
end
},
}
})
}
end
function CalibreCompanion:initCalibreMQ(host, port)

@ -71,7 +71,7 @@ function EvernoteExporter:migrateClippings()
end
function EvernoteExporter:addToMainMenu(tab_item_table)
table.insert(tab_item_table.plugins, {
self.ui.menu.menu_items["evernote"] = {
text = _("Evernote"),
sub_item_table = {
{
@ -175,7 +175,7 @@ function EvernoteExporter:addToMainMenu(tab_item_table)
end
}
}
})
}
end
function EvernoteExporter:login()

@ -23,7 +23,7 @@ function Goodreads:init()
end
function Goodreads:addToMainMenu(tab_item_table)
table.insert(tab_item_table.plugins, {
self.ui.menu.menu_items["goodreads"] = {
text = _("Goodreads"),
sub_item_table = {
{
@ -68,7 +68,7 @@ function Goodreads:addToMainMenu(tab_item_table)
end,
},
},
})
}
end
function Goodreads:updateSettings()

@ -68,7 +68,7 @@ function KeepAlive:init()
end
function KeepAlive:addToMainMenu(tab_item_table)
table.insert(tab_item_table.plugins, menuItem)
self.ui.menu.menu_items["keep_alive"] = menuItem
end
return KeepAlive

@ -86,7 +86,7 @@ function KOSync:onReaderReady()
end
function KOSync:addToMainMenu(tab_item_table)
table.insert(tab_item_table.plugins, {
self.ui.menu.menu_items["progress_sync"] = {
text = _("Progress sync"),
sub_item_table = {
{
@ -215,7 +215,7 @@ function KOSync:addToMainMenu(tab_item_table)
},
},
}
})
}
end
function KOSync:setCustomServer(server)

@ -158,7 +158,7 @@ function PerceptionExpander:showSettingsDialog()
end
function PerceptionExpander:addToMainMenu(tab_item_table)
table.insert(tab_item_table.plugins,{
self.ui.menu.menu_items["speed_reading_module_perception_expander"] = {
text = _("Speed reading module - perception expander"),
sub_item_table ={
{
@ -186,7 +186,7 @@ function PerceptionExpander:addToMainMenu(tab_item_table)
end,
},
},
})
}
end
function PerceptionExpander:onPageUpdate(pageno)

@ -192,7 +192,7 @@ function ReaderStatistics:updateSettings()
end
function ReaderStatistics:addToMainMenu(tab_item_table)
table.insert(tab_item_table.plugins, {
self.ui.menu.menu_items["statistics"] = {
text = _("Statistics"),
sub_item_table = {
self:getStatisticEnabledMenuItem(),
@ -281,7 +281,7 @@ function ReaderStatistics:addToMainMenu(tab_item_table)
}
},
},
})
}
end
function ReaderStatistics:getCurrentStat()

@ -50,7 +50,7 @@ function StorageStat:init()
end
function StorageStat:addToMainMenu(tab_item_table)
table.insert(tab_item_table.plugins, self.menuItem)
self.ui.menu.menu_items["storagestat"] = self.menuItem
end
return StorageStat

@ -71,7 +71,7 @@ function TimeSync:init()
end
function TimeSync:addToMainMenu(tab_item_table)
table.insert(tab_item_table.plugins, menuItem)
self.ui.menu.menu_items["synchronize_time"] = menuItem
end
return TimeSync

@ -25,7 +25,7 @@ function ZSync:init()
end
function ZSync:addToMainMenu(tab_item_table)
table.insert(tab_item_table.plugins, {
self.ui.menu.menu_items["zsync"] = {
text = _("ZSync"),
sub_item_table = {
{
@ -63,7 +63,7 @@ function ZSync:addToMainMenu(tab_item_table)
end
}
}
})
}
end
function ZSync:initServerZyreMQ()

Loading…
Cancel
Save