diff options
| author | tassaron | 2017-08-14 16:39:53 -0400 |
|---|---|---|
| committer | tassaron | 2017-08-14 16:39:53 -0400 |
| commit | a327bec4e42cc572fb84e559025e888a4a20edd3 (patch) | |
| tree | 2b98cec6f27eda23389e1ec25b0e5cc0432de7f4 /src/gui/preview_thread.py | |
| parent | 39d6a4e5af94a8aa612a009bbe235715b84e7abc (diff) | |
organizing GUImode-specific code
Diffstat (limited to 'src/gui/preview_thread.py')
| -rw-r--r-- | src/gui/preview_thread.py | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/src/gui/preview_thread.py b/src/gui/preview_thread.py new file mode 100644 index 0000000..9615884 --- /dev/null +++ b/src/gui/preview_thread.py @@ -0,0 +1,90 @@ +''' + Thread that runs to create QImages for MainWindow's preview label. + Processes a queue of component lists. +''' +from PyQt5 import QtCore, QtGui, uic +from PyQt5.QtCore import pyqtSignal, pyqtSlot +from PIL import Image +from PIL.ImageQt import ImageQt +from queue import Queue, Empty +import os +import logging + +from toolkit.frame import Checkerboard +from toolkit import disableWhenOpeningProject + + +log = logging.getLogger("AVP.PreviewThread") + + +class Worker(QtCore.QObject): + + imageCreated = pyqtSignal(QtGui.QImage) + error = pyqtSignal(str) + + def __init__(self, parent=None, queue=None): + QtCore.QObject.__init__(self) + parent.newTask.connect(self.createPreviewImage) + parent.processTask.connect(self.process) + self.parent = parent + self.core = parent.core + self.settings = parent.settings + self.queue = queue + + width = int(self.settings.value('outputWidth')) + height = int(self.settings.value('outputHeight')) + self.background = Checkerboard(width, height) + + @disableWhenOpeningProject + @pyqtSlot(list) + def createPreviewImage(self, components): + dic = { + "components": components, + } + self.queue.put(dic) + + @pyqtSlot() + def process(self): + width = int(self.settings.value('outputWidth')) + height = int(self.settings.value('outputHeight')) + try: + nextPreviewInformation = self.queue.get(block=False) + while self.queue.qsize() >= 2: + try: + self.queue.get(block=False) + except Empty: + continue + if self.background.width != width \ + or self.background.height != height: + self.background = Checkerboard(width, height) + + frame = self.background.copy() + log.debug('Creating new preview frame') + components = nextPreviewInformation["components"] + for component in reversed(components): + try: + component.lockSize(width, height) + newFrame = component.previewRender() + component.unlockSize() + frame = Image.alpha_composite( + frame, newFrame + ) + + except ValueError as e: + errMsg = "Bad frame returned by %s's preview renderer. " \ + "%s. New frame size was %s*%s; should be %s*%s." % ( + str(component), str(e).capitalize(), + newFrame.width, newFrame.height, + width, height + ) + log.critical(errMsg) + self.error.emit(errMsg) + break + except RuntimeError as e: + log.error(str(e)) + else: + self.frame = ImageQt(frame) + self.imageCreated.emit(QtGui.QImage(self.frame)) + + except Empty: + True |
