91 lines
3.0 KiB
Python
91 lines
3.0 KiB
Python
'''
|
|
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.Gui.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):
|
|
try:
|
|
nextPreviewInformation = self.queue.get(block=False)
|
|
while self.queue.qsize() >= 2:
|
|
try:
|
|
self.queue.get(block=False)
|
|
except Empty:
|
|
continue
|
|
width = int(self.settings.value('outputWidth'))
|
|
height = int(self.settings.value('outputHeight'))
|
|
if self.background.width != width \
|
|
or self.background.height != height:
|
|
self.background = Checkerboard(width, height)
|
|
|
|
frame = self.background.copy()
|
|
log.info('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
|