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
pull/2677/head
Frans de Jonge 7 years ago
parent 56659ddb20
commit 8f31a81601

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

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

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

@ -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 = {}

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

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

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

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

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

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

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

@ -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(),

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

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

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

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

Loading…
Cancel
Save