home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / share / python-support / gnome-games-data / gnome_sudoku / printing.py < prev    next >
Encoding:
Python Source  |  2009-04-14  |  4.1 KB  |  115 lines

  1. # -*- coding: utf-8 -*-
  2. import gtk, cairo
  3. import sudoku, gsudoku
  4. from gettext import gettext as _
  5. from gettext import ngettext
  6.  
  7. def fit_squares_in_rectangle (width, height, n, margin=0):
  8.     """Optimally fit squares into a rectangle.
  9.  
  10.     Return number of columns, number of rows, and square size
  11.     for the best fit of n squares into a rectangle of given width and height.
  12.  
  13.     Optionally include a margin along edges and between squares.
  14.     """
  15.     best_square_size = 0
  16.     best_fit = None
  17.     for n_across in range(1,int(n)+1):
  18.         # if there's a remainder, we need to add an extra row...
  19.         # i.e. 5 / 2 = 2 remainder 1, which means with two rows we
  20.         # would need three columns, not two.
  21.         n_down = n / n_across + (n % n_across and 1 or 0)
  22.         across_size = width - ((n_across+1) * margin)
  23.         across_size = across_size / n_across
  24.         down_size = height - ((n_down+1) * margin)
  25.         down_size = down_size / n_down
  26.         if across_size < down_size:
  27.             square_size = across_size
  28.         else:
  29.             square_size = down_size
  30.         if square_size > best_square_size:
  31.             best_square_size = square_size
  32.             best_fit = n_across,n_down
  33.     if best_fit:
  34.         return best_fit,best_square_size
  35.  
  36. class SudokuPrinter:
  37.     def __init__ (self,
  38.                   sudokus,
  39.                   main_window,
  40.                   margin=50,
  41.                   sudokus_per_page=1,
  42.                   ):
  43.         self.drawn = False
  44.         self.margin = margin
  45.         self.sudokus_per_page=sudokus_per_page
  46.         self.n_sudokus = len(sudokus)
  47.         self.sudokus = sudokus
  48.         self.print_op = gtk.PrintOperation()
  49.         self.print_op.connect( "begin-print", self.begin_print)
  50.         self.print_op.connect("draw-page", self.draw_page)
  51.         self.main_window = main_window
  52.  
  53.     def begin_print(self, operation, context):
  54.         import math
  55.         pages = int(math.ceil(self.n_sudokus / self.sudokus_per_page))
  56.         operation.set_n_pages(pages)
  57.  
  58.     def draw_page(self, operation, context, page_nr):
  59.         import pango
  60.         import sudoku_thumber
  61.  
  62.         margin = 25
  63.         cr = context.get_cairo_context()
  64.         width = context.get_width()
  65.         height = context.get_height()
  66.  
  67.         best_fit,best_square_size = fit_squares_in_rectangle(width, height, self.sudokus_per_page, margin)
  68.  
  69.         start = int(page_nr*self.sudokus_per_page)
  70.         sudokus_on_page = self.sudokus[start : start+int(self.sudokus_per_page)]
  71.  
  72.         left = margin
  73.         top = margin
  74.         pos = [1,1]
  75.         for sudoku in sudokus_on_page:
  76.             if type(sudoku)==tuple:
  77.                 label = sudoku[1]
  78.                 sudoku = sudoku[0]
  79.             else:
  80.                 label = ""
  81.  
  82.             cr.set_font_size(12)
  83.             cr.select_font_face("", cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_BOLD)
  84.             cr.set_source_rgb(0,0,0)    
  85.             xbearing, ybearing, width, height, xadvance, yadvance = cr.text_extents(label)
  86.             cr.move_to(left, top-height/2)
  87.             cr.show_text(label)
  88.  
  89.             if isinstance(sudoku, gsudoku.SudokuGameDisplay):
  90.                 sudoku = sudoku.grid
  91.  
  92.             sudoku_thumber.draw_sudoku (cr, sudoku.grid, None, best_square_size, left, top)
  93.             if pos[0] < best_fit[0]:
  94.                 left = left + best_square_size + margin
  95.                 pos[0] += 1
  96.             else:
  97.                 top = top + best_square_size + margin
  98.                 left = margin
  99.                 pos[0] = 1
  100.                 pos[1] += 1
  101.  
  102.  
  103. def print_sudokus(*args,**kwargs):
  104.     sp = SudokuPrinter(*args,**kwargs)
  105.     res = sp.print_op.run(gtk.PRINT_OPERATION_ACTION_PRINT_DIALOG, sp.main_window)
  106.     if res == gtk.PRINT_OPERATION_RESULT_ERROR:
  107.         error_dialog = gtk.MessageDialog(main_window,
  108.                                       gtk.DIALOG_DESTROY_WITH_PARENT,
  109.                                       gtk.MESSAGE_ERROR,
  110.                                       gtk.BUTTONS_CLOSE,
  111.                                       "Error printing file:\n")
  112.         error_dialog.connect("response", lambda w,id: w.destroy())
  113.         error_dialog.show()
  114.  
  115.