From fb0e5fca943906a2d095ee39a6d06dfd4ef95b34 Mon Sep 17 00:00:00 2001 From: Aleksa Sarai Date: Sat, 6 Nov 2021 16:09:33 +1100 Subject: [PATCH] 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 --- frontend/ui/elements/menu_keyboard_layout.lua | 28 ++++++++++++++----- frontend/ui/widget/virtualkeyboard.lua | 4 +++ 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/frontend/ui/elements/menu_keyboard_layout.lua b/frontend/ui/elements/menu_keyboard_layout.lua index bad58c34c..c4f346db8 100644 --- a/frontend/ui/elements/menu_keyboard_layout.lua +++ b/frontend/ui/elements/menu_keyboard_layout.lua @@ -3,6 +3,7 @@ local FFIUtil = require("ffi/util") local Language = require("ui/language") local UIManager = require("ui/uimanager") local VirtualKeyboard = require("ui/widget/virtualkeyboard") +local dbg = require("dbg") local util = require("util") local _ = require("gettext") @@ -94,29 +95,33 @@ local sub_item_table = { input_dialog:onShowKeyboard() 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, { text_func = function() - local text = Language:getLanguageName(k) - if G_reader_settings:readSetting("keyboard_layout_default") == k then + local text = Language:getLanguageName(lang) + if G_reader_settings:readSetting("keyboard_layout_default") == lang then text = text .. " ★" end return text end, checked_func = function() local keyboard_layouts = G_reader_settings:readSetting("keyboard_layouts") or {} - return util.arrayContains(keyboard_layouts, k) + return util.arrayContains(keyboard_layouts, lang) end, callback = function() 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 table.remove(keyboard_layouts, layout_index) else if #keyboard_layouts < 4 then - table.insert(keyboard_layouts, k) + table.insert(keyboard_layouts, lang) else -- no more space in the 'globe' popup UIManager:show(require("ui/widget/infomessage"):new{ 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) end, 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 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 diff --git a/frontend/ui/widget/virtualkeyboard.lua b/frontend/ui/widget/virtualkeyboard.lua index f4fd858fe..869d6361a 100644 --- a/frontend/ui/widget/virtualkeyboard.lua +++ b/frontend/ui/widget/virtualkeyboard.lua @@ -761,6 +761,10 @@ local VirtualKeyboard = FocusManager:new{ ru = "ru_keyboard", tr = "tr_keyboard", }, + + lang_has_submenu = { + ja = true, + }, } function VirtualKeyboard:init()