PrintJobOutputModel.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. # Copyright (c) 2017 Ultimaker B.V.
  2. # Cura is released under the terms of the LGPLv3 or higher.
  3. from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, pyqtSlot
  4. from typing import Optional, TYPE_CHECKING
  5. from PyQt5.QtCore import QUrl
  6. from PyQt5.QtGui import QImage
  7. if TYPE_CHECKING:
  8. from cura.PrinterOutput.PrinterOutputController import PrinterOutputController
  9. from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel
  10. from cura.PrinterOutput.ConfigurationModel import ConfigurationModel
  11. class PrintJobOutputModel(QObject):
  12. stateChanged = pyqtSignal()
  13. timeTotalChanged = pyqtSignal()
  14. timeElapsedChanged = pyqtSignal()
  15. nameChanged = pyqtSignal()
  16. keyChanged = pyqtSignal()
  17. assignedPrinterChanged = pyqtSignal()
  18. ownerChanged = pyqtSignal()
  19. configurationChanged = pyqtSignal()
  20. previewImageChanged = pyqtSignal()
  21. def __init__(self, output_controller: "PrinterOutputController", key: str = "", name: str = "", parent=None) -> None:
  22. super().__init__(parent)
  23. self._output_controller = output_controller
  24. self._state = ""
  25. self._time_total = 0
  26. self._time_elapsed = 0
  27. self._name = name # Human readable name
  28. self._key = key # Unique identifier
  29. self._assigned_printer = None # type: Optional[PrinterOutputModel]
  30. self._owner = "" # Who started/owns the print job?
  31. self._configuration = None # type: Optional[ConfigurationModel]
  32. self._preview_image_id = 0
  33. self._preview_image = None
  34. @pyqtProperty(QUrl, notify=previewImageChanged)
  35. def preview_image_url(self):
  36. self._preview_image_id += 1
  37. # There is an image provider that is called "camera". In order to ensure that the image qml object, that
  38. # requires a QUrl to function, updates correctly we add an increasing number. This causes to see the QUrl
  39. # as new (instead of relying on cached version and thus forces an update.
  40. temp = "image://print_job_preview/" + str(self._preview_image_id) + "/" + self._key
  41. return QUrl(temp, QUrl.TolerantMode)
  42. def getPreviewImage(self):
  43. return self._preview_image
  44. def updatePreviewImage(self, preview_image: Optional[QImage]):
  45. if self._preview_image != preview_image:
  46. self._preview_image = preview_image
  47. self.previewImageChanged.emit()
  48. @pyqtProperty(QObject, notify=configurationChanged)
  49. def configuration(self) -> Optional["ConfigurationModel"]:
  50. return self._configuration
  51. def updateConfiguration(self, configuration: Optional["ConfigurationModel"]) -> None:
  52. if self._configuration != configuration:
  53. self._configuration = configuration
  54. self.configurationChanged.emit()
  55. @pyqtProperty(str, notify=ownerChanged)
  56. def owner(self):
  57. return self._owner
  58. def updateOwner(self, owner):
  59. if self._owner != owner:
  60. self._owner = owner
  61. self.ownerChanged.emit()
  62. @pyqtProperty(QObject, notify=assignedPrinterChanged)
  63. def assignedPrinter(self):
  64. return self._assigned_printer
  65. def updateAssignedPrinter(self, assigned_printer: "PrinterOutputModel"):
  66. if self._assigned_printer != assigned_printer:
  67. old_printer = self._assigned_printer
  68. self._assigned_printer = assigned_printer
  69. if old_printer is not None:
  70. # If the previously assigned printer is set, this job is moved away from it.
  71. old_printer.updateActivePrintJob(None)
  72. self.assignedPrinterChanged.emit()
  73. @pyqtProperty(str, notify=keyChanged)
  74. def key(self):
  75. return self._key
  76. def updateKey(self, key: str):
  77. if self._key != key:
  78. self._key = key
  79. self.keyChanged.emit()
  80. @pyqtProperty(str, notify = nameChanged)
  81. def name(self):
  82. return self._name
  83. def updateName(self, name: str):
  84. if self._name != name:
  85. self._name = name
  86. self.nameChanged.emit()
  87. @pyqtProperty(int, notify = timeTotalChanged)
  88. def timeTotal(self):
  89. return self._time_total
  90. @pyqtProperty(int, notify = timeElapsedChanged)
  91. def timeElapsed(self):
  92. return self._time_elapsed
  93. @pyqtProperty(str, notify=stateChanged)
  94. def state(self):
  95. return self._state
  96. def updateTimeTotal(self, new_time_total):
  97. if self._time_total != new_time_total:
  98. self._time_total = new_time_total
  99. self.timeTotalChanged.emit()
  100. def updateTimeElapsed(self, new_time_elapsed):
  101. if self._time_elapsed != new_time_elapsed:
  102. self._time_elapsed = new_time_elapsed
  103. self.timeElapsedChanged.emit()
  104. def updateState(self, new_state):
  105. if self._state != new_state:
  106. self._state = new_state
  107. self.stateChanged.emit()
  108. @pyqtSlot(str)
  109. def setState(self, state):
  110. self._output_controller.setJobState(self, state)