2012-03-13 21:51:25 +00:00
|
|
|
require "rendertext"
|
|
|
|
require "keys"
|
|
|
|
require "graphics"
|
|
|
|
require "font"
|
|
|
|
require "inputbox"
|
|
|
|
require "selectmenu"
|
|
|
|
require "commands"
|
|
|
|
|
|
|
|
HelpPage = {
|
2012-03-20 19:15:24 +00:00
|
|
|
-- Other Class vars:
|
2012-03-13 21:51:25 +00:00
|
|
|
|
2012-05-19 10:59:38 +00:00
|
|
|
-- title height
|
|
|
|
title_H = 40,
|
|
|
|
-- horisontal margin
|
|
|
|
margin_H = 10,
|
|
|
|
-- foot height
|
|
|
|
foot_H = 28,
|
|
|
|
-- background color
|
|
|
|
bg_color = 4,
|
2012-03-13 21:51:25 +00:00
|
|
|
-- spacing between lines
|
|
|
|
spacing = 25,
|
|
|
|
|
|
|
|
-- state buffer
|
|
|
|
commands = nil,
|
|
|
|
items = 0,
|
2012-04-09 17:04:26 +00:00
|
|
|
page = 1,
|
|
|
|
|
|
|
|
-- font for displaying keys
|
|
|
|
fsize = 20,
|
|
|
|
face = Font:getFace("hpkfont", 20),
|
|
|
|
|
|
|
|
-- font for displaying help messages
|
|
|
|
hfsize = 20,
|
|
|
|
hface = Font:getFace("hfont", 20),
|
|
|
|
|
|
|
|
-- font for paging display
|
|
|
|
ffsize = 15,
|
|
|
|
fface = Font:getFace("pgfont", 15)
|
2012-03-13 21:51:25 +00:00
|
|
|
}
|
|
|
|
|
2012-03-20 19:15:24 +00:00
|
|
|
-- Other Class vars:
|
|
|
|
|
|
|
|
|
2012-04-09 07:42:19 +00:00
|
|
|
function HelpPage:show(ypos, height, commands)
|
2012-03-13 21:51:25 +00:00
|
|
|
self.commands = {}
|
|
|
|
self.items = 0
|
|
|
|
local keys = {}
|
|
|
|
for k,v in pairs(commands.map) do
|
|
|
|
local key = v.keygroup or v.keydef:display()
|
2012-04-18 16:16:49 +00:00
|
|
|
--debug("order: "..v.order.." command: "..tostring(v.keydef).." - keygroup:"..(v.keygroup or "nil").." -keys[key]:"..(keys[key] or "nil"))
|
2012-03-13 21:51:25 +00:00
|
|
|
if keys[key] == nil then
|
|
|
|
keys[key] = 1
|
|
|
|
table.insert(self.commands,{shortcut=key,help=v.help,order=v.order})
|
|
|
|
self.items = self.items + 1
|
|
|
|
end
|
|
|
|
end
|
|
|
|
table.sort(self.commands,function(w1,w2) return w1.order<w2.order end)
|
2012-03-20 22:28:49 +00:00
|
|
|
|
2012-04-16 18:16:31 +00:00
|
|
|
local face_height, face_ascender = self.face.ftface:getHeightAndAscender()
|
|
|
|
--local hface_height, hface_ascender = self.hface.ftface:getHeightAndAscender()
|
|
|
|
local fface_height, fface_ascender = self.fface.ftface:getHeightAndAscender()
|
2012-04-18 16:16:49 +00:00
|
|
|
--debug(face_height.."-"..face_ascender)
|
|
|
|
--debug(fface_height.."-"..fface_ascender)
|
2012-04-16 18:16:31 +00:00
|
|
|
face_height = math.ceil(face_height)
|
|
|
|
face_ascender = math.ceil(face_ascender)
|
|
|
|
fface_height = math.ceil(fface_height)
|
|
|
|
fface_ascender = math.ceil(fface_ascender)
|
|
|
|
local spacing = face_height + 5
|
2012-05-19 10:59:38 +00:00
|
|
|
local vert_S = self.title_H + 12
|
2012-03-20 22:28:49 +00:00
|
|
|
|
2012-05-19 10:59:38 +00:00
|
|
|
local perpage = math.floor( (height - ypos - 1 * (fface_height + 5) - vert_S) / spacing )
|
2012-06-03 13:03:55 +00:00
|
|
|
self.page = 1
|
2012-04-16 18:16:31 +00:00
|
|
|
local is_pagedirty = true
|
2012-03-13 21:51:25 +00:00
|
|
|
|
|
|
|
while true do
|
2012-04-16 18:16:31 +00:00
|
|
|
if is_pagedirty then
|
2012-04-15 14:07:39 +00:00
|
|
|
fb.bb:paintRect(0, ypos, fb.bb:getWidth(), height, 0)
|
2012-05-19 10:59:38 +00:00
|
|
|
-- draw header
|
|
|
|
DrawTitle("Active Hotkeys",self.margin_H,0,self.title_H,self.bg_color,Font:getFace("tfont", 25))
|
2012-03-13 21:51:25 +00:00
|
|
|
local c
|
|
|
|
local max_x = 0
|
|
|
|
for c = 1, perpage do
|
2012-05-19 10:59:38 +00:00
|
|
|
local x = self.margin_H
|
2012-03-13 21:51:25 +00:00
|
|
|
local i = (self.page - 1) * perpage + c
|
|
|
|
if i <= self.items then
|
2012-04-15 14:07:39 +00:00
|
|
|
local key = self.commands[i].shortcut
|
|
|
|
for _k,aMod in pairs(MOD_TABLE) do
|
|
|
|
local modStart, modEnd = key:find(aMod.v)
|
2012-04-18 16:16:49 +00:00
|
|
|
debug("key:"..key.." v:"..aMod.v.." d:"..aMod.d.." modstart:"..(modStart or "nil"))
|
2012-04-15 14:07:39 +00:00
|
|
|
if(modStart ~= nil) then
|
|
|
|
key = key:sub(1,modStart-1)..key:sub(modEnd+1)
|
2012-04-15 22:08:19 +00:00
|
|
|
local box = sizeUtf8Text( x, fb.bb:getWidth(), self.face, aMod.d, true)
|
2012-05-19 10:59:38 +00:00
|
|
|
fb.bb:paintRect(x, ypos + spacing*c - box.y_top + vert_S, box.x + self.title_H, box.y_top + box.y_bottom, self.bg_color)
|
|
|
|
local pen_x = renderUtf8Text(fb.bb, x, ypos + spacing*c + vert_S, self.face, aMod.d.." + ", true)
|
2012-04-15 14:07:39 +00:00
|
|
|
x = x + pen_x
|
|
|
|
max_x = math.max(max_x, pen_x)
|
|
|
|
end
|
|
|
|
end
|
2012-04-18 16:16:49 +00:00
|
|
|
debug("key:"..key)
|
2012-04-15 22:08:19 +00:00
|
|
|
local box = sizeUtf8Text( x, fb.bb:getWidth(), self.face, key , true)
|
2012-05-19 10:59:38 +00:00
|
|
|
fb.bb:paintRect(x, ypos + spacing*c - box.y_top + vert_S, box.x, box.y_top + box.y_bottom, self.bg_color)
|
|
|
|
local pen_x = renderUtf8Text(fb.bb, x, ypos + spacing*c + vert_S, self.face, key, true)
|
2012-04-15 14:07:39 +00:00
|
|
|
x = x + pen_x
|
|
|
|
max_x = math.max(max_x, x)
|
2012-03-13 21:51:25 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
for c = 1, perpage do
|
|
|
|
local i = (self.page - 1) * perpage + c
|
|
|
|
if i <= self.items then
|
2012-05-19 10:59:38 +00:00
|
|
|
renderUtf8Text(fb.bb, max_x + 20, ypos + spacing*c + vert_S, self.hface, self.commands[i].help, true)
|
2012-03-13 21:51:25 +00:00
|
|
|
end
|
2012-03-20 19:15:24 +00:00
|
|
|
end
|
2012-05-19 10:59:38 +00:00
|
|
|
-- draw footer
|
|
|
|
local footer = "Page "..self.page.." of "..math.ceil(self.items / perpage).." - Back to close this page"
|
|
|
|
-- DrawFooter(footer,Font:getFace("ffont", 16),self.foot_H) --
|
|
|
|
renderUtf8Text(fb.bb, self.margin_H, height-7, self.fface, footer, true)
|
2012-03-13 21:51:25 +00:00
|
|
|
end
|
2012-04-16 18:16:31 +00:00
|
|
|
if is_pagedirty then
|
2012-03-13 21:51:25 +00:00
|
|
|
fb:refresh(0, 0, ypos, fb.bb:getWidth(), height)
|
2012-04-16 18:16:31 +00:00
|
|
|
is_pagedirty = false
|
2012-03-13 21:51:25 +00:00
|
|
|
end
|
|
|
|
|
2012-04-12 19:00:44 +00:00
|
|
|
local ev = input.saveWaitForEvent()
|
2012-04-18 16:16:49 +00:00
|
|
|
--debug("key code:"..ev.code)
|
2012-03-13 21:51:25 +00:00
|
|
|
ev.code = adjustKeyEvents(ev)
|
|
|
|
if ev.type == EV_KEY and ev.value == EVENT_VALUE_KEY_PRESS then
|
2012-04-20 02:04:31 +00:00
|
|
|
if ev.code == KEY_PGFWD or ev.code == KEY_LPGFWD then
|
2012-03-13 21:51:25 +00:00
|
|
|
if self.page < (self.items / perpage) then
|
|
|
|
self.page = self.page + 1
|
2012-04-16 18:16:31 +00:00
|
|
|
is_pagedirty = true
|
2012-03-13 21:51:25 +00:00
|
|
|
end
|
2012-04-20 02:04:31 +00:00
|
|
|
elseif ev.code == KEY_PGBCK or ev.code == KEY_LPGBCK then
|
2012-03-13 21:51:25 +00:00
|
|
|
if self.page > 1 then
|
|
|
|
self.page = self.page - 1
|
2012-04-16 18:16:31 +00:00
|
|
|
is_pagedirty = true
|
2012-03-13 21:51:25 +00:00
|
|
|
end
|
|
|
|
elseif ev.code == KEY_BACK or ev.code == KEY_HOME then
|
|
|
|
return nil
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|