From 1f5672accab09c975e1dbd49def4d95c5d236345 Mon Sep 17 00:00:00 2001 From: Konstantinos Karmas Date: Mon, 4 Oct 2021 15:55:06 +0200 Subject: [PATCH] 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?