From 34e28d28e621e1e0fe5f01627551d9687bbe899b Mon Sep 17 00:00:00 2001 From: chrox Date: Sat, 18 Jan 2014 15:04:24 +0800 Subject: [PATCH 1/5] page links for crereader and pdfreader Swipe right will return to previous page or position. --- frontend/document/document.lua | 2 + frontend/document/pdfdocument.lua | 15 +++++ frontend/ui/reader/readerlink.lua | 95 +++++++++++++++++++++++----- frontend/ui/reader/readerrolling.lua | 10 +-- 4 files changed, 97 insertions(+), 25 deletions(-) diff --git a/frontend/document/document.lua b/frontend/document/document.lua index db86b626e..f63eaf19e 100644 --- a/frontend/document/document.lua +++ b/frontend/document/document.lua @@ -36,6 +36,8 @@ local Document = { author = "", date = "" }, + + links = {}, GAMMA_NO_GAMMA = 1.0, diff --git a/frontend/document/pdfdocument.lua b/frontend/document/pdfdocument.lua index 2b489d215..bc9d2367c 100644 --- a/frontend/document/pdfdocument.lua +++ b/frontend/document/pdfdocument.lua @@ -97,6 +97,21 @@ function PdfDocument:getUsedBBox(pageno) return used end +function PdfDocument:getPageLinks(pageno) + local hash = "pglinks|"..self.file.."|"..pageno + local cached = Cache:check(hash) + if cached then + return cached.links + end + local page = self._document:openPage(pageno) + local links = page:getPageLinks() + Cache:insert(hash, CacheItem:new{ + links = links, + }) + page:close() + return links +end + function PdfDocument:getPageBBox(pageno) return self.koptinterface:getPageBBox(self, pageno) end diff --git a/frontend/ui/reader/readerlink.lua b/frontend/ui/reader/readerlink.lua index 9b6701680..06c5cada3 100644 --- a/frontend/ui/reader/readerlink.lua +++ b/frontend/ui/reader/readerlink.lua @@ -6,7 +6,9 @@ local Device = require("ui/device") local Event = require("ui/event") local DEBUG = require("dbg") -local ReaderLink = InputContainer:new{} +local ReaderLink = InputContainer:new{ + link_states = {} +} function ReaderLink:init() if Device:isTouchDevice() then @@ -27,6 +29,16 @@ function ReaderLink:initGesListener() } } }, + Swipe = { + GestureRange:new{ + ges = "swipe", + range = Geom:new{ + x = 0, y = 0, + w = Screen:getWidth(), + h = Screen:getHeight(), + } + } + }, } end end @@ -49,22 +61,71 @@ function ReaderLink:onTap(arg, ges) end end end - if self.view.links then - local pos = self.view:screenToPageTransform(ges.pos) - for i = 1, #self.view.links do - local link = self.view.links[i] - -- enlarge tappable link box - local lbox = Geom:new{ - x = link.start_x - Screen:scaleByDPI(15), - y = link.start_y - Screen:scaleByDPI(15), - w = link.end_x - link.start_x + Screen:scaleByDPI(30), - h = link.end_y - link.start_y > 0 - and link.end_y - link.start_y + Screen:scaleByDPI(30) - or Screen:scaleByDPI(50), - } - if inside_box(pos, lbox) then - DEBUG("goto link", link) - self.document:gotoLink(link.section) + local pos = self.view:screenToPageTransform(ges.pos) + if self.ui.document.info.has_pages then + local page_links = self.ui.document:getPageLinks(pos.page) + --DEBUG("page links", page_links) + if page_links then + for i = 1, #page_links do + local link = page_links[i] + -- enlarge tappable link box + local lbox = Geom:new{ + x = link.x0 - Screen:scaleByDPI(15), + y = link.y0 - Screen:scaleByDPI(15), + w = link.x1 - link.x0 + Screen:scaleByDPI(30), + h = link.y1 - link.y0 + Screen:scaleByDPI(30) + } + if inside_box(pos, lbox) and link.page then + return self:onGotoLink(link) + end + end + end + else + if self.view.links then + for i = 1, #self.view.links do + local link = self.view.links[i] + -- enlarge tappable link box + local lbox = Geom:new{ + x = link.start_x - Screen:scaleByDPI(15), + y = link.start_y - Screen:scaleByDPI(15), + w = link.end_x - link.start_x + Screen:scaleByDPI(30), + h = link.end_y - link.start_y > 0 + and link.end_y - link.start_y + Screen:scaleByDPI(30) + or Screen:scaleByDPI(50), + } + if inside_box(pos, lbox) then + return self:onGotoLink(link) + end + end + end + end +end + +function ReaderLink:onGotoLink(link) + DEBUG("goto link", link) + if self.ui.document.info.has_pages then + table.insert(self.link_states, self.view.state.page) + self.ui:handleEvent(Event:new("PageUpdate", link.page + 1)) + else + table.insert(self.link_states, self.ui.document:getXPointer()) + self.document:gotoLink(link.section) + self.ui:handleEvent(Event:new("UpdateXPointer")) + end + return true +end + +function ReaderLink:onSwipe(arg, ges) + if ges.direction == "east" then + if self.ui.document.info.has_pages then + local last_page = table.remove(self.link_states) + if last_page then + self.ui:handleEvent(Event:new("PageUpdate", last_page)) + return true + end + else + local last_xp = table.remove(self.link_states) + if last_xp then + self.ui.document:gotoXPointer(last_xp) self.ui:handleEvent(Event:new("UpdateXPointer")) return true end diff --git a/frontend/ui/reader/readerrolling.lua b/frontend/ui/reader/readerrolling.lua index 5debdfd5d..527b565d3 100644 --- a/frontend/ui/reader/readerrolling.lua +++ b/frontend/ui/reader/readerrolling.lua @@ -183,16 +183,10 @@ function ReaderRolling:onTapBackward() end function ReaderRolling:onSwipe(arg, ges) - if ges.direction == "north" then + if ges.direction == "west" or ges.direction == "north" then self:onGotoViewRel(1) - elseif ges.direction == "south" then + elseif ges.direction == "east" or ges.direction == "south" then self:onGotoViewRel(-1) - elseif ges.direction == "west" then - self.ui.document:goForward() - self:onUpdateXPointer() - elseif ges.direction == "east" then - self.ui.document:goBack() - self:onUpdateXPointer() end return true end From ce3b58538cb83a289ffc4e7c30fb38f2075f7f79 Mon Sep 17 00:00:00 2001 From: chrox Date: Sat, 18 Jan 2014 15:31:27 +0800 Subject: [PATCH 2/5] fix no getPageLinks method in djvudocument --- frontend/document/document.lua | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/frontend/document/document.lua b/frontend/document/document.lua index f63eaf19e..52cb42ab2 100644 --- a/frontend/document/document.lua +++ b/frontend/document/document.lua @@ -173,6 +173,10 @@ function Document:getToc() return self._document:getToc() end +function Document:getPageLinks(pageno) + return nil +end + function Document:getTextBoxes(pageno) return nil end From 2d6d0a92f60a7d6032755f3c6967b7230e1d9510 Mon Sep 17 00:00:00 2001 From: chrox Date: Sat, 18 Jan 2014 15:37:58 +0800 Subject: [PATCH 3/5] tweaks on dimension of dictionary window --- frontend/ui/reader/readerdictionary.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/ui/reader/readerdictionary.lua b/frontend/ui/reader/readerdictionary.lua index 734b0acd9..47eda1dfb 100644 --- a/frontend/ui/reader/readerdictionary.lua +++ b/frontend/ui/reader/readerdictionary.lua @@ -53,7 +53,7 @@ function ReaderDictionary:showDict(results, box) dialog = self.dialog, results = results, dictionary = self.default_dictionary, - width = Screen:getWidth() - Screen:scaleByDPI(120), + width = Screen:getWidth() - Screen:scaleByDPI(80), height = math.min(region.h*0.7, Screen:getHeight()*0.5), region = region, align = align, From e947f83548bb84d4e05031f4168d72b138dd3963 Mon Sep 17 00:00:00 2001 From: chrox Date: Sat, 18 Jan 2014 19:18:12 +0800 Subject: [PATCH 4/5] fix dogear not shown properly in crereader --- frontend/document/credocument.lua | 5 +++++ frontend/ui/reader/readerbookmark.lua | 25 +++++++++++++++++-------- frontend/ui/reader/readerdogear.lua | 2 ++ koreader-base | 2 +- 4 files changed, 25 insertions(+), 9 deletions(-) diff --git a/frontend/document/credocument.lua b/frontend/document/credocument.lua index b6bd76fff..b9bc174aa 100644 --- a/frontend/document/credocument.lua +++ b/frontend/document/credocument.lua @@ -348,6 +348,11 @@ function CreDocument:setBatteryState(state) self._document:setBatteryState(state) end +function CreDocument:isXPointerInCurrentPage(xp) + DEBUG("CreDocument: check in page", xp) + return self._document:isXPointerInCurrentPage(xp) +end + function CreDocument:register(registry) registry:addProvider("txt", "application/txt", self) registry:addProvider("epub", "application/epub", self) diff --git a/frontend/ui/reader/readerbookmark.lua b/frontend/ui/reader/readerbookmark.lua index 375c0d7cc..f717d43b7 100644 --- a/frontend/ui/reader/readerbookmark.lua +++ b/frontend/ui/reader/readerbookmark.lua @@ -7,6 +7,7 @@ local Geom = require("ui/geometry") local Screen = require("ui/screen") local UIManager = require("ui/uimanager") local Event = require("ui/event") +local DEBUG = require("dbg") local _ = require("gettext") local ReaderBookmark = InputContainer:new{ @@ -35,10 +36,10 @@ end function ReaderBookmark:onToggleBookmark() local pn_or_xp = nil - if self.ui.document.getXPointer then - pn_or_xp = self.ui.document:getXPointer() - else + if self.ui.document.info.has_pages then pn_or_xp = self.view.state.page + else + pn_or_xp = self.ui.document:getXPointer() end self:toggleBookmark(pn_or_xp) self.view.dogear_visible = not self.view.dogear_visible @@ -55,14 +56,20 @@ function ReaderBookmark:setDogearVisibility(pn_or_xp) end function ReaderBookmark:onPageUpdate(pageno) - self:setDogearVisibility(pageno) + if self.ui.document.info.has_pages then + self:setDogearVisibility(pageno) + else + -- FIXME: this is a dirty hack to prevent crash in isXPointerInCurrentPage + if pageno ~= 1 then + self:setDogearVisibility("dummy") + end + end end function ReaderBookmark:onPosUpdate(pos) - -- TODO: cannot check if this pos is bookmarked or not. + self:setDogearVisibility("dummy") end - function ReaderBookmark:onShowBookmark() -- build up item_table for k, v in ipairs(self.bookmarks) do @@ -124,7 +131,8 @@ end function ReaderBookmark:isBookmarked(pn_or_xp) for k,v in ipairs(self.bookmarks) do - if v.page == pn_or_xp then + if (type(pn_or_xp) == "number" and v.page == pn_or_xp) or + (type(pn_or_xp) == "string" and self.ui.document:isXPointerInCurrentPage(v.page)) then return true end end @@ -155,7 +163,8 @@ end function ReaderBookmark:toggleBookmark(pn_or_xp) for k,v in ipairs(self.bookmarks) do - if v.page == pn_or_xp then + if (type(pn_or_xp) == "number" and v.page == pn_or_xp) or + (type(pn_or_xp) == "string" and self.ui.document:isXPointerInCurrentPage(v.page)) then table.remove(self.bookmarks, k) return end diff --git a/frontend/ui/reader/readerdogear.lua b/frontend/ui/reader/readerdogear.lua index 13e8e2acc..cb3f2b50f 100644 --- a/frontend/ui/reader/readerdogear.lua +++ b/frontend/ui/reader/readerdogear.lua @@ -2,6 +2,7 @@ local InputContainer = require("ui/widget/container/inputcontainer") local RightContainer = require("ui/widget/container/rightcontainer") local ImageWidget = require("ui/widget/imagewidget") local GestureRange = require("ui/gesturerange") +local UIManager = require("ui/uimanager") local Device = require("ui/device") local Geom = require("ui/geometry") local Screen = require("ui/screen") @@ -57,6 +58,7 @@ end function ReaderDogear:onSetDogearVisibility(visible) self.view.dogear_visible = visible + UIManager:setDirty(self.view.dialog, "partial") return true end diff --git a/koreader-base b/koreader-base index ff0611948..aa1328ca5 160000 --- a/koreader-base +++ b/koreader-base @@ -1 +1 @@ -Subproject commit ff06119483b6500afc5a03dcecb5848871c658d2 +Subproject commit aa1328ca5d8812084cfb1adf45d809044f887379 From 913a3df5a165cf70e3b88d98e242fdaef0962bb5 Mon Sep 17 00:00:00 2001 From: chrox Date: Sat, 18 Jan 2014 21:21:49 +0800 Subject: [PATCH 5/5] adjust nice value of reader.lua process to -2 when launching koreader with KUAL This should fix #413. --- extensions/koreader/menu.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/extensions/koreader/menu.json b/extensions/koreader/menu.json index 4c5a99892..9896aa2de 100644 --- a/extensions/koreader/menu.json +++ b/extensions/koreader/menu.json @@ -7,24 +7,24 @@ { "name": "Start the filemanager", "priority": 1, - "action": "/mnt/us/koreader/koreader.sh", + "action": "nice -n -7 /mnt/us/koreader/koreader.sh", "params": "/mnt/us/documents" }, { "name": "Open the last document", "priority": 2, - "action": "/mnt/us/koreader/koreader.sh" + "action": "nice -n -7 /mnt/us/koreader/koreader.sh" }, { "name": "Start the filemanager (no framework)", "priority": 3, - "action": "/mnt/us/koreader/koreader.sh", + "action": "nice -n -7 /mnt/us/koreader/koreader.sh", "params": "--framework_stop /mnt/us/documents" }, { "name": "Open the last document (no framework)", "priority": 4, - "action": "/mnt/us/koreader/koreader.sh", + "action": "nice -n -7 /mnt/us/koreader/koreader.sh", "params": "--framework_stop" } ]