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

Loading…
Cancel
Save