mirror of
https://github.com/koreader/koreader.git
synced 2025-08-10 00:52:38 +00:00
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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user