2
0
mirror of https://github.com/koreader/koreader synced 2024-10-31 21:20:20 +00:00
koreader/frontend/ui/widget/button.lua
Hans-Werner Hilse 3066c86e38 Refactoring hardware abstraction
This is a major overhaul of the hardware abstraction layer.
A few notes:

General platform distinction happens in
  frontend/device.lua
which will delegate everything else to
  frontend/device/<platform_name>/device.lua
which should extend
  frontend/device/generic/device.lua

Screen handling is implemented in
  frontend/device/screen.lua
which includes the *functionality* to support device specifics.
Actually setting up the device specific functionality, however,
is done in the device specific setup code in the relevant
device.lua file.

The same goes for input handling.
2014-11-02 21:19:04 +01:00

174 lines
4.3 KiB
Lua

local InputContainer = require("ui/widget/container/inputcontainer")
local TextWidget = require("ui/widget/textwidget")
local ImageWidget = require("ui/widget/imagewidget")
local Font = require("ui/font")
local Geom = require("ui/geometry")
local GestureRange = require("ui/gesturerange")
local FrameContainer = require("ui/widget/container/framecontainer")
local CenterContainer = require("ui/widget/container/centercontainer")
local UIManager = require("ui/uimanager")
local Device = require("device")
local DEBUG = require("dbg")
local _ = require("gettext")
local Blitbuffer = require("ffi/blitbuffer")
--[[
a button widget that shows text or a icon and handles callback when tapped
--]]
local Button = InputContainer:new{
text = nil, -- mandatory
icon = nil,
preselect = false,
callback = nil,
enabled = true,
margin = 0,
bordersize = 3,
background = Blitbuffer.COLOR_WHITE,
radius = 15,
padding = 2,
width = nil,
text_font_face = "cfont",
text_font_size = 20,
}
function Button:init()
if self.text then
self.label_widget = TextWidget:new{
text = self.text,
fgcolor = Blitbuffer.gray(self.enabled and 1.0 or 0.5),
bold = true,
face = Font:getFace(self.text_font_face, self.text_font_size)
}
else
self.label_widget = ImageWidget:new{
file = self.icon,
dim = not self.enabled,
}
end
local widget_size = self.label_widget:getSize()
if self.width == nil then
self.width = widget_size.w
end
-- set FrameContainer content
self.frame = FrameContainer:new{
margin = self.margin,
bordersize = self.bordersize,
background = self.background,
radius = self.radius,
padding = self.padding,
CenterContainer:new{
dimen = Geom:new{
w = self.width,
h = widget_size.h
},
self.label_widget,
}
}
if self.preselect then
self.frame.color = Blitbuffer.COLOR_BLACK
else
self.frame.color = Blitbuffer.gray(0.33)
end
self.dimen = self.frame:getSize()
self[1] = self.frame
if Device:isTouchDevice() then
self.ges_events = {
TapSelectButton = {
GestureRange:new{
ges = "tap",
range = self.dimen,
},
doc = "Tap Button",
},
HoldSelectButton = {
GestureRange:new{
ges = "hold",
range = self.dimen,
},
doc = "Hold Button",
}
}
end
end
function Button:onFocus()
self[1].color = Blitbuffer.COLOR_BLACK
return true
end
function Button:onUnfocus()
self[1].color = Blitbuffer.gray(0.33)
return true
end
function Button:enable()
self.enabled = true
if self.text then
self.label_widget.fgcolor = Blitbuffer.gray(self.enabled and 1.0 or 0.5)
else
self.label_widget.dim = not self.enabled
end
end
function Button:disable()
self.enabled = false
if self.text then
self.label_widget.fgcolor = Blitbuffer.gray(self.enabled and 1.0 or 0.5)
else
self.label_widget.dim = not self.enabled
end
end
function Button:enableDisable(enable)
if enable then
self:enable()
else
self:disable()
end
end
function Button:hide()
if self.icon then
self.frame.orig_background = self[1].background
self.frame.background = nil
self.label_widget.hide = true
end
end
function Button:show()
if self.icon then
self.label_widget.hide = false
self.frame.background = self[1].old_background
end
end
function Button:showHide(show)
if show then
self:show()
else
self:hide()
end
end
function Button:onTapSelectButton()
if self.enabled and self.callback then
self[1].invert = true
UIManager:setDirty(self.show_parent, "partial")
UIManager:scheduleIn(0.1, function()
self.callback()
self[1].invert = false
UIManager:setDirty(self.show_parent, "partial")
end)
end
return true
end
function Button:onHoldSelectButton()
if self.enabled and self.hold_callback then
self.hold_callback()
end
return true
end
return Button