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.
pull/431/head
chrox 11 years ago
parent 80732b6bf6
commit 6d30f679c5

@ -163,4 +163,42 @@ function ReaderBookmark:toggleBookmark(pn_or_xp)
self:addBookmark(pn_or_xp) self:addBookmark(pn_or_xp)
end 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 return ReaderBookmark

@ -29,6 +29,17 @@ function ReaderDogear:init()
h = Screen:getHeight()*DTAP_ZONE_BOOKMARK.h 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 end
@ -39,6 +50,11 @@ function ReaderDogear:onTap()
return true return true
end end
function ReaderDogear:onHold()
self.ui:handleEvent(Event:new("ToggleBookmarkFlipping"))
return true
end
function ReaderDogear:onSetDogearVisibility(visible) function ReaderDogear:onSetDogearVisibility(visible)
self.view.dogear_visible = visible self.view.dogear_visible = visible
return true return true

@ -37,7 +37,7 @@ function ReaderFlipping:init()
end end
function ReaderFlipping:onTap() function ReaderFlipping:onTap()
self.ui:handleEvent(Event:new("ToggleFlipping")) self.ui:handleEvent(Event:new("TogglePageFlipping"))
return true return true
end end

@ -18,6 +18,9 @@ local ReaderPaging = InputContainer:new{
page_area = nil, page_area = nil,
show_overlap_enable = nil, show_overlap_enable = nil,
overlap = Screen:scaleByDPI(20), overlap = Screen:scaleByDPI(20),
page_flipping_mode = false,
bookmark_flipping_mode = false,
flip_steps = {0,1,2,5,10,20,50,100} flip_steps = {0,1,2,5,10,20,50,100}
} }
@ -190,12 +193,12 @@ function ReaderPaging:onTapBackward()
return true return true
end end
function ReaderPaging:onToggleFlipping() function ReaderPaging:onTogglePageFlipping()
self.view.flipping_visible = not self.view.flipping_visible 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 self.flipping_page = self.current_page
if self.flipping_mode then if self.page_flipping_mode then
self:updateOriginalPage(self.current_page) self:updateOriginalPage(self.current_page)
self:enterFlippingMode() self:enterFlippingMode()
else else
@ -203,8 +206,30 @@ function ReaderPaging:onToggleFlipping()
self:exitFlippingMode() self:exitFlippingMode()
end end
self.view:resetLayout() self.view:resetLayout()
self.ui:handleEvent(Event:new("SetFlippingMode", self.flipping_mode)) self.ui:handleEvent(Event:new("SetHinting", not self.page_flipping_mode))
self.ui:handleEvent(Event:new("SetHinting", not self.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")) self.ui:handleEvent(Event:new("ReZoom"))
UIManager:setDirty(self.view.dialog, "partial") UIManager:setDirty(self.view.dialog, "partial")
end end
@ -243,7 +268,7 @@ function ReaderPaging:updateFlippingPage(page)
self.flipping_page = page self.flipping_page = page
end end
function ReaderPaging:flipping(flipping_page, flipping_ges) function ReaderPaging:pageFlipping(flipping_page, flipping_ges)
local whole = self.number_of_pages local whole = self.number_of_pages
local steps = #self.flip_steps local steps = #self.flip_steps
local stp_proportion = flipping_ges.distance / Screen:getWidth() 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") UIManager:setDirty(self.view.dialog, "partial")
end 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) function ReaderPaging:onSwipe(arg, ges)
if self.flipping_mode then if self.bookmark_flipping_mode then
self:flipping(self.flipping_page, ges) self:bookmarkFlipping(self.current_page, ges)
elseif self.page_flipping_mode then
self:pageFlipping(self.flipping_page, ges)
self:updateFlippingPage(self.current_page) self:updateFlippingPage(self.current_page)
elseif ges.direction == "west" then elseif ges.direction == "west" then
self:onPagingRel(1) self:onPagingRel(1)
@ -281,9 +317,11 @@ function ReaderPaging:onTwoFingerSwipe(arg, ges)
end end
function ReaderPaging:onPan(arg, ges) 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 if self.view.zoom_mode == "page" then
self:flipping(self.flipping_page, ges) self:pageFlipping(self.flipping_page, ges)
else else
self.view:PanningStart(-ges.relative.x, -ges.relative.y) self.view:PanningStart(-ges.relative.x, -ges.relative.y)
end end
@ -295,7 +333,7 @@ function ReaderPaging:onPan(arg, ges)
end end
function ReaderPaging:onPanRelease(arg, ges) function ReaderPaging:onPanRelease(arg, ges)
if self.flipping_mode then if self.page_flipping_mode then
if self.view.zoom_mode == "page" then if self.view.zoom_mode == "page" then
self:updateFlippingPage(self.current_page) self:updateFlippingPage(self.current_page)
else else
@ -713,7 +751,7 @@ end
-- wrapper for bounds checking -- wrapper for bounds checking
function ReaderPaging:gotoPage(number, orig) function ReaderPaging:gotoPage(number, orig)
if number == self.current_page then if number == self.current_page or not number then
return true return true
end end
if number > self.number_of_pages if number > self.number_of_pages

Loading…
Cancel
Save