From 829e2fffd8afa0b62dfe145bd55fa9fa0843e790 Mon Sep 17 00:00:00 2001 From: Frans de Jonge Date: Sun, 3 Sep 2017 16:54:59 +0200 Subject: [PATCH] [fix] MenuSorter: take care of orphaned submenus See https://github.com/koreader/koreader/pull/3167#issuecomment-326805768 --- frontend/ui/menusorter.lua | 7 +++++++ spec/unit/menusorter_spec.lua | 30 ++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/frontend/ui/menusorter.lua b/frontend/ui/menusorter.lua index 4cdbef3e4..8dcf1855f 100644 --- a/frontend/ui/menusorter.lua +++ b/frontend/ui/menusorter.lua @@ -157,6 +157,13 @@ function MenuSorter:sort(item_table, order) v.text = self.orphaned_prefix .. v.text -- prevent text being prepended to item on menu reload, i.e., on switching between reader and filemanager v.new = true + -- deal with orphaned submenus + if #v > 0 then + v.sub_item_table = {} + for i=1,#v do + v.sub_item_table[i] = v[i] + end + end end table.insert(menu_table["KOMenu:menu_buttons"][1], v) end diff --git a/spec/unit/menusorter_spec.lua b/spec/unit/menusorter_spec.lua index edfee0f47..005df02f1 100644 --- a/spec/unit/menusorter_spec.lua +++ b/spec/unit/menusorter_spec.lua @@ -80,6 +80,36 @@ describe("MenuSorter module", function() assert.is_true(string.sub(menu_item.text,1,string.len(MenuSorter.orphaned_prefix))==MenuSorter.orphaned_prefix) end end) + it("should display submenu of orphaned submenu", function() + local menu_items = { + ["KOMenu:menu_buttons"] = {}, + main = {text="Main"}, + search = {text="Search"}, + tools = {text="Tools"}, + setting = {text="Settings"}, + submenu = {text="Submenu"}, + submenu_item1 = {text="Submenu item 1"}, + submenu_item2 = {text="Submenu item 2"}, + } + local order = { + ["KOMenu:menu_buttons"] = { + "setting", + }, + setting = {}, + submenu = { + "submenu_item2", + "submenu_item1", + }, + } + + local test_menu = MenuSorter:sort(menu_items, order) + + -- all four should be in the first menu + assert.is_true(#test_menu[1] == 4) + assert.is_truthy(test_menu[1][3].sub_item_table) + assert.equals(test_menu[1][3].sub_item_table[1].id, "submenu_item2") + assert.equals(test_menu[1][3].sub_item_table[2].id, "submenu_item1") + end) it("should not treat disabled as orphans", function() local menu_items = { ["KOMenu:menu_buttons"] = {},