From 8c880b8f90bc2ed68f099a14b8ce45cdc8693e3e Mon Sep 17 00:00:00 2001 From: Qingping Hou Date: Wed, 15 Feb 2012 17:39:30 +0800 Subject: [PATCH 1/6] mod: add kpdfview in gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 687f5c489..100e46616 100644 --- a/.gitignore +++ b/.gitignore @@ -5,5 +5,6 @@ lsqlite3* sqlite-amalgamation* mupdf/ luafilesystem/ +kpdfview From 4b93d2c71b5745f38c9e8548b7ede9b540fa2a9a Mon Sep 17 00:00:00 2001 From: Qingping Hou Date: Thu, 16 Feb 2012 15:18:28 +0800 Subject: [PATCH 2/6] add: F key code in EMU mode --- keys.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/keys.lua b/keys.lua index bd56f53b4..b757dd5b0 100644 --- a/keys.lua +++ b/keys.lua @@ -121,6 +121,7 @@ function set_emu_keycodes() KEY_A = 38 KEY_S = 39 KEY_D = 40 + KEY_F = 41 KEY_J = 44 KEY_K = 45 From 9cf646b2a6ed65f92f6ff346be01ccc434845210 Mon Sep 17 00:00:00 2001 From: Qingping Hou Date: Thu, 16 Feb 2012 15:19:56 +0800 Subject: [PATCH 3/6] add: fontchooser --- filechooser.lua | 13 ++++- fontchooser.lua | 135 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 146 insertions(+), 2 deletions(-) create mode 100644 fontchooser.lua diff --git a/filechooser.lua b/filechooser.lua index 52532c768..ae5104c82 100644 --- a/filechooser.lua +++ b/filechooser.lua @@ -1,6 +1,7 @@ require "rendertext" require "keys" require "graphics" +require "fontchooser" FileChooser = { -- Class vars: @@ -83,7 +84,7 @@ function FileChooser:choose(ypos, height) local pagedirty = true local markerdirty = false - prevItem = function () + local prevItem = function () if self.current == 1 then if self.page > 1 then self.current = perpage @@ -96,7 +97,7 @@ function FileChooser:choose(ypos, height) end end - nextItem = function () + local nextItem = function () if self.current == perpage then if self.page < (self.items / perpage) then self.current = 1 @@ -174,6 +175,14 @@ function FileChooser:choose(ypos, height) elseif self:rotationMode() == 3 then prevItem() end + elseif ev.code == KEY_F then + FontChooser:init() + newfont = FontChooser:choose(0, height) + if newfont ~= nil then + self.face = freetype.newBuiltinFace(newfont, 25) + clearglyphcache() + end + pagedirty = true elseif ev.code == KEY_PGFWD then if self.page < (self.items / perpage) then if self.current + self.page*perpage > self.items then diff --git a/fontchooser.lua b/fontchooser.lua new file mode 100644 index 000000000..327e09791 --- /dev/null +++ b/fontchooser.lua @@ -0,0 +1,135 @@ +require "rendertext" +require "keys" +require "graphics" + +FontChooser = { + -- font for displaying file/dir names + face = freetype.newBuiltinFace("sans", 25), + fhash = "s25", + -- font for page title + tface = freetype.newBuiltinFace("Helvetica-BoldOblique", 32), + tfhash = "hbo32", + -- font for paging display + sface = freetype.newBuiltinFace("sans", 16), + sfhash = "s16", + -- spacing between lines + spacing = 40, + + -- state buffer + fonts = {"sans", "cjk", "mono", + "Courier", "Courier-Bold", "Courier-Oblique", "Courier-BoldOblique", + "Helvetica", "Helvetica-Oblique", "Helvetica-BoldOblique", + "Times-Roman", "Times-Bold", "Times-Italic", "Times-BoldItalic",}, + items = 14, + page = 1, + current = 2, + oldcurrent = 1, +} + +function FontChooser:init() + self.items = #self.fonts + table.sort(self.fonts) +end + + +function FontChooser:choose(ypos, height) + local perpage = math.floor(height / self.spacing) - 1 + local pagedirty = true + local markerdirty = false + + local prevItem = function () + if self.current == 2 then + if self.page > 1 then + self.current = perpage + self.page = self.page - 1 + pagedirty = true + end + else + self.current = self.current - 1 + markerdirty = true + end + end + + local nextItem = function () + if self.current == perpage then + if self.page < (self.items / perpage) then + self.current = 1 + self.page = self.page + 1 + pagedirty = true + end + else + if self.page ~= math.floor(self.items / perpage) + 1 + or self.current + (self.page-1)*perpage < self.items then + self.current = self.current + 1 + markerdirty = true + end + end + end + + while true do + if pagedirty then + fb.bb:paintRect(0, ypos, fb.bb:getWidth(), height, 0) + renderUtf8Text(fb.bb, 30, ypos + self.spacing, self.tface, self.tfhash, "[ Fonts Menu ]", true) + local c + for c = 2, perpage do + local i = (self.page - 1) * perpage + c + if i <= self.items then + renderUtf8Text(fb.bb, 50, ypos + self.spacing*c, self.face, self.fhash, self.fonts[i], true) + end + end + renderUtf8Text(fb.bb, 39, ypos + self.spacing * perpage + 32, self.sface, self.sfhash, + "Page "..self.page.." of "..(math.floor(self.items / perpage)+1), true) + markerdirty = true + end + if markerdirty then + if not pagedirty then + if self.oldcurrent > 0 then + fb.bb:paintRect(30, ypos + self.spacing*self.oldcurrent + 10, fb.bb:getWidth() - 60, 3, 0) + fb:refresh(1, 30, ypos + self.spacing*self.oldcurrent + 10, fb.bb:getWidth() - 60, 3) + end + end + fb.bb:paintRect(30, ypos + self.spacing*self.current + 10, fb.bb:getWidth() - 60, 3, 15) + if not pagedirty then + fb:refresh(1, 30, ypos + self.spacing*self.current + 10, fb.bb:getWidth() - 60, 3) + end + self.oldcurrent = self.current + markerdirty = false + end + if pagedirty then + fb:refresh(0, 0, ypos, fb.bb:getWidth(), height) + pagedirty = false + end + local ev = input.waitForEvent() + if ev.type == EV_KEY and ev.value == EVENT_VALUE_KEY_PRESS then + if ev.code == KEY_FW_UP then + prevItem() + elseif ev.code == KEY_FW_DOWN then + nextItem() + elseif ev.code == KEY_PGFWD then + if self.page < (self.items / perpage) then + if self.current + self.page*perpage > self.items then + self.current = self.items - self.page*perpage + end + self.page = self.page + 1 + pagedirty = true + else + self.current = self.items - (self.page-1)*perpage + markerdirty = true + end + elseif ev.code == KEY_PGBCK then + if self.page > 1 then + self.page = self.page - 1 + pagedirty = true + else + self.current = 2 + markerdirty = true + end + elseif ev.code == KEY_ENTER or ev.code == KEY_FW_PRESS then + local newface = self.fonts[perpage*(self.page-1)+self.current] + return newface + elseif ev.code == KEY_BACK then + return nil + end + end + end +end From 8412532479f60ad6987f8a98dc6f0847bb17feaa Mon Sep 17 00:00:00 2001 From: Qingping Hou Date: Thu, 16 Feb 2012 19:25:01 +0800 Subject: [PATCH 4/6] fix: adjust perpage item according to title height --- fontchooser.lua | 39 ++++++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/fontchooser.lua b/fontchooser.lua index 327e09791..0c8af5132 100644 --- a/fontchooser.lua +++ b/fontchooser.lua @@ -12,8 +12,12 @@ FontChooser = { -- font for paging display sface = freetype.newBuiltinFace("sans", 16), sfhash = "s16", + -- title height + title_H = 45, -- spacing between lines spacing = 40, + -- foot height + foot_H = 27, -- state buffer fonts = {"sans", "cjk", "mono", @@ -33,12 +37,12 @@ end function FontChooser:choose(ypos, height) - local perpage = math.floor(height / self.spacing) - 1 + local perpage = math.floor(height / self.spacing) - 2 local pagedirty = true local markerdirty = false local prevItem = function () - if self.current == 2 then + if self.current == 1 then if self.page > 1 then self.current = perpage self.page = self.page - 1 @@ -66,39 +70,52 @@ function FontChooser:choose(ypos, height) end end + -- draw menu title + fb.bb:paintRect(0, ypos, fb.bb:getWidth(), height, 0) + renderUtf8Text(fb.bb, 30, ypos + self.spacing, self.tface, self.tfhash, "[ Fonts Menu ]", true) + fb:refresh(0, 0, ypos, fb.bb:getWidth(), self.title_H) + while true do if pagedirty then fb.bb:paintRect(0, ypos, fb.bb:getWidth(), height, 0) - renderUtf8Text(fb.bb, 30, ypos + self.spacing, self.tface, self.tfhash, "[ Fonts Menu ]", true) + --renderUtf8Text(fb.bb, 30, ypos + self.spacing, self.tface, self.tfhash, "[ Fonts Menu ]", true) local c - for c = 2, perpage do + for c = 1, perpage do local i = (self.page - 1) * perpage + c if i <= self.items then - renderUtf8Text(fb.bb, 50, ypos + self.spacing*c, self.face, self.fhash, self.fonts[i], true) + y = ypos + self.title_H + (self.spacing * c) + renderUtf8Text(fb.bb, 50, y, self.face, self.fhash, self.fonts[i], true) end end - renderUtf8Text(fb.bb, 39, ypos + self.spacing * perpage + 32, self.sface, self.sfhash, + y = ypos + self.title_H + (self.spacing * perpage) + self.foot_H + x = (fb.bb:getWidth() / 2) - 50 + renderUtf8Text(fb.bb, x, y, self.sface, self.sfhash, "Page "..self.page.." of "..(math.floor(self.items / perpage)+1), true) markerdirty = true end + if markerdirty then if not pagedirty then if self.oldcurrent > 0 then - fb.bb:paintRect(30, ypos + self.spacing*self.oldcurrent + 10, fb.bb:getWidth() - 60, 3, 0) - fb:refresh(1, 30, ypos + self.spacing*self.oldcurrent + 10, fb.bb:getWidth() - 60, 3) + y = ypos + self.title_H + (self.spacing * self.oldcurrent) + 10 + fb.bb:paintRect(30, y, fb.bb:getWidth() - 60, 3, 0) + fb:refresh(1, 30, y, fb.bb:getWidth() - 60, 3) end end - fb.bb:paintRect(30, ypos + self.spacing*self.current + 10, fb.bb:getWidth() - 60, 3, 15) + y = ypos + self.title_H + (self.spacing * self.current) + 10 + fb.bb:paintRect(30, y, fb.bb:getWidth() - 60, 3, 15) if not pagedirty then - fb:refresh(1, 30, ypos + self.spacing*self.current + 10, fb.bb:getWidth() - 60, 3) + fb:refresh(1, 30, y, fb.bb:getWidth() - 60, 3) end self.oldcurrent = self.current markerdirty = false end + if pagedirty then - fb:refresh(0, 0, ypos, fb.bb:getWidth(), height) + fb:refresh(0, 0, ypos + self.title_H, fb.bb:getWidth(), height - self.title_H) pagedirty = false end + local ev = input.waitForEvent() if ev.type == EV_KEY and ev.value == EVENT_VALUE_KEY_PRESS then if ev.code == KEY_FW_UP then From 599e0fd1df12f65f59f78e0753fb9e49524ddc6a Mon Sep 17 00:00:00 2001 From: Qingping Hou Date: Thu, 16 Feb 2012 19:46:39 +0800 Subject: [PATCH 5/6] fix: do full page refresh to get better user experience --- fontchooser.lua | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/fontchooser.lua b/fontchooser.lua index 0c8af5132..920a32ec8 100644 --- a/fontchooser.lua +++ b/fontchooser.lua @@ -70,15 +70,15 @@ function FontChooser:choose(ypos, height) end end - -- draw menu title - fb.bb:paintRect(0, ypos, fb.bb:getWidth(), height, 0) - renderUtf8Text(fb.bb, 30, ypos + self.spacing, self.tface, self.tfhash, "[ Fonts Menu ]", true) - fb:refresh(0, 0, ypos, fb.bb:getWidth(), self.title_H) while true do if pagedirty then fb.bb:paintRect(0, ypos, fb.bb:getWidth(), height, 0) - --renderUtf8Text(fb.bb, 30, ypos + self.spacing, self.tface, self.tfhash, "[ Fonts Menu ]", true) + + -- draw menu title + renderUtf8Text(fb.bb, 30, ypos + self.title_H, self.tface, self.tfhash, + "[ Fonts Menu ]", true) + local c for c = 1, perpage do local i = (self.page - 1) * perpage + c @@ -102,6 +102,7 @@ function FontChooser:choose(ypos, height) fb:refresh(1, 30, y, fb.bb:getWidth() - 60, 3) end end + -- draw new marker line y = ypos + self.title_H + (self.spacing * self.current) + 10 fb.bb:paintRect(30, y, fb.bb:getWidth() - 60, 3, 15) if not pagedirty then @@ -112,7 +113,7 @@ function FontChooser:choose(ypos, height) end if pagedirty then - fb:refresh(0, 0, ypos + self.title_H, fb.bb:getWidth(), height - self.title_H) + fb:refresh(0, 0, ypos, fb.bb:getWidth(), height) pagedirty = false end @@ -138,7 +139,7 @@ function FontChooser:choose(ypos, height) self.page = self.page - 1 pagedirty = true else - self.current = 2 + self.current = 1 markerdirty = true end elseif ev.code == KEY_ENTER or ev.code == KEY_FW_PRESS then From 72397af9c252609b403fe474425e93a8f4073e27 Mon Sep 17 00:00:00 2001 From: Qingping Hou Date: Sat, 18 Feb 2012 20:39:26 +0800 Subject: [PATCH 6/6] mod: listen event for KEY_LPBCK and KEY_LPFWD --- pdfreader.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pdfreader.lua b/pdfreader.lua index 9e1352f30..c01d0473c 100644 --- a/pdfreader.lua +++ b/pdfreader.lua @@ -285,7 +285,7 @@ function PDFReader:inputloop() self.shiftmode = true elseif ev.code == KEY_ALT then self.altmode = true - elseif ev.code == KEY_PGFWD then + elseif ev.code == KEY_PGFWD or ev.code == KEY_LPGFWD then if self.shiftmode then self:setglobalzoom(self.globalzoom*1.2) elseif self.altmode then @@ -293,7 +293,7 @@ function PDFReader:inputloop() else self:goto(self.pageno + 1) end - elseif ev.code == KEY_PGBCK then + elseif ev.code == KEY_PGBCK or ev.code == KEY_LPGBCK then if self.shiftmode then self:setglobalzoom(self.globalzoom*0.8) elseif self.altmode then