From 1f5672accab09c975e1dbd49def4d95c5d236345 Mon Sep 17 00:00:00 2001 From: Konstantinos Karmas Date: Mon, 4 Oct 2021 15:55:06 +0200 Subject: [PATCH 01/10] Check if new materials were installed on initialization When the MaterialManagementModel is initialized, it will check whether during this startup new materials were installed. If that's the case, then it will show the prompt message to sync those materials with the printers, which should initiate the sync materials flow. CURA-8254 --- .../Models/MaterialManagementModel.py | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/cura/Machines/Models/MaterialManagementModel.py b/cura/Machines/Models/MaterialManagementModel.py index c75e16cd63..306d760d63 100644 --- a/cura/Machines/Models/MaterialManagementModel.py +++ b/cura/Machines/Models/MaterialManagementModel.py @@ -7,6 +7,8 @@ from typing import Any, Dict, Optional, TYPE_CHECKING import uuid # To generate new GUIDs for new materials. import zipfile # To export all materials in a .zip archive. +from PyQt5.QtGui import QDesktopServices + from UM.i18n import i18nCatalog from UM.Logger import Logger from UM.Message import Message @@ -21,6 +23,7 @@ if TYPE_CHECKING: catalog = i18nCatalog("cura") + class MaterialManagementModel(QObject): favoritesChanged = pyqtSignal(str) """Triggered when a favorite is added or removed. @@ -28,6 +31,56 @@ class MaterialManagementModel(QObject): :param The base file of the material is provided as parameter when this emits """ + def __init__(self, parent: Optional[QObject] = None) -> None: + super().__init__(parent = parent) + self._checkIfNewMaterialsWereInstalled() + + def _checkIfNewMaterialsWereInstalled(self): + application = cura.CuraApplication.CuraApplication.getInstance() + new_materials_installed = False + print(application.getPackageManager().installed_packages) + for package_id, package_info in application.getPackageManager().installed_packages.items(): + new_materials_installed = package_info["package_info"]["package_type"] == "material" + if new_materials_installed: + self._showSyncNewMaterialsMessage() + + def _showSyncNewMaterialsMessage(self): + sync_materials_message = Message( + text = catalog.i18nc("@action:button", + "Please sync the material profiles with your pinter before starting to print."), + title = catalog.i18nc("@action:button", "New materials installed"), + message_type = Message.MessageType.WARNING, + lifetime = 0 + ) + + sync_materials_message.addAction( + "sync", + name = catalog.i18nc("@action:button", "Sync materials with printers"), + icon = "", + description = "Sync your newly installed materials with your printers.", + button_align = Message.ActionButtonAlignment.ALIGN_RIGHT + ) + + sync_materials_message.addAction( + "learn_more", + name = catalog.i18nc("@action:button", "Learn more"), + icon = "", + description = "Learn more.", + button_align = Message.ActionButtonAlignment.ALIGN_LEFT, + button_style = Message.ActionButtonStyle.LINK + ) + sync_materials_message.actionTriggered.connect(self._onSyncMaterialsMessageActionTriggered) + sync_materials_message.show() + + @staticmethod + def _onSyncMaterialsMessageActionTriggered(sync_message: Optional[Message], sync_message_action: Optional[str]): + if sync_message_action == "sync": + QDesktopServices.openUrl(QUrl("https://example.com/sync")) + if sync_message is not None: + sync_message.hide() + elif sync_message_action == "learn_more": + QDesktopServices.openUrl(QUrl("https://example.com/learn_more")) + @pyqtSlot("QVariant", result = bool) def canMaterialBeRemoved(self, material_node: "MaterialNode") -> bool: """Can a certain material be deleted, or is it still in use in one of the container stacks anywhere? From 4b7f385077477a4d73e61007d8468f701a343cf7 Mon Sep 17 00:00:00 2001 From: Konstantinos Karmas Date: Mon, 4 Oct 2021 16:43:17 +0200 Subject: [PATCH 02/10] Add external link to "Learn more" action CURA-8254 --- cura/Machines/Models/MaterialManagementModel.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/cura/Machines/Models/MaterialManagementModel.py b/cura/Machines/Models/MaterialManagementModel.py index 306d760d63..c174625bb7 100644 --- a/cura/Machines/Models/MaterialManagementModel.py +++ b/cura/Machines/Models/MaterialManagementModel.py @@ -47,7 +47,7 @@ class MaterialManagementModel(QObject): def _showSyncNewMaterialsMessage(self): sync_materials_message = Message( text = catalog.i18nc("@action:button", - "Please sync the material profiles with your pinter before starting to print."), + "Please sync the material profiles with your printer before starting to print."), title = catalog.i18nc("@action:button", "New materials installed"), message_type = Message.MessageType.WARNING, lifetime = 0 @@ -57,7 +57,6 @@ class MaterialManagementModel(QObject): "sync", name = catalog.i18nc("@action:button", "Sync materials with printers"), icon = "", - description = "Sync your newly installed materials with your printers.", button_align = Message.ActionButtonAlignment.ALIGN_RIGHT ) @@ -65,21 +64,20 @@ class MaterialManagementModel(QObject): "learn_more", name = catalog.i18nc("@action:button", "Learn more"), icon = "", - description = "Learn more.", button_align = Message.ActionButtonAlignment.ALIGN_LEFT, button_style = Message.ActionButtonStyle.LINK ) sync_materials_message.actionTriggered.connect(self._onSyncMaterialsMessageActionTriggered) sync_materials_message.show() - @staticmethod - def _onSyncMaterialsMessageActionTriggered(sync_message: Optional[Message], sync_message_action: Optional[str]): + def _onSyncMaterialsMessageActionTriggered(self, sync_message: Optional[Message], sync_message_action: Optional[str]): if sync_message_action == "sync": - QDesktopServices.openUrl(QUrl("https://example.com/sync")) + QDesktopServices.openUrl(QUrl("https://example.com/openSyncAllWindow")) + # self.openSyncAllWindow() if sync_message is not None: sync_message.hide() elif sync_message_action == "learn_more": - QDesktopServices.openUrl(QUrl("https://example.com/learn_more")) + QDesktopServices.openUrl(QUrl("https://support.ultimaker.com/hc/en-us/articles/360013137919?utm_source=cura&utm_medium=software&utm_campaign=sync-material-printer")) @pyqtSlot("QVariant", result = bool) def canMaterialBeRemoved(self, material_node: "MaterialNode") -> bool: From ce34e16cdd731ff07c6362a084c0cf7f5b5acda5 Mon Sep 17 00:00:00 2001 From: Konstantinos Karmas Date: Mon, 4 Oct 2021 16:47:48 +0200 Subject: [PATCH 03/10] Add documentation CURA-8254 --- cura/Machines/Models/MaterialManagementModel.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/cura/Machines/Models/MaterialManagementModel.py b/cura/Machines/Models/MaterialManagementModel.py index c174625bb7..8747e2279c 100644 --- a/cura/Machines/Models/MaterialManagementModel.py +++ b/cura/Machines/Models/MaterialManagementModel.py @@ -36,9 +36,12 @@ class MaterialManagementModel(QObject): self._checkIfNewMaterialsWereInstalled() def _checkIfNewMaterialsWereInstalled(self): + """ + Checks whether new material packages were installed in the latest startup. If there were, then it shows + a message prompting the user to sync the materials with their printers. + """ application = cura.CuraApplication.CuraApplication.getInstance() new_materials_installed = False - print(application.getPackageManager().installed_packages) for package_id, package_info in application.getPackageManager().installed_packages.items(): new_materials_installed = package_info["package_info"]["package_type"] == "material" if new_materials_installed: @@ -57,6 +60,7 @@ class MaterialManagementModel(QObject): "sync", name = catalog.i18nc("@action:button", "Sync materials with printers"), icon = "", + description = "Sync your newly installed materials with your printers.", button_align = Message.ActionButtonAlignment.ALIGN_RIGHT ) @@ -64,6 +68,7 @@ class MaterialManagementModel(QObject): "learn_more", name = catalog.i18nc("@action:button", "Learn more"), icon = "", + description = "Learn more about syncing your newly installed materials with your printers.", button_align = Message.ActionButtonAlignment.ALIGN_LEFT, button_style = Message.ActionButtonStyle.LINK ) From 5732fc2b51f457da3656407dfdf8458216f6acd4 Mon Sep 17 00:00:00 2001 From: Konstantinos Karmas Date: Mon, 4 Oct 2021 17:05:36 +0200 Subject: [PATCH 04/10] Update campaign tags CURA-8254 --- cura/Machines/Models/MaterialManagementModel.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/Machines/Models/MaterialManagementModel.py b/cura/Machines/Models/MaterialManagementModel.py index 8747e2279c..56315be86e 100644 --- a/cura/Machines/Models/MaterialManagementModel.py +++ b/cura/Machines/Models/MaterialManagementModel.py @@ -82,7 +82,7 @@ class MaterialManagementModel(QObject): if sync_message is not None: sync_message.hide() elif sync_message_action == "learn_more": - QDesktopServices.openUrl(QUrl("https://support.ultimaker.com/hc/en-us/articles/360013137919?utm_source=cura&utm_medium=software&utm_campaign=sync-material-printer")) + QDesktopServices.openUrl(QUrl("https://support.ultimaker.com/hc/en-us/articles/360013137919?utm_source=cura&utm_medium=software&utm_campaign=sync-material-printer-message")) @pyqtSlot("QVariant", result = bool) def canMaterialBeRemoved(self, material_node: "MaterialNode") -> bool: From 658e54c8e513366434aa8b5a8840ed92968b8d4a Mon Sep 17 00:00:00 2001 From: Konstantinos Karmas Date: Tue, 5 Oct 2021 11:36:10 +0200 Subject: [PATCH 05/10] Simplify the check for new materials If there is at least one material, we can already show the message without checking the rest of the installed packages. CURA-8254 --- cura/Machines/Models/MaterialManagementModel.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cura/Machines/Models/MaterialManagementModel.py b/cura/Machines/Models/MaterialManagementModel.py index 56315be86e..468d28709b 100644 --- a/cura/Machines/Models/MaterialManagementModel.py +++ b/cura/Machines/Models/MaterialManagementModel.py @@ -41,11 +41,11 @@ class MaterialManagementModel(QObject): a message prompting the user to sync the materials with their printers. """ application = cura.CuraApplication.CuraApplication.getInstance() - new_materials_installed = False - for package_id, package_info in application.getPackageManager().installed_packages.items(): - new_materials_installed = package_info["package_info"]["package_type"] == "material" - if new_materials_installed: - self._showSyncNewMaterialsMessage() + for package_id, package_data in application.getPackageManager().installed_packages.items(): + if package_data["package_info"]["package_type"] == "material": + # At least one new material was installed + self._showSyncNewMaterialsMessage() + break def _showSyncNewMaterialsMessage(self): sync_materials_message = Message( From 8157cedfefa7232e7dd5cac4b9a200c05d805be9 Mon Sep 17 00:00:00 2001 From: Konstantinos Karmas Date: Tue, 5 Oct 2021 11:42:00 +0200 Subject: [PATCH 06/10] Show the message only if there are printers that support material export If none of the user's printers support exporting materials to it, then the message should not be shown. CURA-8254 --- cura/Machines/Models/MaterialManagementModel.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cura/Machines/Models/MaterialManagementModel.py b/cura/Machines/Models/MaterialManagementModel.py index 468d28709b..5d56fb73ca 100644 --- a/cura/Machines/Models/MaterialManagementModel.py +++ b/cura/Machines/Models/MaterialManagementModel.py @@ -73,7 +73,10 @@ class MaterialManagementModel(QObject): button_style = Message.ActionButtonStyle.LINK ) sync_materials_message.actionTriggered.connect(self._onSyncMaterialsMessageActionTriggered) - sync_materials_message.show() + container_registry = cura.CuraApplication.CuraApplication.getInstance().getContainerRegistry() + global_stacks = container_registry.findContainerStacks(type = "machine") + if any([stack.supportsMaterialExport for stack in global_stacks]): + sync_materials_message.show() def _onSyncMaterialsMessageActionTriggered(self, sync_message: Optional[Message], sync_message_action: Optional[str]): if sync_message_action == "sync": From bdbac23fdf33e6174fa2fe8fa73c64ccf58ba02e Mon Sep 17 00:00:00 2001 From: Konstantinos Karmas Date: Tue, 5 Oct 2021 11:43:36 +0200 Subject: [PATCH 07/10] Add comment CURA-8254 --- cura/Machines/Models/MaterialManagementModel.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cura/Machines/Models/MaterialManagementModel.py b/cura/Machines/Models/MaterialManagementModel.py index 5d56fb73ca..3737e490d2 100644 --- a/cura/Machines/Models/MaterialManagementModel.py +++ b/cura/Machines/Models/MaterialManagementModel.py @@ -73,6 +73,8 @@ class MaterialManagementModel(QObject): button_style = Message.ActionButtonStyle.LINK ) sync_materials_message.actionTriggered.connect(self._onSyncMaterialsMessageActionTriggered) + + # Show the message only if there are printers that support material export container_registry = cura.CuraApplication.CuraApplication.getInstance().getContainerRegistry() global_stacks = container_registry.findContainerStacks(type = "machine") if any([stack.supportsMaterialExport for stack in global_stacks]): From cb4d5ce6e54ad74440e67bc1bf3f45cf73963ed2 Mon Sep 17 00:00:00 2001 From: Konstantinos Karmas Date: Tue, 5 Oct 2021 13:11:52 +0200 Subject: [PATCH 08/10] Update message text CURA-8254 --- cura/Machines/Models/MaterialManagementModel.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/Machines/Models/MaterialManagementModel.py b/cura/Machines/Models/MaterialManagementModel.py index 3737e490d2..ea7a26796e 100644 --- a/cura/Machines/Models/MaterialManagementModel.py +++ b/cura/Machines/Models/MaterialManagementModel.py @@ -50,7 +50,7 @@ class MaterialManagementModel(QObject): def _showSyncNewMaterialsMessage(self): sync_materials_message = Message( text = catalog.i18nc("@action:button", - "Please sync the material profiles with your printer before starting to print."), + "Please sync the material profiles with your printers before starting to print."), title = catalog.i18nc("@action:button", "New materials installed"), message_type = Message.MessageType.WARNING, lifetime = 0 From 587421f97a2f982bdbd367464edee77ff3d5e824 Mon Sep 17 00:00:00 2001 From: Konstantinos Karmas Date: Tue, 5 Oct 2021 14:51:14 +0200 Subject: [PATCH 09/10] Make the installed_packages private CURA-8254 --- cura/Machines/Models/MaterialManagementModel.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/Machines/Models/MaterialManagementModel.py b/cura/Machines/Models/MaterialManagementModel.py index ea7a26796e..ae86e609ee 100644 --- a/cura/Machines/Models/MaterialManagementModel.py +++ b/cura/Machines/Models/MaterialManagementModel.py @@ -41,7 +41,7 @@ class MaterialManagementModel(QObject): a message prompting the user to sync the materials with their printers. """ application = cura.CuraApplication.CuraApplication.getInstance() - for package_id, package_data in application.getPackageManager().installed_packages.items(): + for package_id, package_data in application.getPackageManager().getPackagesInstalledOnStartup().items(): if package_data["package_info"]["package_type"] == "material": # At least one new material was installed self._showSyncNewMaterialsMessage() From e4f6c1a440eb18afd9923cd4e31fbb48acc1ddbd Mon Sep 17 00:00:00 2001 From: Konstantinos Karmas Date: Tue, 5 Oct 2021 14:53:38 +0200 Subject: [PATCH 10/10] Fix typing CURA-8254 Co-Authored-By: Jaime van Kessel <3922611+nallath@users.noreply.github.com> --- cura/Machines/Models/MaterialManagementModel.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/cura/Machines/Models/MaterialManagementModel.py b/cura/Machines/Models/MaterialManagementModel.py index ae86e609ee..5c6baaf55f 100644 --- a/cura/Machines/Models/MaterialManagementModel.py +++ b/cura/Machines/Models/MaterialManagementModel.py @@ -35,7 +35,7 @@ class MaterialManagementModel(QObject): super().__init__(parent = parent) self._checkIfNewMaterialsWereInstalled() - def _checkIfNewMaterialsWereInstalled(self): + def _checkIfNewMaterialsWereInstalled(self) -> None: """ Checks whether new material packages were installed in the latest startup. If there were, then it shows a message prompting the user to sync the materials with their printers. @@ -47,7 +47,7 @@ class MaterialManagementModel(QObject): self._showSyncNewMaterialsMessage() break - def _showSyncNewMaterialsMessage(self): + def _showSyncNewMaterialsMessage(self) -> None: sync_materials_message = Message( text = catalog.i18nc("@action:button", "Please sync the material profiles with your printers before starting to print."), @@ -80,12 +80,11 @@ class MaterialManagementModel(QObject): if any([stack.supportsMaterialExport for stack in global_stacks]): sync_materials_message.show() - def _onSyncMaterialsMessageActionTriggered(self, sync_message: Optional[Message], sync_message_action: Optional[str]): + def _onSyncMaterialsMessageActionTriggered(self, sync_message: Message, sync_message_action: str): if sync_message_action == "sync": QDesktopServices.openUrl(QUrl("https://example.com/openSyncAllWindow")) # self.openSyncAllWindow() - if sync_message is not None: - sync_message.hide() + sync_message.hide() elif sync_message_action == "learn_more": QDesktopServices.openUrl(QUrl("https://support.ultimaker.com/hc/en-us/articles/360013137919?utm_source=cura&utm_medium=software&utm_campaign=sync-material-printer-message"))