Virtual keyboard: default layout, compact mode (#8142)

pull/8148/head
hius07 3 years ago committed by GitHub
parent 39b810a3bd
commit 32d61c7878
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -8,13 +8,23 @@ local VerticalGroup = require("ui/widget/verticalgroup")
local VirtualKeyboard = require("ui/widget/virtualkeyboard") local VirtualKeyboard = require("ui/widget/virtualkeyboard")
local _ = require("gettext") 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 = { local sub_item_table = {
{ {
text = _("Keyboard layout"), text = _("Keyboard layout"),
sub_item_table = {}, 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"), text = _("Keyboard font size"),
keep_menu_open = true, 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_font_size", font_size)
G_reader_settings:saveSetting("keyboard_key_bold", check_button_bold.checked) 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_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:onCloseKeyboard()
input_dialog._input_widget:initKeyboard() input_dialog._input_widget:initKeyboard()
input_dialog:onShowKeyboard() input_dialog:onShowKeyboard()
@ -69,6 +80,15 @@ local sub_item_table = {
check_button_border:toggleCheck() check_button_border:toggleCheck()
end, 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 checkbox_shift = math.floor((input_dialog.width - input_dialog._input_widget.width) / 2 + 0.5)
local check_buttons = HorizontalGroup:new{ local check_buttons = HorizontalGroup:new{
@ -77,6 +97,7 @@ local sub_item_table = {
align = "left", align = "left",
check_button_bold, check_button_bold,
check_button_border, 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, { table.insert(sub_item_table[1].sub_item_table, {
text_func = function() text_func = function()
local text = Language:getLanguageName(k) local text = Language:getLanguageName(k)
if VirtualKeyboard:getKeyboardLayout() == k then if G_reader_settings:readSetting("keyboard_layout_default") == k then
text = text .. "" text = text .. ""
end end
return text return text
@ -105,11 +131,25 @@ for k, _ in FFIUtil.orderedPairs(VirtualKeyboard.lang_to_keyboard_layout) do
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 {}
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) 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", k) G_reader_settings:saveSetting("keyboard_layout_default", k)
if touchmenu_instance then touchmenu_instance:updateItems() end if touchmenu_instance then touchmenu_instance:updateItems() end
end, end,
}) })

@ -27,6 +27,7 @@ local KeyboardLayoutDialog = InputContainer:new{
title = _("Keyboard layout"), title = _("Keyboard layout"),
modal = true, modal = true,
stop_events_propagation = true, stop_events_propagation = true,
keyboard_state = nil,
width = math.floor(Screen:getWidth() * 0.8), width = math.floor(Screen:getWidth() * 0.8),
face = Font:getFace("cfont", 22), face = Font:getFace("cfont", 22),
title_face = Font:getFace("x_smalltfont"), title_face = Font:getFace("x_smalltfont"),
@ -58,15 +59,26 @@ function KeyboardLayoutDialog:init()
local buttons = {} local buttons = {}
local radio_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 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, { table.insert(radio_buttons, {
{ {
text = Language:getLanguageName(k), text = text,
checked = self.parent.keyboard:getKeyboardLayout() == k, checked = self.parent.keyboard:getKeyboardLayout() == k,
provider = k, provider = k,
}, },
}) })
end end
self.keyboard_state.force_current_layout = false
table.insert(buttons, { table.insert(buttons, {
{ {

@ -25,6 +25,10 @@ local logger = require("logger")
local util = require("util") local util = require("util")
local Screen = Device.screen 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 VirtualKeyPopup
local VirtualKey = InputContainer:new{ local VirtualKey = InputContainer:new{
@ -61,17 +65,12 @@ function VirtualKey:init()
self.key_chars = self:genkeyboardLayoutKeyChars() self.key_chars = self:genkeyboardLayoutKeyChars()
self.callback = function () self.callback = function ()
local current = G_reader_settings:readSetting("keyboard_layout") 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 keyboard_layouts = G_reader_settings:readSetting("keyboard_layouts") or {}
local enabled = false local enabled = false
local next_layout = nil local next_layout = nil
for k, v in FFIUtil.orderedPairs(keyboard_layouts) do if not keyboard_layouts[current] and current ~= default then
if enabled and v == true then next_layout = default
next_layout = k
break
end
if k == current then
enabled = true
end
end end
if not next_layout then if not next_layout then
for k, v in FFIUtil.orderedPairs(keyboard_layouts) do for k, v in FFIUtil.orderedPairs(keyboard_layouts) do
@ -79,6 +78,17 @@ function VirtualKey:init()
next_layout = k next_layout = k
break break
end 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
end end
if next_layout then if next_layout then
@ -86,13 +96,14 @@ function VirtualKey:init()
end end
end end
self.hold_callback = function() 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{ self.popup = VirtualKeyPopup:new{
parent_key = self, parent_key = self,
} }
else else
self.keyboard_layout_dialog = KeyboardLayoutDialog:new{ self.keyboard_layout_dialog = KeyboardLayoutDialog:new{
parent = self, parent = self,
keyboard_state = keyboard_state,
} }
UIManager:show(self.keyboard_layout_dialog) UIManager:show(self.keyboard_layout_dialog)
end end
@ -290,6 +301,7 @@ function VirtualKey:genkeyboardLayoutKeyChars()
UIManager:close(self.popup) UIManager:close(self.popup)
self.keyboard_layout_dialog = KeyboardLayoutDialog:new{ self.keyboard_layout_dialog = KeyboardLayoutDialog:new{
parent = self, parent = self,
keyboard_state = keyboard_state,
} }
UIManager:show(self.keyboard_layout_dialog) UIManager:show(self.keyboard_layout_dialog)
end, end,
@ -766,7 +778,8 @@ function VirtualKeyboard:init()
self.symbolmode_keys = keyboard.symbolmode_keys self.symbolmode_keys = keyboard.symbolmode_keys
self.utf8mode_keys = keyboard.utf8mode_keys self.utf8mode_keys = keyboard.utf8mode_keys
self.umlautmode_keys = keyboard.umlautmode_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.min_layer = keyboard.min_layer
self.max_layer = keyboard.max_layer self.max_layer = keyboard.max_layer
self:initLayer(self.keyboard_layer) self:initLayer(self.keyboard_layer)
@ -784,10 +797,16 @@ function VirtualKeyboard:init()
end end
function VirtualKeyboard:getKeyboardLayout() 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") return G_reader_settings:readSetting("keyboard_layout") or G_reader_settings:readSetting("language")
end end
function VirtualKeyboard:setKeyboardLayout(layout) function VirtualKeyboard:setKeyboardLayout(layout)
keyboard_state.force_current_layout = true
local prev_keyboard_height = self.dimen and self.dimen.h local prev_keyboard_height = self.dimen and self.dimen.h
G_reader_settings:saveSetting("keyboard_layout", layout) G_reader_settings:saveSetting("keyboard_layout", layout)
self:init() self:init()
@ -800,6 +819,7 @@ function VirtualKeyboard:setKeyboardLayout(layout)
else else
self:_refresh(true) self:_refresh(true)
end end
keyboard_state.force_current_layout = false
end end
function VirtualKeyboard:onClose() function VirtualKeyboard:onClose()

Loading…
Cancel
Save