diff --git a/frontend/apps/reader/modules/readerpaging.lua b/frontend/apps/reader/modules/readerpaging.lua index 0976e583e..73d78d1d9 100644 --- a/frontend/apps/reader/modules/readerpaging.lua +++ b/frontend/apps/reader/modules/readerpaging.lua @@ -19,6 +19,7 @@ local ReaderPaging = InputContainer:new{ show_overlap_enable = nil, overlap = Screen:scaleBySize(DOVERLAPPIXELS), + inverse_reading_order = false, page_flipping_mode = false, bookmark_flipping_mode = false, flip_steps = {0,1,2,5,10,20,50,100} @@ -117,6 +118,7 @@ function ReaderPaging:initGesListener() } }, } + self:updateReadOrder() end function ReaderPaging:onReadSettings(config) @@ -128,6 +130,8 @@ function ReaderPaging:onReadSettings(config) end self.flipping_zoom_mode = config:readSetting("flipping_zoom_mode") or "page" self.flipping_scroll_mode = config:readSetting("flipping_scroll_mode") or false + self.inverse_reading_order = config:readSetting("inverse_reading_order") or false + self:updateReadOrder() end function ReaderPaging:onSaveSettings() @@ -138,6 +142,7 @@ function ReaderPaging:onSaveSettings() self.ui.doc_settings:saveSetting("show_overlap_enable", self.show_overlap_enable) self.ui.doc_settings:saveSetting("flipping_zoom_mode", self.flipping_zoom_mode) self.ui.doc_settings:saveSetting("flipping_scroll_mode", self.flipping_scroll_mode) + self.ui.doc_settings:saveSetting("inverse_reading_order", self.inverse_reading_order) end function ReaderPaging:getLastProgress() @@ -178,6 +183,14 @@ function ReaderPaging:addToMainMenu(tab_item_table) end, sub_item_table = page_overlap_menu, }) + table.insert(tab_item_table.typeset, { + text = _("Read from right to left"), + checked_func = function() return self.inverse_reading_order end, + callback = function() + self.inverse_reading_order = not self.inverse_reading_order + self:updateReadOrder() + end, + }) end --[[ @@ -320,9 +333,17 @@ function ReaderPaging:onSwipe(arg, ges) elseif self.page_flipping_mode and self.original_page then self:_gotoPage(self.original_page) elseif ges.direction == "west" then - self:onPagingRel(1) + if self.inverse_reading_order then + self:onPagingRel(-1) + else + self:onPagingRel(1) + end elseif ges.direction == "east" then - self:onPagingRel(-1) + if self.inverse_reading_order then + self:onPagingRel(1) + else + self:onPagingRel(-1) + end else -- trigger full refresh UIManager:setDirty(nil, "full") @@ -829,4 +850,54 @@ function ReaderPaging:onGotoPercentage(percentage) return true end +function ReaderPaging:updateReadOrder() + if self.inverse_reading_order then + self.ges_events.TapForward = { + GestureRange:new{ + ges = "tap", + range = Geom:new{ + x = Screen:getWidth()*(1-DTAP_ZONE_FORWARD.x-DTAP_ZONE_FORWARD.w), + y = Screen:getHeight()*DTAP_ZONE_FORWARD.y, + w = Screen:getWidth()*DTAP_ZONE_FORWARD.w, + h = Screen:getHeight()*DTAP_ZONE_FORWARD.h, + } + } + } + self.ges_events.TapBackward = { + GestureRange:new{ + ges = "tap", + range = Geom:new{ + x = Screen:getWidth()*(1-DTAP_ZONE_BACKWARD.x-DTAP_ZONE_BACKWARD.w), + y = Screen:getHeight()*DTAP_ZONE_BACKWARD.y, + w = Screen:getWidth()*DTAP_ZONE_BACKWARD.w, + h = Screen:getHeight()*DTAP_ZONE_BACKWARD.h, + } + } + } + else + self.ges_events.TapForward = { + GestureRange:new{ + ges = "tap", + range = Geom:new{ + x = Screen:getWidth()*DTAP_ZONE_FORWARD.x, + y = Screen:getHeight()*DTAP_ZONE_FORWARD.y, + w = Screen:getWidth()*DTAP_ZONE_FORWARD.w, + h = Screen:getHeight()*DTAP_ZONE_FORWARD.h, + } + } + } + self.ges_events.TapBackward = { + GestureRange:new{ + ges = "tap", + range = Geom:new{ + x = Screen:getWidth()*DTAP_ZONE_BACKWARD.x, + y = Screen:getHeight()*DTAP_ZONE_BACKWARD.y, + w = Screen:getWidth()*DTAP_ZONE_BACKWARD.w, + h = Screen:getHeight()*DTAP_ZONE_BACKWARD.h, + } + } + } + end +end + return ReaderPaging diff --git a/frontend/apps/reader/modules/readerrolling.lua b/frontend/apps/reader/modules/readerrolling.lua index 271f1624e..2a814b2bc 100644 --- a/frontend/apps/reader/modules/readerrolling.lua +++ b/frontend/apps/reader/modules/readerrolling.lua @@ -34,6 +34,7 @@ local ReaderRolling = InputContainer:new{ old_doc_height = nil, old_page = nil, current_pos = 0, + inverse_reading_order = false, -- only used for page view mode current_page= nil, doc_height = nil, @@ -97,7 +98,7 @@ function ReaderRolling:init() self.ui.menu:registerToMainMenu(self) end --- This method will be called in onSetDimensions handler +-- This method will be called in onSetDimensions handler function ReaderRolling:initGesListener() self.ges_events = { TapForward = { @@ -166,6 +167,7 @@ function ReaderRolling:initGesListener() } }, } + self:updateReadOrder() end function ReaderRolling:onReadSettings(config) @@ -207,6 +209,8 @@ function ReaderRolling:onReadSettings(config) if self.show_overlap_enable == nil then self.show_overlap_enable = DSHOWOVERLAP end + self.inverse_reading_order = config:readSetting("inverse_reading_order") or false + self:updateReadOrder() end function ReaderRolling:onSaveSettings() @@ -215,6 +219,7 @@ function ReaderRolling:onSaveSettings() self.ui.doc_settings:saveSetting("last_xpointer", self.xpointer) self.ui.doc_settings:saveSetting("percent_finished", self:getLastPercent()) self.ui.doc_settings:saveSetting("show_overlap_enable", self.show_overlap_enable) + self.ui.doc_settings:saveSetting("inverse_reading_order", self.inverse_reading_order) end function ReaderRolling:getLastProgress() @@ -269,10 +274,22 @@ function ReaderRolling:onTapBackward() end function ReaderRolling:onSwipe(arg, ges) - if ges.direction == "west" or ges.direction == "north" then + if ges.direction == "north" then self:onGotoViewRel(1) - elseif ges.direction == "east" or ges.direction == "south" then + elseif ges.direction == "south" then self:onGotoViewRel(-1) + elseif ges.direction == "west" then + if self.inverse_reading_order then + self:onPagingRel(-1) + else + self:onPagingRel(1) + end + elseif ges.direction == "east" then + if self.inverse_reading_order then + self:onPagingRel(1) + else + self:onPagingRel(-1) + end end end @@ -525,4 +542,54 @@ function ReaderRolling:updateBatteryState() end end +function ReaderRolling:updateReadOrder() + if self.inverse_reading_order then + self.ges_events.TapForward = { + GestureRange:new{ + ges = "tap", + range = Geom:new{ + x = Screen:getWidth()*(1-DTAP_ZONE_FORWARD.x-DTAP_ZONE_FORWARD.w), + y = Screen:getHeight()*DTAP_ZONE_FORWARD.y, + w = Screen:getWidth()*DTAP_ZONE_FORWARD.w, + h = Screen:getHeight()*DTAP_ZONE_FORWARD.h, + } + } + } + self.ges_events.TapBackward = { + GestureRange:new{ + ges = "tap", + range = Geom:new{ + x = Screen:getWidth()*(1-DTAP_ZONE_BACKWARD.x-DTAP_ZONE_BACKWARD.w), + y = Screen:getHeight()*DTAP_ZONE_BACKWARD.y, + w = Screen:getWidth()*DTAP_ZONE_BACKWARD.w, + h = Screen:getHeight()*DTAP_ZONE_BACKWARD.h, + } + } + } + else + self.ges_events.TapForward = { + GestureRange:new{ + ges = "tap", + range = Geom:new{ + x = Screen:getWidth()*DTAP_ZONE_FORWARD.x, + y = Screen:getHeight()*DTAP_ZONE_FORWARD.y, + w = Screen:getWidth()*DTAP_ZONE_FORWARD.w, + h = Screen:getHeight()*DTAP_ZONE_FORWARD.h, + } + } + } + self.ges_events.TapBackward = { + GestureRange:new{ + ges = "tap", + range = Geom:new{ + x = Screen:getWidth()*DTAP_ZONE_BACKWARD.x, + y = Screen:getHeight()*DTAP_ZONE_BACKWARD.y, + w = Screen:getWidth()*DTAP_ZONE_BACKWARD.w, + h = Screen:getHeight()*DTAP_ZONE_BACKWARD.h, + } + } + } + end +end + return ReaderRolling diff --git a/frontend/ui/data/strings.lua b/frontend/ui/data/strings.lua index a8232a39b..255f9ff67 100644 --- a/frontend/ui/data/strings.lua +++ b/frontend/ui/data/strings.lua @@ -28,6 +28,7 @@ S.EMBEDDED_STYLE = _("Embedded Style") S.WRITING_DIR = _("Writing Direction") S.PROGRESS_BAR = _("Progress Bar") S.FORCED_OCR = _("Forced OCR") +S.INVERSE_READING_ORDER = _("Inverse Order") S.ON = _("on") S.OFF = _("off")