mirror of
https://github.com/Ultimaker/Cura.git
synced 2025-07-06 22:47:29 -06:00
Added signal to prevent window closing if USB printer is printing
CURA-5384
This commit is contained in:
parent
c36d089113
commit
596a7b7169
4 changed files with 83 additions and 1 deletions
|
@ -1701,3 +1701,22 @@ class CuraApplication(QtApplication):
|
||||||
@pyqtSlot()
|
@pyqtSlot()
|
||||||
def showMoreInformationDialogForAnonymousDataCollection(self):
|
def showMoreInformationDialogForAnonymousDataCollection(self):
|
||||||
cast(SliceInfo, self._plugin_registry.getPluginObject("SliceInfoPlugin")).showMoreInfoDialog()
|
cast(SliceInfo, self._plugin_registry.getPluginObject("SliceInfoPlugin")).showMoreInfoDialog()
|
||||||
|
|
||||||
|
## Signal to check whether the application can be closed or not
|
||||||
|
checkCuraCloseChange = pyqtSignal()
|
||||||
|
|
||||||
|
# This variable is necessary to ensure that all methods that were subscribed for the checkCuraCloseChange event
|
||||||
|
# have been passed checks
|
||||||
|
_isCuraCanBeClosed = True
|
||||||
|
|
||||||
|
def setCuraCanBeClosed(self, value: bool):
|
||||||
|
self._isCuraCanBeClosed = value
|
||||||
|
|
||||||
|
@pyqtSlot(result=bool)
|
||||||
|
def preCloseEventHandler(self)-> bool:
|
||||||
|
|
||||||
|
# If any of checks failed then then _isCuraCanBeClosed should be set to False and Cura will not be closed
|
||||||
|
# after clicking the quit button
|
||||||
|
self.checkCuraCloseChange.emit()
|
||||||
|
|
||||||
|
return self._isCuraCanBeClosed
|
||||||
|
|
|
@ -435,6 +435,9 @@ class USBPrinterOutputDevice(PrinterOutputDevice):
|
||||||
|
|
||||||
self._gcode_position += 1
|
self._gcode_position += 1
|
||||||
|
|
||||||
|
def getIsPrinting(self)-> bool:
|
||||||
|
return self._is_printing
|
||||||
|
|
||||||
|
|
||||||
class FirmwareUpdateState(IntEnum):
|
class FirmwareUpdateState(IntEnum):
|
||||||
idle = 0
|
idle = 0
|
||||||
|
|
|
@ -6,7 +6,8 @@ import platform
|
||||||
import time
|
import time
|
||||||
import serial.tools.list_ports
|
import serial.tools.list_ports
|
||||||
|
|
||||||
from PyQt5.QtCore import QObject, pyqtSlot, pyqtProperty, pyqtSignal
|
from PyQt5.QtCore import QObject, pyqtSlot, pyqtSignal, QCoreApplication
|
||||||
|
from PyQt5.QtWidgets import QMessageBox
|
||||||
|
|
||||||
from UM.Logger import Logger
|
from UM.Logger import Logger
|
||||||
from UM.Resources import Resources
|
from UM.Resources import Resources
|
||||||
|
@ -50,6 +51,11 @@ class USBPrinterOutputDeviceManager(QObject, OutputDevicePlugin):
|
||||||
|
|
||||||
self._application.globalContainerStackChanged.connect(self.updateUSBPrinterOutputDevices)
|
self._application.globalContainerStackChanged.connect(self.updateUSBPrinterOutputDevices)
|
||||||
|
|
||||||
|
self._application.checkCuraCloseChange.connect(self.checkWheterUSBIsActiveOrNot)
|
||||||
|
|
||||||
|
self._lock = threading.Lock()
|
||||||
|
self._confirm_dialog_visible = False
|
||||||
|
|
||||||
# The method updates/reset the USB settings for all connected USB devices
|
# The method updates/reset the USB settings for all connected USB devices
|
||||||
def updateUSBPrinterOutputDevices(self):
|
def updateUSBPrinterOutputDevices(self):
|
||||||
for key, device in self._usb_output_devices.items():
|
for key, device in self._usb_output_devices.items():
|
||||||
|
@ -184,3 +190,51 @@ class USBPrinterOutputDeviceManager(QObject, OutputDevicePlugin):
|
||||||
@classmethod
|
@classmethod
|
||||||
def getInstance(cls, *args, **kwargs) -> "USBPrinterOutputDeviceManager":
|
def getInstance(cls, *args, **kwargs) -> "USBPrinterOutputDeviceManager":
|
||||||
return cls.__instance
|
return cls.__instance
|
||||||
|
|
||||||
|
# The method checks whether a printer is printing via USB or not before closing cura. If the printer is printing then pop up a
|
||||||
|
# dialog to confirm stop printing
|
||||||
|
def checkWheterUSBIsActiveOrNot(self)-> None:
|
||||||
|
|
||||||
|
is_printing = False
|
||||||
|
for key, device in self._usb_output_devices.items():
|
||||||
|
if type(device) is USBPrinterOutputDevice.USBPrinterOutputDevice:
|
||||||
|
if device.getIsPrinting():
|
||||||
|
is_printing = True
|
||||||
|
break
|
||||||
|
|
||||||
|
if is_printing:
|
||||||
|
if threading.current_thread() != threading.main_thread():
|
||||||
|
self._lock.acquire()
|
||||||
|
self._confirm_dialog_visible = True
|
||||||
|
|
||||||
|
CuraApplication.getInstance().messageBox(i18n_catalog.i18nc("@window:title", "Confirm stop printing"),
|
||||||
|
i18n_catalog.i18nc("@window:message","A USB print is in progress, closing Cura will stop this print. Are you sure?"),
|
||||||
|
buttons=QMessageBox.Yes + QMessageBox.No,
|
||||||
|
icon=QMessageBox.Question,
|
||||||
|
callback=self._messageBoxCallback)
|
||||||
|
# Wait for dialog result
|
||||||
|
self.waitForClose()
|
||||||
|
|
||||||
|
## Block thread until the dialog is closed.
|
||||||
|
def waitForClose(self)-> None:
|
||||||
|
if self._confirm_dialog_visible:
|
||||||
|
if threading.current_thread() != threading.main_thread():
|
||||||
|
self._lock.acquire()
|
||||||
|
self._lock.release()
|
||||||
|
else:
|
||||||
|
# If this is not run from a separate thread, we need to ensure that the events are still processed.
|
||||||
|
while self._confirm_dialog_visible:
|
||||||
|
time.sleep(1 / 50)
|
||||||
|
QCoreApplication.processEvents() # Ensure that the GUI does not freeze.
|
||||||
|
|
||||||
|
def _messageBoxCallback(self, button):
|
||||||
|
if button == QMessageBox.Yes:
|
||||||
|
self._application.setCuraCanBeClosed(True)
|
||||||
|
else:
|
||||||
|
self._application.setCuraCanBeClosed(False)
|
||||||
|
|
||||||
|
self._confirm_dialog_visible = False
|
||||||
|
try:
|
||||||
|
self._lock.release()
|
||||||
|
except:
|
||||||
|
pass
|
|
@ -22,6 +22,12 @@ UM.MainWindow
|
||||||
|
|
||||||
backgroundColor: UM.Theme.getColor("viewport_background")
|
backgroundColor: UM.Theme.getColor("viewport_background")
|
||||||
|
|
||||||
|
// Event which does the check before closing the window
|
||||||
|
onPreCloseChange:
|
||||||
|
{
|
||||||
|
event.accepted = CuraApplication.preCloseEventHandler()
|
||||||
|
}
|
||||||
|
|
||||||
// This connection is here to support legacy printer output devices that use the showPrintMonitor signal on Application to switch to the monitor stage
|
// This connection is here to support legacy printer output devices that use the showPrintMonitor signal on Application to switch to the monitor stage
|
||||||
// It should be phased out in newer plugin versions.
|
// It should be phased out in newer plugin versions.
|
||||||
Connections
|
Connections
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue