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.current_margin_side = 0
|
||||||
this.is_full_screen_layout = false
|
this.is_full_screen_layout = false
|
||||||
this.max_col_width = -1
|
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) ->
|
set_geometry: (cols_per_screen=1, margin_top=20, margin_side=40, margin_bottom=20) ->
|
||||||
this.margin_top = margin_top
|
this.margin_top = margin_top
|
||||||
@ -36,6 +47,7 @@ class PagedDisplay
|
|||||||
layout: () ->
|
layout: () ->
|
||||||
# start_time = new Date().getTime()
|
# start_time = new Date().getTime()
|
||||||
body_style = window.getComputedStyle(document.body)
|
body_style = window.getComputedStyle(document.body)
|
||||||
|
bs = document.body.style
|
||||||
# When laying body out in columns, webkit bleeds the top margin of the
|
# 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
|
# first block element out above the columns, leading to an extra top
|
||||||
# margin for the page. We compensate for that here. Computing the
|
# margin for the page. We compensate for that here. Computing the
|
||||||
@ -43,8 +55,10 @@ class PagedDisplay
|
|||||||
# it before the column layout is applied.
|
# it before the column layout is applied.
|
||||||
first_layout = false
|
first_layout = false
|
||||||
if not this.in_paged_mode
|
if not this.in_paged_mode
|
||||||
document.body.style.marginTop = '0px'
|
bs.setProperty('margin-top', '0px')
|
||||||
extra_margin = document.body.getBoundingClientRect().top
|
extra_margin = document.body.getBoundingClientRect().top
|
||||||
|
if extra_margin <= this.margin_top
|
||||||
|
extra_margin = 0
|
||||||
margin_top = (this.margin_top - extra_margin) + 'px'
|
margin_top = (this.margin_top - extra_margin) + 'px'
|
||||||
# Check if the current document is a full screen layout like
|
# Check if the current document is a full screen layout like
|
||||||
# cover, if so we treat it specially.
|
# cover, if so we treat it specially.
|
||||||
@ -78,7 +92,6 @@ class PagedDisplay
|
|||||||
this.screen_width = this.page_width * this.cols_per_screen
|
this.screen_width = this.page_width * this.cols_per_screen
|
||||||
|
|
||||||
fgcolor = body_style.getPropertyValue('color')
|
fgcolor = body_style.getPropertyValue('color')
|
||||||
bs = document.body.style
|
|
||||||
|
|
||||||
bs.setProperty('-webkit-column-gap', (2*sm)+'px')
|
bs.setProperty('-webkit-column-gap', (2*sm)+'px')
|
||||||
bs.setProperty('-webkit-column-width', col_width+'px')
|
bs.setProperty('-webkit-column-width', col_width+'px')
|
||||||
@ -101,7 +114,7 @@ class PagedDisplay
|
|||||||
# Convert page-breaks to column-breaks
|
# Convert page-breaks to column-breaks
|
||||||
for sheet in document.styleSheets
|
for sheet in document.styleSheets
|
||||||
for rule in sheet.rules
|
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']
|
for prop in ['page-break-before', 'page-break-after', 'page-break-inside']
|
||||||
val = rule.style.getPropertyValue(prop)
|
val = rule.style.getPropertyValue(prop)
|
||||||
if val
|
if val
|
||||||
@ -144,6 +157,19 @@ class PagedDisplay
|
|||||||
img.style.setProperty('max-width', max_width+'px')
|
img.style.setProperty('max-width', max_width+'px')
|
||||||
calibre_utils.store(img, 'width-limited', true)
|
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_pos: (frac) ->
|
||||||
# Scroll to the position represented by frac (number between 0 and 1)
|
# Scroll to the position represented by frac (number between 0 and 1)
|
||||||
xpos = Math.floor(document.body.scrollWidth * frac)
|
xpos = Math.floor(document.body.scrollWidth * frac)
|
||||||
|
@ -202,6 +202,7 @@ class PDFWriter(QObject): # {{{
|
|||||||
paged_display.set_geometry(1, 0, 0, 0);
|
paged_display.set_geometry(1, 0, 0, 0);
|
||||||
paged_display.layout();
|
paged_display.layout();
|
||||||
paged_display.fit_images();
|
paged_display.fit_images();
|
||||||
|
paged_display.check_top_margin();
|
||||||
''')
|
''')
|
||||||
mf = self.view.page().mainFrame()
|
mf = self.view.page().mainFrame()
|
||||||
while True:
|
while True:
|
||||||
|
@ -179,6 +179,7 @@ class Document(QWebPage): # {{{
|
|||||||
fset=_pass_json_value_setter)
|
fset=_pass_json_value_setter)
|
||||||
|
|
||||||
def after_load(self):
|
def after_load(self):
|
||||||
|
self.javascript('window.paged_display.read_document_margins()')
|
||||||
self.set_bottom_padding(0)
|
self.set_bottom_padding(0)
|
||||||
self.fit_images()
|
self.fit_images()
|
||||||
self.init_hyphenate()
|
self.init_hyphenate()
|
||||||
@ -228,6 +229,7 @@ class Document(QWebPage): # {{{
|
|||||||
sz.setWidth(scroll_width+side_margin)
|
sz.setWidth(scroll_width+side_margin)
|
||||||
self.setPreferredContentsSize(sz)
|
self.setPreferredContentsSize(sz)
|
||||||
self.javascript('window.paged_display.fit_images()')
|
self.javascript('window.paged_display.fit_images()')
|
||||||
|
self.javascript('window.paged_display.check_top_margin()')
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def column_boundaries(self):
|
def column_boundaries(self):
|
||||||
|
@ -71,6 +71,7 @@ class Printing(QObject):
|
|||||||
paged_display.set_geometry(1, 0, 0, 0);
|
paged_display.set_geometry(1, 0, 0, 0);
|
||||||
paged_display.layout();
|
paged_display.layout();
|
||||||
paged_display.fit_images();
|
paged_display.fit_images();
|
||||||
|
paged_display.check_top_margin();
|
||||||
''')
|
''')
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user