mirror of
https://github.com/koreader/koreader.git
synced 2025-08-10 00:52:38 +00:00
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.
This commit is contained in:
16
frontend/ui/reader/readerflip.lua
Normal file
16
frontend/ui/reader/readerflip.lua
Normal file
@@ -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
|
||||
|
||||
--[[
|
||||
|
||||
Reference in New Issue
Block a user