mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-08-30 23:00:21 -04:00
Viewer: Allow displaying the current page / total pages in the header/footer. Useful in paged mode to see exactly how many pages are left. Fixes #1899163 [Request: Add pages left in chapter](https://bugs.launchpad.net/calibre/+bug/1899163)
This commit is contained in:
parent
15443c869e
commit
5e67433334
@ -39,7 +39,7 @@ from read_book.paged_mode import (
|
||||
get_columns_per_screen_data, handle_gesture as paged_handle_gesture,
|
||||
handle_shortcut as paged_handle_shortcut, jump_to_cfi as paged_jump_to_cfi,
|
||||
layout as paged_layout, onwheel as paged_onwheel,
|
||||
prepare_for_resize as paged_prepare_for_resize, progress_frac,
|
||||
prepare_for_resize as paged_prepare_for_resize, progress_frac, page_counts,
|
||||
reset_paged_mode_globals, resize_done as paged_resize_done,
|
||||
scroll_by_page as paged_scroll_by_page, scroll_to_elem,
|
||||
scroll_to_extend_annotation as paged_annotation_scroll,
|
||||
@ -441,7 +441,10 @@ class IframeBoss:
|
||||
si = spine[i]
|
||||
if si:
|
||||
self.length_before += files[si]?.length or 0
|
||||
self.send_message('content_loaded', progress_frac=self.calculate_progress_frac(), file_progress_frac=progress_frac())
|
||||
self.send_message(
|
||||
'content_loaded', progress_frac=self.calculate_progress_frac(),
|
||||
file_progress_frac=progress_frac(), page_counts=page_counts()
|
||||
)
|
||||
self.last_cfi = None
|
||||
self.auto_scroll_action('resume')
|
||||
reset_touch_handlers() # Needed to mitigate issue https://bugs.chromium.org/p/chromium/issues/detail?id=464579
|
||||
@ -480,10 +483,10 @@ class IframeBoss:
|
||||
self.send_message(
|
||||
'report_cfi', cfi=cfi, progress_frac=self.calculate_progress_frac(),
|
||||
file_progress_frac=progress_frac(), request_id=data.request_id,
|
||||
selected_text=seltext, selection_bounds=selcfi)
|
||||
selected_text=seltext, selection_bounds=selcfi, page_counts=page_counts())
|
||||
return
|
||||
self.send_message(
|
||||
'report_cfi', cfi=None, progress_frac=0, file_progress_frac=0, request_id=data.request_id)
|
||||
'report_cfi', cfi=None, progress_frac=0, file_progress_frac=0, page_counts=page_counts(), request_id=data.request_id)
|
||||
|
||||
def update_cfi(self):
|
||||
cfi = current_cfi()
|
||||
@ -497,11 +500,11 @@ class IframeBoss:
|
||||
self.last_cfi = cfi
|
||||
self.send_message(
|
||||
'update_cfi', cfi=cfi, replace_history=self.replace_history_on_next_cfi_update,
|
||||
progress_frac=pf, file_progress_frac=fpf)
|
||||
progress_frac=pf, file_progress_frac=fpf, page_counts=page_counts())
|
||||
self.replace_history_on_next_cfi_update = True
|
||||
else:
|
||||
self.send_message(
|
||||
'update_progress_frac', progress_frac=pf, file_progress_frac=fpf)
|
||||
'update_progress_frac', progress_frac=pf, file_progress_frac=fpf, page_counts=page_counts())
|
||||
|
||||
def update_toc_position(self):
|
||||
visible_anchors = update_visible_toc_anchors(self.book.manifest.toc_anchor_map, self.anchor_funcs)
|
||||
@ -516,7 +519,7 @@ class IframeBoss:
|
||||
pf = self.calculate_progress_frac()
|
||||
fpf = progress_frac()
|
||||
self.send_message(
|
||||
'update_progress_frac', progress_frac=pf, file_progress_frac=fpf)
|
||||
'update_progress_frac', progress_frac=pf, file_progress_frac=fpf, page_counts=page_counts())
|
||||
sel = window.getSelection()
|
||||
if sel and not sel.isCollapsed:
|
||||
self.send_message('update_selection_position', selection_extents=selection_extents(current_layout_mode() is 'flow', True))
|
||||
|
@ -618,6 +618,19 @@ def progress_frac(frac):
|
||||
return Math.max(0, Math.min(scroll_viewport.block_pos() / limit, 1))
|
||||
|
||||
|
||||
def page_counts():
|
||||
if in_paged_mode():
|
||||
return {'current': column_at_current_scroll_offset(), 'total': number_of_cols, 'pages_per_screen': cols_per_screen}
|
||||
doc_size = scroll_viewport.document_block_size()
|
||||
screen_size = scroll_viewport.block_size()
|
||||
pos = scroll_viewport.block_pos()
|
||||
return {
|
||||
'current': (pos + 10) // screen_size,
|
||||
'total': doc_size // screen_size,
|
||||
'pages_per_screen': 1
|
||||
}
|
||||
|
||||
|
||||
def next_spine_item(backward):
|
||||
if not backward:
|
||||
csi = current_spine_item()
|
||||
|
@ -34,13 +34,15 @@ def create_item(region, label):
|
||||
opt(_('Top level section'), 'top-section'),
|
||||
opt(_('Current section'), 'section'),
|
||||
sep(),
|
||||
opt(_('Clock'), 'clock'),
|
||||
sep(),
|
||||
opt(_('Progress'), 'progress'),
|
||||
opt(_('Time to read book'), 'time-book'),
|
||||
opt(_('Time to read chapter'), 'time-chapter'),
|
||||
opt(_('Time to read chapter and book'), 'time-chapter-book'),
|
||||
opt(_('Position in book'), 'pos-book'),
|
||||
opt(_('Position in chapter'), 'pos-chapter'),
|
||||
opt(_('Clock'), 'clock'),
|
||||
opt(_('Pages in chapter'), 'pages-progress'),
|
||||
))
|
||||
)
|
||||
|
||||
@ -199,6 +201,8 @@ def render_head_foot(div, which, region, metadata, current_toc_node, current_toc
|
||||
text = format_pos(pos.progress_frac, pos.book_length)
|
||||
else:
|
||||
text = format_pos(pos.file_progress_frac, pos.chapter_length)
|
||||
elif field is 'pages-progress':
|
||||
text = f'{pos.page_counts.current + 1} / {pos.page_counts.total}'
|
||||
if not text:
|
||||
text = '\xa0'
|
||||
if text is not div.textContent:
|
||||
|
@ -205,6 +205,7 @@ class View:
|
||||
self.reference_mode_enabled = False
|
||||
self.loaded_resources = {}
|
||||
self.current_progress_frac = self.current_file_progress_frac = 0
|
||||
self.current_page_counts = {'current': 0, 'total': 0, 'pages_per_screen': 1}
|
||||
self.current_toc_node = self.current_toc_toplevel_node = None
|
||||
self.current_toc_family = v'[]'
|
||||
self.report_cfi_callbacks = {}
|
||||
@ -1127,7 +1128,7 @@ class View:
|
||||
if not self.book.last_read_position:
|
||||
self.book.last_read_position = {}
|
||||
self.book.last_read_position[unkey] = data.cfi
|
||||
self.set_progress_frac(data.progress_frac, data.file_progress_frac)
|
||||
self.set_progress_frac(data.progress_frac, data.file_progress_frac, data.page_counts)
|
||||
self.update_header_footer()
|
||||
if ui_operations.update_last_read_time:
|
||||
ui_operations.update_last_read_time(self.book)
|
||||
@ -1146,7 +1147,7 @@ class View:
|
||||
v'delete self.report_cfi_callbacks[data.request_id]'
|
||||
|
||||
def on_update_progress_frac(self, data):
|
||||
self.set_progress_frac(data.progress_frac, data.file_progress_frac)
|
||||
self.set_progress_frac(data.progress_frac, data.file_progress_frac, data.page_counts)
|
||||
self.update_header_footer()
|
||||
|
||||
def on_update_cfi(self, data):
|
||||
@ -1181,7 +1182,8 @@ class View:
|
||||
'progress_frac': self.current_progress_frac,
|
||||
'book_length': book_length, 'chapter_length': chapter_length,
|
||||
'file_progress_frac': self.current_file_progress_frac,
|
||||
'cfi': self.currently_showing?.bookpos
|
||||
'cfi': self.currently_showing?.bookpos,
|
||||
'page_counts': self.current_page_counts,
|
||||
}
|
||||
return pos
|
||||
|
||||
@ -1260,7 +1262,7 @@ class View:
|
||||
self.processing_spine_item_display = False
|
||||
self.currently_showing.loading = False
|
||||
self.hide_loading()
|
||||
self.set_progress_frac(data.progress_frac, data.file_progress_frac)
|
||||
self.set_progress_frac(data.progress_frac, data.file_progress_frac, data.page_counts)
|
||||
self.update_header_footer()
|
||||
self.on_reference_item_changed()
|
||||
window.scrollTo(0, 0) # ensure window is at 0 on mobile where the navbar causes issues
|
||||
@ -1271,9 +1273,10 @@ class View:
|
||||
if ui_operations.content_file_changed:
|
||||
ui_operations.content_file_changed(self.currently_showing.name)
|
||||
|
||||
def set_progress_frac(self, progress_frac, file_progress_frac):
|
||||
def set_progress_frac(self, progress_frac, file_progress_frac, page_counts):
|
||||
self.current_progress_frac = progress_frac or 0
|
||||
self.current_file_progress_frac = file_progress_frac or 0
|
||||
self.current_page_counts = page_counts
|
||||
self.book_scrollbar.sync_to_contents(self.current_progress_frac)
|
||||
|
||||
def update_font_size(self):
|
||||
|
Loading…
x
Reference in New Issue
Block a user