From 7e84082aff26195d82b8d3c9239dee863949c099 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Thu, 24 Nov 2022 13:55:31 +0100 Subject: [PATCH 01/13] Add quality type to ufp files Cura-9773 --- cura/Settings/MachineManager.py | 17 ++++++++++++----- plugins/UFPWriter/UFPWriter.py | 1 + 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 27d8fbbc78..b5d43ba8a1 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -1764,14 +1764,21 @@ class MachineManager(QObject): global_stack = self._application.getGlobalContainerStack() return global_stack is None or global_stack.qualityChanges != empty_quality_changes_container - @pyqtProperty(str, notify = activeQualityGroupChanged) - def activeQualityOrQualityChangesName(self) -> str: + def activeQualityOrQualityChanges(self) -> GlobalStack: global_container_stack = self._application.getGlobalContainerStack() if not global_container_stack: - return empty_quality_container.getName() + return empty_quality_container if global_container_stack.qualityChanges != empty_quality_changes_container: - return global_container_stack.qualityChanges.getName() - return global_container_stack.quality.getName() + return global_container_stack.qualityChanges + return global_container_stack.quality + + @pyqtProperty(str, notify = activeQualityGroupChanged) + def activeQualityOrQualityChangesName(self) -> str: + return self.activeQualityOrQualityChanges().getName() + + @pyqtProperty(str, notify = activeQualityGroupChanged) + def activeQualityOrQualityChangesId(self) -> str: + return self.activeQualityOrQualityChanges().getId() @pyqtProperty(bool, notify = activeQualityGroupChanged) def hasNotSupportedQuality(self) -> bool: diff --git a/plugins/UFPWriter/UFPWriter.py b/plugins/UFPWriter/UFPWriter.py index d7671d02c8..f328bb2b11 100644 --- a/plugins/UFPWriter/UFPWriter.py +++ b/plugins/UFPWriter/UFPWriter.py @@ -227,6 +227,7 @@ class UFPWriter(MeshWriter): }, "intent": machine_manager.activeIntentCategory, "quality": machine_manager.activeQualityOrQualityChangesName, + "quality_type": machine_manager.activeQualityOrQualityChangesId, } global_stack = cast(GlobalStack, Application.getInstance().getGlobalContainerStack()) From e8f6786e972898ed715ce63015c91bf86faafd94 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Thu, 24 Nov 2022 22:56:35 +0100 Subject: [PATCH 02/13] Revert "Add quality type to ufp files" This reverts commit 7e84082aff26195d82b8d3c9239dee863949c099. --- cura/Settings/MachineManager.py | 19 ++++++------------- plugins/UFPWriter/UFPWriter.py | 1 - 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index b5d43ba8a1..27d8fbbc78 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -1764,21 +1764,14 @@ class MachineManager(QObject): global_stack = self._application.getGlobalContainerStack() return global_stack is None or global_stack.qualityChanges != empty_quality_changes_container - def activeQualityOrQualityChanges(self) -> GlobalStack: - global_container_stack = self._application.getGlobalContainerStack() - if not global_container_stack: - return empty_quality_container - if global_container_stack.qualityChanges != empty_quality_changes_container: - return global_container_stack.qualityChanges - return global_container_stack.quality - @pyqtProperty(str, notify = activeQualityGroupChanged) def activeQualityOrQualityChangesName(self) -> str: - return self.activeQualityOrQualityChanges().getName() - - @pyqtProperty(str, notify = activeQualityGroupChanged) - def activeQualityOrQualityChangesId(self) -> str: - return self.activeQualityOrQualityChanges().getId() + global_container_stack = self._application.getGlobalContainerStack() + if not global_container_stack: + return empty_quality_container.getName() + if global_container_stack.qualityChanges != empty_quality_changes_container: + return global_container_stack.qualityChanges.getName() + return global_container_stack.quality.getName() @pyqtProperty(bool, notify = activeQualityGroupChanged) def hasNotSupportedQuality(self) -> bool: diff --git a/plugins/UFPWriter/UFPWriter.py b/plugins/UFPWriter/UFPWriter.py index f328bb2b11..d7671d02c8 100644 --- a/plugins/UFPWriter/UFPWriter.py +++ b/plugins/UFPWriter/UFPWriter.py @@ -227,7 +227,6 @@ class UFPWriter(MeshWriter): }, "intent": machine_manager.activeIntentCategory, "quality": machine_manager.activeQualityOrQualityChangesName, - "quality_type": machine_manager.activeQualityOrQualityChangesId, } global_stack = cast(GlobalStack, Application.getInstance().getGlobalContainerStack()) From c2ad41e10eff1caa3bc2b17daa438cb1202ddf81 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Thu, 24 Nov 2022 23:02:13 +0100 Subject: [PATCH 03/13] Add quality type to ufp files Cura-9773 --- plugins/UFPWriter/UFPWriter.py | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/UFPWriter/UFPWriter.py b/plugins/UFPWriter/UFPWriter.py index d7671d02c8..3693352c1d 100644 --- a/plugins/UFPWriter/UFPWriter.py +++ b/plugins/UFPWriter/UFPWriter.py @@ -227,6 +227,7 @@ class UFPWriter(MeshWriter): }, "intent": machine_manager.activeIntentCategory, "quality": machine_manager.activeQualityOrQualityChangesName, + "quality_display_name": machine_manager.activeQualityDisplayNameMap, } global_stack = cast(GlobalStack, Application.getInstance().getGlobalContainerStack()) From 52ee149edc1960382595f71c30a8e98a37d93aa7 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Fri, 25 Nov 2022 16:09:55 +0100 Subject: [PATCH 04/13] Unify `activeQualityDisplayNameMap` string creation Generation quality display names in `CustomPrintSetup.qml` and `PrintSetupSelectorHeader.qml` were so similar that I decided to combine the logic. Cura-9773 --- cura/Settings/MachineManager.py | 66 ++++++++++++------- .../Custom/CustomPrintSetup.qml | 31 +-------- .../PrintSetupSelectorHeader.qml | 20 +----- 3 files changed, 46 insertions(+), 71 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 27d8fbbc78..6992ffc4e0 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -1631,33 +1631,49 @@ class MachineManager(QObject): # Examples: # - "my_profile - Fine" (only based on a default quality, no intent involved) # - "my_profile - Engineering - Fine" (based on an intent) + @pyqtProperty("QList", notify = activeQualityDisplayNameChanged) + def activeQualityDisplayNameStringParts(self) -> [str]: + result_map = self.activeQualityDisplayNameMap + string_parts = list() + + if result_map["custom_profile"] is not None: + string_parts.append(result_map["custom_profile"]) + + string_parts.append(result_map["profile"]) + + if result_map["intent_category"] is not "default": + string_parts.append(result_map["intent_name"]) + + if result_map["layer_height"]: + string_parts.append(f"""{result_map["layer_height"]}mm""") + + if result_map["is_experimental"]: + string_parts.append(catalog.i18nc("@label", "Experimental")) + + return string_parts + @pyqtProperty("QVariantMap", notify = activeQualityDisplayNameChanged) - def activeQualityDisplayNameMap(self) -> Dict[str, str]: + def activeQualityDisplayNameMap(self) -> Dict[str, Any]: global_stack = self._application.getGlobalContainerStack() if global_stack is None: - return {"main": "", - "suffix": ""} + return { + "profile": "", + "intent_category": "", + "intent": "", + "custom_profile": None, + "is_experimental": False + } - display_name = global_stack.quality.getName() - - intent_category = self.activeIntentCategory - if intent_category != "default": - intent_display_name = IntentCategoryModel.translation(intent_category, - "name", - intent_category.title()) - display_name = "{intent_name} - {the_rest}".format(intent_name = intent_display_name, - the_rest = display_name) - - main_part = display_name - suffix_part = "" - - # Not a custom quality - if global_stack.qualityChanges != empty_quality_changes_container: - main_part = self.activeQualityOrQualityChangesName - suffix_part = display_name - - return {"main": main_part, - "suffix": suffix_part} + return { + "profile": global_stack.quality.getName(), + "intent_category": self.activeIntentCategory, + "intent_name": IntentCategoryModel.translation(self.activeIntentCategory, "name", self.activeIntentCategory.title()), + "custom_profile": self.activeQualityOrQualityChangesName \ + if global_stack.qualityChanges is not empty_quality_changes_container \ + else None, + "layer_height": self.activeQualityLayerHeight if self.isActiveQualitySupported else None, + "is_experimental": self.isActiveQualityExperimental and self.isActiveQualitySupported, + } @pyqtSlot(str) def setIntentByCategory(self, intent_category: str) -> None: @@ -1776,7 +1792,9 @@ class MachineManager(QObject): @pyqtProperty(bool, notify = activeQualityGroupChanged) def hasNotSupportedQuality(self) -> bool: global_container_stack = self._application.getGlobalContainerStack() - return (not global_container_stack is None) and global_container_stack.quality == empty_quality_container and global_container_stack.qualityChanges == empty_quality_changes_container + return global_container_stack is not None\ + and global_container_stack.quality == empty_quality_container \ + and global_container_stack.qualityChanges == empty_quality_changes_container @pyqtProperty(bool, notify = activeQualityGroupChanged) def isActiveQualityCustom(self) -> bool: diff --git a/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml b/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml index 554b663a9b..6385d60c6a 100644 --- a/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml +++ b/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml @@ -67,7 +67,7 @@ Item UM.Label { id: textLabel - text: Cura.MachineManager.activeQualityDisplayNameMap["main"] + text: Cura.MachineManager.activeQualityDisplayNameStringParts[0] Layout.margins: 0 Layout.maximumWidth: Math.floor(parent.width * 0.7) // Always leave >= 30% for the rest of the row. height: contentHeight @@ -77,7 +77,8 @@ Item UM.Label { - text: activeQualityDetailText() + text: Cura.MachineManager.activeQualityDisplayNameStringParts.slice(1).join(" - ") + color: UM.Theme.getColor("text_detail") Layout.margins: 0 Layout.fillWidth: true @@ -85,32 +86,6 @@ Item height: contentHeight elide: Text.ElideRight wrapMode: Text.NoWrap - function activeQualityDetailText() - { - var resultMap = Cura.MachineManager.activeQualityDisplayNameMap - var resultSuffix = resultMap["suffix"] - var result = "" - - if (Cura.MachineManager.isActiveQualityExperimental) - { - resultSuffix += " (Experimental)" - } - - if (Cura.MachineManager.isActiveQualitySupported) - { - if (Cura.MachineManager.activeQualityLayerHeight > 0) - { - if (resultSuffix) - { - result += " - " + resultSuffix - } - result += " - " - result += Cura.MachineManager.activeQualityLayerHeight + "mm" - } - } - - return result - } } } diff --git a/resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml b/resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml index 41e913a2c1..8804e51bb2 100644 --- a/resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml +++ b/resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml @@ -17,26 +17,8 @@ RowLayout { source: UM.Theme.getIcon("Sliders", "medium") iconSize: UM.Theme.getSize("button_icon").width - text: - { - if (Cura.MachineManager.activeStack) - { - var resultMap = Cura.MachineManager.activeQualityDisplayNameMap - var text = resultMap["main"] - if (resultMap["suffix"]) - { - text += " - " + resultMap["suffix"] - } - if (!Cura.MachineManager.hasNotSupportedQuality) - { - text += " - " + layerHeight.properties.value + "mm" - text += Cura.MachineManager.isActiveQualityExperimental ? " - " + catalog.i18nc("@label", "Experimental") : "" - } - return text - } - return "" - } + text: Cura.MachineManager.activeQualityDisplayNameStringParts.join(" - ") font: UM.Theme.getFont("medium") elide: Text.ElideMiddle wrapMode: Text.NoWrap From 1ae8f2da62b21bd11c45555959e9cf13f5562517 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Fri, 25 Nov 2022 16:12:44 +0100 Subject: [PATCH 05/13] Add quality display name with ufp files Cura-9773 --- plugins/UFPWriter/UFPWriter.py | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/UFPWriter/UFPWriter.py b/plugins/UFPWriter/UFPWriter.py index d7671d02c8..3693352c1d 100644 --- a/plugins/UFPWriter/UFPWriter.py +++ b/plugins/UFPWriter/UFPWriter.py @@ -227,6 +227,7 @@ class UFPWriter(MeshWriter): }, "intent": machine_manager.activeIntentCategory, "quality": machine_manager.activeQualityOrQualityChangesName, + "quality_display_name": machine_manager.activeQualityDisplayNameMap, } global_stack = cast(GlobalStack, Application.getInstance().getGlobalContainerStack()) From 76564f7bc4a893cb585bdabeaae87690f226908c Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Fri, 25 Nov 2022 16:46:21 +0100 Subject: [PATCH 06/13] Add dash between main, and suffix part of quality display name Cura-9773 --- resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml b/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml index 6385d60c6a..0870e14d44 100644 --- a/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml +++ b/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml @@ -77,7 +77,7 @@ Item UM.Label { - text: Cura.MachineManager.activeQualityDisplayNameStringParts.slice(1).join(" - ") + text: ` - ${Cura.MachineManager.activeQualityDisplayNameStringParts.slice(1).join(" - ")}` color: UM.Theme.getColor("text_detail") Layout.margins: 0 From 4fa024cd317f4f8409790e29b7e440fca2bc01f6 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Fri, 25 Nov 2022 16:48:06 +0100 Subject: [PATCH 07/13] Group intent and quality Bit of an ugly hack. At later point in the code it is assumed the first element of the list is the main part and the remaining elements form the suffix. Intent and the profile form both the main part so these need to be grouped together. Cura-9773 --- cura/Settings/MachineManager.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 6992ffc4e0..657eeb6089 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -1639,10 +1639,10 @@ class MachineManager(QObject): if result_map["custom_profile"] is not None: string_parts.append(result_map["custom_profile"]) - string_parts.append(result_map["profile"]) - if result_map["intent_category"] is not "default": - string_parts.append(result_map["intent_name"]) + string_parts.append(f"""{result_map["intent_name"]} - {result_map["profile"]}""") + else: + string_parts.append(result_map["profile"]) if result_map["layer_height"]: string_parts.append(f"""{result_map["layer_height"]}mm""") From a645fa7d96cbf4da5c09943cf472c951d8f5f316 Mon Sep 17 00:00:00 2001 From: Casper Lamboo Date: Mon, 28 Nov 2022 11:22:53 +0100 Subject: [PATCH 08/13] Use bracket to initialise list Co-authored-by: Joey de l'Arago --- cura/Settings/MachineManager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 657eeb6089..28a79b6fd3 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -1634,7 +1634,7 @@ class MachineManager(QObject): @pyqtProperty("QList", notify = activeQualityDisplayNameChanged) def activeQualityDisplayNameStringParts(self) -> [str]: result_map = self.activeQualityDisplayNameMap - string_parts = list() + string_parts = [] if result_map["custom_profile"] is not None: string_parts.append(result_map["custom_profile"]) From f297909a82cf3b852df25ad270bc896c509cfe23 Mon Sep 17 00:00:00 2001 From: Casper Lamboo Date: Mon, 28 Nov 2022 11:23:53 +0100 Subject: [PATCH 09/13] Fix type signature of function Co-authored-by: Joey de l'Arago --- cura/Settings/MachineManager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 28a79b6fd3..fabfc27db8 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -1632,7 +1632,7 @@ class MachineManager(QObject): # - "my_profile - Fine" (only based on a default quality, no intent involved) # - "my_profile - Engineering - Fine" (based on an intent) @pyqtProperty("QList", notify = activeQualityDisplayNameChanged) - def activeQualityDisplayNameStringParts(self) -> [str]: + def activeQualityDisplayNameStringParts(self) -> List[str]: result_map = self.activeQualityDisplayNameMap string_parts = [] From 8dcccd941b72fc1f9e5324937cecec1eeb2b6234 Mon Sep 17 00:00:00 2001 From: Joey de l'Arago Date: Mon, 28 Nov 2022 12:40:35 +0100 Subject: [PATCH 10/13] Add dataclass for ActiveQuality. Move some logic out of MachineManager into ActiveQuality. CURA-9793 --- cura/Settings/ActiveQuality.py | 37 ++++++++++++++++++++++++++ cura/Settings/MachineManager.py | 46 +++++++-------------------------- plugins/UFPWriter/UFPWriter.py | 3 ++- 3 files changed, 49 insertions(+), 37 deletions(-) create mode 100644 cura/Settings/ActiveQuality.py diff --git a/cura/Settings/ActiveQuality.py b/cura/Settings/ActiveQuality.py new file mode 100644 index 0000000000..48af2c5d1a --- /dev/null +++ b/cura/Settings/ActiveQuality.py @@ -0,0 +1,37 @@ +from dataclasses import dataclass +from typing import List + +from UM import i18nCatalog + +catalog = i18nCatalog("cura") + + +@dataclass +class ActiveQuality: + """ Represents the active intent+profile combination, contains all information needed to display active quality. """ + intent_category: str = "" # Name of the base intent. For example "visual" or "engineering". + intent_name: str = "" # Name of the base intent formatted for display. For Example "Visual" or "Engineering" + profile: str = "" # Name of the base profile. For example "Fine" or "Fast" + custom_profile: str = "" # Name of the custom profile, this is based on profile. For example "MyCoolCustomProfile" + layer_height: float = None # Layer height of quality in mm. For example 0.4 + is_experimental: bool = False # If the quality experimental. + + def getStringParts(self) -> List[str]: + string_parts = [] + + if self.custom_profile is not None: + string_parts.append(self.custom_profile) + + if self.intent_category is not "default": + string_parts.append(f"{self.intent_name} - {self.profile}") + else: + string_parts.append(self.profile) + + if self.layer_height: + string_parts.append(f"{self.layer_height}mm") + + if self.is_experimental: + string_parts.append(catalog.i18nc("@label", "Experimental")) + + return string_parts + diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index fabfc27db8..350cac906a 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -40,6 +40,7 @@ from cura.Settings.cura_empty_instance_containers import (empty_definition_chang empty_material_container, empty_quality_container, empty_quality_changes_container, empty_intent_container) from cura.UltimakerCloud.UltimakerCloudConstants import META_UM_LINKED_TO_ACCOUNT +from .ActiveQuality import ActiveQuality from .CuraStackBuilder import CuraStackBuilder @@ -1633,47 +1634,20 @@ class MachineManager(QObject): # - "my_profile - Engineering - Fine" (based on an intent) @pyqtProperty("QList", notify = activeQualityDisplayNameChanged) def activeQualityDisplayNameStringParts(self) -> List[str]: - result_map = self.activeQualityDisplayNameMap - string_parts = [] - - if result_map["custom_profile"] is not None: - string_parts.append(result_map["custom_profile"]) - - if result_map["intent_category"] is not "default": - string_parts.append(f"""{result_map["intent_name"]} - {result_map["profile"]}""") - else: - string_parts.append(result_map["profile"]) - - if result_map["layer_height"]: - string_parts.append(f"""{result_map["layer_height"]}mm""") - - if result_map["is_experimental"]: - string_parts.append(catalog.i18nc("@label", "Experimental")) - - return string_parts + return self.activeQualityDisplayNameMap.getStringParts() @pyqtProperty("QVariantMap", notify = activeQualityDisplayNameChanged) - def activeQualityDisplayNameMap(self) -> Dict[str, Any]: + def activeQualityDisplayNameMap(self) -> ActiveQuality: global_stack = self._application.getGlobalContainerStack() if global_stack is None: - return { - "profile": "", - "intent_category": "", - "intent": "", - "custom_profile": None, - "is_experimental": False - } + return ActiveQuality() - return { - "profile": global_stack.quality.getName(), - "intent_category": self.activeIntentCategory, - "intent_name": IntentCategoryModel.translation(self.activeIntentCategory, "name", self.activeIntentCategory.title()), - "custom_profile": self.activeQualityOrQualityChangesName \ - if global_stack.qualityChanges is not empty_quality_changes_container \ - else None, - "layer_height": self.activeQualityLayerHeight if self.isActiveQualitySupported else None, - "is_experimental": self.isActiveQualityExperimental and self.isActiveQualitySupported, - } + return ActiveQuality(profile = global_stack.quality.getName(), + intent_category = self.activeIntentCategory, + intent_name = IntentCategoryModel.translation(self.activeIntentCategory, "name", self.activeIntentCategory.title()), + custom_profile = self.activeQualityOrQualityChangesName if global_stack.qualityChanges is not empty_quality_changes_container else None, + layer_height = self.activeQualityLayerHeight if self.isActiveQualitySupported else None, + is_experimental = self.isActiveQualityExperimental and self.isActiveQualitySupported) @pyqtSlot(str) def setIntentByCategory(self, intent_category: str) -> None: diff --git a/plugins/UFPWriter/UFPWriter.py b/plugins/UFPWriter/UFPWriter.py index 3693352c1d..6594557584 100644 --- a/plugins/UFPWriter/UFPWriter.py +++ b/plugins/UFPWriter/UFPWriter.py @@ -1,6 +1,7 @@ # Copyright (c) 2022 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. import json +from dataclasses import asdict from typing import cast, List, Dict from Charon.VirtualFile import VirtualFile # To open UFP files. @@ -227,7 +228,7 @@ class UFPWriter(MeshWriter): }, "intent": machine_manager.activeIntentCategory, "quality": machine_manager.activeQualityOrQualityChangesName, - "quality_display_name": machine_manager.activeQualityDisplayNameMap, + "quality_display_name": asdict(machine_manager.activeQualityDisplayNameMap), } global_stack = cast(GlobalStack, Application.getInstance().getGlobalContainerStack()) From 5ed572779dd1509262fe4f3e4b68217d4053d07e Mon Sep 17 00:00:00 2001 From: Joey de l'Arago Date: Mon, 28 Nov 2022 12:44:20 +0100 Subject: [PATCH 11/13] remove redundant properties in settings CURA-9773 --- plugins/UFPWriter/UFPWriter.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/plugins/UFPWriter/UFPWriter.py b/plugins/UFPWriter/UFPWriter.py index 6594557584..b9bcc94bf8 100644 --- a/plugins/UFPWriter/UFPWriter.py +++ b/plugins/UFPWriter/UFPWriter.py @@ -226,9 +226,7 @@ class UFPWriter(MeshWriter): "changes": {}, "all_settings": {}, }, - "intent": machine_manager.activeIntentCategory, - "quality": machine_manager.activeQualityOrQualityChangesName, - "quality_display_name": asdict(machine_manager.activeQualityDisplayNameMap), + "quality": asdict(machine_manager.activeQualityDisplayNameMap), } global_stack = cast(GlobalStack, Application.getInstance().getGlobalContainerStack()) From 8e8437eab050ff4ce1fc663159f15869203722a3 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Mon, 28 Nov 2022 13:10:52 +0100 Subject: [PATCH 12/13] Split of `getStringParts` function Spit into `getMainStringParts` and `getTailStringParts` so we can easily differentiate between the two in the front-end. Cura-9773 --- cura/Settings/ActiveQuality.py | 19 +++++++++++++++---- cura/Settings/MachineManager.py | 14 ++++++++++++-- .../Custom/CustomPrintSetup.qml | 15 +++++++++++++-- 3 files changed, 40 insertions(+), 8 deletions(-) diff --git a/cura/Settings/ActiveQuality.py b/cura/Settings/ActiveQuality.py index 48af2c5d1a..420d1f24fc 100644 --- a/cura/Settings/ActiveQuality.py +++ b/cura/Settings/ActiveQuality.py @@ -16,16 +16,25 @@ class ActiveQuality: layer_height: float = None # Layer height of quality in mm. For example 0.4 is_experimental: bool = False # If the quality experimental. - def getStringParts(self) -> List[str]: + def getMainStringParts(self) -> List[str]: string_parts = [] if self.custom_profile is not None: string_parts.append(self.custom_profile) - - if self.intent_category is not "default": - string_parts.append(f"{self.intent_name} - {self.profile}") else: string_parts.append(self.profile) + if self.intent_category is not "default": + string_parts.append(self.intent_name) + + return string_parts + + def getTailStringParts(self) -> List[str]: + string_parts = [] + + if self.custom_profile is not None: + string_parts.append(self.profile) + if self.intent_category is not "default": + string_parts.append(self.intent_name) if self.layer_height: string_parts.append(f"{self.layer_height}mm") @@ -35,3 +44,5 @@ class ActiveQuality: return string_parts + def getStringParts(self) -> List[str]: + return self.getMainStringParts() + self.getTailStringParts() diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 350cac906a..2ee0facab8 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -1636,18 +1636,28 @@ class MachineManager(QObject): def activeQualityDisplayNameStringParts(self) -> List[str]: return self.activeQualityDisplayNameMap.getStringParts() + @pyqtProperty("QList", notify = activeQualityDisplayNameChanged) + def activeQualityDisplayNameMainStringParts(self) -> List[str]: + return self.activeQualityDisplayNameMap.getMainStringParts() + + @pyqtProperty("QList", notify = activeQualityDisplayNameChanged) + def activeQualityDisplayNameTailStringParts(self) -> List[str]: + return self.activeQualityDisplayNameMap.getTailStringParts() + @pyqtProperty("QVariantMap", notify = activeQualityDisplayNameChanged) def activeQualityDisplayNameMap(self) -> ActiveQuality: global_stack = self._application.getGlobalContainerStack() if global_stack is None: return ActiveQuality() - return ActiveQuality(profile = global_stack.quality.getName(), + return ActiveQuality( + profile = global_stack.quality.getName(), intent_category = self.activeIntentCategory, intent_name = IntentCategoryModel.translation(self.activeIntentCategory, "name", self.activeIntentCategory.title()), custom_profile = self.activeQualityOrQualityChangesName if global_stack.qualityChanges is not empty_quality_changes_container else None, layer_height = self.activeQualityLayerHeight if self.isActiveQualitySupported else None, - is_experimental = self.isActiveQualityExperimental and self.isActiveQualitySupported) + is_experimental = self.isActiveQualityExperimental and self.isActiveQualitySupported + ) @pyqtSlot(str) def setIntentByCategory(self, intent_category: str) -> None: diff --git a/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml b/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml index 0870e14d44..e64f211cd1 100644 --- a/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml +++ b/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml @@ -67,7 +67,7 @@ Item UM.Label { id: textLabel - text: Cura.MachineManager.activeQualityDisplayNameStringParts[0] + text: Cura.MachineManager.activeQualityDisplayNameMainStringParts.join(" - ") Layout.margins: 0 Layout.maximumWidth: Math.floor(parent.width * 0.7) // Always leave >= 30% for the rest of the row. height: contentHeight @@ -77,7 +77,18 @@ Item UM.Label { - text: ` - ${Cura.MachineManager.activeQualityDisplayNameStringParts.slice(1).join(" - ")}` + text: + { + const string_parts = Cura.MachineManager.activeQualityDisplayNameTailStringParts; + if (string_parts.length === 0) + { + return ""; + } + else + { + ` - ${string_parts.join(" - ")}` + } + } color: UM.Theme.getColor("text_detail") Layout.margins: 0 From be409200425bcca50f21cbc397b4f58d043c039e Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Mon, 28 Nov 2022 13:14:47 +0100 Subject: [PATCH 13/13] Fix cura crashing `activeQualityDisplayNameMap` no longer returned a dict and could thus not be a pyqt property Cura-9773 --- cura/Settings/MachineManager.py | 7 +++---- plugins/UFPWriter/UFPWriter.py | 2 +- .../qml/Dialogs/DiscardOrKeepProfileChangesDialog.qml | 4 ++-- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 2ee0facab8..b8a5e7d885 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -1634,17 +1634,16 @@ class MachineManager(QObject): # - "my_profile - Engineering - Fine" (based on an intent) @pyqtProperty("QList", notify = activeQualityDisplayNameChanged) def activeQualityDisplayNameStringParts(self) -> List[str]: - return self.activeQualityDisplayNameMap.getStringParts() + return self.activeQualityDisplayNameMap().getStringParts() @pyqtProperty("QList", notify = activeQualityDisplayNameChanged) def activeQualityDisplayNameMainStringParts(self) -> List[str]: - return self.activeQualityDisplayNameMap.getMainStringParts() + return self.activeQualityDisplayNameMap().getMainStringParts() @pyqtProperty("QList", notify = activeQualityDisplayNameChanged) def activeQualityDisplayNameTailStringParts(self) -> List[str]: - return self.activeQualityDisplayNameMap.getTailStringParts() + return self.activeQualityDisplayNameMap().getTailStringParts() - @pyqtProperty("QVariantMap", notify = activeQualityDisplayNameChanged) def activeQualityDisplayNameMap(self) -> ActiveQuality: global_stack = self._application.getGlobalContainerStack() if global_stack is None: diff --git a/plugins/UFPWriter/UFPWriter.py b/plugins/UFPWriter/UFPWriter.py index b9bcc94bf8..f90ef823e7 100644 --- a/plugins/UFPWriter/UFPWriter.py +++ b/plugins/UFPWriter/UFPWriter.py @@ -226,7 +226,7 @@ class UFPWriter(MeshWriter): "changes": {}, "all_settings": {}, }, - "quality": asdict(machine_manager.activeQualityDisplayNameMap), + "quality": asdict(machine_manager.activeQualityDisplayNameMap()), } global_stack = cast(GlobalStack, Application.getInstance().getGlobalContainerStack()) diff --git a/resources/qml/Dialogs/DiscardOrKeepProfileChangesDialog.qml b/resources/qml/Dialogs/DiscardOrKeepProfileChangesDialog.qml index 0b39d84177..0fecb6b662 100644 --- a/resources/qml/Dialogs/DiscardOrKeepProfileChangesDialog.qml +++ b/resources/qml/Dialogs/DiscardOrKeepProfileChangesDialog.qml @@ -56,7 +56,7 @@ UM.Dialog UM.Label { id: infoText - text: catalog.i18nc("@text:window, %1 is a profile name", "You have customized some profile settings. Would you like to Keep these changed settings after switching profiles? Alternatively, you can discard the changes to load the defaults from '%1'.").arg(Cura.MachineManager.activeQualityDisplayNameMap["main"]) + text: catalog.i18nc("@text:window, %1 is a profile name", "You have customized some profile settings. Would you like to Keep these changed settings after switching profiles? Alternatively, you can discard the changes to load the defaults from '%1'.").arg(Cura.MachineManager.activeQualityDisplayNameMainStringParts.join(" - ")) anchors.left: parent.left anchors.right: parent.right wrapMode: Text.WordWrap @@ -83,7 +83,7 @@ UM.Dialog columnHeaders: [ catalog.i18nc("@title:column", "Profile settings"), - Cura.MachineManager.activeQualityDisplayNameMap["main"], + Cura.MachineManager.activeQualityDisplayNameMainStringParts.join(" - "), catalog.i18nc("@title:column", "Current changes") ] model: UM.TableModel