@ -55,7 +55,8 @@ local ReaderRolling = InputContainer:new{
-- With visible_pages=2, in 2-pages mode, ensure the first
-- With visible_pages=2, in 2-pages mode, ensure the first
-- page is always odd or even (odd is logical to avoid a
-- page is always odd or even (odd is logical to avoid a
-- same page when turning first 2-pages set of document)
-- same page when turning first 2-pages set of document)
odd_or_even_first_page = 1 -- 1 = odd, 2 = even, nil or others = free
odd_or_even_first_page = 1 , -- 1 = odd, 2 = even, nil or others = free
hide_nonlinear_flows = nil ,
}
}
function ReaderRolling : init ( )
function ReaderRolling : init ( )
@ -206,7 +207,7 @@ function ReaderRolling:onReadSettings(config)
self.setupXpointer = function ( )
self.setupXpointer = function ( )
self.xpointer = self.ui . document : getXPointer ( )
self.xpointer = self.ui . document : getXPointer ( )
if self.view . view_mode == " page " then
if self.view . view_mode == " page " then
self.ui : handleEvent ( Event : new ( " PageUpdate " , 1 ) )
self.ui : handleEvent ( Event : new ( " PageUpdate " , self.ui . document : getNextPage ( 0 ) ) )
end
end
end
end
end
end
@ -230,6 +231,12 @@ function ReaderRolling:onReadSettings(config)
G_reader_settings : readSetting ( " copt_visible_pages " ) or 1
G_reader_settings : readSetting ( " copt_visible_pages " ) or 1
self.ui . document : setVisiblePageCount ( self.visible_pages )
self.ui . document : setVisiblePageCount ( self.visible_pages )
self.hide_nonlinear_flows = config : readSetting ( " hide_nonlinear_flows " )
if self.hide_nonlinear_flows == nil then
self.hide_nonlinear_flows = G_reader_settings : isTrue ( " hide_nonlinear_flows " )
end
self.ui . document : setHideNonlinearFlows ( self.hide_nonlinear_flows )
-- Set a callback to allow showing load and rendering progress
-- Set a callback to allow showing load and rendering progress
-- (this callback will be cleaned up by cre.cpp closeDocument(),
-- (this callback will be cleaned up by cre.cpp closeDocument(),
-- no need to handle it in :onCloseDocument() here.)
-- no need to handle it in :onCloseDocument() here.)
@ -302,10 +309,14 @@ function ReaderRolling:onSaveSettings()
self.ui . doc_settings : saveSetting ( " show_overlap_enable " , self.show_overlap_enable )
self.ui . doc_settings : saveSetting ( " show_overlap_enable " , self.show_overlap_enable )
self.ui . doc_settings : saveSetting ( " inverse_reading_order " , self.inverse_reading_order )
self.ui . doc_settings : saveSetting ( " inverse_reading_order " , self.inverse_reading_order )
self.ui . doc_settings : saveSetting ( " visible_pages " , self.visible_pages )
self.ui . doc_settings : saveSetting ( " visible_pages " , self.visible_pages )
self.ui . doc_settings : saveSetting ( " hide_nonlinear_flows " , self.hide_nonlinear_flows )
end
end
function ReaderRolling : onReaderReady ( )
function ReaderRolling : onReaderReady ( )
self : setupTouchZones ( )
self : setupTouchZones ( )
if self.hide_nonlinear_flows then
self.ui . document : cacheFlows ( )
end
self.setupXpointer ( )
self.setupXpointer ( )
end
end
@ -457,6 +468,31 @@ You can set how many lines are shown.]])
help_text = _ ( [[When page overlap is enabled, some lines from the previous pages are shown on the next page.]] ) ,
help_text = _ ( [[When page overlap is enabled, some lines from the previous pages are shown on the next page.]] ) ,
sub_item_table = page_overlap_menu ,
sub_item_table = page_overlap_menu ,
}
}
if self.ui . document : hasNonLinearFlows ( ) then
local hide_nonlinear_text = _ ( " When this option is enabled, if a document contains non-linear fragments, they will be hidden from the normal page flow, but they are still accessible through links, Toc or Go to. This currently works only in single-page, non-scrolling mode. " )
menu_items.hide_nonlinear_flows = {
text = _ ( " Hide non-linear fragments " ) ,
enabled_func = function ( )
return self.view . view_mode == " page " and self.ui . document : getVisiblePageCount ( ) == 1
end ,
checked_func = function ( ) return self.hide_nonlinear_flows end ,
callback = function ( )
self : onToggleHideNonlinear ( )
end ,
hold_callback = function ( )
UIManager : show ( ConfirmBox : new {
text = T (
hide_nonlinear_text .. _ ( " \n \n Set default hide non-linear fragments to %1? " ) ,
self.hide_nonlinear_flows and _ ( " enabled " ) or _ ( " disabled " )
) ,
ok_callback = function ( )
G_reader_settings : saveSetting ( " hide_nonlinear_flows " , self.hide_nonlinear_flows )
end ,
} )
end ,
help_text = hide_nonlinear_text ,
}
end
end
end
function ReaderRolling : getLastPercent ( )
function ReaderRolling : getLastPercent ( )
@ -526,8 +562,18 @@ end
function ReaderRolling : onGotoNextChapter ( )
function ReaderRolling : onGotoNextChapter ( )
local visible_page_count = self.ui . document : getVisiblePageCount ( )
local visible_page_count = self.ui . document : getVisiblePageCount ( )
local pageno = self.current_page + ( visible_page_count > 1 and 1 or 0 )
local pageno = self.current_page + ( visible_page_count > 1 and 1 or 0 )
local new_page = self.ui . toc : getNextChapter ( pageno , 0 )
local new_page
if new_page then
if self.ui . document : hasHiddenFlows ( ) then
-- Find next chapter start
new_page = self.ui . document : getNextPage ( pageno )
while new_page > 0 do
if self.ui . toc : isChapterStart ( new_page ) then break end
new_page = self.ui . document : getNextPage ( new_page )
end
else
new_page = self.ui . toc : getNextChapter ( pageno ) or 0
end
if new_page > 0 then
self.ui . link : addCurrentLocationToStack ( )
self.ui . link : addCurrentLocationToStack ( )
self : onGotoPage ( new_page )
self : onGotoPage ( new_page )
end
end
@ -536,8 +582,18 @@ end
function ReaderRolling : onGotoPrevChapter ( )
function ReaderRolling : onGotoPrevChapter ( )
local pageno = self.current_page
local pageno = self.current_page
local new_page = self.ui . toc : getPreviousChapter ( pageno , 0 )
local new_page
if new_page then
if self.ui . document : hasHiddenFlows ( ) then
-- Find previous chapter start
new_page = self.ui . document : getPrevPage ( pageno )
while new_page > 0 do
if self.ui . toc : isChapterStart ( new_page ) then break end
new_page = self.ui . document : getPrevPage ( new_page )
end
else
new_page = self.ui . toc : getPreviousChapter ( pageno ) or 0
end
if new_page > 0 then
self.ui . link : addCurrentLocationToStack ( )
self.ui . link : addCurrentLocationToStack ( )
self : onGotoPage ( new_page )
self : onGotoPage ( new_page )
end
end
@ -721,7 +777,23 @@ function ReaderRolling:onGotoViewRel(diff)
else
else
diff = math.floor ( diff )
diff = math.floor ( diff )
end
end
self : _gotoPage ( self.current_page + diff * page_count )
local new_page = self.current_page
if self.ui . document : hasHiddenFlows ( ) then
local test_page
for i = 1 , math.abs ( diff * page_count ) do
if diff > 0 then
test_page = self.ui . document : getNextPage ( new_page )
else
test_page = self.ui . document : getPrevPage ( new_page )
end
if test_page > 0 then
new_page = test_page
end
end
else
new_page = new_page + diff * page_count
end
self : _gotoPage ( new_page )
if diff > 0 and old_page == self.current_page then
if diff > 0 and old_page == self.current_page then
self.ui : handleEvent ( Event : new ( " EndOfBook " ) )
self.ui : handleEvent ( Event : new ( " EndOfBook " ) )
end
end
@ -783,12 +855,13 @@ function ReaderRolling:updatePos()
local new_height = self.ui . document.info . doc_height
local new_height = self.ui . document.info . doc_height
local new_page = self.ui . document.info . number_of_pages
local new_page = self.ui . document.info . number_of_pages
if self.old_doc_height ~= new_height or self.old_page ~= new_page then
if self.old_doc_height ~= new_height or self.old_page ~= new_page then
if self.hide_nonlinear_flows then
self.ui . document : cacheFlows ( )
end
self : _gotoXPointer ( self.xpointer )
self : _gotoXPointer ( self.xpointer )
self.old_doc_height = new_height
self.old_doc_height = new_height
self.old_page = new_page
self.old_page = new_page
self.ui : handleEvent ( Event : new ( " UpdateToc " ) )
self.ui : handleEvent ( Event : new ( " UpdateToc " ) )
self.view . footer : setTocMarkers ( true )
self.view . footer : onUpdateFooter ( )
end
end
self : updateTopStatusBarMarkers ( )
self : updateTopStatusBarMarkers ( )
UIManager : setDirty ( self.view . dialog , " partial " )
UIManager : setDirty ( self.view . dialog , " partial " )
@ -808,7 +881,6 @@ function ReaderRolling:onChangeViewMode()
self.old_doc_height = self.ui . document.info . doc_height
self.old_doc_height = self.ui . document.info . doc_height
self.old_page = self.ui . document.info . number_of_pages
self.old_page = self.ui . document.info . number_of_pages
self.ui : handleEvent ( Event : new ( " UpdateToc " ) )
self.ui : handleEvent ( Event : new ( " UpdateToc " ) )
self.view . footer : setTocMarkers ( true )
if self.xpointer then
if self.xpointer then
self : _gotoXPointer ( self.xpointer )
self : _gotoXPointer ( self.xpointer )
-- Ensure a whole screen refresh is always enqueued
-- Ensure a whole screen refresh is always enqueued
@ -1310,6 +1382,20 @@ Note that %1 (out of %2) xpaths from your bookmarks and highlights have been nor
} )
} )
end
end
function ReaderRolling : onToggleHideNonlinear ( )
self.hide_nonlinear_flows = not self.hide_nonlinear_flows
self.ui . document : setHideNonlinearFlows ( self.hide_nonlinear_flows )
-- The document may change due to forced pagebreaks between flows being
-- added or removed, so we need to find our location
self : onUpdatePos ( )
-- Even if the document doesn't change, we must ensure that the
-- flow and call caches are cleared, to get the right page numbers,
-- which may have changed, and the correct flow structure. Also,
-- the footer needs updating, and TOC markers may come or go.
self.ui . document : cacheFlows ( )
self.ui : handleEvent ( Event : new ( " UpdateToc " ) )
end
-- Duplicated in ReaderPaging
-- Duplicated in ReaderPaging
function ReaderRolling : onToggleReadingOrder ( )
function ReaderRolling : onToggleReadingOrder ( )
self.inverse_reading_order = not self.inverse_reading_order
self.inverse_reading_order = not self.inverse_reading_order