This repository has been archived on 2020-08-22. You can view files and clone it, but cannot push or open issues or pull requests.
pyaudviz/src/preview_thread.py

83 lines
2.7 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
import core
from queue import Queue, Empty
import os
from frame import FloodFrame
class Worker(QtCore.QObject):
imageCreated = pyqtSignal(['QImage'])
error = pyqtSignal()
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 = self.parent.core
self.queue = queue
self.core.settings = parent.settings
self.stackedWidget = parent.window.stackedWidget
# create checkerboard background to represent transparency
self.background = FloodFrame(1920, 1080, (0, 0, 0, 0))
self.background.paste(Image.open(os.path.join(
self.core.wd, "background.png")))
@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.core.settings.value('outputWidth'))
height = int(self.core.settings.value('outputHeight'))
frame = self.background.copy()
frame = frame.resize((width, height))
components = nextPreviewInformation["components"]
for component in reversed(components):
try:
frame = Image.alpha_composite(
frame, component.previewRender(self)
)
except ValueError as e:
self.parent.showMessage(
msg="Bad frame returned by %s's previewRender method. "
"This is a fatal error." %
str(component),
detail=str(e),
icon='Warning',
parent=None # mainwindow is in a different thread
)
from frame import BlankFrame
self.imageCreated.emit(ImageQt(BlankFrame))
self.error.emit()
break
else:
self.imageCreated.emit(ImageQt(frame))
except Empty:
True