diff --git a/frontend/ui/reader/readerflip.lua b/frontend/ui/reader/readerflip.lua new file mode 100644 index 000000000..9331b3f7c --- /dev/null +++ b/frontend/ui/reader/readerflip.lua @@ -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 \ No newline at end of file diff --git a/frontend/ui/reader/readermenu.lua b/frontend/ui/reader/readermenu.lua index 05b613857..1f53b2b0b 100644 --- a/frontend/ui/reader/readermenu.lua +++ b/frontend/ui/reader/readermenu.lua @@ -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, } } diff --git a/frontend/ui/reader/readerpaging.lua b/frontend/ui/reader/readerpaging.lua index f0cda7905..6c7bba0c3 100644 --- a/frontend/ui/reader/readerpaging.lua +++ b/frontend/ui/reader/readerpaging.lua @@ -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 diff --git a/frontend/ui/reader/readerview.lua b/frontend/ui/reader/readerview.lua index 1a3e54ac2..8cc5f2110 100644 --- a/frontend/ui/reader/readerview.lua +++ b/frontend/ui/reader/readerview.lua @@ -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 --[[