mirror of
https://github.com/koreader/koreader.git
synced 2025-08-10 00:52:38 +00:00
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
This commit is contained in:
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user