From 6d30f679c5141cad646696d33c3ab8acdc35ad88 Mon Sep 17 00:00:00 2001 From: chrox Date: Sat, 4 Jan 2014 03:14:24 +0800 Subject: [PATCH] add bookmark flipping feature Bookmark flipping mode is toggled when long-holding the upper-right corner of the screen. In this mood both the flipping icon and the dogear icon are shown. And swiping west and east in this mode will flipping only on bookmarked pages. Currently only pdf/djvu readers are supported. This should implement feature request in #154. --- frontend/ui/reader/readerbookmark.lua | 38 ++++++++++++++++ frontend/ui/reader/readerdogear.lua | 16 +++++++ frontend/ui/reader/readerflipping.lua | 2 +- frontend/ui/reader/readerpaging.lua | 62 +++++++++++++++++++++------ 4 files changed, 105 insertions(+), 13 deletions(-) diff --git a/frontend/ui/reader/readerbookmark.lua b/frontend/ui/reader/readerbookmark.lua index eb359f464..375c0d7cc 100644 --- a/frontend/ui/reader/readerbookmark.lua +++ b/frontend/ui/reader/readerbookmark.lua @@ -163,4 +163,42 @@ function ReaderBookmark:toggleBookmark(pn_or_xp) self:addBookmark(pn_or_xp) end +function ReaderBookmark:getPreviousBookmarkedPage(pn_or_xp) + for i = #self.bookmarks, 1, -1 do + if pn_or_xp > self.bookmarks[i].page then + return self.bookmarks[i].page + end + end +end + +function ReaderBookmark:getNextBookmarkedPage(pn_or_xp) + for i = 1, #self.bookmarks do + if pn_or_xp < self.bookmarks[i].page then + return self.bookmarks[i].page + end + end +end + +function ReaderBookmark:onGotoPreviousBookmark(pn_or_xp) + self:GotoBookmark(self:getPreviousBookmarkedPage(pn_or_xp)) + return true +end + +function ReaderBookmark:onGotoNextBookmark(pn_or_xp) + self:GotoBookmark(self:getNextBookmarkedPage(pn_or_xp)) + return true +end + +function ReaderBookmark:GotoBookmark(pn_or_xp) + if type(pn_or_xp) == "string" then + if self.view.view_mode == "page" then + self.ui:handleEvent(Event:new("PageUpdate", self.ui.document:getPageFromXPointer(pn_or_xp))) + else + self.ui:handleEvent(Event:new("PosUpdate", self.ui.document:getPosFromXPointer(pn_or_xp))) + end + elseif type(pn_or_xp) == "number" then + self.ui:handleEvent(Event:new("PageUpdate", pn_or_xp)) + end +end + return ReaderBookmark diff --git a/frontend/ui/reader/readerdogear.lua b/frontend/ui/reader/readerdogear.lua index fa8e0197b..13e8e2acc 100644 --- a/frontend/ui/reader/readerdogear.lua +++ b/frontend/ui/reader/readerdogear.lua @@ -29,6 +29,17 @@ function ReaderDogear:init() h = Screen:getHeight()*DTAP_ZONE_BOOKMARK.h } } + }, + Hold = { + GestureRange:new{ + ges = "hold", + range = Geom:new{ + x = Screen:getWidth()*DTAP_ZONE_BOOKMARK.x, + y = Screen:getHeight()*DTAP_ZONE_BOOKMARK.y, + w = Screen:getWidth()*DTAP_ZONE_BOOKMARK.w, + h = Screen:getHeight()*DTAP_ZONE_BOOKMARK.h + } + } } } end @@ -39,6 +50,11 @@ function ReaderDogear:onTap() return true end +function ReaderDogear:onHold() + self.ui:handleEvent(Event:new("ToggleBookmarkFlipping")) + return true +end + function ReaderDogear:onSetDogearVisibility(visible) self.view.dogear_visible = visible return true diff --git a/frontend/ui/reader/readerflipping.lua b/frontend/ui/reader/readerflipping.lua index a6a3b9e70..24f0b5551 100644 --- a/frontend/ui/reader/readerflipping.lua +++ b/frontend/ui/reader/readerflipping.lua @@ -37,7 +37,7 @@ function ReaderFlipping:init() end function ReaderFlipping:onTap() - self.ui:handleEvent(Event:new("ToggleFlipping")) + self.ui:handleEvent(Event:new("TogglePageFlipping")) return true end diff --git a/frontend/ui/reader/readerpaging.lua b/frontend/ui/reader/readerpaging.lua index 8c804b221..900867f36 100644 --- a/frontend/ui/reader/readerpaging.lua +++ b/frontend/ui/reader/readerpaging.lua @@ -18,6 +18,9 @@ local ReaderPaging = InputContainer:new{ page_area = nil, show_overlap_enable = nil, overlap = Screen:scaleByDPI(20), + + page_flipping_mode = false, + bookmark_flipping_mode = false, flip_steps = {0,1,2,5,10,20,50,100} } @@ -190,12 +193,12 @@ function ReaderPaging:onTapBackward() return true end -function ReaderPaging:onToggleFlipping() +function ReaderPaging:onTogglePageFlipping() self.view.flipping_visible = not self.view.flipping_visible - self.flipping_mode = self.view.flipping_visible + self.page_flipping_mode = self.view.flipping_visible self.flipping_page = self.current_page - if self.flipping_mode then + if self.page_flipping_mode then self:updateOriginalPage(self.current_page) self:enterFlippingMode() else @@ -203,8 +206,30 @@ function ReaderPaging:onToggleFlipping() self:exitFlippingMode() end self.view:resetLayout() - self.ui:handleEvent(Event:new("SetFlippingMode", self.flipping_mode)) - self.ui:handleEvent(Event:new("SetHinting", not self.flipping_mode)) + self.ui:handleEvent(Event:new("SetHinting", not self.page_flipping_mode)) + self.ui:handleEvent(Event:new("ReZoom")) + UIManager:setDirty(self.view.dialog, "partial") +end + +function ReaderPaging:onToggleBookmarkFlipping() + self.bookmark_flipping_mode = not self.bookmark_flipping_mode + + if self.bookmark_flipping_mode then + self.orig_flipping_mode = self.view.flipping_visible + self.orig_dogear_mode = self.view.dogear_visible + + self.view.flipping_visible = true + self.view.dogear_visible = true + self.bm_flipping_orig_page = self.current_page + self:enterFlippingMode() + else + self.view.flipping_visible = self.orig_flipping_mode + self.view.dogear_visible = self.orig_dogear_mode + self:exitFlippingMode() + self:gotoPage(self.bm_flipping_orig_page) + end + self.view:resetLayout() + self.ui:handleEvent(Event:new("SetHinting", not self.bookmark_flipping_mode)) self.ui:handleEvent(Event:new("ReZoom")) UIManager:setDirty(self.view.dialog, "partial") end @@ -243,7 +268,7 @@ function ReaderPaging:updateFlippingPage(page) self.flipping_page = page end -function ReaderPaging:flipping(flipping_page, flipping_ges) +function ReaderPaging:pageFlipping(flipping_page, flipping_ges) local whole = self.number_of_pages local steps = #self.flip_steps local stp_proportion = flipping_ges.distance / Screen:getWidth() @@ -260,9 +285,20 @@ function ReaderPaging:flipping(flipping_page, flipping_ges) UIManager:setDirty(self.view.dialog, "partial") end +function ReaderPaging:bookmarkFlipping(flipping_page, flipping_ges) + if flipping_ges.direction == "east" then + self.ui:handleEvent(Event:new("GotoPreviousBookmark", flipping_page)) + elseif flipping_ges.direction == "west" then + self.ui:handleEvent(Event:new("GotoNextBookmark", flipping_page)) + end + UIManager:setDirty(self.view.dialog, "partial") +end + function ReaderPaging:onSwipe(arg, ges) - if self.flipping_mode then - self:flipping(self.flipping_page, ges) + if self.bookmark_flipping_mode then + self:bookmarkFlipping(self.current_page, ges) + elseif self.page_flipping_mode then + self:pageFlipping(self.flipping_page, ges) self:updateFlippingPage(self.current_page) elseif ges.direction == "west" then self:onPagingRel(1) @@ -281,9 +317,11 @@ function ReaderPaging:onTwoFingerSwipe(arg, ges) end function ReaderPaging:onPan(arg, ges) - if self.flipping_mode then + if self.bookmark_flipping_mode then + return true + elseif self.page_flipping_mode then if self.view.zoom_mode == "page" then - self:flipping(self.flipping_page, ges) + self:pageFlipping(self.flipping_page, ges) else self.view:PanningStart(-ges.relative.x, -ges.relative.y) end @@ -295,7 +333,7 @@ function ReaderPaging:onPan(arg, ges) end function ReaderPaging:onPanRelease(arg, ges) - if self.flipping_mode then + if self.page_flipping_mode then if self.view.zoom_mode == "page" then self:updateFlippingPage(self.current_page) else @@ -713,7 +751,7 @@ end -- wrapper for bounds checking function ReaderPaging:gotoPage(number, orig) - if number == self.current_page then + if number == self.current_page or not number then return true end if number > self.number_of_pages