189 lines
6.0 KiB
Python
189 lines
6.0 KiB
Python
#------------------------------------------------------------------------------
|
|
#
|
|
# PyGUI - Printing - Gtk
|
|
#
|
|
#------------------------------------------------------------------------------
|
|
|
|
import gtk, gtkunixprint
|
|
from gtk import UNIT_POINTS
|
|
from GUI import Canvas
|
|
from GUI.GPrinting import PageSetup as GPageSetup, Printable as GPrintable, \
|
|
Paginator
|
|
|
|
gtk_paper_names = [
|
|
gtk.PAPER_NAME_A3,
|
|
gtk.PAPER_NAME_A4,
|
|
gtk.PAPER_NAME_A5,
|
|
gtk.PAPER_NAME_B5,
|
|
gtk.PAPER_NAME_LETTER,
|
|
gtk.PAPER_NAME_EXECUTIVE,
|
|
gtk.PAPER_NAME_LEGAL,
|
|
]
|
|
|
|
gtk_paper_formats = {}
|
|
|
|
gtk_print_settings = gtk.PrintSettings()
|
|
|
|
def init_gtk_paper_formats():
|
|
for gtk_name in gtk_paper_names:
|
|
display_name = gtk.PaperSize(gtk_name).get_display_name()
|
|
gtk_paper_formats[display_name] = gtk_name
|
|
|
|
init_gtk_paper_formats()
|
|
|
|
def gtk_default_page_setup():
|
|
pset = gtk.PageSetup()
|
|
pset.set_paper_size(gtk.PaperSize())
|
|
return pset
|
|
|
|
def get_gtk_state(gtk_page_setup):
|
|
state = {}
|
|
state['orientation'] = gtk_page_setup.get_orientation()
|
|
state['paper_size'] = gtk_page_setup.get_paper_size().get_name()
|
|
state['top_margin'] = gtk_page_setup.get_top_margin(UNIT_POINTS)
|
|
state['bottom_margin'] = gtk_page_setup.get_bottom_margin(UNIT_POINTS)
|
|
state['left_margin'] = gtk_page_setup.get_left_margin(UNIT_POINTS)
|
|
state['right_margin'] = gtk_page_setup.get_right_margin(UNIT_POINTS)
|
|
return state
|
|
|
|
def set_gtk_state(gtk_page_setup, state):
|
|
gtk_page_setup.set_orientation(state['orientation'])
|
|
gtk_page_setup.set_paper_size(gtk.PaperSize(state['paper_size']))
|
|
gtk_page_setup.set_top_margin(state['top_margin'], UNIT_POINTS)
|
|
gtk_page_setup.set_bottom_margin(state['bottom_margin'], UNIT_POINTS)
|
|
gtk_page_setup.set_left_margin(state['left_margin'], UNIT_POINTS)
|
|
gtk_page_setup.set_right_margin(state['right_margin'], UNIT_POINTS)
|
|
|
|
#------------------------------------------------------------------------------
|
|
|
|
class PageSetup(GPageSetup):
|
|
|
|
_printer_name = ""
|
|
_left_margin = 36
|
|
_top_margin = 36
|
|
_right_margin = 36
|
|
_bottom_margin = 36
|
|
|
|
def __init__(self):
|
|
self._gtk_page_setup = gtk_default_page_setup()
|
|
|
|
def __getstate__(self):
|
|
state = GPageSetup.__getstate__(self)
|
|
state['_gtk_page_setup'] = get_gtk_state(self._gtk_page_setup)
|
|
return state
|
|
|
|
def __setstate__(self, state):
|
|
gtk_setup = gtk_default_page_setup()
|
|
self._gtk_page_setup = gtk_setup
|
|
gtk_state = state.pop('_gtk_page_setup', None)
|
|
if gtk_state:
|
|
set_gtk_state(gtk_setup, gtk_state)
|
|
self.margins = state['margins']
|
|
self.printer_name = state['printer_name']
|
|
else:
|
|
GPageSetup.__setstate__(state)
|
|
|
|
def get_paper_name(self):
|
|
return self._gtk_page_setup.get_paper_size().get_display_name()
|
|
|
|
def set_paper_name(self, x):
|
|
psize = gtk.PaperSize(gtk_paper_formats.get(x) or x)
|
|
self._gtk_page_setup.set_paper_size(psize)
|
|
|
|
def get_paper_width(self):
|
|
return self._gtk_page_setup.get_paper_width(UNIT_POINTS)
|
|
|
|
def set_paper_width(self, x):
|
|
self._gtk_page_setup.set_paper_width(x, UNIT_POINTS)
|
|
|
|
def get_paper_height(self):
|
|
return self._gtk_page_setup.get_paper_height(UNIT_POINTS)
|
|
|
|
def set_paper_height(self, x):
|
|
self._gtk_page_setup.set_paper_height(x, UNIT_POINTS)
|
|
|
|
def get_orientation(self):
|
|
o = self._gtk_page_setup.get_orientation()
|
|
if o in (gtk.PAGE_ORIENTATION_LANDSCAPE,
|
|
gtk.PAGE_ORIENTATION_REVERSE_LANDSCAPE):
|
|
return 'landscape'
|
|
else:
|
|
return 'portrait'
|
|
|
|
def set_orientation(self, x):
|
|
if x == 'landscape':
|
|
o = gtk.PAGE_ORIENTATION_LANDSCAPE
|
|
else:
|
|
o = gtk.PAGE_ORIENTATION_PORTRAIT
|
|
self._gtk_page_setup.set_orientation(o)
|
|
|
|
def get_left_margin(self):
|
|
return self._left_margin
|
|
|
|
def get_top_margin(self):
|
|
return self._top_margin
|
|
|
|
def get_right_margin(self):
|
|
return self._right_margin
|
|
|
|
def get_bottom_margin(self):
|
|
return self._bottom_margin
|
|
|
|
def set_left_margin(self, x):
|
|
self._left_margin = x
|
|
|
|
def set_top_margin(self, x):
|
|
self._top_margin = x
|
|
|
|
def set_right_margin(self, x):
|
|
self._right_margin = x
|
|
|
|
def set_bottom_margin(self, x):
|
|
self._bottom_margin = x
|
|
|
|
def get_printer_name(self):
|
|
return self._printer_name
|
|
|
|
def set_printer_name(self, x):
|
|
self._printer_name = x
|
|
|
|
#------------------------------------------------------------------------------
|
|
|
|
class Printable(GPrintable):
|
|
|
|
def print_view(self, page_setup, prompt = True):
|
|
global gtk_print_settings
|
|
paginator = Paginator(self, page_setup)
|
|
|
|
def draw_page(_, gtk_print_context, page_num):
|
|
cairo_context = gtk_print_context.get_cairo_context()
|
|
canvas = Canvas._from_cairo_context(cairo_context)
|
|
paginator.draw_page(canvas, page_num)
|
|
|
|
gtk_op = gtk.PrintOperation()
|
|
gtk_op.set_print_settings(gtk_print_settings)
|
|
gtk_op.set_default_page_setup(page_setup._gtk_page_setup)
|
|
gtk_op.set_n_pages(paginator.num_pages)
|
|
gtk_op.set_use_full_page(True)
|
|
gtk_op.set_unit(UNIT_POINTS)
|
|
gtk_op.connect('draw-page', draw_page)
|
|
if prompt:
|
|
action = gtk.PRINT_OPERATION_ACTION_PRINT_DIALOG
|
|
else:
|
|
action = gtk.PRINT_OPERATION_ACTION_PRINT
|
|
result = gtk_op.run(action)
|
|
if result == gtk.PRINT_OPERATION_RESULT_APPLY:
|
|
gtk_print_settings = gtk_op.get_print_settings()
|
|
|
|
#------------------------------------------------------------------------------
|
|
|
|
def present_page_setup_dialog(page_setup):
|
|
old_setup = page_setup._gtk_page_setup
|
|
ps = gtk.PrintSettings()
|
|
new_setup = gtk.print_run_page_setup_dialog(None, old_setup, ps)
|
|
if get_gtk_state(old_setup) <> get_gtk_state(new_setup):
|
|
page_setup._gtk_page_setup = new_setup
|
|
return True
|
|
else:
|
|
return False
|