Browse Source

Merge branch 'master' of github.com:Ultimaker/Cura

Jaime van Kessel 8 years ago
parent
commit
f9c66526b6

+ 19 - 1
cura/Settings/ContainerManager.py

@@ -181,7 +181,7 @@ class ContainerManager(QObject):
     def setContainerMetaDataEntry(self, container_id, entry_name, entry_value):
         containers = UM.Settings.ContainerRegistry.getInstance().findContainers(None, id = container_id)
         if not containers:
-            UM.Logger.log("w", "Could set metadata of container %s because it was not found.", container_id)
+            UM.Logger.log("w", "Could not set metadata of container %s because it was not found.", container_id)
             return False
 
         container = containers[0]
@@ -210,6 +210,24 @@ class ContainerManager(QObject):
 
         return True
 
+    ##  Set the name of the specified container.
+    @pyqtSlot(str, str, result = bool)
+    def setContainerName(self, container_id, new_name):
+        containers = UM.Settings.ContainerRegistry.getInstance().findContainers(None, id = container_id)
+        if not containers:
+            UM.Logger.log("w", "Could not set name of container %s because it was not found.", container_id)
+            return False
+
+        container = containers[0]
+
+        if container.isReadOnly():
+            UM.Logger.log("w", "Cannot set name of read-only container %s.", container_id)
+            return False
+
+        container.setName(new_name)
+
+        return True
+
     ##  Find instance containers matching certain criteria.
     #
     #   This effectively forwards to ContainerRegistry::findInstanceContainers.

+ 6 - 3
cura/Settings/MachineManager.py

@@ -809,10 +809,13 @@ class MachineManager(QObject):
             # If a quality for this specific material cannot be found, try finding qualities for a generic version of the material
             material_search_criteria = { "type": "material", "material": material_container.getMetaDataEntry("material"), "color_name": "Generic" }
             if definition.getMetaDataEntry("has_machine_quality"):
-                material_search_criteria["definition"] = definition.id
+                if material_container:
+                    material_search_criteria["definition"] = material_container.getDefinition().id
+                else:
+                    material_search_criteria["definition"] = definition.id
 
-                if definition.getMetaDataEntry("has_variants") and variant_container:
-                    material_search_criteria["variant"] = variant_container.id
+                    if definition.getMetaDataEntry("has_variants") and variant_container:
+                        material_search_criteria["variant"] = variant_container.id
             else:
                 material_search_criteria["definition"] = "fdmprinter"
 

+ 21 - 0
plugins/XmlMaterialProfile/XmlMaterialProfile.py

@@ -61,6 +61,27 @@ class XmlMaterialProfile(UM.Settings.InstanceContainer):
         for container in UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(GUID = self.getMetaDataEntry("GUID"), base_file = basefile):
             container.setMetaData(copy.deepcopy(self._metadata))
 
+    ##  Overridden from InstanceContainer, similar to setMetaDataEntry.
+    #   without this function the setName would only set the name of the specific nozzle / material / machine combination container
+    #   The function is a bit tricky. It will not set the name of all containers if it has the correct name itself.
+    def setName(self, new_name):
+        if self.isReadOnly():
+            return
+
+        # Not only is this faster, it also prevents a major loop that causes a stack overflow.
+        if self.getName() == new_name:
+            return
+
+        super().setName(new_name)
+
+        basefile = self.getMetaDataEntry("base_file", self._id)  # if basefile is none, this is a basefile.
+        # Update the basefile as well, this is actually what we're trying to do
+        # Update all containers that share GUID and basefile
+        containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id=basefile) + UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(
+                GUID=self.getMetaDataEntry("GUID"), base_file=basefile)
+        for container in containers:
+            container.setName(new_name)
+
     ##  Overridden from InstanceContainer
     def setProperty(self, key, property_name, property_value, container = None):
         if self.isReadOnly():

+ 21 - 1
resources/qml/Preferences/MaterialView.qml

@@ -44,6 +44,16 @@ TabView
 
                 property real rowHeight: textField.height;
 
+                Label { width: base.firstColumnWidth; height: parent.rowHeight; verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Display Name") }
+                ReadOnlyTextField
+                {
+                    id: displayNameTextField;
+                    width: base.secondColumnWidth;
+                    text: properties.name;
+                    readOnly: !base.editingEnabled;
+                    onEditingFinished: base.setName(properties.name, text)
+                }
+
                 Label { width: base.firstColumnWidth; height: parent.rowHeight; verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Brand") }
                 ReadOnlyTextField
                 {
@@ -254,7 +264,17 @@ TabView
     {
         if(old_value != new_value)
         {
-            Cura.ContainerManager.setContainerMetaDataEntry(base.containerId, entry_name, new_value)
+            Cura.ContainerManager.setContainerMetaDataEntry(base.containerId, entry_name, new_value);
+        }
+    }
+
+    function setName(old_value, new_value)
+    {
+        if(old_value != new_value)
+        {
+            Cura.ContainerManager.setContainerName(base.containerId, new_value);
+            // update material name label. not so pretty, but it works
+            materialProperties.name = new_value;
         }
     }
 }

+ 1 - 0
resources/qml/Preferences/ReadOnlyTextField.qml

@@ -1,5 +1,6 @@
 // Copyright (c) 2016 Ultimaker B.V.
 // Uranium is released under the terms of the AGPLv3 or higher.
+// Different than the name suggests, it is not always read-only.
 
 import QtQuick 2.1
 import QtQuick.Controls 1.1