diff --git a/cura/API/Account.py b/cura/API/Account.py index 2e48a040ad..59ac5381f3 100644 --- a/cura/API/Account.py +++ b/cura/API/Account.py @@ -178,7 +178,9 @@ class Account(QObject): if self._error_message: self._error_message.hide() Logger.log("w", "Failed to login: %s", error_message) - self._error_message = Message(error_message, title = i18n_catalog.i18nc("@info:title", "Login failed")) + self._error_message = Message(error_message, + title = i18n_catalog.i18nc("@info:title", "Login failed"), + message_type = Message.MessageType.ERROR) self._error_message.show() self._logged_in = False self.loginStateChanged.emit(False) diff --git a/cura/Arranging/ArrangeObjectsJob.py b/cura/Arranging/ArrangeObjectsJob.py index e65a442acb..d45dc2c67f 100644 --- a/cura/Arranging/ArrangeObjectsJob.py +++ b/cura/Arranging/ArrangeObjectsJob.py @@ -40,6 +40,6 @@ class ArrangeObjectsJob(Job): i18n_catalog.i18nc("@info:status", "Unable to find a location within the build volume for all objects"), title = i18n_catalog.i18nc("@info:title", "Can't Find Location"), - message_type = Message.MessageType.ERROR) + message_type = Message.MessageType.WARNING) no_full_solution_message.show() self.finished.emit(self) diff --git a/cura/Backups/Backup.py b/cura/Backups/Backup.py index 1f6a961733..71567148ff 100644 --- a/cura/Backups/Backup.py +++ b/cura/Backups/Backup.py @@ -119,7 +119,7 @@ class Backup: def _showMessage(self, message: str) -> None: """Show a UI message.""" - Message(message, title=self.catalog.i18nc("@info:title", "Backup"), lifetime=30).show() + Message(message, title=self.catalog.i18nc("@info:title", "Backup")).show() def restore(self) -> bool: """Restore this back-up. @@ -154,7 +154,10 @@ class Backup: archive = ZipFile(io.BytesIO(self.zip_file), "r") except LookupError as e: Logger.log("d", f"The following error occurred while trying to restore a Cura backup: {str(e)}") - self._showMessage(self.catalog.i18nc("@info:backup_failed", "The following error occurred while trying to restore a Cura backup:") + str(e)) + Message(self.catalog.i18nc("@info:backup_failed", "The following error occurred while trying to restore a Cura backup:") + str(e), + title = self.catalog.i18nc("@info:title", "Backup"), + message_type = Message.MessageType.ERROR).show() + return False extracted = self._extractArchive(archive, version_data_dir) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index c8570c33e6..463b121cad 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1798,8 +1798,9 @@ class CuraApplication(QtApplication): if extension in self._non_sliceable_extensions: message = Message( self._i18n_catalog.i18nc("@info:status", - "Only one G-code file can be loaded at a time. Skipped importing {0}", - filename), title = self._i18n_catalog.i18nc("@info:title", "Warning")) + "Only one G-code file can be loaded at a time. Skipped importing {0}", filename), + title = self._i18n_catalog.i18nc("@info:title", "Warning"), + message_type = Message.MessageType.WARNING) message.show() return # If file being loaded is non-slicable file, then prevent loading of any other files @@ -1808,8 +1809,9 @@ class CuraApplication(QtApplication): if extension in self._non_sliceable_extensions: message = Message( self._i18n_catalog.i18nc("@info:status", - "Can't open any other file if G-code is loading. Skipped importing {0}", - filename), title = self._i18n_catalog.i18nc("@info:title", "Error")) + "Can't open any other file if G-code is loading. Skipped importing {0}", filename), + title = self._i18n_catalog.i18nc("@info:title", "Error"), + message_type = Message.MessageType.ERROR) message.show() return diff --git a/cura/MultiplyObjectsJob.py b/cura/MultiplyObjectsJob.py index 1ba78edacf..4c1caf137c 100644 --- a/cura/MultiplyObjectsJob.py +++ b/cura/MultiplyObjectsJob.py @@ -74,5 +74,6 @@ class MultiplyObjectsJob(Job): if not found_solution_for_all: no_full_solution_message = Message( i18n_catalog.i18nc("@info:status", "Unable to find a location within the build volume for all objects"), - title = i18n_catalog.i18nc("@info:title", "Placing Object")) + title = i18n_catalog.i18nc("@info:title", "Placing Object"), + message_type = Message.MessageType.WARNING) no_full_solution_message.show() diff --git a/cura/OAuth2/AuthorizationService.py b/cura/OAuth2/AuthorizationService.py index 96091f9c11..e416fb63c4 100644 --- a/cura/OAuth2/AuthorizationService.py +++ b/cura/OAuth2/AuthorizationService.py @@ -187,7 +187,8 @@ class AuthorizationService: except OSError: Logger.logException("w", "Unable to create authorization request server") Message(i18n_catalog.i18nc("@info", "Unable to start a new sign in process. Check if another sign in attempt is still active."), - title=i18n_catalog.i18nc("@info:title", "Warning")).show() + title=i18n_catalog.i18nc("@info:title", "Warning"), + message_type = Message.MessageType.WARNING).show() return auth_url = self._generate_auth_url(query_parameters_dict, force_browser_logout) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index 7e6c3f5d20..cd9255cdc0 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -150,11 +150,13 @@ class CuraContainerRegistry(ContainerRegistry): Logger.log("w", "Failed to export profile to %s: Writer plugin reported failure.", file_name) m = Message(catalog.i18nc("@info:status Don't translate the XML tag !", "Failed to export profile to {0}: Writer plugin reported failure.", file_name), lifetime = 0, - title = catalog.i18nc("@info:title", "Error")) + title = catalog.i18nc("@info:title", "Error"), + message_type = Message.MessageType.ERROR) m.show() return False m = Message(catalog.i18nc("@info:status Don't translate the XML tag !", "Exported profile to {0}", file_name), - title = catalog.i18nc("@info:title", "Export succeeded")) + title = catalog.i18nc("@info:title", "Export succeeded"), + message_type = Message.MessageType.POSITIVE) m.show() return True diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index d0442e083b..ee8652839d 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -540,7 +540,8 @@ class ThreeMFWorkspaceReader(WorkspaceReader): "Project file {0} contains an unknown machine type" " {1}. Cannot import the machine." " Models will be imported instead.", file_name, machine_definition_id), - title = i18n_catalog.i18nc("@info:title", "Open Project File")) + title = i18n_catalog.i18nc("@info:title", "Open Project File"), + message_type = Message.MessageType.WARNING) message.show() Logger.log("i", "Could unknown machine definition %s in project file %s, cannot import it.", @@ -637,14 +638,16 @@ class ThreeMFWorkspaceReader(WorkspaceReader): except EnvironmentError as e: message = Message(i18n_catalog.i18nc("@info:error Don't translate the XML tags or !", "Project file {0} is suddenly inaccessible: {1}.", file_name, str(e)), - title = i18n_catalog.i18nc("@info:title", "Can't Open Project File")) + title = i18n_catalog.i18nc("@info:title", "Can't Open Project File"), + message_type = Message.MessageType.ERROR) message.show() self.setWorkspaceName("") return [], {} except zipfile.BadZipFile as e: message = Message(i18n_catalog.i18nc("@info:error Don't translate the XML tags or !", "Project file {0} is corrupt: {1}.", file_name, str(e)), - title = i18n_catalog.i18nc("@info:title", "Can't Open Project File")) + title = i18n_catalog.i18nc("@info:title", "Can't Open Project File"), + message_type = Message.MessageType.ERROR) message.show() self.setWorkspaceName("") return [], {} @@ -696,7 +699,8 @@ class ThreeMFWorkspaceReader(WorkspaceReader): if not global_stacks: message = Message(i18n_catalog.i18nc("@info:error Don't translate the XML tag !", "Project file {0} is made using profiles that" - " are unknown to this version of Ultimaker Cura.", file_name)) + " are unknown to this version of Ultimaker Cura.", file_name), + message_type = Message.MessageType.ERROR) message.show() self.setWorkspaceName("") return [], {} diff --git a/plugins/CuraDrive/src/DrivePluginExtension.py b/plugins/CuraDrive/src/DrivePluginExtension.py index 3a7a59a172..f42ffea9f7 100644 --- a/plugins/CuraDrive/src/DrivePluginExtension.py +++ b/plugins/CuraDrive/src/DrivePluginExtension.py @@ -114,13 +114,17 @@ class DrivePluginExtension(QObject, Extension): self.restoringStateChanged.emit() if error_message: self.backupIdBeingRestored = "" - Message(error_message, title = catalog.i18nc("@info:title", "Backup")).show() + Message(error_message, + title = catalog.i18nc("@info:title", "Backup"), + message_type = Message.MessageType.ERROR).show() def _onCreatingStateChanged(self, is_creating: bool = False, error_message: str = None) -> None: self._is_creating_backup = is_creating self.creatingStateChanged.emit() if error_message: - Message(error_message, title = catalog.i18nc("@info:title", "Backup")).show() + Message(error_message, + title = catalog.i18nc("@info:title", "Backup"), + message_type = Message.MessageType.ERROR).show() else: self._storeBackupDate() if not is_creating and not error_message: diff --git a/plugins/DigitalLibrary/src/DFFileExportAndUploadManager.py b/plugins/DigitalLibrary/src/DFFileExportAndUploadManager.py index 69163f9cdf..65489e8b5f 100644 --- a/plugins/DigitalLibrary/src/DFFileExportAndUploadManager.py +++ b/plugins/DigitalLibrary/src/DFFileExportAndUploadManager.py @@ -73,6 +73,7 @@ class DFFileExportAndUploadManager: text = "Your {} uploaded to '{}'.".format("file was" if len(self._file_upload_job_metadata) <= 1 else "files were", self._library_project_name), title = "Upload successful", lifetime = 0, + message_type=Message.MessageType.POSITIVE ) self._generic_success_message.addAction( "open_df_project", @@ -81,8 +82,6 @@ class DFFileExportAndUploadManager: ) self._generic_success_message.actionTriggered.connect(self._onMessageActionTriggered) - - def _onCuraProjectFileExported(self, job: ExportFileJob) -> None: """Handler for when the DF Library workspace file (3MF) has been created locally. diff --git a/plugins/DigitalLibrary/src/DigitalFactoryController.py b/plugins/DigitalLibrary/src/DigitalFactoryController.py index cd0f0be638..c0323100c8 100644 --- a/plugins/DigitalLibrary/src/DigitalFactoryController.py +++ b/plugins/DigitalLibrary/src/DigitalFactoryController.py @@ -530,7 +530,8 @@ class DigitalFactoryController(QObject): Message( text = "Failed to write to temporary file for '{}'.".format(file_name), title = "File-system error", - lifetime = 10 + lifetime = 10, + message_type=Message.MessageType.ERROR ).show() return @@ -544,7 +545,8 @@ class DigitalFactoryController(QObject): Message( text = "Failed Digital Library download for '{}'.".format(f), title = "Network error {}".format(error), - lifetime = 10 + lifetime = 10, + message_type=Message.MessageType.ERROR ).show() download_manager = HttpRequestManager.getInstance() @@ -589,7 +591,10 @@ class DigitalFactoryController(QObject): if filename == "": Logger.log("w", "The file name cannot be empty.") - Message(text = "Cannot upload file with an empty name to the Digital Library", title = "Empty file name provided", lifetime = 0).show() + Message(text = "Cannot upload file with an empty name to the Digital Library", + title = "Empty file name provided", + lifetime = 0, + message_type = Message.MessageType.ERROR).show() return self._saveFileToSelectedProjectHelper(filename, formats) diff --git a/plugins/ModelChecker/ModelChecker.py b/plugins/ModelChecker/ModelChecker.py index 4f2f8bdf40..321ce8d007 100644 --- a/plugins/ModelChecker/ModelChecker.py +++ b/plugins/ModelChecker/ModelChecker.py @@ -28,7 +28,8 @@ class ModelChecker(QObject, Extension): self._caution_message = Message("", #Message text gets set when the message gets shown, to display the models in question. lifetime = 0, - title = catalog.i18nc("@info:title", "3D Model Assistant")) + title = catalog.i18nc("@info:title", "3D Model Assistant"), + message_type = Message.MessageType.WARNING) self._change_timer = QTimer() self._change_timer.setInterval(200) diff --git a/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py b/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py index ccdd27ef16..556935756c 100644 --- a/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py +++ b/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py @@ -136,7 +136,8 @@ class RemovableDriveOutputDevice(OutputDevice): except: Logger.logException("w", "An execption occured while trying to write to removable drive.") message = Message(catalog.i18nc("@info:status", "Could not save to removable drive {0}: {1}").format(self.getName(),str(job.getError())), - title = catalog.i18nc("@info:title", "Error")) + title = catalog.i18nc("@info:title", "Error"), + message_type = Message.MessageType.ERROR) message.show() self.writeError.emit(self) return @@ -144,13 +145,17 @@ class RemovableDriveOutputDevice(OutputDevice): self._writing = False self.writeFinished.emit(self) if job.getResult(): - message = Message(catalog.i18nc("@info:status", "Saved to Removable Drive {0} as {1}").format(self.getName(), os.path.basename(job.getFileName())), title = catalog.i18nc("@info:title", "File Saved")) + message = Message(catalog.i18nc("@info:status", "Saved to Removable Drive {0} as {1}").format(self.getName(), os.path.basename(job.getFileName())), + title = catalog.i18nc("@info:title", "File Saved"), + message_type = Message.MessageType.POSITIVE) message.addAction("eject", catalog.i18nc("@action:button", "Eject"), "eject", catalog.i18nc("@action", "Eject removable device {0}").format(self.getName())) message.actionTriggered.connect(self._onActionTriggered) message.show() self.writeSuccess.emit(self) else: - message = Message(catalog.i18nc("@info:status", "Could not save to removable drive {0}: {1}").format(self.getName(), str(job.getError())), title = catalog.i18nc("@info:title", "Warning")) + message = Message(catalog.i18nc("@info:status", "Could not save to removable drive {0}: {1}").format(self.getName(), str(job.getError())), + title = catalog.i18nc("@info:title", "Error"), + message_type = Message.MessageType.ERROR) message.show() self.writeError.emit(self) job.getStream().close() diff --git a/plugins/SimulationView/SimulationView.py b/plugins/SimulationView/SimulationView.py index 57209f2678..5fc2669d2d 100644 --- a/plugins/SimulationView/SimulationView.py +++ b/plugins/SimulationView/SimulationView.py @@ -126,9 +126,13 @@ class SimulationView(CuraView): self._compatibility_mode = self._evaluateCompatibilityMode() self._wireprint_warning_message = Message(catalog.i18nc("@info:status", "Cura does not accurately display layers when Wire Printing is enabled."), - title = catalog.i18nc("@info:title", "Simulation View")) - self._slice_first_warning_message = Message(catalog.i18nc("@info:status", "Nothing is shown because you need to slice first."), title = catalog.i18nc("@info:title", "No layers to show"), - option_text = catalog.i18nc("@info:option_text", "Do not show this message again"), option_state = False) + title = catalog.i18nc("@info:title", "Simulation View"), + message_type = Message.MessageType.WARNING) + self._slice_first_warning_message = Message(catalog.i18nc("@info:status", "Nothing is shown because you need to slice first."), + title = catalog.i18nc("@info:title", "No layers to show"), + option_text = catalog.i18nc("@info:option_text", "Do not show this message again"), + option_state = False, + message_type = Message.MessageType.WARNING) self._slice_first_warning_message.optionToggled.connect(self._onDontAskMeAgain) CuraApplication.getInstance().getPreferences().addPreference(self._no_layers_warning_preference, True) diff --git a/plugins/SolidView/SolidView.py b/plugins/SolidView/SolidView.py index 3ecc84eb37..f12c1aae01 100644 --- a/plugins/SolidView/SolidView.py +++ b/plugins/SolidView/SolidView.py @@ -72,7 +72,8 @@ class SolidView(View): lifetime = 60 * 5, # leave message for 5 minutes title = catalog.i18nc("@info:title", "Model Errors"), option_text = catalog.i18nc("@info:option_text", "Do not show this message again"), - option_state = False + option_state = False, + message_type=Message.MessageType.WARNING ) self._xray_warning_message.optionToggled.connect(self._onDontAskMeAgain) application.getPreferences().addPreference(self._show_xray_warning_preference, True) diff --git a/plugins/Toolbox/src/CloudSync/SyncOrchestrator.py b/plugins/Toolbox/src/CloudSync/SyncOrchestrator.py index a85c13f639..bb37c6d4a9 100644 --- a/plugins/Toolbox/src/CloudSync/SyncOrchestrator.py +++ b/plugins/Toolbox/src/CloudSync/SyncOrchestrator.py @@ -111,4 +111,4 @@ class SyncOrchestrator(Extension): """Logs an error and shows it to the user""" Logger.error(text) - Message(text, lifetime=0).show() + Message(text, lifetime = 0, message_type = Message.MessageType.ERROR).show() diff --git a/plugins/UM3NetworkPrinting/src/Messages/LegacyDeviceNoLongerSupportedMessage.py b/plugins/UM3NetworkPrinting/src/Messages/LegacyDeviceNoLongerSupportedMessage.py index 146767467a..9014cc2d70 100644 --- a/plugins/UM3NetworkPrinting/src/Messages/LegacyDeviceNoLongerSupportedMessage.py +++ b/plugins/UM3NetworkPrinting/src/Messages/LegacyDeviceNoLongerSupportedMessage.py @@ -19,7 +19,8 @@ class LegacyDeviceNoLongerSupportedMessage(Message): "running Ultimaker Connect. Please update the printer to the " "latest firmware."), title = I18N_CATALOG.i18nc("@info:title", "Update your printer"), - lifetime = 10 + lifetime = 10, + message_type = Message.MessageType.WARNING ) def show(self) -> None: diff --git a/plugins/UM3NetworkPrinting/src/Messages/NotClusterHostMessage.py b/plugins/UM3NetworkPrinting/src/Messages/NotClusterHostMessage.py index 70bfa769ee..059b81b39e 100644 --- a/plugins/UM3NetworkPrinting/src/Messages/NotClusterHostMessage.py +++ b/plugins/UM3NetworkPrinting/src/Messages/NotClusterHostMessage.py @@ -29,7 +29,8 @@ class NotClusterHostMessage(Message): "it as a group host.", device.name), title = I18N_CATALOG.i18nc("@info:title", "Not a group host"), lifetime = 0, - dismissable = True + dismissable = True, + message_type = Message.MessageType.ERROR ) self._address = device.address self.addAction("", I18N_CATALOG.i18nc("@action", "Configure group"), "", "") diff --git a/plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadBlockedMessage.py b/plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadBlockedMessage.py index 39dc985cb8..bfb6ece4cd 100644 --- a/plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadBlockedMessage.py +++ b/plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadBlockedMessage.py @@ -14,5 +14,6 @@ class PrintJobUploadBlockedMessage(Message): super().__init__( text = I18N_CATALOG.i18nc("@info:status", "Please wait until the current job has been sent."), title = I18N_CATALOG.i18nc("@info:title", "Print error"), - lifetime = 10 + lifetime = 10, + message_type = Message.MessageType.WARNING ) diff --git a/plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadErrorMessage.py b/plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadErrorMessage.py index 9feb4b4970..4b30013b9c 100644 --- a/plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadErrorMessage.py +++ b/plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadErrorMessage.py @@ -13,5 +13,6 @@ class PrintJobUploadErrorMessage(Message): def __init__(self, message: str = None) -> None: super().__init__( text = message or I18N_CATALOG.i18nc("@info:text", "Could not upload the data to the printer."), - title = I18N_CATALOG.i18nc("@info:title", "Network error") + title = I18N_CATALOG.i18nc("@info:title", "Network error"), + message_type=Message.MessageType.ERROR ) diff --git a/plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadQueueFullMessage.py b/plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadQueueFullMessage.py index dc910e9e1b..b9f4b3b704 100644 --- a/plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadQueueFullMessage.py +++ b/plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadQueueFullMessage.py @@ -15,5 +15,6 @@ class PrintJobUploadQueueFullMessage(Message): super().__init__( text = I18N_CATALOG.i18nc("@info:status", "Print job queue is full. The printer can't accept a new job."), title = I18N_CATALOG.i18nc("@info:title", "Queue Full"), - lifetime = 10 + lifetime = 10, + message_type=Message.MessageType.WARNING ) diff --git a/plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadSuccessMessage.py b/plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadSuccessMessage.py index aa3d72ccd8..7fa7340cff 100644 --- a/plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadSuccessMessage.py +++ b/plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadSuccessMessage.py @@ -13,5 +13,6 @@ class PrintJobUploadSuccessMessage(Message): def __init__(self) -> None: super().__init__( text = I18N_CATALOG.i18nc("@info:status", "Print job was successfully sent to the printer."), - title = I18N_CATALOG.i18nc("@info:title", "Data Sent") + title = I18N_CATALOG.i18nc("@info:title", "Data Sent"), + message_type = Message.MessageType.POSITIVE ) diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index 70a1f4333e..1e4a83eba3 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -131,7 +131,9 @@ class USBPrinterOutputDevice(PrinterOutputDevice): """ if self._is_printing: - message = Message(text = catalog.i18nc("@message", "A print is still in progress. Cura cannot start another print via USB until the previous print has completed."), title = catalog.i18nc("@message", "Print in Progress")) + message = Message(text = catalog.i18nc("@message", "A print is still in progress. Cura cannot start another print via USB until the previous print has completed."), + title = catalog.i18nc("@message", "Print in Progress"), + message_type = Message.MessageType.WARNING) message.show() return # Already printing self.writeStarted.emit(self)