mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Paged display: Fix handling of top margin
This commit is contained in:
parent
754f504286
commit
9da41e1756
Binary file not shown.
@ -26,6 +26,17 @@ class PagedDisplay
|
||||
this.current_margin_side = 0
|
||||
this.is_full_screen_layout = false
|
||||
this.max_col_width = -1
|
||||
this.document_margins = null
|
||||
|
||||
read_document_margins: () ->
|
||||
if false and this.document_margins is null
|
||||
for sheet in document.styleSheets
|
||||
for rule in sheet.rules
|
||||
if rule.type == CSSRule.PAGE_RULE
|
||||
for prop in ['margin-top', 'margin-bottom', 'margin-left', 'margin-right']
|
||||
val = rule.style.getPropertyValue(prop)
|
||||
if val
|
||||
log(val)
|
||||
|
||||
set_geometry: (cols_per_screen=1, margin_top=20, margin_side=40, margin_bottom=20) ->
|
||||
this.margin_top = margin_top
|
||||
@ -36,6 +47,7 @@ class PagedDisplay
|
||||
layout: () ->
|
||||
# start_time = new Date().getTime()
|
||||
body_style = window.getComputedStyle(document.body)
|
||||
bs = document.body.style
|
||||
# When laying body out in columns, webkit bleeds the top margin of the
|
||||
# first block element out above the columns, leading to an extra top
|
||||
# margin for the page. We compensate for that here. Computing the
|
||||
@ -43,8 +55,10 @@ class PagedDisplay
|
||||
# it before the column layout is applied.
|
||||
first_layout = false
|
||||
if not this.in_paged_mode
|
||||
document.body.style.marginTop = '0px'
|
||||
bs.setProperty('margin-top', '0px')
|
||||
extra_margin = document.body.getBoundingClientRect().top
|
||||
if extra_margin <= this.margin_top
|
||||
extra_margin = 0
|
||||
margin_top = (this.margin_top - extra_margin) + 'px'
|
||||
# Check if the current document is a full screen layout like
|
||||
# cover, if so we treat it specially.
|
||||
@ -78,7 +92,6 @@ class PagedDisplay
|
||||
this.screen_width = this.page_width * this.cols_per_screen
|
||||
|
||||
fgcolor = body_style.getPropertyValue('color')
|
||||
bs = document.body.style
|
||||
|
||||
bs.setProperty('-webkit-column-gap', (2*sm)+'px')
|
||||
bs.setProperty('-webkit-column-width', col_width+'px')
|
||||
@ -101,7 +114,7 @@ class PagedDisplay
|
||||
# Convert page-breaks to column-breaks
|
||||
for sheet in document.styleSheets
|
||||
for rule in sheet.rules
|
||||
if rule.type == 1 # CSSStyleRule
|
||||
if rule.type == CSSRule.STYLE_RULE
|
||||
for prop in ['page-break-before', 'page-break-after', 'page-break-inside']
|
||||
val = rule.style.getPropertyValue(prop)
|
||||
if val
|
||||
@ -144,6 +157,19 @@ class PagedDisplay
|
||||
img.style.setProperty('max-width', max_width+'px')
|
||||
calibre_utils.store(img, 'width-limited', true)
|
||||
|
||||
check_top_margin: () ->
|
||||
# This is needed to handle the case when a descendant of body specifies
|
||||
# a top margin as a percentage, which messes up the top margin
|
||||
# calculations above
|
||||
tm = document.body.getBoundingClientRect().top
|
||||
if tm != this.margin_top
|
||||
document.body.style.setProperty('margin-top', '0px')
|
||||
tm = document.body.getBoundingClientRect().top
|
||||
if tm <= this.margin_top
|
||||
tm = 0
|
||||
m = this.margin_top - tm
|
||||
document.body.style.setProperty('margin-top', m+'px')
|
||||
|
||||
scroll_to_pos: (frac) ->
|
||||
# Scroll to the position represented by frac (number between 0 and 1)
|
||||
xpos = Math.floor(document.body.scrollWidth * frac)
|
||||
|
@ -202,6 +202,7 @@ class PDFWriter(QObject): # {{{
|
||||
paged_display.set_geometry(1, 0, 0, 0);
|
||||
paged_display.layout();
|
||||
paged_display.fit_images();
|
||||
paged_display.check_top_margin();
|
||||
''')
|
||||
mf = self.view.page().mainFrame()
|
||||
while True:
|
||||
|
@ -179,6 +179,7 @@ class Document(QWebPage): # {{{
|
||||
fset=_pass_json_value_setter)
|
||||
|
||||
def after_load(self):
|
||||
self.javascript('window.paged_display.read_document_margins()')
|
||||
self.set_bottom_padding(0)
|
||||
self.fit_images()
|
||||
self.init_hyphenate()
|
||||
@ -228,6 +229,7 @@ class Document(QWebPage): # {{{
|
||||
sz.setWidth(scroll_width+side_margin)
|
||||
self.setPreferredContentsSize(sz)
|
||||
self.javascript('window.paged_display.fit_images()')
|
||||
self.javascript('window.paged_display.check_top_margin()')
|
||||
|
||||
@property
|
||||
def column_boundaries(self):
|
||||
|
@ -71,6 +71,7 @@ class Printing(QObject):
|
||||
paged_display.set_geometry(1, 0, 0, 0);
|
||||
paged_display.layout();
|
||||
paged_display.fit_images();
|
||||
paged_display.check_top_margin();
|
||||
''')
|
||||
|
||||
while True:
|
||||
|
Loading…
x
Reference in New Issue
Block a user