Keyboards/Menu: Lazy-load the layout-specific menu (#9584)

And do so only for the active layouts.

This prevents loading a potentially large amount of data without even having navigated to said menu (or having the layout enabled).
pull/9597/head
NiLuJe 2 years ago committed by GitHub
parent 1ea7e16f3e
commit 68b26c3a36
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -10,7 +10,6 @@ local UIManager = require("ui/uimanager")
local VirtualKeyboard = require("ui/widget/virtualkeyboard")
local Screen = Device.screen
local T = require("ffi/util").template
local dbg = require("dbg")
local logger = require("logger")
local util = require("util")
local _ = require("gettext")
@ -23,7 +22,7 @@ local input_dialog, check_button_bold, check_button_border, check_button_compact
local function getActivatedKeyboards(compact)
local keyboard_layouts = G_reader_settings:readSetting("keyboard_layouts", {})
local activated_keyboards = {}
for lang, dummy in FFIUtil.orderedPairs(VirtualKeyboard.lang_to_keyboard_layout) do
for lang, __ in FFIUtil.orderedPairs(VirtualKeyboard.lang_to_keyboard_layout) do
if util.arrayContains(keyboard_layouts, lang) then
if compact then
table.insert(activated_keyboards, lang)
@ -43,6 +42,50 @@ local function getActivatedKeyboards(compact)
return table.concat(activated_keyboards, ", "), #activated_keyboards
end
local function isKeyboardLayoutActive(lang)
if VirtualKeyboard:getKeyboardLayout() == lang then
return true
end
local keyboard_layouts = G_reader_settings:readSetting("keyboard_layouts", {})
return util.arrayContains(keyboard_layouts, lang)
end
-- Generate the language specific settings menu on demand, and only for active layouts,
-- to avoid loading potentially complex/large data when the layout isn't enabled.
local function genLayoutSpecificSubmenu()
local item_table = {}
for lang, __ in FFIUtil.orderedPairs(VirtualKeyboard.lang_has_submenu) do
if isKeyboardLayoutActive(lang) then
local keyboard_layout = VirtualKeyboard.lang_to_keyboard_layout[lang]
local kb_pkg = "ui/data/keyboardlayouts/" .. keyboard_layout
table.insert(item_table, {
text = Language:getLanguageName(lang),
sub_item_table_func = function()
local keyboard = require(kb_pkg)
if keyboard.genMenuItems ~= nil then
return keyboard:genMenuItems()
else
return {
text = _("Not implemented"),
}
end
end,
})
end
end
-- Be a little more user-friendly than an empty menu ;).
if #item_table == 0 then
table.insert(item_table, {
text = _("Not available for any of your active layouts"),
})
end
return item_table
end
local sub_item_table = {
{
text_func = function()
@ -140,7 +183,8 @@ local sub_item_table = {
},
{
text = _("Layout-specific keyboard settings"),
sub_item_table = {},
-- Lazy-loaded to avoid pinning potentially unnecessary data
sub_item_table_func = genLayoutSpecificSubmenu,
}
}
@ -180,15 +224,6 @@ for lang, keyboard_layout in FFIUtil.orderedPairs(VirtualKeyboard.lang_to_keyboa
if touchmenu_instance then touchmenu_instance:updateItems() end
end,
})
if VirtualKeyboard.lang_has_submenu[lang] then
local keyboard = require("ui/data/keyboardlayouts/" .. keyboard_layout)
if dbg.dassert(keyboard.genMenuItems ~= nil) then
table.insert(sub_item_table[4].sub_item_table, {
text = Language:getLanguageName(lang),
sub_item_table = keyboard:genMenuItems(),
})
end
end
end
return sub_item_table

Loading…
Cancel
Save