diff --git a/cura/Machines/Models/QualitySettingsModel.py b/cura/Machines/Models/QualitySettingsModel.py index e91897b632..304e2f36f0 100644 --- a/cura/Machines/Models/QualitySettingsModel.py +++ b/cura/Machines/Models/QualitySettingsModel.py @@ -89,7 +89,11 @@ class QualitySettingsModel(ListModel): else: quality_changes_node = quality_changes_group.nodes_for_extruders.get(self._extruder_position) if quality_changes_node is not None: # it can be None if number of extruders are changed during runtime - quality_containers.insert(0, quality_changes_node.getContainer()) + try: + quality_containers.insert(0, quality_changes_node.getContainer()) + except: + # FIXME: This is to prevent incomplete update of QualityManager + return settings_keys.update(quality_changes_group.getAllKeys()) current_category = "" diff --git a/cura/Settings/ContainerManager.py b/cura/Settings/ContainerManager.py index 10934e7275..730800af77 100644 --- a/cura/Settings/ContainerManager.py +++ b/cura/Settings/ContainerManager.py @@ -404,24 +404,17 @@ class ContainerManager(QObject): for node in quality_changes_group.getAllNodes(): self._container_registry.removeContainer(node.metadata["id"]) - ## Rename a set of quality changes containers. # - # This will search for quality_changes containers matching the supplied name and rename them. - # Note that if the machine specifies that qualities should be filtered by machine and/or material - # only the containers related to the active machine/material are renamed. + # Rename a set of quality changes containers. Returns the new name. # - # \param quality_name The name of the quality changes containers to rename. - # \param new_name The new name of the quality changes. - # - # \return True if successful, False if not. - @pyqtSlot(QObject, str) - def renameQualityChangesGroup(self, quality_changes_group, new_name): + @pyqtSlot(QObject, str, result = str) + def renameQualityChangesGroup(self, quality_changes_group, new_name) -> str: Logger.log("i", "Renaming QualityChangesGroup[%s] to [%s]", quality_changes_group.name, new_name) self._machine_manager.blurSettings.emit() if new_name == quality_changes_group.name: Logger.log("i", "QualityChangesGroup name [%s] unchanged.", quality_changes_group.name) - return + return new_name new_name = self._container_registry.uniqueName(new_name) for node in quality_changes_group.getAllNodes(): @@ -430,6 +423,8 @@ class ContainerManager(QObject): self._machine_manager.activeQualityChanged.emit() self._machine_manager.activeQualityGroupChanged.emit() + return new_name + @pyqtSlot(str, "QVariantMap") def duplicateQualityChanges(self, quality_changes_name, quality_model_item): global_stack = Application.getInstance().getGlobalContainerStack() diff --git a/resources/qml/Preferences/ProfilesPage.qml b/resources/qml/Preferences/ProfilesPage.qml index 224c8f1b3d..e5c7e3662a 100644 --- a/resources/qml/Preferences/ProfilesPage.qml +++ b/resources/qml/Preferences/ProfilesPage.qml @@ -171,32 +171,46 @@ Item object: "" onAccepted: { - base.newQualityChangesNameToSwitchTo = newName; // We want to switch to the new profile once it's created + base.newQualityNameToSelect = newName; // We want to switch to the new profile once it's created + base.toActivateNewQuality = true; Cura.ContainerManager.createQualityChanges(newName); } } - property string newQualityChangesNameToSwitchTo: "" + property string newQualityNameToSelect: "" + property bool toActivateNewQuality: false - // This connection makes sure that we will switch to the new + // This connection makes sure that we will switch to the correct quality after the model gets updated Connections { target: qualitiesModel onItemsChanged: { - var currentItemName = base.currentItem == null ? "" : base.currentItem.name; + var toSelectItemName = base.currentItem == null ? "" : base.currentItem.name; + if (newQualityNameToSelect != "") { + toSelectItemName = newQualityNameToSelect; + } - if (base.newQualityChangesNameToSwitchTo != "") { + var newIdx = -1; // Default to nothing if nothing can be found + if (toSelectItemName != "") { + // Select the required quality name if given for (var idx = 0; idx < qualitiesModel.rowCount(); ++idx) { var item = qualitiesModel.getItem(idx); - if (item.name == base.newQualityChangesNameToSwitchTo) { + if (item.name == toSelectItemName) { // Switch to the newly created profile if needed - qualityListView.currentIndex = idx; - Cura.MachineManager.setQualityChangesGroup(item.quality_changes_group); - base.newQualityChangesNameToSwitchTo = ""; + newIdx = idx; + if (base.toActivateNewQuality) { + // Activate this custom quality if required + Cura.MachineManager.setQualityChangesGroup(item.quality_changes_group); + } break; } } } + qualityListView.currentIndex = newIdx; + + // Reset states + base.newQualityNameToSelect = ""; + base.toActivateNewQuality = false; } } @@ -209,7 +223,6 @@ Item onAccepted: { Cura.ContainerManager.duplicateQualityChanges(newName, base.currentItem); - qualityListView.currentIndex = -1; // TODO: Reset selection. } } @@ -240,8 +253,8 @@ Item object: "" onAccepted: { - Cura.ContainerManager.renameQualityChangesGroup(base.currentItem.quality_changes_group, newName); - qualityListView.currentIndex = -1; // TODO: Reset selection. + var actualNewName = Cura.ContainerManager.renameQualityChangesGroup(base.currentItem.quality_changes_group, newName); + base.newQualityNameToSelect = actualNewName; // Select the new name after the model gets updated } }