From d24131b13bd2343652942514ad874d7415b77277 Mon Sep 17 00:00:00 2001 From: chrox Date: Sun, 14 Apr 2013 17:39:12 +0800 Subject: [PATCH 1/3] add panning of page in scroll mode --- frontend/ui/reader/readerpaging.lua | 146 ++++++++++++++++++---------- 1 file changed, 96 insertions(+), 50 deletions(-) diff --git a/frontend/ui/reader/readerpaging.lua b/frontend/ui/reader/readerpaging.lua index 38117b99d..0eeb4c7fd 100644 --- a/frontend/ui/reader/readerpaging.lua +++ b/frontend/ui/reader/readerpaging.lua @@ -190,9 +190,9 @@ function ReaderPaging:onSwipe(arg, ges) if self.flipping_mode then self:flipping(self.flipping_page, ges) self:updateFlippingPage(self.current_page) - elseif ges.direction == "west" or ges.direction == "north" then + elseif ges.direction == "west" then self:onPagingRel(1) - elseif ges.direction == "east" or ges.direction == "south" then + elseif ges.direction == "east" then self:onPagingRel(-1) end return true @@ -207,6 +207,10 @@ end function ReaderPaging:onPan(arg, ges) if self.flipping_mode then self:flipping(self.flipping_page, ges) + elseif ges.direction == "north" then + self:onPanningRel(ges.distance) + elseif ges.direction == "south" then + self:onPanningRel(-ges.distance) end return true end @@ -255,6 +259,13 @@ function ReaderPaging:onPagingRel(diff) return true end +function ReaderPaging:onPanningRel(diff) + if self.view.page_scroll then + self:onScrollPanRel(diff) + end + return true +end + function ReaderPaging:onInitScrollPageStates(orig) DEBUG("init scroll page states") if self.view.page_scroll then @@ -337,7 +348,7 @@ function ReaderPaging:getPrevPageState(blank_area, offset) } end -function ReaderPaging:updateLastPageState(state, blank_area, offset) +function ReaderPaging:updateTopPageState(state, blank_area, offset) local visible_area = Geom:new{x = 0, y = 0} visible_area.w, visible_area.h = blank_area.w, blank_area.h visible_area.x, visible_area.y = state.visible_area.x, state.visible_area.y @@ -352,7 +363,7 @@ function ReaderPaging:updateLastPageState(state, blank_area, offset) return state end -function ReaderPaging:updateFirstPageState(state, blank_area, offset) +function ReaderPaging:updateBottomPageState(state, blank_area, offset) local visible_area = Geom:new{x = 0, y = 0} visible_area.w, visible_area.h = blank_area.w, blank_area.h visible_area.x = state.page_area.x @@ -368,6 +379,85 @@ function ReaderPaging:updateFirstPageState(state, blank_area, offset) return state end +function ReaderPaging:genPageStatesFromTop(top_page_state, blank_area, offset) + -- Offset should always be greater than 0 + -- otherwise if offset is less than 0 the height of blank area will be + -- larger than 0 even if page area is much larger than visible area, + -- which will trigger the drawing of next page leaving part of current + -- page undrawn. This should also be true for generating from bottom. + if offset.y < 0 then offset.y = 0 end + local state = self:updateTopPageState(top_page_state, blank_area, offset) + --DEBUG("updated state", state) + local page_states = {} + if state.visible_area.h > 0 then + table.insert(page_states, state) + end + --DEBUG("blank area", blank_area) + local current_page = state.page + while blank_area.h > 0 do + blank_area.h = blank_area.h - self.view.page_gap.height + if blank_area.h > 0 then + if self.current_page == self.number_of_pages then break end + self:gotoPage(current_page + 1, "scrolling") + current_page = current_page + 1 + local state = self:getNextPageState(blank_area, Geom:new{}) + --DEBUG("new state", state) + table.insert(page_states, state) + end + end + return page_states +end + +function ReaderPaging:genPageStatesFromBottom(bottom_page_state, blank_area, offset) + -- scroll up offset should always be less than 0 + if offset.y > 0 then offset.y = 0 end + local state = self:updateBottomPageState(bottom_page_state, blank_area, offset) + --DEBUG("updated state", state) + local page_states = {} + if state.visible_area.h > 0 then + table.insert(page_states, state) + end + --DEBUG("blank area", blank_area) + local current_page = state.page + while blank_area.h > 0 do + blank_area.h = blank_area.h - self.view.page_gap.height + if blank_area.h > 0 then + if self.current_page == 1 then break end + self:gotoPage(current_page - 1, "scrolling") + current_page = current_page - 1 + local state = self:getPrevPageState(blank_area, Geom:new{}) + --DEBUG("new state", state) + table.insert(page_states, 1, state) + end + end + return page_states +end + +function ReaderPaging:onScrollPanRel(diff) + DEBUG("pan relative height:", diff) + local blank_area = Geom:new{} + blank_area:setSizeTo(self.view.dimen) + if diff > 0 then + local first_page_state = table.remove(self.view.page_states, 1) + local offset = Geom:new{ + x = 0, + y = diff, + } + self.view.page_states = self:genPageStatesFromTop(first_page_state, blank_area, offset) + end + if diff < 0 then + local last_page_state = table.remove(self.view.page_states) + local offset = Geom:new{ + x = 0, + y = diff + } + self.view.page_states = self:genPageStatesFromBottom(last_page_state, blank_area, offset) + end + -- update current pageno to the very last part in current view + self:gotoPage(self.view.page_states[#self.view.page_states].page, "scrolling") + UIManager:setDirty(self.view.dialog) +end + function ReaderPaging:onScrollPageRel(diff) DEBUG("scroll relative page:", diff) local blank_area = Geom:new{} @@ -378,31 +468,7 @@ function ReaderPaging:onScrollPageRel(diff) x = 0, y = last_page_state.visible_area.h - self.overlap } - -- Scroll down offset should always be greater than 0 - -- otherwise if offset is less than 0 the height of blank area will be - -- larger than 0 even if page area is much larger than visible area, - -- which will trigger the drawing of next page leaving part of current - -- page undrawn. This should also be true for scroll up offset. - if offset.y < 0 then offset.y = 0 end - local state = self:updateLastPageState(last_page_state, blank_area, offset) - --DEBUG("updated state", state) - self.view.page_states = {} - if state.visible_area.h > 0 then - table.insert(self.view.page_states, state) - end - --DEBUG("blank area", blank_area) - local current_page = state.page - while blank_area.h > 0 do - blank_area.h = blank_area.h - self.view.page_gap.height - if blank_area.h > 0 then - if self.current_page == self.number_of_pages then break end - self:gotoPage(current_page + 1, "scrolling") - current_page = current_page + 1 - local state = self:getNextPageState(blank_area, Geom:new{}) - --DEBUG("new state", state) - table.insert(self.view.page_states, state) - end - end + self.view.page_states = self:genPageStatesFromTop(last_page_state, blank_area, offset) end if diff < 0 then local first_page_state = table.remove(self.view.page_states, 1) @@ -410,27 +476,7 @@ function ReaderPaging:onScrollPageRel(diff) x = 0, y = -first_page_state.visible_area.h + self.overlap } - -- scroll up offset should always be less than 0 - if offset.y > 0 then offset.y = 0 end - local state = self:updateFirstPageState(first_page_state, blank_area, offset) - --DEBUG("updated state", state) - self.view.page_states = {} - if state.visible_area.h > 0 then - table.insert(self.view.page_states, state) - end - --DEBUG("blank area", blank_area) - local current_page = state.page - while blank_area.h > 0 do - blank_area.h = blank_area.h - self.view.page_gap.height - if blank_area.h > 0 then - if self.current_page == 1 then break end - self:gotoPage(current_page - 1, "scrolling") - current_page = current_page - 1 - local state = self:getPrevPageState(blank_area, Geom:new{}) - --DEBUG("new state", state) - table.insert(self.view.page_states, 1, state) - end - end + self.view.page_states = self:genPageStatesFromBottom(first_page_state, blank_area, offset) end -- update current pageno to the very last part in current view self:gotoPage(self.view.page_states[#self.view.page_states].page, "scrolling") From 4fbebe0d4c9fb80953bcb9eaa50acad104d10cf4 Mon Sep 17 00:00:00 2001 From: chrox Date: Sun, 14 Apr 2013 18:02:34 +0800 Subject: [PATCH 2/3] horizontal swipe in flipping mode will use stepped paging Proportional to swipe distance the page increment is stepped as 0, 1, 2, 5, 10, 20, 50 and 100. --- frontend/ui/reader/readerpaging.lua | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/ui/reader/readerpaging.lua b/frontend/ui/reader/readerpaging.lua index 0eeb4c7fd..2f6f16c51 100644 --- a/frontend/ui/reader/readerpaging.lua +++ b/frontend/ui/reader/readerpaging.lua @@ -7,6 +7,7 @@ ReaderPaging = InputContainer:new{ page_area = nil, show_overlap_enable = true, overlap = scaleByDPI(20), + flip_steps = {0,1,2,5,10,20,50,100} } function ReaderPaging:init() @@ -169,15 +170,14 @@ function ReaderPaging:updateFlippingPage(page) end function ReaderPaging:flipping(flipping_page, flipping_ges) - local read = flipping_page - 1 - local unread = self.number_of_pages - flipping_page local whole = self.number_of_pages - local rel_proportion = flipping_ges.distance / Screen:getWidth() + local steps = #self.flip_steps + local stp_proportion = flipping_ges.distance / Screen:getWidth() local abs_proportion = flipping_ges.distance / Screen:getHeight() if flipping_ges.direction == "east" then - self:gotoPage(flipping_page - math.floor(read*rel_proportion)) + self:gotoPage(flipping_page - self.flip_steps[math.ceil(steps*stp_proportion)]) elseif flipping_ges.direction == "west" then - self:gotoPage(flipping_page + math.floor(unread*rel_proportion)) + self:gotoPage(flipping_page + self.flip_steps[math.ceil(steps*stp_proportion)]) elseif flipping_ges.direction == "south" then self:gotoPage(flipping_page - math.floor(whole*abs_proportion)) elseif flipping_ges.direction == "north" then From 1c9388cd1717c556f23f2547994abba3da52507b Mon Sep 17 00:00:00 2001 From: chrox Date: Sun, 14 Apr 2013 18:19:42 +0800 Subject: [PATCH 3/3] add swipe rolling for crereader --- frontend/ui/reader/readerrolling.lua | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/frontend/ui/reader/readerrolling.lua b/frontend/ui/reader/readerrolling.lua index 9db1f1b6d..f9b40a8fd 100644 --- a/frontend/ui/reader/readerrolling.lua +++ b/frontend/ui/reader/readerrolling.lua @@ -88,7 +88,17 @@ function ReaderRolling:initGesListener() h = 5*Screen:getHeight()/8, } } - } + }, + Swipe = { + GestureRange:new{ + ges = "swipe", + range = Geom:new{ + x = 0, y = 0, + w = Screen:getWidth(), + h = Screen:getHeight(), + } + } + }, } end @@ -149,6 +159,15 @@ function ReaderRolling:onTapBackward() return true end +function ReaderRolling:onSwipe(arg, ges) + if ges.direction == "west" or ges.direction == "north" then + self:onGotoViewRel(1) + elseif ges.direction == "east" or ges.direction == "south" then + self:onGotoViewRel(-1) + end + return true +end + function ReaderRolling:onPosUpdate(new_pos) self.current_pos = new_pos end