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