[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Maposmatic-dev] [PATCH 1/2] Print page number at bottom of multi-page m
From: |
David MENTRE |
Subject: |
[Maposmatic-dev] [PATCH 1/2] Print page number at bottom of multi-page map index |
Date: |
Sat, 31 Mar 2012 18:45:07 +0200 |
Signed-off-by: David MENTRE <address@hidden>
---
ocitysmap2/draw_utils.py | 32 +++++++++++++++++
ocitysmap2/indexlib/multi_page_renderer.py | 49 +++++++++++++++++++++-----
ocitysmap2/layoutlib/multi_page_renderer.py | 7 +++-
3 files changed, 77 insertions(+), 11 deletions(-)
diff --git a/ocitysmap2/draw_utils.py b/ocitysmap2/draw_utils.py
index c8a655f..e7b1a04 100644
--- a/ocitysmap2/draw_utils.py
+++ b/ocitysmap2/draw_utils.py
@@ -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()
diff --git a/ocitysmap2/indexlib/multi_page_renderer.py
b/ocitysmap2/indexlib/multi_page_renderer.py
index 9000141..b3fda0b 100644
--- a/ocitysmap2/indexlib/multi_page_renderer.py
+++ b/ocitysmap2/indexlib/multi_page_renderer.py
@@ -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()
diff --git a/ocitysmap2/layoutlib/multi_page_renderer.py
b/ocitysmap2/layoutlib/multi_page_renderer.py
index 7673cdd..8919b5d 100644
--- a/ocitysmap2/layoutlib/multi_page_renderer.py
+++ b/ocitysmap2/layoutlib/multi_page_renderer.py
@@ -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()
--
1.7.5.4
- [Maposmatic-dev] [PATCH 1/2] Print page number at bottom of multi-page map index,
David MENTRE <=