From 5b20106db7a95dff9d9266e79e61646ec279793e Mon Sep 17 00:00:00 2001 From: Frans de Jonge Date: Tue, 28 Feb 2017 22:46:32 +0100 Subject: [PATCH] MenuSorter: initial implementation * Menus are now sanely configurable * Custom separator placement for clearer menus --- .../apps/filemanager/filemanagerhistory.lua | 4 +- frontend/apps/filemanager/filemanagermenu.lua | 166 ++++++++++----- .../apps/reader/modules/readerbookmark.lua | 4 +- .../apps/reader/modules/readerdictionary.lua | 4 +- frontend/apps/reader/modules/readerfont.lua | 4 +- frontend/apps/reader/modules/readerfooter.lua | 4 +- frontend/apps/reader/modules/readergoto.lua | 8 +- .../apps/reader/modules/readerhighlight.lua | 4 +- .../apps/reader/modules/readerhyphenation.lua | 4 +- frontend/apps/reader/modules/readerlink.lua | 4 +- frontend/apps/reader/modules/readermenu.lua | 189 ++++++++++++------ frontend/apps/reader/modules/readerpaging.lua | 8 +- .../apps/reader/modules/readerrolling.lua | 4 +- frontend/apps/reader/modules/readersearch.lua | 4 +- frontend/apps/reader/modules/readerstatus.lua | 4 +- frontend/apps/reader/modules/readertoc.lua | 4 +- .../apps/reader/modules/readertypeset.lua | 8 +- .../apps/reader/modules/readerwikipedia.lua | 4 +- .../apps/reader/modules/readerzooming.lua | 4 +- .../ui/elements/common_info_menu_table.lua | 10 +- .../elements/common_settings_menu_table.lua | 28 +-- frontend/ui/menusorter.lua | 150 ++++++++++++++ frontend/ui/widget/touchmenu.lua | 35 ++-- plugins/calibrecompanion.koplugin/main.lua | 4 +- plugins/evernote.koplugin/main.lua | 4 +- plugins/goodreads.koplugin/main.lua | 4 +- plugins/keepalive.koplugin/main.lua | 2 +- plugins/kosync.koplugin/main.lua | 4 +- plugins/perceptionexpander.koplugin/main.lua | 4 +- plugins/statistics.koplugin/main.lua | 4 +- plugins/storagestat.koplugin/main.lua | 2 +- plugins/timesync.koplugin/main.lua | 2 +- plugins/zsync.koplugin/main.lua | 4 +- 33 files changed, 490 insertions(+), 202 deletions(-) create mode 100644 frontend/ui/menusorter.lua diff --git a/frontend/apps/filemanager/filemanagerhistory.lua b/frontend/apps/filemanager/filemanagerhistory.lua index 9b2dca339..3fde48f2c 100644 --- a/frontend/apps/filemanager/filemanagerhistory.lua +++ b/frontend/apps/filemanager/filemanagerhistory.lua @@ -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() diff --git a/frontend/apps/filemanager/filemanagermenu.lua b/frontend/apps/filemanager/filemanagermenu.lua index 142cb5a00..b72521921 100644 --- a/frontend/apps/filemanager/filemanagermenu.lua +++ b/frontend/apps/filemanager/filemanagermenu.lua @@ -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 diff --git a/frontend/apps/reader/modules/readerbookmark.lua b/frontend/apps/reader/modules/readerbookmark.lua index 9e04a24e4..52cb6fbd7 100644 --- a/frontend/apps/reader/modules/readerbookmark.lua +++ b/frontend/apps/reader/modules/readerbookmark.lua @@ -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) diff --git a/frontend/apps/reader/modules/readerdictionary.lua b/frontend/apps/reader/modules/readerdictionary.lua index 462fa5bc4..a54861c9b 100644 --- a/frontend/apps/reader/modules/readerdictionary.lua +++ b/frontend/apps/reader/modules/readerdictionary.lua @@ -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) diff --git a/frontend/apps/reader/modules/readerfont.lua b/frontend/apps/reader/modules/readerfont.lua index 668b9be45..68ef31cd5 100644 --- a/frontend/apps/reader/modules/readerfont.lua +++ b/frontend/apps/reader/modules/readerfont.lua @@ -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 diff --git a/frontend/apps/reader/modules/readerfooter.lua b/frontend/apps/reader/modules/readerfooter.lua index 8bb34b145..ad78c4510 100644 --- a/frontend/apps/reader/modules/readerfooter.lua +++ b/frontend/apps/reader/modules/readerfooter.lua @@ -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{ diff --git a/frontend/apps/reader/modules/readergoto.lua b/frontend/apps/reader/modules/readergoto.lua index 3014d4871..c302a6de7 100644 --- a/frontend/apps/reader/modules/readergoto.lua +++ b/frontend/apps/reader/modules/readergoto.lua @@ -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() diff --git a/frontend/apps/reader/modules/readerhighlight.lua b/frontend/apps/reader/modules/readerhighlight.lua index 8c01384ed..f97d43d6d 100644 --- a/frontend/apps/reader/modules/readerhighlight.lua +++ b/frontend/apps/reader/modules/readerhighlight.lua @@ -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 = { diff --git a/frontend/apps/reader/modules/readerhyphenation.lua b/frontend/apps/reader/modules/readerhyphenation.lua index d4c9fa5c7..b9907b527 100644 --- a/frontend/apps/reader/modules/readerhyphenation.lua +++ b/frontend/apps/reader/modules/readerhyphenation.lua @@ -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 diff --git a/frontend/apps/reader/modules/readerlink.lua b/frontend/apps/reader/modules/readerlink.lua index c0ad06e5f..da5c44a7e 100644 --- a/frontend/apps/reader/modules/readerlink.lua +++ b/frontend/apps/reader/modules/readerlink.lua @@ -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) diff --git a/frontend/apps/reader/modules/readermenu.lua b/frontend/apps/reader/modules/readermenu.lua index 7142047d8..62baa3ab8 100644 --- a/frontend/apps/reader/modules/readermenu.lua +++ b/frontend/apps/reader/modules/readermenu.lua @@ -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 diff --git a/frontend/apps/reader/modules/readerpaging.lua b/frontend/apps/reader/modules/readerpaging.lua index 8444aa672..7bf8ea40f 100644 --- a/frontend/apps/reader/modules/readerpaging.lua +++ b/frontend/apps/reader/modules/readerpaging.lua @@ -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 --[[ diff --git a/frontend/apps/reader/modules/readerrolling.lua b/frontend/apps/reader/modules/readerrolling.lua index 1af66a523..b420741c2 100644 --- a/frontend/apps/reader/modules/readerrolling.lua +++ b/frontend/apps/reader/modules/readerrolling.lua @@ -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() diff --git a/frontend/apps/reader/modules/readersearch.lua b/frontend/apps/reader/modules/readersearch.lua index 44b84ba9d..908a0e2bd 100644 --- a/frontend/apps/reader/modules/readersearch.lua +++ b/frontend/apps/reader/modules/readersearch.lua @@ -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) diff --git a/frontend/apps/reader/modules/readerstatus.lua b/frontend/apps/reader/modules/readerstatus.lua index 8ec09b2db..ff69eafd1 100644 --- a/frontend/apps/reader/modules/readerstatus.lua +++ b/frontend/apps/reader/modules/readerstatus.lua @@ -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() diff --git a/frontend/apps/reader/modules/readertoc.lua b/frontend/apps/reader/modules/readertoc.lua index 7b62dad87..b32d52368 100644 --- a/frontend/apps/reader/modules/readertoc.lua +++ b/frontend/apps/reader/modules/readertoc.lua @@ -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 diff --git a/frontend/apps/reader/modules/readertypeset.lua b/frontend/apps/reader/modules/readertypeset.lua index a5c9d4c61..0afb28278 100644 --- a/frontend/apps/reader/modules/readertypeset.lua +++ b/frontend/apps/reader/modules/readertypeset.lua @@ -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() diff --git a/frontend/apps/reader/modules/readerwikipedia.lua b/frontend/apps/reader/modules/readerwikipedia.lua index 3962040f9..1fe4d8f99 100644 --- a/frontend/apps/reader/modules/readerwikipedia.lua +++ b/frontend/apps/reader/modules/readerwikipedia.lua @@ -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) diff --git a/frontend/apps/reader/modules/readerzooming.lua b/frontend/apps/reader/modules/readerzooming.lua index 94934ba24..0c30a7230 100644 --- a/frontend/apps/reader/modules/readerzooming.lua +++ b/frontend/apps/reader/modules/readerzooming.lua @@ -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 diff --git a/frontend/ui/elements/common_info_menu_table.lua b/frontend/ui/elements/common_info_menu_table.lua index b068a536f..e87b0990b 100644 --- a/frontend/ui/elements/common_info_menu_table.lua +++ b/frontend/ui/elements/common_info_menu_table.lua @@ -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 diff --git a/frontend/ui/elements/common_settings_menu_table.lua b/frontend/ui/elements/common_settings_menu_table.lua index 4b4f148a7..f3e23082a 100644 --- a/frontend/ui/elements/common_settings_menu_table.lua +++ b/frontend/ui/elements/common_settings_menu_table.lua @@ -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 diff --git a/frontend/ui/menusorter.lua b/frontend/ui/menusorter.lua new file mode 100644 index 000000000..37ac2e116 --- /dev/null +++ b/frontend/ui/menusorter.lua @@ -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 diff --git a/frontend/ui/widget/touchmenu.lua b/frontend/ui/widget/touchmenu.lua index 12717034b..ab225d264 100644 --- a/frontend/ui/widget/touchmenu.lua +++ b/frontend/ui/widget/touchmenu.lua @@ -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 diff --git a/plugins/calibrecompanion.koplugin/main.lua b/plugins/calibrecompanion.koplugin/main.lua index aece9cc7a..92738a580 100644 --- a/plugins/calibrecompanion.koplugin/main.lua +++ b/plugins/calibrecompanion.koplugin/main.lua @@ -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) diff --git a/plugins/evernote.koplugin/main.lua b/plugins/evernote.koplugin/main.lua index 6cb63764d..776e40701 100644 --- a/plugins/evernote.koplugin/main.lua +++ b/plugins/evernote.koplugin/main.lua @@ -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() diff --git a/plugins/goodreads.koplugin/main.lua b/plugins/goodreads.koplugin/main.lua index 2edae33b1..cc974ecb4 100644 --- a/plugins/goodreads.koplugin/main.lua +++ b/plugins/goodreads.koplugin/main.lua @@ -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() diff --git a/plugins/keepalive.koplugin/main.lua b/plugins/keepalive.koplugin/main.lua index 485479a48..1d6ab6d94 100644 --- a/plugins/keepalive.koplugin/main.lua +++ b/plugins/keepalive.koplugin/main.lua @@ -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 diff --git a/plugins/kosync.koplugin/main.lua b/plugins/kosync.koplugin/main.lua index 6661b90e2..0b8520643 100644 --- a/plugins/kosync.koplugin/main.lua +++ b/plugins/kosync.koplugin/main.lua @@ -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) diff --git a/plugins/perceptionexpander.koplugin/main.lua b/plugins/perceptionexpander.koplugin/main.lua index 4fe4c2f7c..9fe71435a 100755 --- a/plugins/perceptionexpander.koplugin/main.lua +++ b/plugins/perceptionexpander.koplugin/main.lua @@ -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) diff --git a/plugins/statistics.koplugin/main.lua b/plugins/statistics.koplugin/main.lua index 9612d69c8..9dc0b324f 100755 --- a/plugins/statistics.koplugin/main.lua +++ b/plugins/statistics.koplugin/main.lua @@ -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() diff --git a/plugins/storagestat.koplugin/main.lua b/plugins/storagestat.koplugin/main.lua index f3ef5da26..d5149958d 100644 --- a/plugins/storagestat.koplugin/main.lua +++ b/plugins/storagestat.koplugin/main.lua @@ -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 diff --git a/plugins/timesync.koplugin/main.lua b/plugins/timesync.koplugin/main.lua index 2a2ae2981..c4edfa0c7 100644 --- a/plugins/timesync.koplugin/main.lua +++ b/plugins/timesync.koplugin/main.lua @@ -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 diff --git a/plugins/zsync.koplugin/main.lua b/plugins/zsync.koplugin/main.lua index d1ae4007d..5246bee9d 100644 --- a/plugins/zsync.koplugin/main.lua +++ b/plugins/zsync.koplugin/main.lua @@ -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()