2
0
mirror of https://github.com/koreader/koreader synced 2024-11-13 19:11:25 +00:00
koreader/frontend/ui/widget/inputtext.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

183 lines
4.8 KiB
Lua

local InputContainer = require("ui/widget/container/inputcontainer")
local ScrollTextWidget = require("ui/widget/scrolltextwidget")
local TextBoxWidget = require("ui/widget/textboxwidget")
local FrameContainer = require("ui/widget/container/framecontainer")
local VirtualKeyboard = require("ui/widget/virtualkeyboard")
local GestureRange = require("ui/gesturerange")
local UIManager = require("ui/uimanager")
local Geom = require("ui/geometry")
local Device = require("device")
local Screen = require("device").screen
local Font = require("ui/font")
local DEBUG = require("dbg")
local util = require("ffi/util")
local Blitbuffer = require("ffi/blitbuffer")
local InputText = InputContainer:new{
text = "",
hint = "demo hint",
charlist = {}, -- table to store input string
charpos = 1,
input_type = nil,
text_type = nil,
width = nil,
height = nil,
face = Font:getFace("cfont", 22),
padding = 5,
margin = 5,
bordersize = 2,
parent = nil, -- parent dialog that will be set dirty
scroll = false,
focused = true,
}
function InputText:init()
self:initTextBox(self.text)
self:initKeyboard()
if Device:isTouchDevice() then
self.ges_events = {
TapTextBox = {
GestureRange:new{
ges = "tap",
range = self.dimen
}
}
}
end
end
function InputText:initTextBox(text)
self.text = text
self:initCharlist(text)
local fgcolor = Blitbuffer.gray(self.text == "" and 0.5 or 1.0)
local text_widget = nil
local show_text = self.text
if self.text_type == "password" and show_text ~= "" then
show_text = self.text:gsub("(.-).", function() return "*" end)
show_text = show_text:gsub("(.)$", function() return self.text:sub(-1) end)
elseif show_text == "" then
show_text = self.hint
end
if self.scroll then
text_widget = ScrollTextWidget:new{
text = show_text,
face = self.face,
fgcolor = fgcolor,
width = self.width,
height = self.height,
}
else
text_widget = TextBoxWidget:new{
text = show_text,
face = self.face,
fgcolor = fgcolor,
width = self.width,
height = self.height,
}
end
self[1] = FrameContainer:new{
bordersize = self.bordersize,
padding = self.padding,
margin = self.margin,
color = Blitbuffer.gray(self.focused and 1.0 or 0.5),
text_widget,
}
self.dimen = self[1]:getSize()
end
function InputText:initCharlist(text)
if text == nil then return end
-- clear
self.charlist = {}
self.charpos = 1
local prevcharcode, charcode = 0
for uchar in string.gfind(text, "([%z\1-\127\194-\244][\128-\191]*)") do
charcode = util.utf8charcode(uchar)
if prevcharcode then -- utf8
self.charlist[#self.charlist+1] = uchar
end
prevcharcode = charcode
end
self.charpos = #self.charlist+1
end
function InputText:initKeyboard()
local keyboard_layout = 2
if self.input_type == "number" then
keyboard_layout = 3
end
self.keyboard = VirtualKeyboard:new{
layout = keyboard_layout,
inputbox = self,
width = Screen:getWidth(),
height = math.max(Screen:getWidth(), Screen:getHeight())*0.33,
}
end
function InputText:onTapTextBox()
if self.parent.onSwitchFocus then
self.parent:onSwitchFocus(self)
end
end
function InputText:unfocus()
self.focused = false
self[1].color = Blitbuffer.gray(0.5)
end
function InputText:focus()
self.focused = true
self[1].color = Blitbuffer.COLOR_BLACK
end
function InputText:onShowKeyboard()
UIManager:show(self.keyboard)
end
function InputText:onCloseKeyboard()
UIManager:close(self.keyboard)
end
function InputText:getKeyboardDimen()
return self.keyboard.dimen
end
function InputText:addChar(char)
if self.enter_callback and char == '\n' then
UIManager:scheduleIn(0.3, function() self.enter_callback() end)
return
end
table.insert(self.charlist, self.charpos, char)
self.charpos = self.charpos + 1
self:initTextBox(table.concat(self.charlist))
UIManager:setDirty(self.parent, "partial")
end
function InputText:delChar()
if self.charpos == 1 then return end
self.charpos = self.charpos - 1
table.remove(self.charlist, self.charpos)
self:initTextBox(table.concat(self.charlist))
UIManager:setDirty(self.parent, "partial")
end
function InputText:clear()
self:initTextBox("")
UIManager:setDirty(self.parent, "partial")
end
function InputText:getText()
return self.text
end
function InputText:setText(text)
self:initTextBox(text)
UIManager:setDirty(self.parent, "partial")
end
return InputText