mirror of
https://github.com/koreader/koreader
synced 2024-11-08 07:10:27 +00:00
b523c2e8b9
Get rid of the doc & seqtext fields, as they are not actually used (nor are they particularly useful, the event handler's name should be pretty self-explanatory). Also, tweak the key_events documentation to highlight the quirks of the API, especially as far as array nesting is involved... Random drive-by cleanup of the declarations of key_events & ges_events to re-use the existing instance object (now that we know they're sane ;p) for tables with a single member (less GC pressure).
465 lines
15 KiB
Lua
Executable File
465 lines
15 KiB
Lua
Executable File
-- widget test utility
|
|
-- usage: ./luajit tools/wtest.lua
|
|
|
|
require "defaults"
|
|
print(package.path)
|
|
package.path = "common/?.lua;rocks/share/lua/5.1/?.lua;frontend/?.lua;" .. package.path
|
|
package.cpath = "common/?.so;common/?.dll;/usr/lib/lua/?.so;rocks/lib/lua/5.1/?.so;" .. package.cpath
|
|
|
|
local DataStorage = require("datastorage")
|
|
local _ = require("gettext")
|
|
|
|
-- read settings and check for language override
|
|
-- has to be done before requiring other files because
|
|
-- they might call gettext on load
|
|
G_reader_settings = require("luasettings"):open(
|
|
DataStorage:getDataDir().."/settings.reader.lua")
|
|
local lang_locale = G_reader_settings:readSetting("language")
|
|
if lang_locale then
|
|
_.changeLang(lang_locale)
|
|
end
|
|
local Device = require("device")
|
|
local CanvasContext = require("document/canvascontext")
|
|
CanvasContext:init(Device)
|
|
local UIManager = require("ui/uimanager")
|
|
local RenderText = require("ui/rendertext")
|
|
local Font = require("ui/font")
|
|
local Geom = require("ui/geometry")
|
|
local Menu = require("ui/widget/menu")
|
|
local Widget = require("ui/widget/widget")
|
|
local TextWidget = require("ui/widget/textwidget")
|
|
local InfoMessage = require("ui/widget/infomessage")
|
|
local InputContainer = require("ui/widget/container/inputcontainer")
|
|
local CenterContainer = require("ui/widget/container/centercontainer")
|
|
local FrameContainer = require("ui/widget/container/framecontainer")
|
|
local AlphaContainer = require("ui/widget/container/alphacontainer")
|
|
local ConfirmBox = require("ui/widget/confirmbox")
|
|
local TouchMenu = require("ui/widget/touchmenu")
|
|
local DocumentRegistry = require("document/documentregistry")
|
|
local ReaderUI = require("apps/reader/readerui")
|
|
local DEBUG = require("dbg")
|
|
local Screen = require("device").screen
|
|
local Blitbuffer = require("ffi/blitbuffer")
|
|
local InputText = require("ui/widget/inputtext")
|
|
|
|
DEBUG:turnOn()
|
|
|
|
-----------------------------------------------------
|
|
-- widget that paints the grid on the background
|
|
-----------------------------------------------------
|
|
TestGrid = Widget:new{}
|
|
TestVisible = Widget:new{}
|
|
|
|
function TestGrid:paintTo(bb)
|
|
v_line = math.floor(bb:getWidth() / 50)
|
|
h_line = math.floor(bb:getHeight() / 50)
|
|
for i=1,h_line do
|
|
y_num = i*50
|
|
RenderText:renderUtf8Text(bb, 0, y_num+10, Font:getFace("ffont", 12), y_num, true)
|
|
bb:paintRect(0, y_num, bb:getWidth(), 1, Blitbuffer.gray(0.7))
|
|
end
|
|
for i=1,v_line do
|
|
x_num = i*50
|
|
RenderText:renderUtf8Text(bb, x_num, 10, Font:getFace("ffont", 12), x_num, true)
|
|
bb:paintRect(x_num, 0, 1, bb:getHeight(), Blitbuffer.gray(0.7))
|
|
end
|
|
end
|
|
|
|
function TestVisible:paintTo(bb)
|
|
-- Draw three lines at the borders to assess what the maximum visible coordinates are
|
|
v_line = math.floor(bb:getWidth() / 50)
|
|
h_line = math.floor(bb:getHeight() / 50)
|
|
-- Paint white background for higher contrast
|
|
bb:paintRect(0,0,bb:getWidth(),bb:getHeight(), Blitbuffer.COLOR_WHITE)
|
|
-- Only render gridtext not lines at a more central postition, so it doesn't interfere with the
|
|
for i=1,h_line do
|
|
y_num = i*50
|
|
RenderText:renderUtf8Text(bb, 40, y_num+10, Font:getFace("ffont", 12), y_num, true)
|
|
end
|
|
for i=1,v_line do
|
|
x_num = i*50
|
|
RenderText:renderUtf8Text(bb, x_num, 40, Font:getFace("ffont", 12), x_num, true)
|
|
end
|
|
|
|
-- Handtunable minimal and maximal visible coordinates
|
|
local x_min = 0 + 4
|
|
local x_max = bb:getWidth() - 4
|
|
local y_min = 0 + 3
|
|
local y_max = bb:getHeight() - 3 - 12
|
|
|
|
-- Render extremes on screen
|
|
RenderText:renderUtf8Text(bb, 150, 100, Font:getFace("ffont", 22), "x_min = "..x_min, true)
|
|
RenderText:renderUtf8Text(bb, 500, 100, Font:getFace("ffont", 22), "x_max = "..x_max, true)
|
|
RenderText:renderUtf8Text(bb, 100, 150, Font:getFace("ffont", 22), "y_min = "..y_min, true)
|
|
RenderText:renderUtf8Text(bb, 100, 300, Font:getFace("ffont", 22), "y_max = "..y_max, true)
|
|
RenderText:renderUtf8Text(bb, 100, 500, Font:getFace("ffont", 26), "Visible screen size : "..(x_max-x_min).."x"..(y_max-y_min), true)
|
|
|
|
-- Three parallel lines at the top
|
|
bb:paintRect(x_min,y_min, x_max, 1 , Blitbuffer.gray(0.7))
|
|
bb:paintRect(x_min,y_min + 3, x_max, 1 , Blitbuffer.gray(0.7))
|
|
bb:paintRect(x_min,y_min + 6, x_max, 1 , Blitbuffer.gray(0.7))
|
|
|
|
-- Three parallel lines at the bottom
|
|
bb:paintRect(x_min,y_max, x_max, 1 , Blitbuffer.gray(0.7))
|
|
bb:paintRect(x_min,y_max - 3, x_max, 1 , Blitbuffer.gray(0.7))
|
|
bb:paintRect(x_min,y_max - 6, x_max, 1 , Blitbuffer.gray(0.7))
|
|
|
|
-- Three parallel lines at the left
|
|
bb:paintRect(x_min,y_min, 1, y_max , Blitbuffer.gray(0.7))
|
|
bb:paintRect(x_min + 3,y_min, 1, y_max, Blitbuffer.gray(0.7))
|
|
bb:paintRect(x_min + 6,y_min, 1, y_max, Blitbuffer.gray(0.7))
|
|
|
|
-- Three parallel lines at the right
|
|
bb:paintRect(x_max,y_min, 1, y_max , Blitbuffer.gray(0.7))
|
|
bb:paintRect(x_max - 3,y_min, 1, y_max, Blitbuffer.gray(0.7))
|
|
bb:paintRect(x_max - 6,y_min, 1, y_max, Blitbuffer.gray(0.7))
|
|
|
|
--Two lines spaces 600 pixels
|
|
bb:paintRect(100,600, 1, 250 , Blitbuffer.gray(0.7))
|
|
bb:paintRect(700,600, 1, 250 , Blitbuffer.gray(0.7))
|
|
RenderText:renderUtf8Text(bb, 150, 670, Font:getFace("ffont", 26), "Measure inches per 600 pixels", true)
|
|
RenderText:renderUtf8Text(bb, 150, 770, Font:getFace("ffont", 22), "Kobo Aura: 600 pixels/ 2.82 \" = "..(600/2.82).." dpi", true)
|
|
end
|
|
|
|
-----------------------------------------------------
|
|
-- we create a widget that paints a background:
|
|
-----------------------------------------------------
|
|
Background = InputContainer:new{
|
|
is_always_active = true, -- receive events when other dialogs are active
|
|
key_events = {
|
|
OpenDialog = { { "Press" } },
|
|
OpenConfirmBox = { { "Del" } },
|
|
QuitApplication = { { { "Home", "Back" } } },
|
|
},
|
|
-- contains a gray rectangular desktop
|
|
FrameContainer:new{
|
|
background = Blitbuffer.COLOR_DARK_GRAY,
|
|
bordersize = 0,
|
|
dimen = Screen:getSize(),
|
|
Widget:new{
|
|
dimen = {
|
|
w = Screen:getWidth(),
|
|
h = Screen:getHeight(),
|
|
}
|
|
},
|
|
}
|
|
}
|
|
|
|
function Background:onOpenDialog()
|
|
UIManager:show(InfoMessage:new{
|
|
text = "Example message.",
|
|
timeout = 10
|
|
})
|
|
end
|
|
|
|
function Background:onOpenConfirmBox()
|
|
UIManager:show(ConfirmBox:new{
|
|
text = "Please confirm delete"
|
|
})
|
|
end
|
|
|
|
function Background:onInputError()
|
|
UIManager:quit()
|
|
end
|
|
|
|
function Background:onQuitApplication()
|
|
UIManager:quit()
|
|
end
|
|
|
|
-----------------------------------------------------
|
|
-- example widget: a clock
|
|
-----------------------------------------------------
|
|
Clock = AlphaContainer:new{
|
|
alpha = 0.7,
|
|
|
|
FrameContainer:new{
|
|
background = Blitbuffer.COLOR_WHITE,
|
|
bordersize = Screen:scaleBySize(1),
|
|
margin = 0,
|
|
padding = Screen:scaleBySize(1),
|
|
}
|
|
}
|
|
|
|
function Clock:schedFunc()
|
|
self[1][1]:free()
|
|
self[1][1] = self:getTextWidget()
|
|
UIManager:setDirty(self)
|
|
-- TODO: wait until next real second shift
|
|
UIManager:scheduleIn(1, function() self:schedFunc() end)
|
|
end
|
|
|
|
function Clock:onShow()
|
|
self[1][1] = self:getTextWidget()
|
|
self:schedFunc()
|
|
end
|
|
|
|
function Clock:getTextWidget()
|
|
return CenterContainer:new{
|
|
dimen = { w = 300, h = 25 },
|
|
TextWidget:new{
|
|
text = os.date("%H:%M:%S"),
|
|
face = Font:getFace("cfont", 12)
|
|
}
|
|
}
|
|
end
|
|
|
|
-----------------------------------------------------
|
|
-- a confirmbox box widget
|
|
-----------------------------------------------------
|
|
Quiz = ConfirmBox:new{
|
|
text = "Tell me the truth, isn't it COOL?!",
|
|
width = Screen:scaleBySize(300),
|
|
ok_text = "Yes, of course.",
|
|
cancel_text = "No, it's ugly.",
|
|
cancel_callback = function()
|
|
UIManager:show(InfoMessage:new{
|
|
text="You liar!",
|
|
})
|
|
end,
|
|
}
|
|
|
|
-----------------------------------------------------
|
|
-- a menu widget
|
|
-----------------------------------------------------
|
|
menu_items = {
|
|
{text = "item1"},
|
|
{text = "item2"},
|
|
{text = "This is a very very log item whose length should exceed the width of the menu."},
|
|
{text = "item3"},
|
|
{text = "item4"},
|
|
{text = "item5"},
|
|
{text = "item6"},
|
|
{text = "item7"},
|
|
{text = "item8"},
|
|
{text = "item9"},
|
|
{text = "item10"},
|
|
{text = "item11"},
|
|
{text = "item12"},
|
|
{text = "item13"},
|
|
{text = "item14"},
|
|
{text = "item15"},
|
|
{text = "item16"},
|
|
{text = "item17"},
|
|
}
|
|
M = Menu:new{
|
|
title = "Test Menu",
|
|
item_table = menu_items,
|
|
width = Screen:scaleBySize(500),
|
|
height = Screen:scaleBySize(600),
|
|
}
|
|
|
|
-----------------------------------------------------
|
|
-- a reader view widget
|
|
-----------------------------------------------------
|
|
readerwindow = CenterContainer:new{
|
|
dimen = Screen:getSize(),
|
|
FrameContainer:new{
|
|
background = Blitbuffer.COLOR_BLACK,
|
|
}
|
|
}
|
|
reader = ReaderUI:new{
|
|
dialog = readerwindow,
|
|
dimen = Geom:new{ w = Screen:getWidth() - 100, h = Screen:getHeight() - 100 },
|
|
document = DocumentRegistry:openDocument("spec/front/unit/data/2col.pdf")
|
|
--document = DocumentRegistry:openDocument("spec/front/unit/data/djvu3spec.djvu")
|
|
}
|
|
readerwindow[1][1] = reader
|
|
|
|
|
|
touch_menu = TouchMenu:new{
|
|
title = "Document menu",
|
|
width = Screen:getWidth(),
|
|
tab_item_table = {
|
|
{
|
|
icon = "appbar.pokeball",
|
|
{
|
|
text = "item1",
|
|
callback = function() end,
|
|
},
|
|
{
|
|
text = "item2",
|
|
callback = function() end,
|
|
},
|
|
{
|
|
text = "item3",
|
|
callback = function() end,
|
|
},
|
|
{
|
|
text = "item4",
|
|
callback = function() end,
|
|
},
|
|
{
|
|
text = "item5",
|
|
callback = function() end,
|
|
},
|
|
{
|
|
text = "item6",
|
|
callback = function() end,
|
|
},
|
|
{
|
|
text = "item7",
|
|
callback = function() end,
|
|
},
|
|
{
|
|
text = "item8",
|
|
callback = function() end,
|
|
},
|
|
{
|
|
text = "item9",
|
|
callback = function() end,
|
|
},
|
|
},
|
|
{
|
|
icon = "appbar.page.corner.bookmark",
|
|
{
|
|
text = "item10",
|
|
callback = function() end,
|
|
},
|
|
{
|
|
text = "item11",
|
|
callback = function() end,
|
|
},
|
|
},
|
|
{
|
|
icon = "home",
|
|
callback = function() DEBUG("hello world!") end
|
|
}
|
|
},
|
|
}
|
|
|
|
-----------------------------------------------------
|
|
-- input box widget
|
|
-----------------------------------------------------
|
|
local TestInputText = InputText:new{
|
|
width = Screen:scaleBySize(400),
|
|
enter_callback = function() print("Entered") end,
|
|
scroll = false,
|
|
input_type = "number",
|
|
parent = {
|
|
onSwitchFocus = false,
|
|
},
|
|
}
|
|
|
|
-----------------------------------------------------
|
|
-- key value page
|
|
-----------------------------------------------------
|
|
function testKeyValuePage()
|
|
local KeyValuePage = require("ui/widget/keyvaluepage")
|
|
local kvp = KeyValuePage:new{
|
|
title = 'Statistics This is a very very log item whose length should exceed the width of the men',
|
|
kv_pairs = {
|
|
{"1 Current period", "00:00:00"},
|
|
{"This is a very very log item whose length should exceed the width of the menu.", "value"},
|
|
{"2 Time to read", "00:00:00 00:00:00 00:00:00 00:00:00"},
|
|
{"2 Time to read", "00:00:00"},
|
|
{"3 Time to read", "00:00:00"},
|
|
{"4 Time to read", "00:00:00"},
|
|
{"5 Time to read", "00:00:00"},
|
|
{"6 Time to read", "00:00:00"},
|
|
{"7 Time to read", "00:00:00"},
|
|
{"8 Time to read", "00:00:00"},
|
|
{"9 Time to read", "00:00:00"},
|
|
{"10 Time to read", "00:00:00"},
|
|
{"11 Time to read", "00:00:00"},
|
|
"----------------------------",
|
|
{"12 Time to read", "00:00:00"},
|
|
{"13 Time to read", "00:00:00"},
|
|
{"14 Time to read", "00:00:00"},
|
|
{"15 Time to read", "00:00:00"},
|
|
{"16 Time to read", "00:00:00"},
|
|
{"17 Time to read", "00:00:00"},
|
|
{"18 Time to read", "00:00:00"},
|
|
{"19 Time to read", "00:00:00"},
|
|
{"20 Time to read", "00:00:00"},
|
|
{"21 Time to read", "00:00:00"},
|
|
},
|
|
}
|
|
UIManager:show(kvp)
|
|
end
|
|
|
|
function testBookStatus()
|
|
-- doc = DocumentRegistry:openDocument("spec/front/unit/data/juliet.epub")
|
|
doc = DocumentRegistry:openDocument("spec/front/unit/data/2col.pdf")
|
|
reader = ReaderUI:new{
|
|
dialog = readerwindow,
|
|
dimen = Geom:new{ w = Screen:getWidth() - 100, h = Screen:getHeight() - 100 },
|
|
document = doc
|
|
}
|
|
|
|
local status_page = require("ui/widget/bookstatuswidget"):new {
|
|
thumbnail = doc:getCoverPageImage(),
|
|
props = doc:getProps(),
|
|
document = doc,
|
|
ui = reader,
|
|
}
|
|
UIManager:show(status_page)
|
|
end
|
|
|
|
function testTouchProbe()
|
|
local TouchProbe = require("tools/kobo_touch_probe")
|
|
UIManager:show(TouchProbe:new{})
|
|
end
|
|
|
|
function testNetworkSetting()
|
|
local list = {
|
|
{
|
|
ssid = "CMU-SECURE",
|
|
signal_level = -58,
|
|
flags = "[WPA2-PSK-CCMP][ESS]",
|
|
signal_quality = 84,
|
|
},
|
|
{
|
|
ssid = "CMU-SECURE 2",
|
|
signal_level = -258,
|
|
signal_quality = 44,
|
|
flags = "[WPA2-PSK-CCMP][ESS]",
|
|
password = "okgo",
|
|
},
|
|
{
|
|
ssid = "218",
|
|
signal_level = 58,
|
|
signal_quality = 100,
|
|
flags = "[WEP][ESS]",
|
|
},
|
|
{
|
|
ssid = "318",
|
|
signal_level = 100,
|
|
signal_quality = 100,
|
|
flags = "[WPA2-PSK-CCMP][ESS]",
|
|
},
|
|
}
|
|
|
|
for i=1,10 do
|
|
table.insert(list, {
|
|
ssid = "918-"..tostring(i),
|
|
signal_level = -58-i*2,
|
|
signal_quality = 84-i*2,
|
|
flags = "[WPA2-PSK-CCMP][ESS]",
|
|
})
|
|
end
|
|
|
|
local nw = require("ui/widget/networksetting"):new{network_list = list}
|
|
UIManager:show(nw)
|
|
end
|
|
|
|
|
|
-----------------------------------------------------------------------
|
|
-- you may want to uncomment following show calls to see the changes
|
|
-----------------------------------------------------------------------
|
|
--UIManager:show(Background:new())
|
|
--UIManager:show(TestGrid)
|
|
UIManager:show(TestVisible)
|
|
UIManager:show(Clock:new())
|
|
-- UIManager:show(M)
|
|
--UIManager:show(Quiz)
|
|
--UIManager:show(readerwindow)
|
|
--UIManager:show(touch_menu)
|
|
--UIManager:show(keyboard)
|
|
--UIManager:show(TestInputText)
|
|
--TestInputText:onShowKeyboard()
|
|
-- testKeyValuePage()
|
|
-- testTouchProbe()
|
|
-- testBookStatus()
|
|
testNetworkSetting()
|
|
UIManager:run()
|