diff --git a/frontend/ui/elements/menu_keyboard_layout.lua b/frontend/ui/elements/menu_keyboard_layout.lua index 3b5394e37..db3d57b4b 100644 --- a/frontend/ui/elements/menu_keyboard_layout.lua +++ b/frontend/ui/elements/menu_keyboard_layout.lua @@ -8,13 +8,23 @@ local VerticalGroup = require("ui/widget/verticalgroup") local VirtualKeyboard = require("ui/widget/virtualkeyboard") local _ = require("gettext") -local input_dialog, check_button_bold, check_button_border +local input_dialog, check_button_bold, check_button_border, check_button_compact local sub_item_table = { { text = _("Keyboard layout"), sub_item_table = {}, }, + { + text = _("Remember last layout"), + checked_func = function() + return G_reader_settings:nilOrTrue("keyboard_remember_layout") + end, + callback = function() + G_reader_settings:flipNilOrTrue("keyboard_remember_layout") + end, + separator = true, + }, { text = _("Keyboard font size"), keep_menu_open = true, @@ -40,6 +50,7 @@ local sub_item_table = { G_reader_settings:saveSetting("keyboard_key_font_size", font_size) G_reader_settings:saveSetting("keyboard_key_bold", check_button_bold.checked) G_reader_settings:saveSetting("keyboard_key_border", check_button_border.checked) + G_reader_settings:saveSetting("keyboard_key_compact", check_button_compact.checked) input_dialog._input_widget:onCloseKeyboard() input_dialog._input_widget:initKeyboard() input_dialog:onShowKeyboard() @@ -69,6 +80,15 @@ local sub_item_table = { check_button_border:toggleCheck() end, } + check_button_compact = CheckButton:new{ + text = _("compact"), + checked = G_reader_settings:isTrue("keyboard_key_compact"), + parent = input_dialog, + max_width = input_dialog._input_widget.width, + callback = function() + check_button_compact:toggleCheck() + end, + } local checkbox_shift = math.floor((input_dialog.width - input_dialog._input_widget.width) / 2 + 0.5) local check_buttons = HorizontalGroup:new{ @@ -77,6 +97,7 @@ local sub_item_table = { align = "left", check_button_bold, check_button_border, + check_button_compact, }, } @@ -90,11 +111,16 @@ local sub_item_table = { }, } -for k, _ in FFIUtil.orderedPairs(VirtualKeyboard.lang_to_keyboard_layout) do +local selected_layouts_count = 0 +local _keyboard_layouts = G_reader_settings:readSetting("keyboard_layouts") or {} +for k, __ in FFIUtil.orderedPairs(VirtualKeyboard.lang_to_keyboard_layout) do + if _keyboard_layouts[k] == true then + selected_layouts_count = selected_layouts_count + 1 + end table.insert(sub_item_table[1].sub_item_table, { text_func = function() local text = Language:getLanguageName(k) - if VirtualKeyboard:getKeyboardLayout() == k then + if G_reader_settings:readSetting("keyboard_layout_default") == k then text = text .. " ★" end return text @@ -105,11 +131,25 @@ for k, _ in FFIUtil.orderedPairs(VirtualKeyboard.lang_to_keyboard_layout) do end, callback = function() local keyboard_layouts = G_reader_settings:readSetting("keyboard_layouts") or {} - keyboard_layouts[k] = not keyboard_layouts[k] + if keyboard_layouts[k] == true then + keyboard_layouts[k] = false + selected_layouts_count = selected_layouts_count - 1 + else + if selected_layouts_count < 4 then + keyboard_layouts[k] = true + selected_layouts_count = selected_layouts_count + 1 + else -- no more space in the 'globe' popup + UIManager:show(require("ui/widget/infomessage"):new{ + text = _("Up to four layouts can be enabled."), + timeout = 2, + }) + return + end + end G_reader_settings:saveSetting("keyboard_layouts", keyboard_layouts) end, hold_callback = function(touchmenu_instance) - G_reader_settings:saveSetting("keyboard_layout", k) + G_reader_settings:saveSetting("keyboard_layout_default", k) if touchmenu_instance then touchmenu_instance:updateItems() end end, }) diff --git a/frontend/ui/widget/keyboardlayoutdialog.lua b/frontend/ui/widget/keyboardlayoutdialog.lua index 64d3c9d7b..c11fb04f1 100644 --- a/frontend/ui/widget/keyboardlayoutdialog.lua +++ b/frontend/ui/widget/keyboardlayoutdialog.lua @@ -27,6 +27,7 @@ local KeyboardLayoutDialog = InputContainer:new{ title = _("Keyboard layout"), modal = true, stop_events_propagation = true, + keyboard_state = nil, width = math.floor(Screen:getWidth() * 0.8), face = Font:getFace("cfont", 22), title_face = Font:getFace("x_smalltfont"), @@ -58,15 +59,26 @@ function KeyboardLayoutDialog:init() local buttons = {} local radio_buttons = {} + + local keyboard_layouts = G_reader_settings:readSetting("keyboard_layouts") or {} + self.keyboard_state.force_current_layout = true for k, _ in FFIUtil.orderedPairs(self.parent.keyboard.lang_to_keyboard_layout) do + local text = Language:getLanguageName(k) .. " (" .. string.sub(k, 1, 2) .. ")" + if keyboard_layouts[k] == true then + text = text .. " ✓" + end + if k == G_reader_settings:readSetting("keyboard_layout_default") then + text = text .. " ★" + end table.insert(radio_buttons, { { - text = Language:getLanguageName(k), + text = text, checked = self.parent.keyboard:getKeyboardLayout() == k, provider = k, }, }) end + self.keyboard_state.force_current_layout = false table.insert(buttons, { { diff --git a/frontend/ui/widget/virtualkeyboard.lua b/frontend/ui/widget/virtualkeyboard.lua index 9fe336037..73ee52e3c 100644 --- a/frontend/ui/widget/virtualkeyboard.lua +++ b/frontend/ui/widget/virtualkeyboard.lua @@ -25,6 +25,10 @@ local logger = require("logger") local util = require("util") local Screen = Device.screen +local keyboard_state = { + force_current_layout = false, -- Set to true to get/set current layout (instead of default layout) +} + local VirtualKeyPopup local VirtualKey = InputContainer:new{ @@ -61,17 +65,12 @@ function VirtualKey:init() self.key_chars = self:genkeyboardLayoutKeyChars() self.callback = function () local current = G_reader_settings:readSetting("keyboard_layout") + local default = G_reader_settings:readSetting("keyboard_layout_default") local keyboard_layouts = G_reader_settings:readSetting("keyboard_layouts") or {} local enabled = false local next_layout = nil - for k, v in FFIUtil.orderedPairs(keyboard_layouts) do - if enabled and v == true then - next_layout = k - break - end - if k == current then - enabled = true - end + if not keyboard_layouts[current] and current ~= default then + next_layout = default end if not next_layout then for k, v in FFIUtil.orderedPairs(keyboard_layouts) do @@ -79,6 +78,17 @@ function VirtualKey:init() next_layout = k break end + if k == current then + enabled = true + end + end + end + if not next_layout then + for k, v in FFIUtil.orderedPairs(keyboard_layouts) do + if v == true then + next_layout = k + break + end end end if next_layout then @@ -86,13 +96,14 @@ function VirtualKey:init() end end self.hold_callback = function() - if util.tableSize(self.key_chars) > 5 then + if util.tableSize(self.key_chars) > 5 then -- 2 or more layouts enabled self.popup = VirtualKeyPopup:new{ parent_key = self, } else self.keyboard_layout_dialog = KeyboardLayoutDialog:new{ parent = self, + keyboard_state = keyboard_state, } UIManager:show(self.keyboard_layout_dialog) end @@ -290,6 +301,7 @@ function VirtualKey:genkeyboardLayoutKeyChars() UIManager:close(self.popup) self.keyboard_layout_dialog = KeyboardLayoutDialog:new{ parent = self, + keyboard_state = keyboard_state, } UIManager:show(self.keyboard_layout_dialog) end, @@ -766,7 +778,8 @@ function VirtualKeyboard:init() self.symbolmode_keys = keyboard.symbolmode_keys self.utf8mode_keys = keyboard.utf8mode_keys self.umlautmode_keys = keyboard.umlautmode_keys - self.height = Screen:scaleBySize(64 * #self.KEYS) + local keys_height = G_reader_settings:isTrue("keyboard_key_compact") and 48 or 64 + self.height = Screen:scaleBySize(keys_height * #self.KEYS) self.min_layer = keyboard.min_layer self.max_layer = keyboard.max_layer self:initLayer(self.keyboard_layer) @@ -784,10 +797,16 @@ function VirtualKeyboard:init() end function VirtualKeyboard:getKeyboardLayout() + if G_reader_settings:isFalse("keyboard_remember_layout") and not keyboard_state.force_current_layout then + local lang = G_reader_settings:readSetting("keyboard_layout_default") + or G_reader_settings:readSetting("keyboard_layout") or "en" + G_reader_settings:saveSetting("keyboard_layout", lang) + end return G_reader_settings:readSetting("keyboard_layout") or G_reader_settings:readSetting("language") end function VirtualKeyboard:setKeyboardLayout(layout) + keyboard_state.force_current_layout = true local prev_keyboard_height = self.dimen and self.dimen.h G_reader_settings:saveSetting("keyboard_layout", layout) self:init() @@ -800,6 +819,7 @@ function VirtualKeyboard:setKeyboardLayout(layout) else self:_refresh(true) end + keyboard_state.force_current_layout = false end function VirtualKeyboard:onClose()