diff --git a/pyqso/logbook.py b/pyqso/logbook.py
index e52f1ea..9dd5dbd 100644
--- a/pyqso/logbook.py
+++ b/pyqso/logbook.py
@@ -17,7 +17,7 @@
# You should have received a copy of the GNU General Public License
# along with PyQSO. If not, see .
-from gi.repository import Gtk, Pango, PangoCairo
+from gi.repository import Gtk
import logging
import sqlite3 as sqlite
import os
@@ -51,6 +51,7 @@ from pyqso.auxiliary_dialogs import *
from pyqso.log_name_dialog import LogNameDialog
from pyqso.record_dialog import RecordDialog
from pyqso.cabrillo_export_dialog import CabrilloExportDialog
+from pyqso.printer import *
class Logbook:
@@ -1014,76 +1015,14 @@ class Logbook:
return
log_index = self._get_log_index()
log = self.logs[log_index]
-
- self.text_to_print = "Callsign\t---\tDate\t---\tTime\t---\tFrequency\t---\tMode\n"
records = log.get_all_records()
if(records is not None):
- for r in records:
- self.text_to_print += str(r["CALL"]) + "\t---\t" + str(r["QSO_DATE"]) + "\t---\t" + str(r["TIME_ON"]) + "\t---\t" + str(r["FREQ"]) + "\t---\t" + str(r["MODE"]) + "\n"
-
- action = Gtk.PrintOperationAction.PRINT_DIALOG
- operation = Gtk.PrintOperation()
- operation.set_default_page_setup(Gtk.PageSetup())
- operation.set_unit(Gtk.Unit.MM)
-
- operation.connect("begin_print", self._begin_print)
- operation.connect("draw_page", self._draw_page)
- operation.run(action, parent=self.application.window)
+ printer = Printer(self.application)
+ printer.print(records)
else:
error(self.application.window, "Could not retrieve the records from the SQL database. No records have been printed.")
return
- def _begin_print(self, operation, context):
- """ Specify the layout/position/font of the text on the pages to be printed.
-
- :arg Gtk.PrintOperation operation: The printing API.
- :arg Gtk.PrintContext context: Used to draw/render the pages to print.
- """
- width = context.get_width()
- height = context.get_height()
- layout = context.create_pango_layout()
- layout.set_font_description(Pango.FontDescription("normal 10"))
- layout.set_width(int(width*Pango.SCALE))
- layout.set_text(self.text_to_print, -1)
-
- number_of_pages = 0
- page_height = 0
- for line in range(0, layout.get_line_count()):
- layout_line = layout.get_line(line)
- ink_rectangle, logical_rectangle = layout_line.get_extents()
- self.line_height = logical_rectangle.height/1024.0 + 3
- page_height += self.line_height
- if(page_height + self.line_height > height):
- number_of_pages += 1
- page_height = self.line_height
- operation.set_n_pages(number_of_pages + 1)
- self.text_to_print = self.text_to_print.split("\n")
- return
-
- def _draw_page(self, operation, context, page_number):
- """ Render the QSO details on the page.
-
- :arg Gtk.PrintOperation operation: The printing API.
- :arg Gtk.PrintContext context: Used to draw/render the pages to print.
- :arg int page_number: The current page number.
- """
- cr = context.get_cairo_context()
- cr.set_source_rgb(0, 0, 0)
- layout = context.create_pango_layout()
-
- current_line_number = 0
- for line in self.text_to_print:
- layout.set_text(line, -1)
- cr.move_to(5, current_line_number*self.line_height)
- PangoCairo.update_layout(cr, layout)
- PangoCairo.show_layout(cr, layout)
- current_line_number += 1
- if(current_line_number*self.line_height > context.get_height()):
- for j in range(0, current_line_number):
- self.text_to_print.pop(0) # Remove what has been printed already before draw_page is called again
- break
- return
-
def add_record_callback(self, widget):
""" A callback function used to add a particular record/QSO. """
# Get the log index
diff --git a/pyqso/printer.py b/pyqso/printer.py
new file mode 100644
index 0000000..7b5959e
--- /dev/null
+++ b/pyqso/printer.py
@@ -0,0 +1,109 @@
+#!/usr/bin/env python3
+
+# Copyright (C) 2017 Christian Thomas Jacobs.
+
+# This file is part of PyQSO.
+
+# PyQSO 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 3 of the License, or
+# (at your option) any later version.
+#
+# PyQSO 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 PyQSO. If not, see .
+
+from gi.repository import Gtk, Pango, PangoCairo
+
+
+class Printer(object):
+
+ """ Handles the printing of one or more records to file or paper. """
+
+ def __init__(self, application):
+ """ Initialise the record printer.
+
+ :arg application: The PyQSO application containing the main Gtk window, etc.
+ """
+
+ self.application = application
+
+ self.action = Gtk.PrintOperationAction.PRINT_DIALOG
+ self.operation = Gtk.PrintOperation()
+ self.operation.set_default_page_setup(Gtk.PageSetup())
+ self.operation.set_unit(Gtk.Unit.MM)
+
+ self.operation.connect("begin_print", self.begin_print)
+ self.operation.connect("draw_page", self.draw_page)
+
+ return
+
+ def print(self, records):
+ """ Perform the print operation.
+
+ :arg dict records: The records to be printed.
+ """
+
+ # Assemble the header and records into one string.
+ self.text_to_print = "Callsign\t---\tDate\t---\tTime\t---\tFrequency\t---\tMode\n"
+ for r in records:
+ self.text_to_print += str(r["CALL"]) + "\t---\t" + str(r["QSO_DATE"]) + "\t---\t" + str(r["TIME_ON"]) + "\t---\t" + str(r["FREQ"]) + "\t---\t" + str(r["MODE"]) + "\n"
+
+ self.operation.run(self.action, parent=self.application.window)
+
+ return
+
+ def begin_print(self, operation, context):
+ """ Specify the layout/position/font of the text on the pages to be printed.
+
+ :arg Gtk.PrintOperation operation: The printing API.
+ :arg Gtk.PrintContext context: Used to draw/render the pages to print.
+ """
+ width = context.get_width()
+ height = context.get_height()
+ layout = context.create_pango_layout()
+ layout.set_font_description(Pango.FontDescription("normal 10"))
+ layout.set_width(int(width*Pango.SCALE))
+ layout.set_text(self.text_to_print, -1)
+
+ number_of_pages = 0
+ page_height = 0
+ for line in range(0, layout.get_line_count()):
+ layout_line = layout.get_line(line)
+ ink_rectangle, logical_rectangle = layout_line.get_extents()
+ self.line_height = logical_rectangle.height/1024.0 + 3
+ page_height += self.line_height
+ if(page_height + self.line_height > height):
+ number_of_pages += 1
+ page_height = self.line_height
+ operation.set_n_pages(number_of_pages + 1)
+ self.text_to_print = self.text_to_print.split("\n")
+ return
+
+ def draw_page(self, operation, context, page_number):
+ """ Render the QSO details on the page.
+
+ :arg Gtk.PrintOperation operation: The printing API.
+ :arg Gtk.PrintContext context: Used to draw/render the pages to print.
+ :arg int page_number: The current page number.
+ """
+ cr = context.get_cairo_context()
+ cr.set_source_rgb(0, 0, 0)
+ layout = context.create_pango_layout()
+
+ current_line_number = 0
+ for line in self.text_to_print:
+ layout.set_text(line, -1)
+ cr.move_to(5, current_line_number*self.line_height)
+ PangoCairo.update_layout(cr, layout)
+ PangoCairo.show_layout(cr, layout)
+ current_line_number += 1
+ if(current_line_number*self.line_height > context.get_height()):
+ for j in range(0, current_line_number):
+ self.text_to_print.pop(0) # Remove what has been printed already before draw_page is called again
+ break
+ return