kopia lustrzana https://github.com/hholzgra/ocitysmap
Print page number at bottom of multi-page map index
Signed-off-by: David MENTRE <dmentre@linux-france.org>stable
rodzic
808a6748e2
commit
8379cd7862
|
@ -24,6 +24,8 @@
|
|||
|
||||
import cairo
|
||||
import pango
|
||||
import ocitysmap2.layoutlib.commons as commons
|
||||
from ocitysmap2.layoutlib.abstract_renderer import Renderer
|
||||
|
||||
def draw_text(ctx, pc, layout, fascent, fheight,
|
||||
baseline_x, baseline_y, text, pango_alignment):
|
||||
|
@ -130,3 +132,33 @@ def draw_dotted_line(ctx, line_width, baseline_x, baseline_y, length):
|
|||
ctx.move_to(baseline_x, baseline_y)
|
||||
ctx.rel_line_to(length, 0)
|
||||
ctx.stroke()
|
||||
|
||||
def render_page_number(ctx, page_number,
|
||||
usable_area_width_pt, usable_area_height_pt, margin_pt,
|
||||
transparent_background = True):
|
||||
"""
|
||||
Render page number
|
||||
"""
|
||||
ctx.save()
|
||||
x_offset = 0
|
||||
if page_number % 2:
|
||||
x_offset += commons.convert_pt_to_dots(usable_area_width_pt)\
|
||||
- commons.convert_pt_to_dots(margin_pt)
|
||||
y_offset = commons.convert_pt_to_dots(usable_area_height_pt)\
|
||||
- commons.convert_pt_to_dots(margin_pt)
|
||||
ctx.translate(x_offset, y_offset)
|
||||
|
||||
if transparent_background:
|
||||
ctx.set_source_rgba(1, 1, 1, 0.6)
|
||||
else:
|
||||
ctx.set_source_rgba(0.8, 0.8, 0.8, 0.6)
|
||||
ctx.rectangle(0, 0, commons.convert_pt_to_dots(margin_pt),
|
||||
commons.convert_pt_to_dots(margin_pt))
|
||||
ctx.fill()
|
||||
|
||||
ctx.set_source_rgba(0, 0, 0, 1)
|
||||
x_offset = commons.convert_pt_to_dots(margin_pt)/2
|
||||
y_offset = commons.convert_pt_to_dots(margin_pt)/2
|
||||
ctx.translate(x_offset, y_offset)
|
||||
Renderer._draw_centered_text(ctx, unicode(page_number), 0, 0)
|
||||
ctx.restore()
|
||||
|
|
|
@ -22,6 +22,12 @@ import ocitysmap2.layoutlib.commons as UTILS
|
|||
import pango
|
||||
import pangocairo
|
||||
import math
|
||||
import draw_utils
|
||||
from ocitysmap2.layoutlib.abstract_renderer import Renderer
|
||||
|
||||
# FIXME: refactoring
|
||||
# We use the same 10mm as GRAYED_MARGIN_MM in the map multi-page renderer
|
||||
PAGE_NUMBER_MARGIN_PT = UTILS.convert_mm_to_pt(10)
|
||||
|
||||
class MultiPageStreetIndexRenderer:
|
||||
"""
|
||||
|
@ -31,7 +37,8 @@ class MultiPageStreetIndexRenderer:
|
|||
|
||||
# ctx: Cairo context
|
||||
# surface: Cairo surface
|
||||
def __init__(self, i18n, ctx, surface, index_categories, rendering_area):
|
||||
def __init__(self, i18n, ctx, surface, index_categories, rendering_area,
|
||||
page_number):
|
||||
self._i18n = i18n
|
||||
self.ctx = ctx
|
||||
self.surface = surface
|
||||
|
@ -40,6 +47,7 @@ class MultiPageStreetIndexRenderer:
|
|||
self.rendering_area_y = rendering_area[1]
|
||||
self.rendering_area_w = rendering_area[2]
|
||||
self.rendering_area_h = rendering_area[3]
|
||||
self.page_number = page_number
|
||||
|
||||
def _create_layout_with_font(self, pc, font_desc):
|
||||
layout = pc.create_layout()
|
||||
|
@ -54,6 +62,22 @@ class MultiPageStreetIndexRenderer:
|
|||
|
||||
return layout, fascent, fheight, em
|
||||
|
||||
def _draw_page_number(self):
|
||||
self.ctx.save()
|
||||
self.ctx.translate(Renderer.PRINT_SAFE_MARGIN_PT,
|
||||
Renderer.PRINT_SAFE_MARGIN_PT)
|
||||
draw_utils.render_page_number(self.ctx, self.page_number,
|
||||
self.rendering_area_w,
|
||||
self.rendering_area_h,
|
||||
PAGE_NUMBER_MARGIN_PT,
|
||||
transparent_background = False)
|
||||
self.ctx.restore()
|
||||
|
||||
def _new_page(self):
|
||||
self.surface.show_page()
|
||||
self.page_number = self.page_number + 1
|
||||
self._draw_page_number()
|
||||
|
||||
def render(self, dpi = UTILS.PT_PER_INCH):
|
||||
self.ctx.save()
|
||||
|
||||
|
@ -104,6 +128,7 @@ class MultiPageStreetIndexRenderer:
|
|||
# Find best number of columns
|
||||
max_drawing_width = \
|
||||
max_label_drawing_width + max_location_drawing_width + 2 * margin
|
||||
max_drawing_height = self.rendering_area_h - PAGE_NUMBER_MARGIN_PT
|
||||
|
||||
columns_count = int(math.ceil(self.rendering_area_w / max_drawing_width))
|
||||
# following test should not be needed. No time to prove it. ;-)
|
||||
|
@ -133,19 +158,22 @@ class MultiPageStreetIndexRenderer:
|
|||
actual_n_cols = 0
|
||||
offset_y = margin/2.
|
||||
|
||||
# page number of first page
|
||||
self._draw_page_number()
|
||||
|
||||
for category in self.index_categories:
|
||||
if ( offset_y + header_fheight + label_fheight
|
||||
+ margin/2. > self.rendering_area_h ):
|
||||
+ margin/2. > max_drawing_height ):
|
||||
offset_y = margin/2.
|
||||
offset_x += delta_x
|
||||
actual_n_cols += 1
|
||||
|
||||
if actual_n_cols == columns_count:
|
||||
self._new_page()
|
||||
actual_n_cols = 0
|
||||
offset_y = margin / 2.
|
||||
offset_x = orig_offset_x
|
||||
delta_x = orig_delta_x
|
||||
self.surface.show_page()
|
||||
|
||||
category.draw(self._i18n.isrtl(), self.ctx, pc, header_layout,
|
||||
UTILS.convert_pt_to_dots(header_fascent, dpi),
|
||||
|
@ -161,17 +189,17 @@ class MultiPageStreetIndexRenderer:
|
|||
for street in category.items:
|
||||
label_height = street.label_drawing_height(label_layout)
|
||||
if ( offset_y + label_height + margin/2.
|
||||
> self.rendering_area_h ):
|
||||
> max_drawing_height ):
|
||||
offset_y = margin/2.
|
||||
offset_x += delta_x
|
||||
actual_n_cols += 1
|
||||
|
||||
if actual_n_cols == columns_count:
|
||||
self._new_page()
|
||||
actual_n_cols = 0
|
||||
offset_y = margin / 2.
|
||||
offset_x = orig_offset_x
|
||||
delta_x = orig_delta_x
|
||||
self.surface.show_page()
|
||||
|
||||
street.draw(self._i18n.isrtl(), self.ctx, pc, column_layout,
|
||||
UTILS.convert_pt_to_dots(label_fascent, dpi),
|
||||
|
@ -190,7 +218,7 @@ class MultiPageStreetIndexRenderer:
|
|||
|
||||
|
||||
self.ctx.restore()
|
||||
pass
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
import random
|
||||
|
@ -241,12 +269,13 @@ if __name__ == '__main__':
|
|||
(15, 15, width - 2 * 15, height - 2 * 15)
|
||||
|
||||
mpsir = MultiPageStreetIndexRenderer(i18nMock(False), ctxtmp, surface,
|
||||
streets, rendering_area)
|
||||
streets, rendering_area, 1)
|
||||
mpsir.render()
|
||||
surface.show_page()
|
||||
|
||||
mpsir = MultiPageStreetIndexRenderer(i18nMock(True), ctxtmp, surface,
|
||||
streets, rendering_area)
|
||||
mpsir.render()
|
||||
mpsir2 = MultiPageStreetIndexRenderer(i18nMock(True), ctxtmp, surface,
|
||||
streets, rendering_area,
|
||||
mpsir.page_number + 1)
|
||||
mpsir2.render()
|
||||
|
||||
surface.finish()
|
||||
|
|
|
@ -51,6 +51,7 @@ import shapely.wkt
|
|||
from ocitysmap2 import maplib
|
||||
|
||||
from indexlib.commons import IndexCategory
|
||||
import draw_utils
|
||||
|
||||
LOG = logging.getLogger('ocitysmap')
|
||||
PAGE_STR = " - Page %(page_number)d"
|
||||
|
@ -624,6 +625,8 @@ class MultiPageRenderer(Renderer):
|
|||
|
||||
self._render_overview_page(ctx, cairo_surface, dpi)
|
||||
|
||||
page_number = 0
|
||||
|
||||
for i, (canvas, grid) in enumerate(self.pages):
|
||||
|
||||
rendered_map = canvas.get_rendered_map()
|
||||
|
@ -645,6 +648,7 @@ class MultiPageRenderer(Renderer):
|
|||
# Render the page number
|
||||
self._render_page_number(ctx, i+4)
|
||||
#self._render_neighbour_arrows()
|
||||
page_number = i+4
|
||||
|
||||
cairo_surface.show_page()
|
||||
ctx.restore()
|
||||
|
@ -655,7 +659,8 @@ class MultiPageRenderer(Renderer):
|
|||
(Renderer.PRINT_SAFE_MARGIN_PT,
|
||||
Renderer.PRINT_SAFE_MARGIN_PT,
|
||||
self._usable_area_width_pt,
|
||||
self._usable_area_height_pt))
|
||||
self._usable_area_height_pt),
|
||||
page_number + 1)
|
||||
|
||||
mpsir.render()
|
||||
|
||||
|
|
Ładowanie…
Reference in New Issue