mirror of
https://github.com/koreader/koreader.git
synced 2025-08-10 00:52:38 +00:00
now shiftmode and altmode is recoreded in Keys module. So all the UIs are sharing these two mode instead of remembering their own. These fix the bug in UI switchings. For instance, you use combo 'Alt'+'b' to fire up some menu in pdfreader, the altmode is set, but the alt key was released after the menu show up. Then the key release event will only be captured by the menu. So after you exit from the menu, the altmode is still set in pdfreader, which is not what we want.
210 lines
5.6 KiB
Lua
210 lines
5.6 KiB
Lua
require "rendertext"
|
|
require "keys"
|
|
require "graphics"
|
|
|
|
InputBox = {
|
|
-- Class vars:
|
|
input_start_x = 145,
|
|
input_start_y = nil,
|
|
input_cur_x = nil, -- points to the start of next input pos
|
|
|
|
input_bg = 0,
|
|
|
|
input_string = "",
|
|
|
|
shiftmode = false,
|
|
altmode = false,
|
|
|
|
-- font for displaying input content
|
|
face = freetype.newBuiltinFace("mono", 25),
|
|
fhash = "m25",
|
|
fheight = 25,
|
|
fwidth = 16,
|
|
}
|
|
|
|
function InputBox:setDefaultInput(text)
|
|
self.input_string = ""
|
|
self:addString(text)
|
|
--renderUtf8Text(fb.bb, self.input_start_x, self.input_start_y,
|
|
--self.face, self.fhash, text, true)
|
|
--self.input_cur_x = self.input_start_x + (string.len(text) * self.fwidth)
|
|
--self.input_string = text
|
|
end
|
|
|
|
function InputBox:addString(str)
|
|
for i = 1, #str do
|
|
self:addChar(str:sub(i,i))
|
|
end
|
|
end
|
|
|
|
function InputBox:addChar(char)
|
|
renderUtf8Text(fb.bb, self.input_cur_x, self.input_start_y, self.face, self.fhash,
|
|
char, true)
|
|
fb:refresh(1, self.input_cur_x, self.input_start_y-19, self.fwidth, self.fheight)
|
|
self.input_cur_x = self.input_cur_x + self.fwidth
|
|
self.input_string = self.input_string .. char
|
|
end
|
|
|
|
function InputBox:delChar()
|
|
if self.input_start_x == self.input_cur_x then
|
|
return
|
|
end
|
|
self.input_cur_x = self.input_cur_x - self.fwidth
|
|
--fill last character with blank rectangle
|
|
fb.bb:paintRect(self.input_cur_x, self.input_start_y-19,
|
|
self.fwidth, self.fheight, self.input_bg)
|
|
fb:refresh(1, self.input_cur_x, self.input_start_y-19, self.fwidth, self.fheight)
|
|
self.input_string = self.input_string:sub(0,-2)
|
|
end
|
|
|
|
function InputBox:drawBox(ypos, w, h, title)
|
|
-- draw input border
|
|
fb.bb:paintRect(20, ypos, w, h, 5)
|
|
-- draw input slot
|
|
fb.bb:paintRect(140, ypos + 10, w - 130, h - 20, self.input_bg)
|
|
-- draw input title
|
|
renderUtf8Text(fb.bb, 35, self.input_start_y, self.face, self.fhash,
|
|
title, true)
|
|
end
|
|
|
|
|
|
--[[
|
|
|| d_text default to nil (used to set default text in input slot)
|
|
--]]
|
|
function InputBox:input(ypos, height, title, d_text)
|
|
local pagedirty = true
|
|
-- do some initilization
|
|
self.input_start_y = ypos + 35
|
|
self.input_cur_x = self.input_start_x
|
|
|
|
if d_text then -- if specified default text, draw it
|
|
w = fb.bb:getWidth() - 40
|
|
h = height - 45
|
|
self:drawBox(ypos, w, h, title)
|
|
self:setDefaultInput(d_text)
|
|
fb:refresh(1, 20, ypos, w, h)
|
|
pagedirty = false
|
|
else -- otherwise, leave the draw task to the main loop
|
|
self.input_string = ""
|
|
end
|
|
|
|
while true do
|
|
if pagedirty then
|
|
w = fb.bb:getWidth() - 40
|
|
h = height - 45
|
|
self:drawBox(ypos, w, h, title)
|
|
fb:refresh(1, 20, ypos, w, h)
|
|
pagedirty = false
|
|
end
|
|
|
|
local ev = input.waitForEvent()
|
|
if ev.type == EV_KEY and ev.value == EVENT_VALUE_KEY_PRESS then
|
|
ev.code = adjustFWKey(ev.code)
|
|
--local secs, usecs = util.gettime()
|
|
if ev.code == KEY_SHIFT then
|
|
Keys.shiftmode = true
|
|
elseif ev.code == KEY_ALT then
|
|
Keys.altmode = true
|
|
elseif ev.code == KEY_FW_UP then
|
|
elseif ev.code == KEY_FW_DOWN then
|
|
elseif ev.code == KEY_A then
|
|
self:addChar("a")
|
|
elseif ev.code == KEY_B then
|
|
self:addChar("b")
|
|
elseif ev.code == KEY_C then
|
|
self:addChar("c")
|
|
elseif ev.code == KEY_D then
|
|
self:addChar("d")
|
|
elseif ev.code == KEY_E then
|
|
self:addChar("e")
|
|
elseif ev.code == KEY_F then
|
|
self:addChar("f")
|
|
elseif ev.code == KEY_G then
|
|
self:addChar("g")
|
|
elseif ev.code == KEY_H then
|
|
self:addChar("h")
|
|
elseif ev.code == KEY_I then
|
|
self:addChar("i")
|
|
elseif ev.code == KEY_J then
|
|
self:addChar("j")
|
|
elseif ev.code == KEY_K then
|
|
self:addChar("k")
|
|
elseif ev.code == KEY_L then
|
|
self:addChar("l")
|
|
elseif ev.code == KEY_M then
|
|
self:addChar("m")
|
|
elseif ev.code == KEY_N then
|
|
self:addChar("n")
|
|
elseif ev.code == KEY_O then
|
|
self:addChar("o")
|
|
elseif ev.code == KEY_P then
|
|
self:addChar("p")
|
|
elseif ev.code == KEY_Q then
|
|
self:addChar("q")
|
|
elseif ev.code == KEY_R then
|
|
self:addChar("r")
|
|
elseif ev.code == KEY_S then
|
|
self:addChar("s")
|
|
elseif ev.code == KEY_T then
|
|
self:addChar("t")
|
|
elseif ev.code == KEY_U then
|
|
self:addChar("u")
|
|
elseif ev.code == KEY_V then
|
|
self:addChar("v")
|
|
elseif ev.code == KEY_W then
|
|
self:addChar("w")
|
|
elseif ev.code == KEY_X then
|
|
self:addChar("x")
|
|
elseif ev.code == KEY_Y then
|
|
self:addChar("y")
|
|
elseif ev.code == KEY_Z then
|
|
self:addChar("z")
|
|
elseif ev.code == KEY_1 then
|
|
self:addChar("1")
|
|
elseif ev.code == KEY_2 then
|
|
self:addChar("2")
|
|
elseif ev.code == KEY_3 then
|
|
self:addChar("3")
|
|
elseif ev.code == KEY_4 then
|
|
self:addChar("4")
|
|
elseif ev.code == KEY_5 then
|
|
self:addChar("5")
|
|
elseif ev.code == KEY_6 then
|
|
self:addChar("6")
|
|
elseif ev.code == KEY_7 then
|
|
self:addChar("7")
|
|
elseif ev.code == KEY_8 then
|
|
self:addChar("8")
|
|
elseif ev.code == KEY_9 then
|
|
self:addChar("9")
|
|
elseif ev.code == KEY_0 then
|
|
self:addChar("0")
|
|
elseif ev.code == KEY_SPACE then
|
|
self:addChar(" ")
|
|
elseif ev.code == KEY_PGFWD then
|
|
elseif ev.code == KEY_PGBCK then
|
|
elseif ev.code == KEY_ENTER or ev.code == KEY_FW_PRESS then
|
|
if self.input_string == "" then
|
|
return nil
|
|
else
|
|
return self.input_string
|
|
end
|
|
elseif ev.code == KEY_DEL then
|
|
self:delChar()
|
|
elseif ev.code == KEY_BACK then
|
|
return nil
|
|
end
|
|
|
|
--local nsecs, nusecs = util.gettime()
|
|
--local dur = (nsecs - secs) * 1000000 + nusecs - usecs
|
|
--print("E: T="..ev.type.." V="..ev.value.." C="..ev.code.." DUR="..dur)
|
|
elseif ev.type == EV_KEY and ev.value == EVENT_VALUE_KEY_RELEASE
|
|
and ev.code == KEY_SHIFT then
|
|
Keys.shiftmode = false
|
|
elseif ev.type == EV_KEY and ev.value == EVENT_VALUE_KEY_RELEASE
|
|
and ev.code == KEY_ALT then
|
|
Keys.altmode = false
|
|
end
|
|
end
|
|
end
|