menu: keyboard_layout: add ability for layout-specific settings

A layout might want to make some specific feature configurable, so
create an addToMainMenu-like system for allowing layouts to add their
own configuration sub-menu to the keyboard configuration menu.

Signed-off-by: Aleksa Sarai <cyphar@cyphar.com>
reviewable/pr8432/r1
Aleksa Sarai 3 years ago committed by poire-z
parent cb702fb062
commit fb0e5fca94

@ -3,6 +3,7 @@ local FFIUtil = require("ffi/util")
local Language = require("ui/language") local Language = require("ui/language")
local UIManager = require("ui/uimanager") local UIManager = require("ui/uimanager")
local VirtualKeyboard = require("ui/widget/virtualkeyboard") local VirtualKeyboard = require("ui/widget/virtualkeyboard")
local dbg = require("dbg")
local util = require("util") local util = require("util")
local _ = require("gettext") local _ = require("gettext")
@ -94,29 +95,33 @@ local sub_item_table = {
input_dialog:onShowKeyboard() input_dialog:onShowKeyboard()
end, end,
}, },
{
text = _("Layout-specific keyboard settings"),
sub_item_table = {},
}
} }
for k, __ in FFIUtil.orderedPairs(VirtualKeyboard.lang_to_keyboard_layout) do for lang, keyboard_layout in FFIUtil.orderedPairs(VirtualKeyboard.lang_to_keyboard_layout) do
table.insert(sub_item_table[1].sub_item_table, { table.insert(sub_item_table[1].sub_item_table, {
text_func = function() text_func = function()
local text = Language:getLanguageName(k) local text = Language:getLanguageName(lang)
if G_reader_settings:readSetting("keyboard_layout_default") == k then if G_reader_settings:readSetting("keyboard_layout_default") == lang then
text = text .. "" text = text .. ""
end end
return text return text
end, end,
checked_func = function() checked_func = function()
local keyboard_layouts = G_reader_settings:readSetting("keyboard_layouts") or {} local keyboard_layouts = G_reader_settings:readSetting("keyboard_layouts") or {}
return util.arrayContains(keyboard_layouts, k) return util.arrayContains(keyboard_layouts, lang)
end, end,
callback = function() callback = function()
local keyboard_layouts = G_reader_settings:readSetting("keyboard_layouts") or {} local keyboard_layouts = G_reader_settings:readSetting("keyboard_layouts") or {}
local layout_index = util.arrayContains(keyboard_layouts, k) local layout_index = util.arrayContains(keyboard_layouts, lang)
if layout_index then if layout_index then
table.remove(keyboard_layouts, layout_index) table.remove(keyboard_layouts, layout_index)
else else
if #keyboard_layouts < 4 then if #keyboard_layouts < 4 then
table.insert(keyboard_layouts, k) table.insert(keyboard_layouts, lang)
else -- no more space in the 'globe' popup else -- no more space in the 'globe' popup
UIManager:show(require("ui/widget/infomessage"):new{ UIManager:show(require("ui/widget/infomessage"):new{
text = _("Up to four layouts can be enabled."), text = _("Up to four layouts can be enabled."),
@ -128,10 +133,19 @@ for k, __ in FFIUtil.orderedPairs(VirtualKeyboard.lang_to_keyboard_layout) do
G_reader_settings:saveSetting("keyboard_layouts", keyboard_layouts) G_reader_settings:saveSetting("keyboard_layouts", keyboard_layouts)
end, end,
hold_callback = function(touchmenu_instance) hold_callback = function(touchmenu_instance)
G_reader_settings:saveSetting("keyboard_layout_default", k) G_reader_settings:saveSetting("keyboard_layout_default", lang)
if touchmenu_instance then touchmenu_instance:updateItems() end if touchmenu_instance then touchmenu_instance:updateItems() end
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 end
return sub_item_table return sub_item_table

@ -761,6 +761,10 @@ local VirtualKeyboard = FocusManager:new{
ru = "ru_keyboard", ru = "ru_keyboard",
tr = "tr_keyboard", tr = "tr_keyboard",
}, },
lang_has_submenu = {
ja = true,
},
} }
function VirtualKeyboard:init() function VirtualKeyboard:init()

Loading…
Cancel
Save