minor tweeks to gtkprint

svn: r7870
This commit is contained in:
Richard Taylor 2007-01-05 16:10:08 +00:00
parent 6054e6f7b9
commit 00cf9559b3
2 changed files with 50 additions and 6 deletions

View File

@ -1,3 +1,6 @@
2007-01-05 Richard Taylor <rjt-gramps@thegrindstone.me.uk>
* src/docgen/GtkPrint.py: minor tweeks
2007-01-05 Richard Taylor <rjt-gramps@thegrindstone.me.uk>
* src/docgen/GtkPrint.py: Add initial stab at GtkPrint.

View File

@ -80,10 +80,10 @@ class PreviewCanvas(gtk.DrawingArea):
self._print_context = print_context
self.connect("expose_event",self.expose)
self.connect("realize",self.realize)
self._page_no = 1 # always start on page 1
self.set_size_request(200, 300)
def set_page(self,page):
"""Change which page is displayed"""
@ -91,7 +91,7 @@ class PreviewCanvas(gtk.DrawingArea):
self._page_no = page
self.queue_draw()
def realize(self):
def realize(self, dummy=None):
"""Generate the cairo context for this drawing area
and pass it to the print context."""
gtk.DrawingArea.realize(self)
@ -103,6 +103,12 @@ class PreviewCanvas(gtk.DrawingArea):
print "expose"
self.window.clear()
self._preview_operation.render_page(self._page_no)
# need to calculate how large the widget now is and
# set it so that the scrollbars are updated.
# I can't work out how to do this.
#self.set_size_request(200, 300)
class PreviewWindow(gtk.Window):
"""A dialog to show a print preview."""
@ -153,11 +159,11 @@ class PreviewWindow(gtk.Window):
lambda spinbutton: self._canvas.set_page(spinbutton.get_value_as_int()))
self._canvas.set_double_buffered(False)
self._canvas.realize()
self.show_all()
def change_n_pages(self, widget, event ):
"""Update the spin box to have the correct number of pages for the
print operation"""
@ -196,10 +202,39 @@ class PreviewWindow(gtk.Window):
#
#
#------------------------------------------------------------------------
def paperstyle_to_pagesetup(paper_style):
"""convert a gramps paper_style instance into a gtk.PageSetup instance.
"""
page_setup = gtk.PageSetup()
if paper_style.get_orientation() == BaseDoc.PAPER_PORTRAIT:
page_setup.set_orientation(gtk.PAGE_ORIENTATION_PORTRAIT)
else:
page_setup.set_orientation(gtk.PAGE_ORIENTATION_LANDSCAPE)
# This causes my gtk to seg fault.
#paper_size = gtk.PaperSize(paper_style.get_name())
#if paper_size.is_custom():
# paper_size.set_size(paper_style.get_width()*10,
# paper_style.get_height()*10,
# gtk.UNIT_MM)
# So we just to this instead.
# This does not appear to work either, it reports an
# GtkWarning: gtk_paper_size_set_size: assertion `size->is_custom' failed
# But I don't know how to tell it that it is custom without it segfaulting.
paper_size = gtk.PaperSize()
paper_size.set_size(paper_style.get_width()*10,
paper_style.get_height()*10,
gtk.UNIT_MM)
page_setup.set_paper_size(paper_size)
return page_setup
class PrintFacade(gtk.PrintOperation):
"""Provides the main print operation functions."""
def __init__(self, renderer):
def __init__(self, renderer,page_setup):
"""
render must be an object with the following interface:
render: callable that takes (operation, context, page_nr)
@ -212,6 +247,8 @@ class PrintFacade(gtk.PrintOperation):
self._renderer = renderer
self.set_default_page_setup(page_setup)
self.connect("begin_print", self.begin_print)
self.connect("draw_page", self.draw_page)
self.connect("paginate", self.paginate)
@ -271,6 +308,9 @@ class CairoJob(object):
# interface required for PrintFacade
#
def render(self, operation, context, page_nr):
"""Renders the document on the cairo context.
A useful reference is: http://www.tortall.net/mu/wiki/CairoTutorial
"""
cr = context.get_cairo_context()
y = 20
@ -296,7 +336,7 @@ class CairoJob(object):
return 3
#
# methods to add context to abstract document.
# methods to add content to abstract document.
#
def write_text(self,text):
@ -313,7 +353,8 @@ class GtkDoc(BaseDoc.BaseDoc):
self._job = CairoJob()
def close(self):
PrintFacade(self._job).do_print()
PrintFacade(self._job,
paperstyle_to_pagesetup(self.paper)).do_print()
def page_break(self):
pass