[UX] VirtualKeyPopup: variable size (#4892)

This makes the code a lot more complex, but it looks much better.
pull/4897/head
Frans de Jonge 5 years ago committed by GitHub
parent fd50dc34a6
commit 3f59dee721
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -19,6 +19,7 @@ local VerticalGroup = require("ui/widget/verticalgroup")
local VerticalSpan = require("ui/widget/verticalspan") local VerticalSpan = require("ui/widget/verticalspan")
local WidgetContainer = require("ui/widget/container/widgetcontainer") local WidgetContainer = require("ui/widget/container/widgetcontainer")
local logger = require("logger") local logger = require("logger")
local util = require("util")
local Screen = Device.screen local Screen = Device.screen
local VirtualKeyPopup local VirtualKeyPopup
@ -273,25 +274,45 @@ function VirtualKeyPopup:init()
local key_chars = parent_key.key_chars local key_chars = parent_key.key_chars
local key_char_orig = key_chars[1] local key_char_orig = key_chars[1]
local extra_key_chars = {} local rows = {
extra_key_chars[1] = key_chars[2] extra_key_chars = {
extra_key_chars[2] = key_chars[3] key_chars[2],
extra_key_chars[3] = key_chars[4] key_chars[3],
local top_key_chars = {} key_chars[4],
top_key_chars[1] = key_chars.northwest },
top_key_chars[2] = key_chars.north top_key_chars = {
top_key_chars[3] = key_chars.northeast key_chars.northwest,
local middle_key_chars = {} key_chars.north,
middle_key_chars[1] = key_chars.west key_chars.northeast,
middle_key_chars[2] = key_char_orig },
middle_key_chars[3] = key_chars.east middle_key_chars = {
local bottom_key_chars = {} key_chars.west,
bottom_key_chars[1] = key_chars.southwest key_char_orig,
bottom_key_chars[2] = key_chars.south key_chars.east,
bottom_key_chars[3] = key_chars.southeast },
bottom_key_chars = {
local blank = HorizontalSpan:new{width = parent_key.width} key_chars.southwest,
local h_key_padding = HorizontalSpan:new{width = parent_key.keyboard.key_padding} key_chars.south,
key_chars.southeast,
},
}
if util.tableSize(rows.extra_key_chars) == 0 then rows.extra_key_chars = nil end
if util.tableSize(rows.top_key_chars) == 0 then rows.top_key_chars = nil end
-- we should always have a middle
if util.tableSize(rows.bottom_key_chars) == 0 then rows.bottom_key_chars = nil end
-- to store if a column exists
local columns = {}
local blank = {
HorizontalSpan:new{width = 0},
HorizontalSpan:new{width = parent_key.width},
HorizontalSpan:new{width = 0},
}
local h_key_padding = {
HorizontalSpan:new{width = 0},
HorizontalSpan:new{width = parent_key.keyboard.key_padding},
HorizontalSpan:new{width = 0},
}
local v_key_padding = VerticalSpan:new{width = parent_key.keyboard.key_padding} local v_key_padding = VerticalSpan:new{width = parent_key.keyboard.key_padding}
local vertical_group = VerticalGroup:new{} local vertical_group = VerticalGroup:new{}
@ -302,10 +323,17 @@ function VirtualKeyPopup:init()
local function horizontalRow(chars, group) local function horizontalRow(chars, group)
local layout_horizontal = {} local layout_horizontal = {}
for i = 1,3 do for i = 1,3 do
local v = chars[i] local v = chars[i]
if v then if v then
columns[i] = true
blank[i].width = blank[2].width
if i == 1 then
h_key_padding[i].width = h_key_padding[2].width
end
local virtual_key = VirtualKey:new{ local virtual_key = VirtualKey:new{
key = v, key = v,
label = v, label = v,
@ -340,22 +368,34 @@ function VirtualKeyPopup:init()
table.insert(group, virtual_key) table.insert(group, virtual_key)
table.insert(layout_horizontal, virtual_key) table.insert(layout_horizontal, virtual_key)
else else
table.insert(group, blank) table.insert(group, blank[i])
end
if i ~= #chars then
table.insert(group, h_key_padding)
end end
table.insert(group, h_key_padding[i])
end end
table.insert(vertical_group, group) table.insert(vertical_group, group)
table.insert(self.layout, layout_horizontal) table.insert(self.layout, layout_horizontal)
end end
horizontalRow(extra_key_chars, horizontal_group_extra) if rows.extra_key_chars then
table.insert(vertical_group, v_key_padding) horizontalRow(rows.extra_key_chars, horizontal_group_extra)
horizontalRow(top_key_chars, horizontal_group_top) table.insert(vertical_group, v_key_padding)
table.insert(vertical_group, v_key_padding) end
horizontalRow(middle_key_chars, horizontal_group_middle) if rows.top_key_chars then
table.insert(vertical_group, v_key_padding) horizontalRow(rows.top_key_chars, horizontal_group_top)
horizontalRow(bottom_key_chars, horizontal_group_bottom) table.insert(vertical_group, v_key_padding)
end
-- always middle row
horizontalRow(rows.middle_key_chars, horizontal_group_middle)
if rows.bottom_key_chars then
table.insert(vertical_group, v_key_padding)
horizontalRow(rows.bottom_key_chars, horizontal_group_bottom)
end
if not columns[3] then
h_key_padding[2].width = 0
end
local num_rows = util.tableSize(rows)
local num_columns = util.tableSize(columns)
local keyboard_frame = FrameContainer:new{ local keyboard_frame = FrameContainer:new{
margin = 0, margin = 0,
@ -365,8 +405,8 @@ function VirtualKeyPopup:init()
padding = parent_key.keyboard.padding, padding = parent_key.keyboard.padding,
CenterContainer:new{ CenterContainer:new{
dimen = Geom:new{ dimen = Geom:new{
w = parent_key.width*3 - 2*Size.border.default + 4*parent_key.keyboard.key_padding, w = parent_key.width*num_columns + 2*Size.border.default + (num_columns)*parent_key.keyboard.key_padding,
h = parent_key.height*4 - 2*Size.border.default + 5*parent_key.keyboard.key_padding, h = parent_key.height*num_rows + 2*Size.border.default + num_rows*parent_key.keyboard.key_padding,
}, },
vertical_group, vertical_group,
} }
@ -388,10 +428,23 @@ function VirtualKeyPopup:init()
self.key_events.Close = { {"Back"}, doc = "close keyboard" } self.key_events.Close = { {"Back"}, doc = "close keyboard" }
end end
local offset_x = 2*parent_key.keyboard.padding + 2*parent_key.keyboard.bordersize
if columns[1] then
offset_x = offset_x + parent_key.width + parent_key.keyboard.padding + 2*parent_key.keyboard.bordersize
end
local offset_y = parent_key.keyboard.padding + parent_key.keyboard.padding + 2*parent_key.keyboard.bordersize
if rows.extra_key_chars then
offset_y = offset_y + parent_key.height + parent_key.keyboard.padding + 2*parent_key.keyboard.bordersize
end
if rows.top_key_chars then
offset_y = offset_y + parent_key.height + parent_key.keyboard.padding + 2*parent_key.keyboard.bordersize
end
local position_container = WidgetContainer:new{ local position_container = WidgetContainer:new{
dimen = { dimen = {
x = parent_key.dimen.x - parent_key.width - 6*parent_key.keyboard.padding - parent_key.keyboard.bordersize, x = parent_key.dimen.x - offset_x,
y = parent_key.dimen.y - parent_key.height*2 - 8*parent_key.keyboard.padding - parent_key.keyboard.bordersize, y = parent_key.dimen.y - offset_y,
h = Screen:getSize().h, h = Screen:getSize().h,
w = Screen:getSize().w, w = Screen:getSize().w,
}, },

Loading…
Cancel
Save