Browse Source

Fix profile management page

Lipu Fei 7 years ago
parent
commit
f487c5b084

+ 5 - 1
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 = ""

+ 6 - 11
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()

+ 25 - 12
resources/qml/Preferences/ProfilesPage.qml

@@ -171,32 +171,46 @@ Item
         object: "<new name>"
         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: "<new name>"
         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
         }
     }