Geography : add printing functionality for all geography views.
svn: r22651
This commit is contained in:
parent
214132889a
commit
99e0bd6c42
172
gramps/plugins/lib/maps/cairoprint.py
Normal file
172
gramps/plugins/lib/maps/cairoprint.py
Normal file
@ -0,0 +1,172 @@
|
||||
# Gramps - a GTK+/GNOME based genealogy program
|
||||
#
|
||||
# Copyright (C) 2001-2007 Donald N. Allingham, Martin Hawlisch
|
||||
# Copyright (C) 2009 Douglas S. Blank
|
||||
# Copyright (C) 2009 Serge Noiraud
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
# $Id: print.py 21985 2013-04-13 14:37:34Z noirauds $
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from gi.repository import Gdk
|
||||
from gi.repository import Gtk
|
||||
import cairo
|
||||
from gramps.gen.const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.translation.gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# GRAMPS modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
|
||||
# the print settings to remember between print sessions
|
||||
PRINT_SETTINGS = None
|
||||
|
||||
#------------------------------------------------------------------------
|
||||
#
|
||||
# CairoPrintSave class
|
||||
#
|
||||
#------------------------------------------------------------------------
|
||||
class CairoPrintSave():
|
||||
"""Act as an abstract document that can render onto a cairo context.
|
||||
|
||||
It can render the model onto cairo context pages, according to the received
|
||||
page style.
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self, widthpx, heightpx, drawfunc, parent):
|
||||
"""
|
||||
This class provides the things needed so as to dump a cairo drawing on
|
||||
a context to output
|
||||
"""
|
||||
self.widthpx = widthpx
|
||||
self.heightpx = heightpx
|
||||
self.drawfunc = drawfunc
|
||||
self.parent = parent
|
||||
|
||||
def run(self):
|
||||
"""Create the physical output from the meta document.
|
||||
|
||||
"""
|
||||
global PRINT_SETTINGS
|
||||
|
||||
# set up a print operation
|
||||
operation = Gtk.PrintOperation()
|
||||
operation.connect("draw_page", self.on_draw_page)
|
||||
operation.connect("preview", self.on_preview)
|
||||
operation.connect("paginate", self.on_paginate)
|
||||
operation.set_n_pages(1)
|
||||
#paper_size = Gtk.PaperSize.new(name="iso_a4")
|
||||
## WHY no Gtk.Unit.PIXEL ?? Is there a better way to convert
|
||||
## Pixels to MM ??
|
||||
paper_size = Gtk.PaperSize.new_custom("custom",
|
||||
"Custom Size",
|
||||
round(self.widthpx * 0.2646),
|
||||
round(self.heightpx * 0.2646),
|
||||
Gtk.Unit.MM)
|
||||
page_setup = Gtk.PageSetup()
|
||||
page_setup.set_paper_size(paper_size)
|
||||
#page_setup.set_orientation(Gtk.PageOrientation.PORTRAIT)
|
||||
operation.set_default_page_setup(page_setup)
|
||||
#operation.set_use_full_page(True)
|
||||
|
||||
if PRINT_SETTINGS is not None:
|
||||
operation.set_print_settings(PRINT_SETTINGS)
|
||||
|
||||
# run print dialog
|
||||
while True:
|
||||
self.preview = None
|
||||
res = operation.run(Gtk.PrintOperationAction.PRINT_DIALOG, None)
|
||||
if self.preview is None: # cancel or print
|
||||
break
|
||||
# set up printing again; can't reuse PrintOperation?
|
||||
operation = Gtk.PrintOperation()
|
||||
operation.set_default_page_setup(page_setup)
|
||||
operation.connect("draw_page", self.on_draw_page)
|
||||
operation.connect("preview", self.on_preview)
|
||||
operation.connect("paginate", self.on_paginate)
|
||||
# set print settings if it was stored previously
|
||||
if PRINT_SETTINGS is not None:
|
||||
operation.set_print_settings(PRINT_SETTINGS)
|
||||
|
||||
# store print settings if printing was successful
|
||||
if res == Gtk.PrintOperationResult.APPLY:
|
||||
PRINT_SETTINGS = operation.get_print_settings()
|
||||
|
||||
def on_draw_page(self, operation, context, page_nr):
|
||||
"""Draw a page on a Cairo context.
|
||||
"""
|
||||
cr = context.get_cairo_context()
|
||||
self.drawfunc(self.parent, cr)
|
||||
|
||||
def on_paginate(self, operation, context):
|
||||
"""Paginate the whole document in chunks.
|
||||
We don't need this as there is only one page, however,
|
||||
we provide a dummy holder here, because on_preview crashes if no
|
||||
default application is set with gir 3.3.2 (typically evince not installed)!
|
||||
It will provide the start of the preview dialog, which cannot be
|
||||
started in on_preview
|
||||
"""
|
||||
finished = True
|
||||
# update page number
|
||||
operation.set_n_pages(1)
|
||||
|
||||
# start preview if needed
|
||||
if self.preview:
|
||||
self.preview.run()
|
||||
|
||||
return finished
|
||||
|
||||
def on_preview(self, operation, preview, context, parent):
|
||||
"""Implement custom print preview functionality.
|
||||
We provide a dummy holder here, because on_preview crashes if no
|
||||
default application is set with gir 3.3.2 (typically evince not installed)!
|
||||
"""
|
||||
dlg = Gtk.MessageDialog(parent,
|
||||
flags=Gtk.DialogFlags.MODAL,
|
||||
type=Gtk.MessageType.WARNING,
|
||||
buttons=Gtk.ButtonsType.CLOSE,
|
||||
message_format=_('No preview available'))
|
||||
self.preview = dlg
|
||||
self.previewopr = operation
|
||||
#dlg.format_secondary_markup(msg2)
|
||||
dlg.set_title("Map Preview - Gramps")
|
||||
dlg.connect('response', self.previewdestroy)
|
||||
|
||||
# give a dummy cairo context to Gtk.PrintContext,
|
||||
try:
|
||||
width = int(round(context.get_width()))
|
||||
except ValueError:
|
||||
width = 0
|
||||
try:
|
||||
height = int(round(context.get_height()))
|
||||
except ValueError:
|
||||
height = 0
|
||||
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height)
|
||||
cr = cairo.Context(surface)
|
||||
context.set_cairo_context(cr, 72.0, 72.0)
|
||||
|
||||
return True
|
||||
|
||||
def previewdestroy(self, dlg, res):
|
||||
self.preview.destroy()
|
||||
self.previewopr.end_preview()
|
@ -67,6 +67,7 @@ from . import constants
|
||||
from .osmgps import OsmGps
|
||||
from .selectionlayer import SelectionLayer
|
||||
from .placeselection import PlaceSelection
|
||||
from .cairoprint import CairoPrintSave
|
||||
|
||||
#------------------------------------------------------------------------
|
||||
#
|
||||
@ -238,6 +239,25 @@ class GeoGraphyView(OsmGps, NavigationView):
|
||||
"""
|
||||
return True
|
||||
|
||||
def define_actions(self):
|
||||
"""
|
||||
Required define_actions function for PageView. Builds the action
|
||||
group information required.
|
||||
As this function is overriden in some plugins, we need to call
|
||||
another method.
|
||||
"""
|
||||
NavigationView.define_actions(self)
|
||||
self.define_print_actions()
|
||||
|
||||
def define_print_actions(self):
|
||||
"""
|
||||
Associate the print button to the PrintView action.
|
||||
"""
|
||||
self._add_action('PrintView', Gtk.STOCK_PRINT, _("_Print..."),
|
||||
accel="<PRIMARY>P",
|
||||
tip=_("Print or save the Map"),
|
||||
callback=self.printview)
|
||||
|
||||
def config_connect(self):
|
||||
"""
|
||||
Overwriten from :class:`~gui.views.pageview.PageView method
|
||||
@ -724,6 +744,21 @@ class GeoGraphyView(OsmGps, NavigationView):
|
||||
mnam = _nd.display(mother) if mother else _("Unknown")
|
||||
return ( fnam, mnam )
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# Printing functionalities
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
def printview(self, obj):
|
||||
"""
|
||||
Print or save the view that is currently shown
|
||||
"""
|
||||
req = self.osm.get_allocation()
|
||||
widthpx = req.width / 0.70
|
||||
heightpx = req.height / 0.70
|
||||
prt = CairoPrintSave(widthpx, heightpx, self.osm.do_draw, self.osm)
|
||||
prt.run()
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# Specific functionalities
|
||||
|
@ -80,6 +80,11 @@ _UI_DEF = '''\
|
||||
<separator/>
|
||||
</placeholder>
|
||||
</menu>
|
||||
<menu action="EditMenu">
|
||||
<placeholder name="CommonEdit">
|
||||
<menuitem action="PrintView"/>
|
||||
</placeholder>
|
||||
</menu>
|
||||
<menu action="BookMenu">
|
||||
<placeholder name="AddEditBook">
|
||||
<menuitem action="AddBook"/>
|
||||
@ -94,6 +99,9 @@ _UI_DEF = '''\
|
||||
<toolitem action="HomePerson"/>
|
||||
<toolitem action="RefPerson"/>
|
||||
</placeholder>
|
||||
<placeholder name="CommonEdit">
|
||||
<toolitem action="PrintView"/>
|
||||
</placeholder>
|
||||
</toolbar>
|
||||
</ui>
|
||||
'''
|
||||
@ -269,6 +277,7 @@ class GeoClose(GeoGraphyView):
|
||||
"""
|
||||
NavigationView.define_actions(self)
|
||||
|
||||
self.define_print_actions()
|
||||
self.ref_person = Gtk.ActionGroup(self.title + '/Selection')
|
||||
self.ref_person.add_actions([
|
||||
('RefPerson', 'gramps-person', _('reference _Person'), None ,
|
||||
|
@ -82,6 +82,11 @@ _UI_DEF = '''\
|
||||
<separator/>
|
||||
</placeholder>
|
||||
</menu>
|
||||
<menu action="EditMenu">
|
||||
<placeholder name="CommonEdit">
|
||||
<menuitem action="PrintView"/>
|
||||
</placeholder>
|
||||
</menu>
|
||||
<menu action="BookMenu">
|
||||
<placeholder name="AddEditBook">
|
||||
<menuitem action="AddBook"/>
|
||||
@ -94,6 +99,9 @@ _UI_DEF = '''\
|
||||
<toolitem action="Back"/>
|
||||
<toolitem action="Forward"/>
|
||||
</placeholder>
|
||||
<placeholder name="CommonEdit">
|
||||
<toolitem action="PrintView"/>
|
||||
</placeholder>
|
||||
</toolbar>
|
||||
</ui>
|
||||
'''
|
||||
|
@ -78,6 +78,11 @@ _UI_DEF = '''\
|
||||
<separator/>
|
||||
</placeholder>
|
||||
</menu>
|
||||
<menu action="EditMenu">
|
||||
<placeholder name="CommonEdit">
|
||||
<menuitem action="PrintView"/>
|
||||
</placeholder>
|
||||
</menu>
|
||||
<menu action="BookMenu">
|
||||
<placeholder name="AddEditBook">
|
||||
<menuitem action="AddBook"/>
|
||||
@ -92,6 +97,9 @@ _UI_DEF = '''\
|
||||
<toolitem action="HomePerson"/>
|
||||
<toolitem action="RefFamily"/>
|
||||
</placeholder>
|
||||
<placeholder name="CommonEdit">
|
||||
<toolitem action="PrintView"/>
|
||||
</placeholder>
|
||||
</toolbar>
|
||||
</ui>
|
||||
'''
|
||||
@ -259,6 +267,7 @@ class GeoFamClose(GeoGraphyView):
|
||||
"""
|
||||
NavigationView.define_actions(self)
|
||||
|
||||
self.define_print_actions()
|
||||
self.ref_family = Gtk.ActionGroup(self.title + '/Selection')
|
||||
self.ref_family.add_actions([
|
||||
('RefFamily', 'gramps-family', _('reference _Family'), None ,
|
||||
|
@ -82,6 +82,11 @@ _UI_DEF = '''\
|
||||
<separator/>
|
||||
</placeholder>
|
||||
</menu>
|
||||
<menu action="EditMenu">
|
||||
<placeholder name="CommonEdit">
|
||||
<menuitem action="PrintView"/>
|
||||
</placeholder>
|
||||
</menu>
|
||||
<menu action="BookMenu">
|
||||
<placeholder name="AddEditBook">
|
||||
<menuitem action="AddBook"/>
|
||||
@ -94,6 +99,9 @@ _UI_DEF = '''\
|
||||
<toolitem action="Back"/>
|
||||
<toolitem action="Forward"/>
|
||||
</placeholder>
|
||||
<placeholder name="CommonEdit">
|
||||
<toolitem action="PrintView"/>
|
||||
</placeholder>
|
||||
</toolbar>
|
||||
</ui>
|
||||
'''
|
||||
|
@ -83,6 +83,11 @@ _UI_DEF = '''\
|
||||
<separator/>
|
||||
</placeholder>
|
||||
</menu>
|
||||
<menu action="EditMenu">
|
||||
<placeholder name="CommonEdit">
|
||||
<menuitem action="PrintView"/>
|
||||
</placeholder>
|
||||
</menu>
|
||||
<menu action="BookMenu">
|
||||
<placeholder name="AddEditBook">
|
||||
<menuitem action="AddBook"/>
|
||||
@ -96,6 +101,9 @@ _UI_DEF = '''\
|
||||
<toolitem action="Forward"/>
|
||||
<toolitem action="HomePerson"/>
|
||||
</placeholder>
|
||||
<placeholder name="CommonEdit">
|
||||
<toolitem action="PrintView"/>
|
||||
</placeholder>
|
||||
</toolbar>
|
||||
</ui>
|
||||
'''
|
||||
@ -211,12 +219,6 @@ class GeoMoves(GeoGraphyView):
|
||||
self._createmap(p1)
|
||||
self.uistate.modify_statusbar(self.dbstate)
|
||||
|
||||
def define_actions(self):
|
||||
"""
|
||||
Define action for the reference family button.
|
||||
"""
|
||||
NavigationView.define_actions(self)
|
||||
|
||||
def build_tree(self):
|
||||
"""
|
||||
This is called by the parent class when the view becomes visible. Since
|
||||
|
@ -87,6 +87,11 @@ _UI_DEF = '''\
|
||||
<separator/>
|
||||
</placeholder>
|
||||
</menu>
|
||||
<menu action="EditMenu">
|
||||
<placeholder name="CommonEdit">
|
||||
<menuitem action="PrintView"/>
|
||||
</placeholder>
|
||||
</menu>
|
||||
<menu action="BookMenu">
|
||||
<placeholder name="AddEditBook">
|
||||
<menuitem action="AddBook"/>
|
||||
@ -100,6 +105,9 @@ _UI_DEF = '''\
|
||||
<toolitem action="Forward"/>
|
||||
<toolitem action="HomePerson"/>
|
||||
</placeholder>
|
||||
<placeholder name="CommonEdit">
|
||||
<toolitem action="PrintView"/>
|
||||
</placeholder>
|
||||
</toolbar>
|
||||
</ui>
|
||||
'''
|
||||
|
@ -82,6 +82,11 @@ _UI_DEF = '''\
|
||||
<separator/>
|
||||
</placeholder>
|
||||
</menu>
|
||||
<menu action="EditMenu">
|
||||
<placeholder name="CommonEdit">
|
||||
<menuitem action="PrintView"/>
|
||||
</placeholder>
|
||||
</menu>
|
||||
<menu action="BookMenu">
|
||||
<placeholder name="AddEditBook">
|
||||
<menuitem action="AddBook"/>
|
||||
@ -94,6 +99,9 @@ _UI_DEF = '''\
|
||||
<toolitem action="Back"/>
|
||||
<toolitem action="Forward"/>
|
||||
</placeholder>
|
||||
<placeholder name="CommonEdit">
|
||||
<toolitem action="PrintView"/>
|
||||
</placeholder>
|
||||
</toolbar>
|
||||
</ui>
|
||||
'''
|
||||
|
Loading…
x
Reference in New Issue
Block a user