diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 01cabcfb90..41dadc2d84 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -959,6 +959,9 @@ class CuraApplication(QtApplication): qmlRegisterType(QualityManagementModel, "Cura", 1, 0, "QualityManagementModel") qmlRegisterType(MachineManagementModel, "Cura", 1, 0, "MachineManagementModel") + from cura.PrinterOutput.CameraView import CameraView + qmlRegisterType(CameraView, "Cura", 1, 0, "CameraView") + qmlRegisterSingletonType(QualityProfilesDropDownMenuModel, "Cura", 1, 0, "QualityProfilesDropDownMenuModel", self.getQualityProfilesDropDownMenuModel) qmlRegisterSingletonType(CustomQualityProfilesDropDownMenuModel, "Cura", 1, 0, diff --git a/cura/PrinterOutput/CameraView.py b/cura/PrinterOutput/CameraView.py new file mode 100644 index 0000000000..4a604b7abe --- /dev/null +++ b/cura/PrinterOutput/CameraView.py @@ -0,0 +1,41 @@ +# Copyright (c) 2018 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from PyQt5.QtCore import pyqtProperty, pyqtSignal +from PyQt5.QtGui import QImage +from PyQt5.QtQuick import QQuickPaintedItem + + +# +# A custom camera view that uses QQuickPaintedItem to present (or "paint") the image frames from a printer's +# network camera feed. +# +class CameraView(QQuickPaintedItem): + + def __init__(self, *args, **kwargs) -> None: + super().__init__(*args, **kwargs) + + self._image = QImage() + + imageChanged = pyqtSignal() + + def setImage(self, image: "QImage") -> None: + self._image = image + self.imageChanged.emit() + self.update() + + def getImage(self) -> "QImage": + return self._image + + image = pyqtProperty(QImage, fget = getImage, fset = setImage, notify = imageChanged) + + @pyqtProperty(int, notify = imageChanged) + def imageWidth(self) -> int: + return self._image.width() + + @pyqtProperty(int, notify = imageChanged) + def imageHeight(self) -> int: + return self._image.height() + + def paint(self, painter): + painter.drawImage(self.contentsBoundingRect(), self._image)