diff --git a/photobooth/Photobooth.py b/photobooth/Photobooth.py index c49a10d..b2b0711 100644 --- a/photobooth/Photobooth.py +++ b/photobooth/Photobooth.py @@ -67,6 +67,7 @@ class Photobooth: self._send = send self.setCameraIdle() + self._send.send(gui.IdleState()) while True: try: diff --git a/photobooth/gui/PyQt5Gui.py b/photobooth/gui/PyQt5Gui.py index 259270a..ed1f08c 100644 --- a/photobooth/gui/PyQt5Gui.py +++ b/photobooth/gui/PyQt5Gui.py @@ -3,7 +3,7 @@ from PIL import ImageQt -from PyQt5.QtCore import Qt, QObject, QThread, pyqtSignal +from PyQt5.QtCore import Qt, QObject, QPoint, QThread, pyqtSignal from PyQt5.QtWidgets import (QApplication, QCheckBox, QComboBox, QFormLayout, QFrame, QGridLayout, QGroupBox, QHBoxLayout, QLabel, QLayout, QLineEdit, QMainWindow, QMessageBox, QPushButton, QVBoxLayout) from PyQt5.QtGui import QImage, QPainter, QPixmap @@ -24,7 +24,8 @@ class PyQt5Gui(Gui): self._app = QApplication(argv) self._p = PyQt5MainWindow() self._lastState = self.showStart - self._printer = Printer((cfg.getInt('Printer', 'width'), cfg.getInt('Printer', 'height'))) + self._printer = Printer((cfg.getInt('Printer', 'width'), + cfg.getInt('Printer', 'height')), True) def run(self, send, recv): @@ -34,7 +35,6 @@ class PyQt5Gui(Gui): receiver.start() self._transport = send - self._p.transport = send self.showStart() @@ -91,7 +91,7 @@ class PyQt5Gui(Gui): img = ImageQt.ImageQt(state.picture) self._p.setCentralWidget(PyQt5PictureMessage('', img)) - self._printer.print('test.pdf', state.picture) + self._printer.print(state.picture) elif isinstance(state, ErrorState): self.showError(state.title, state.message) else: @@ -112,6 +112,13 @@ class PyQt5Gui(Gui): self._p.setCentralWidget(PyQt5Settings(self)) + def showStartPhotobooth(self): + + self._lastState = self.showStartPhotobooth + self._transport.send('start') + self._p.setCentralWidget(PyQt5PictureMessage('Starting the photobooth...')) + + def showIdle(self): self._p.handleKeypressEvent = self.handleKeypressEvent @@ -170,20 +177,6 @@ class PyQt5MainWindow(QMainWindow): self.initUI() - @property - def transport(self): - - return self._transport - - - @transport.setter - def transport(self, new_transport): - - if not hasattr(new_transport, 'send'): - raise ValueError('PyQt5MainWindow.transport must provide send()') - - self._transport = new_transport - @property def handleKeypressEvent(self): @@ -213,19 +206,13 @@ class PyQt5MainWindow(QMainWindow): self.show() - def showMessage(self, message, picture=None): - - content = PyQt5PictureMessage(message, picture) - self.setCentralWidget(content) - - def closeEvent(self, e): reply = QMessageBox.question(self, 'Confirmation', "Quit Photobooth?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if reply == QMessageBox.Yes: - self.transport.close() + # self.transport.close() e.accept() else: e.ignore() @@ -255,7 +242,7 @@ class PyQt5Start(QFrame): btnStart = QPushButton('Start Photobooth') btnStart.resize(btnStart.sizeHint()) - btnStart.clicked.connect(gui.showIdle) + btnStart.clicked.connect(gui.showStartPhotobooth) grid.addWidget(btnStart, 0, 0) btnSettings = QPushButton('Settings') @@ -390,6 +377,7 @@ class PyQt5Settings(QFrame): widget.setLayout(layout) return widget + def createCameraSettings(self): global cfg @@ -571,7 +559,10 @@ class PyQt5PictureMessage(QFrame): else: pix = QPixmap(self._picture) pix = pix.scaled(self.rect().size(), Qt.KeepAspectRatio, Qt.SmoothTransformation) - painter.drawPixmap(pix.rect(), pix, pix.rect()) + + origin = ( (self.rect().width() - pix.width()) // 2, + (self.rect().height() - pix.height()) // 2 ) + painter.drawPixmap(QPoint(*origin), pix) painter.drawText(event.rect(), Qt.AlignCenter, self._message) painter.end() diff --git a/photobooth/main.py b/photobooth/main.py index 558a277..f9048d8 100644 --- a/photobooth/main.py +++ b/photobooth/main.py @@ -27,6 +27,11 @@ def lookup_and_import(module_list, name, package=None): def main_photobooth(config, send, recv): + event = recv.recv() + if str(event) != 'start': + print('Unknown event received: ' + str(event)) + raise RuntimeError('Unknown event received', str(event)) + while True: try: Camera = lookup_and_import(camera.modules, config.get('Camera', 'module'), 'camera') diff --git a/photobooth/printer/PrinterPyQt5.py b/photobooth/printer/PrinterPyQt5.py index 0e7b3e1..a3931c6 100644 --- a/photobooth/printer/PrinterPyQt5.py +++ b/photobooth/printer/PrinterPyQt5.py @@ -11,20 +11,33 @@ from . import Printer class PrinterPyQt5(Printer): - def __init__(self, page_size): + def __init__(self, page_size, print_pdf=False): - super().__init__() + super().__init__(page_size) self._printer = QPrinter(QPrinter.HighResolution) - self._printer.setOutputFormat(QPrinter.PdfFormat) self._printer.setPageSize(QPageSize(QSizeF(*page_size), QPageSize.Millimeter)) + self._print_pdf = print_pdf + if self._print_pdf: + self._counter = 0 + self._printer.setOutputFormat(QPrinter.PdfFormat) + self._printer.setFullPage(True) - def print(self, filename, picture): + + def print(self, picture): + if self._print_pdf: + self._printer.setOutputFileName('print_' + str(self._counter) + '.pdf') + self._counter += 1 + img = ImageQt.ImageQt(picture) img = img.scaled(self._printer.pageRect().size(), Qt.KeepAspectRatio, Qt.SmoothTransformation) - self._printer.setOutputFileName(filename) + + printable_size = self._printer.pageRect(QPrinter.DevicePixel) + offset = ( (printable_size.width() - img.width()) // 2, + (printable_size.height() - img.height()) // 2 ) + painter = QPainter(self._printer) - painter.drawImage(QPoint(0, 0), img) + painter.drawImage(QPoint(*offset), img) painter.end() diff --git a/photobooth/printer/__init__.py b/photobooth/printer/__init__.py index 03eb1d0..bc291ee 100644 --- a/photobooth/printer/__init__.py +++ b/photobooth/printer/__init__.py @@ -9,6 +9,27 @@ modules = ( class Printer: - def __init__(self): + def __init__(self, page_size): - pass \ No newline at end of file + self.pageSize = page_size + + + @property + def pageSize(self): + + return self._page_size + + + @pageSize.setter + def pageSize(self, page_size): + + if not isinstance(page_size, (list, tuple)) or len(page_size) != 2: + raise ValueError('page_size must be a list/tuple of length 2') + + self._page_size = page_size + + + def print(self, picture): + + raise NotImplementedError('print function not implemented!') + \ No newline at end of file