Non-Touch: improve bottom menu usability (#8712)

- FocusManager: allow managing sub widgets by merging their
  "layout" in the main one; make "press" support simpler by
  handling it as a fake tap event at the center of the
  focused widget.
- Setup gestures on non-touch devices for new focus manager.
- ToggleSwitch: use child layout.
- ButtonProgressWidget: use child layout.
- SpinWidget and DoubleSpinWidget: add keyboard navigation.
This commit is contained in:
Philip Chan
2022-01-25 08:32:46 +08:00
committed by GitHub
parent 21932c24a2
commit 3af268dd7a
16 changed files with 300 additions and 169 deletions

View File

@@ -2,11 +2,11 @@ local Blitbuffer = require("ffi/blitbuffer")
local ButtonTable = require("ui/widget/buttontable")
local CenterContainer = require("ui/widget/container/centercontainer")
local Device = require("device")
local FocusManager = require("ui/widget/focusmanager")
local FrameContainer = require("ui/widget/container/framecontainer")
local Geom = require("ui/geometry")
local GestureRange = require("ui/gesturerange")
local HorizontalGroup = require("ui/widget/horizontalgroup")
local InputContainer = require("ui/widget/container/inputcontainer")
local MovableContainer = require("ui/widget/container/movablecontainer")
local NumberPickerWidget = require("ui/widget/numberpickerwidget")
local Size = require("ui/size")
@@ -18,7 +18,7 @@ local _ = require("gettext")
local Screen = Device.screen
local T = require("ffi/util").template
local SpinWidget = InputContainer:new{
local SpinWidget = FocusManager:new{
title_text = "",
info_text = nil,
width = nil,
@@ -64,9 +64,8 @@ function SpinWidget:init()
self.width = math.floor(math.min(self.screen_width, self.screen_height) * self.width_factor)
end
if Device:hasKeys() then
self.key_events = {
Close = { {Device.input.group.Back}, doc = "close spin widget" }
}
self.key_events.Close = { {Device.input.group.Back}, doc = "close spin widget" }
self.key_events.Press = { {"Press"}, doc = "press button" }
end
if Device:isTouchDevice() then
self.ges_events = {
@@ -87,6 +86,7 @@ function SpinWidget:init()
end
function SpinWidget:update(numberpicker_value, numberpicker_value_index)
self.layout = {}
local value_widget = NumberPickerWidget:new{
show_parent = self,
value = numberpicker_value or self.value,
@@ -102,6 +102,7 @@ function SpinWidget:update(numberpicker_value, numberpicker_value_index)
self:update(value, value_index)
end,
}
self:mergeLayoutInVertical(value_widget)
local value_group = HorizontalGroup:new{
align = "center",
value_widget,
@@ -195,8 +196,9 @@ function SpinWidget:update(numberpicker_value, numberpicker_value_index)
buttons = buttons,
zero_sep = true,
show_parent = self,
auto_focus_first_button = false,
}
self:mergeLayoutInVertical(ok_cancel_buttons)
local vgroup = VerticalGroup:new{
align = "left",
title_bar,
@@ -234,6 +236,7 @@ function SpinWidget:update(numberpicker_value, numberpicker_value_index)
},
self.movable,
}
self:focusTopLeftWidget()
UIManager:setDirty(self, function()
return "ui", self.spin_frame.dimen
end)
@@ -277,4 +280,8 @@ function SpinWidget:onClose()
return true
end
function SpinWidget:onPress()
return self:sendTapEventToFocusedWidget()
end
return SpinWidget