add flipping mode in pdf/djvu reader

By tapping on the upper left corner of the reader one can toggling flipping mode on/off.
In flipping mode swiping right/down and left/up  will paging backward and forward
accordingly with pages proportional to swiping distance.
pull/2/merge
chrox 11 years ago
parent fcfe82f4a5
commit 1bd8dfcee1

@ -0,0 +1,16 @@
ReaderFlipping = LeftContainer:new{}
function ReaderFlipping:init()
local widget = ImageWidget:new{
file = "resources/icons/appbar.book.open.png",
}
local icon_size = widget:getSize()
self.dimen = Geom:new{w = Screen:getWidth(), h = icon_size.h}
self[1] = widget
end
function ReaderFlipping:onSetDogearVisibility(visible)
self.view.dogear_visible = visible
return true
end

@ -21,8 +21,9 @@ function ReaderMenu:initGesListener()
GestureRange:new{
ges = "tap",
range = Geom:new{
x = 0, y = 0,
w = Screen:getWidth()*7/8,
x = Screen:getWidth()/8,
y = 0,
w = Screen:getWidth()*3/4,
h = Screen:getHeight()/4,
}
}

@ -68,7 +68,38 @@ function ReaderPaging:initGesListener()
h = 5*Screen:getHeight()/8,
}
}
}
},
ToggleFlipping = {
GestureRange:new{
ges = "tap",
range = Geom:new{
x = 0, y = 0,
w = Screen:getWidth()/8,
h = Screen:getHeight()/8
}
}
},
Swipe = {
GestureRange:new{
ges = "swipe",
range = Geom:new{
x = 0, y = 0,
w = Screen:getWidth(),
h = Screen:getHeight(),
}
}
},
Pan = {
GestureRange:new{
ges = "pan",
range = Geom:new{
x = 0, y = 0,
w = Screen:getWidth(),
h = Screen:getHeight(),
},
rate = 4.0,
}
},
}
end
@ -95,6 +126,47 @@ function ReaderPaging:onTapBackward()
return true
end
function ReaderPaging:onToggleFlipping()
self.view.flipping_visible = not self.view.flipping_visible
self.flipping_page = self.view.flipping_visible and self.current_page or nil
UIManager:setDirty(self.view.dialog, "partial")
end
function ReaderPaging:onSwipe(arg, ges)
if self.flipping_page == nil then
if ges.direction == "left" or ges.direction == "up" then
self:onGotoPageRel(1)
elseif ges.direction == "right" or ges.direction == "down" then
self:onGotoPageRel(-1)
end
elseif self.flipping_page then
self:gotoPage(self.flipping_page)
end
return true
end
function ReaderPaging:onPan(arg, ges)
if self.flipping_page then
local read = self.flipping_page - 1
local unread = self.number_of_pages - self.flipping_page
local whole = self.number_of_pages
local rel_proportion = ges.distance / Screen:getWidth()
local abs_proportion = ges.distance / Screen:getHeight()
if ges.direction == "right" then
self:gotoPage(self.flipping_page - math.floor(read*rel_proportion))
elseif ges.direction == "left" then
self:gotoPage(self.flipping_page + math.floor(unread*rel_proportion))
elseif ges.direction == "down" then
self:gotoPage(self.flipping_page - math.floor(whole*abs_proportion))
elseif ges.direction == "up" then
self:gotoPage(self.flipping_page + math.floor(whole*abs_proportion))
end
UIManager:setDirty(self.view.dialog, "partial")
end
return true
end
function ReaderPaging:onZoomModeUpdate(new_mode)
-- we need to remember zoom mode to handle page turn event
self.zoom_mode = new_mode

@ -1,3 +1,4 @@
require "ui/reader/readerflip"
require "ui/reader/readerfooter"
require "ui/reader/readerdogear"
@ -30,6 +31,8 @@ ReaderView = OverlapGroup:new{
footer_visible = false,
-- has dogear
dogear_visible = false,
-- in flipping state
flipping_visible = false,
}
function ReaderView:init()
@ -43,8 +46,12 @@ function ReaderView:resetLayout()
self.footer = ReaderFooter:new{
view = self,
}
self.flipping = ReaderFlipping:new{
view = self,
}
self[1] = self.dogear
self[2] = self.footer
self[3] = self.flipping
end
function ReaderView:paintTo(bb, x, y)
@ -109,6 +116,10 @@ function ReaderView:paintTo(bb, x, y)
if self.footer_visible then
self.footer:paintTo(bb, x, y)
end
-- paint flipping
if self.flipping_visible then
self.flipping:paintTo(bb, x, y)
end
end
--[[

Loading…
Cancel
Save