maposmatic-dev
[Top][All Lists]
Advanced

[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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]