Viewer: Allow showing the "position in book" as was displayed in the top left of the viewer in calibre 3 in the header and footer. Fixes #1846700 [Absolute position for book viewer](https://bugs.launchpad.net/calibre/+bug/1846700)

This commit is contained in:
Kovid Goyal 2019-10-04 19:55:17 +05:30
parent cc54251368
commit 8ef6938e03
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 18 additions and 4 deletions

View File

@ -37,6 +37,8 @@ def create_item(region, label):
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'),
))
)
@ -125,7 +127,13 @@ def format_time_left(seconds):
return _('{} h {} mins').format(hours, minutes)
def render_head_foot(div, which, region, progress_frac, metadata, current_toc_node, current_toc_toplevel_node, book_time, chapter_time):
def format_pos(progress_frac, length):
pages = Math.ceil(length / 1000)
pos = progress_frac * pages
return f'{pos:.1f} / {pages}'
def render_head_foot(div, which, region, progress_frac, metadata, current_toc_node, current_toc_toplevel_node, book_time, chapter_time, pos):
template = get_session_data().get(which) or {}
field = template[region] or 'empty'
interface_data = get_interface_data()
@ -161,6 +169,11 @@ def render_head_foot(div, which, region, progress_frac, metadata, current_toc_no
text = format_time_left(chapter_time)
else:
text = '{} ({})'.format(format_time_left(chapter_time), format_time_left(book_time))
elif field.startswith('pos-'):
if field is 'pos-book':
text = format_pos(pos.current_progress_frac, pos.book_length)
else:
text = format_pos(pos.current_file_progress_frac, pos.chapter_length)
if not text:
text = '\xa0'
if text is not div.textContent:

View File

@ -726,6 +726,7 @@ class View:
chapter_length = self.book.manifest.files[name]?.length or 0
else:
book_length = chapter_length = 0
pos = {'current_progress_frac': self.current_progress_frac, 'book_length': book_length, 'chapter_length': chapter_length, 'current_file_progress_frac': self.current_file_progress_frac}
book_length *= max(0, 1 - self.current_progress_frac)
chapter_length *= max(0, 1 - self.current_file_progress_frac)
book_time = self.timers.time_for(book_length)
@ -735,9 +736,9 @@ class View:
nonlocal has_clock
if sd.get(sz_attr, 20) > 5:
mi = self.book.metadata
texta, hca = render_head_foot(div.firstChild, name, 'left', self.current_progress_frac, mi, self.current_toc_node, self.current_toc_toplevel_node, book_time, chapter_time)
textb, hcb = render_head_foot(div.firstChild.nextSibling, name, 'middle', self.current_progress_frac, mi, self.current_toc_node, self.current_toc_toplevel_node, book_time, chapter_time)
textc, hcc = render_head_foot(div.lastChild, name, 'right', self.current_progress_frac, mi, self.current_toc_node, self.current_toc_toplevel_node, book_time, chapter_time)
texta, hca = render_head_foot(div.firstChild, name, 'left', self.current_progress_frac, mi, self.current_toc_node, self.current_toc_toplevel_node, book_time, chapter_time, pos)
textb, hcb = render_head_foot(div.firstChild.nextSibling, name, 'middle', self.current_progress_frac, mi, self.current_toc_node, self.current_toc_toplevel_node, book_time, chapter_time, pos)
textc, hcc = render_head_foot(div.lastChild, name, 'right', self.current_progress_frac, mi, self.current_toc_node, self.current_toc_toplevel_node, book_time, chapter_time, pos)
has_clock = hca or hcb or hcc
if textc and not textb and not texta:
# Want right-aligned