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)
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

@ -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

@ -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

@ -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

Loading…
Cancel
Save