From 8f31a816014c1d7f2f4545998fbafbb2f2a4cf2e Mon Sep 17 00:00:00 2001 From: Frans de Jonge Date: Fri, 3 Mar 2017 16:03:12 +0100 Subject: [PATCH] MenuSorter: some documentation MenuSorter: forgot to add plugin style change MenuSorter: worked out the final quirks * Menu always compressed into tables without missing indexes for ipairs compatibility * Orphans attached * Separators no longer count as items --- frontend/apps/filemanager/filemanagermenu.lua | 2 +- frontend/apps/reader/modules/readerfooter.lua | 4 +- frontend/apps/reader/modules/readermenu.lua | 2 +- frontend/ui/menusorter.lua | 77 +++++++++++++++---- frontend/ui/widget/touchmenu.lua | 29 ++++--- plugins/calibrecompanion.koplugin/main.lua | 2 +- plugins/evernote.koplugin/main.lua | 2 +- plugins/goodreads.koplugin/main.lua | 2 +- plugins/keepalive.koplugin/main.lua | 2 +- plugins/kosync.koplugin/main.lua | 2 +- plugins/perceptionexpander.koplugin/main.lua | 2 +- plugins/statistics.koplugin/main.lua | 2 +- plugins/storagestat.koplugin/main.lua | 2 +- plugins/timesync.koplugin/main.lua | 2 +- plugins/zsync.koplugin/main.lua | 2 +- spec/unit/readerfooter_spec.lua | 13 +++- 16 files changed, 102 insertions(+), 45 deletions(-) diff --git a/frontend/apps/filemanager/filemanagermenu.lua b/frontend/apps/filemanager/filemanagermenu.lua index c1f8a93d1..cad6c584d 100644 --- a/frontend/apps/filemanager/filemanagermenu.lua +++ b/frontend/apps/filemanager/filemanagermenu.lua @@ -67,7 +67,7 @@ end function FileManagerMenu:setUpdateItemTable() for _, widget in pairs(self.registered_widgets) do - widget:addToMainMenu(self.tab_item_table) + widget:addToMainMenu(self.menu_items) end -- setting tab diff --git a/frontend/apps/reader/modules/readerfooter.lua b/frontend/apps/reader/modules/readerfooter.lua index 556cbd929..c1690898f 100644 --- a/frontend/apps/reader/modules/readerfooter.lua +++ b/frontend/apps/reader/modules/readerfooter.lua @@ -323,9 +323,9 @@ local option_titles = { mem_usage = _("KOReader memory usage"), } -function ReaderFooter:addToMainMenu(tab_item_table) +function ReaderFooter:addToMainMenu(menu_items) local sub_items = {} - self.ui.menu.menu_items.status_bar = { + menu_items.status_bar = { text = _("Status bar"), sub_item_table = sub_items, } diff --git a/frontend/apps/reader/modules/readermenu.lua b/frontend/apps/reader/modules/readermenu.lua index 801845bea..00b9f054a 100644 --- a/frontend/apps/reader/modules/readermenu.lua +++ b/frontend/apps/reader/modules/readermenu.lua @@ -94,7 +94,7 @@ end function ReaderMenu:setUpdateItemTable() for _, widget in pairs(self.registered_widgets) do - widget:addToMainMenu(self.tab_item_table) + widget:addToMainMenu(self.menu_items) end -- settings tab diff --git a/frontend/ui/menusorter.lua b/frontend/ui/menusorter.lua index d94a2af75..e00454126 100644 --- a/frontend/ui/menusorter.lua +++ b/frontend/ui/menusorter.lua @@ -1,9 +1,17 @@ +--[[-- +This module is responsible for constructing the KOReader menu based on a list of +menu_items and a separate menu order. +]] + local DataStorage = require("datastorage") +local util = require("util") local DEBUG = require("dbg") +local _ = require("gettext") local MenuSorter = { menu_table = {}, separator = { + id = "----------------------------", text = "KOMenu:separator", }, } @@ -16,11 +24,15 @@ local function file_exists(name) end function MenuSorter:readMSSettings(table, config_prefix) - local config_prefix = config_prefix.."_" or "" - local menu_order = DataStorage:getSettingsDir().."/"..config_prefix.."menu_order" + if config_prefix then + local config_prefix = config_prefix.."_" + local menu_order = DataStorage:getSettingsDir().."/"..config_prefix.."menu_order" - if file_exists(menu_order..".lua") then - return require(menu_order) or {} + if file_exists(menu_order..".lua") then + return require(menu_order) or {} + else + return {} + end else return {} end @@ -66,41 +78,61 @@ function MenuSorter:magic(item_table, order) 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 + local tmp_menu_table = {} self.menu_table[order_id] = item_table[order_id] + --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]) + DEBUG("tmp_menu_table[order_id]",tmp_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(sub_menus, order_number_id) - self.menu_table[order_id][order_number] = { + tmp_menu_table[order_number] = { id = order_number_id, - --sub = true, } -- regular, just insert a menu action else if order_number_id == "----------------------------" then -- it's a separator - self.menu_table[order_id][order_number] = self.separator + tmp_menu_table[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] + tmp_menu_table[order_number] = item_table[order_number_id] + -- remove reference from item_table so it won't show up as orphaned item_table[order_number_id] = nil end end end + -- compress menus + -- if menu_items were missing we might have a table with gaps + -- but ipairs doesn't like that and quits when it hits nil + local i = 1 + local new_index = 1 + --k, v = next(tmp_menu_table, nil) + while i <= table.maxn(tmp_menu_table) do + v = tmp_menu_table[i] + if v then + if v.id == "----------------------------" then + new_index = new_index - 1 + self.menu_table[order_id][new_index].separator = true + else + -- fix the index + self.menu_table[order_id][new_index] = tmp_menu_table[i] + end + + new_index = new_index + 1 + end + i = i + 1 + 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", sub_menus) @@ -108,7 +140,10 @@ function MenuSorter:magic(item_table, order) local sub_menu_position = self:findById(self.menu_table["KOMenu:menu_buttons"], sub_menu) or nil if sub_menu_position and sub_menu_position.id then sub_menu_position.sub_item_table = self.menu_table[sub_menu] + -- remove reference from top level output self.menu_table[sub_menu] = nil + -- remove reference from input so it won't show up as orphaned + item_table[sub_menu] = nil end end -- @TODO avoid this extra mini-loop @@ -117,8 +152,24 @@ function MenuSorter:magic(item_table, order) self.menu_table["KOMenu:menu_buttons"][i] = self.menu_table["KOMenu:menu_buttons"][i].sub_item_table end + -- remove top level reference before orphan handling + item_table["KOMenu:menu_buttons"] = nil + --attach orphans based on menu_hint + DEBUG("ORPHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANSS", util.tableSize(item_table)) + for k,v in pairs(item_table) do + DEBUG(k) + -- normally there should be menu text but check to be sure + if v.text then + v.text = _("NEW: ") .. v.text + end + table.insert(self.menu_table["KOMenu:menu_buttons"][1], v) + end end +--- Returns a menu item by ID. +---- @param tbl Lua table +---- @param needle_id Menu item ID string +---- @treturn table a reference to the table item if found function MenuSorter:findById(tbl, needle_id) local items = {} diff --git a/frontend/ui/widget/touchmenu.lua b/frontend/ui/widget/touchmenu.lua index ab225d264..88b8a84f7 100644 --- a/frontend/ui/widget/touchmenu.lua +++ b/frontend/ui/widget/touchmenu.lua @@ -440,22 +440,19 @@ function TouchMenu:updateItems() 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) + 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) + if item.separator and c ~= self.perpage then + -- insert split line + table.insert(self.item_group, self.split_line) end end else diff --git a/plugins/calibrecompanion.koplugin/main.lua b/plugins/calibrecompanion.koplugin/main.lua index 92738a580..85b6cb70d 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) - self.ui.menu.menu_items["calibre_wireless_connection"] = { + self.ui.menu.menu_items.calibre_wireless_connection = { text = _("Calibre wireless connection"), sub_item_table = { { diff --git a/plugins/evernote.koplugin/main.lua b/plugins/evernote.koplugin/main.lua index 776e40701..e5a0f3e2c 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) - self.ui.menu.menu_items["evernote"] = { + self.ui.menu.menu_items.evernote = { text = _("Evernote"), sub_item_table = { { diff --git a/plugins/goodreads.koplugin/main.lua b/plugins/goodreads.koplugin/main.lua index cc974ecb4..ca4760356 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) - self.ui.menu.menu_items["goodreads"] = { + self.ui.menu.menu_items.goodreads = { text = _("Goodreads"), sub_item_table = { { diff --git a/plugins/keepalive.koplugin/main.lua b/plugins/keepalive.koplugin/main.lua index 1d6ab6d94..e4d2d9ba9 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) - self.ui.menu.menu_items["keep_alive"] = 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 0b8520643..1ebbdb5d0 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) - self.ui.menu.menu_items["progress_sync"] = { + self.ui.menu.menu_items.progress_sync = { text = _("Progress sync"), sub_item_table = { { diff --git a/plugins/perceptionexpander.koplugin/main.lua b/plugins/perceptionexpander.koplugin/main.lua index 9fe71435a..06d7b6d20 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) - self.ui.menu.menu_items["speed_reading_module_perception_expander"] = { + self.ui.menu.menu_items.speed_reading_module_perception_expander = { text = _("Speed reading module - perception expander"), sub_item_table ={ { diff --git a/plugins/statistics.koplugin/main.lua b/plugins/statistics.koplugin/main.lua index 9dc0b324f..4619d655a 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) - self.ui.menu.menu_items["statistics"] = { + self.ui.menu.menu_items.statistics = { text = _("Statistics"), sub_item_table = { self:getStatisticEnabledMenuItem(), diff --git a/plugins/storagestat.koplugin/main.lua b/plugins/storagestat.koplugin/main.lua index d5149958d..8bef6a6a0 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) - self.ui.menu.menu_items["storagestat"] = 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 c4edfa0c7..91e346c6c 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) - self.ui.menu.menu_items["synchronize_time"] = 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 5246bee9d..4ca351564 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) - self.ui.menu.menu_items["zsync"] = { + self.ui.menu.menu_items.zsync = { text = _("ZSync"), sub_item_table = { { diff --git a/spec/unit/readerfooter_spec.lua b/spec/unit/readerfooter_spec.lua index bcfc41fba..af4fd7f59 100644 --- a/spec/unit/readerfooter_spec.lua +++ b/spec/unit/readerfooter_spec.lua @@ -16,8 +16,9 @@ describe("Readerfooter module", function() function tapFooterMenu(menu_tab_items, menu_title) local status_bar = MenuSorter:findById(menu_tab_items, "status_bar") or nil + if status_bar then - for _, subitem in ipairs(status_bar) do + for _, subitem in ipairs(status_bar.sub_item_table) do if subitem.text == menu_title then subitem.callback() return @@ -171,9 +172,17 @@ describe("Readerfooter module", function() local readerui = ReaderUI:new{ document = DocumentRegistry:openDocument(sample_pdf), } - local fake_menu = {setting = {}} + local fake_menu = { + ["KOMenu:menu_buttons"] = {}, + setting = {} + } local footer = readerui.view.footer footer:addToMainMenu(fake_menu) + local fake_order = { + ["KOMenu:menu_buttons"] = {"setting"}, + ["setting"] = {"status_bar"}, + } + fake_menu = MenuSorter:sort(fake_menu, fake_order) footer:resetLayout() footer:updateFooter() local timeinfo = footer.textGeneratorMap.time()