diff --git a/resources/qml/Preferences/MaterialsPage.qml b/resources/qml/Preferences/MaterialsPage.qml
index a40d4c1e3b..35fa7256ea 100644
--- a/resources/qml/Preferences/MaterialsPage.qml
+++ b/resources/qml/Preferences/MaterialsPage.qml
@@ -66,7 +66,23 @@ UM.ManagementPage
text: catalog.i18nc("@action:button", "Duplicate");
iconName: "list-add";
enabled: base.currentItem != null
- onClicked: Cura.ContainerManager.duplicateContainer(base.currentItem.id)
+ onClicked:
+ {
+ var material_id = Cura.ContainerManager.duplicateContainer(base.currentItem.id)
+ if(material_id == "")
+ {
+ return
+ }
+
+ if(Cura.MachineManager.filterQualityByMachine)
+ {
+ var quality_id = Cura.ContainerManager.duplicateContainer(Cura.MachineManager.activeQualityId)
+ Cura.ContainerManager.setContainerMetaDataEntry(quality_id, "material", material_id)
+ Cura.MachineManager.setActiveQuality(quality_id)
+ }
+
+ Cura.MachineManager.setActiveMaterial(material_id)
+ }
},
Button
{
@@ -74,6 +90,19 @@ UM.ManagementPage
iconName: "list-remove";
enabled: base.currentItem != null && !base.currentItem.readOnly
onClicked: confirmDialog.open()
+ },
+ Button
+ {
+ text: catalog.i18nc("@action:button", "Import");
+ iconName: "document-import";
+ onClicked: importDialog.open();
+ },
+ Button
+ {
+ text: catalog.i18nc("@action:button", "Export")
+ iconName: "document-export"
+ onClicked: exportDialog.open()
+ enabled: currentItem != null
}
]
@@ -98,6 +127,8 @@ UM.ManagementPage
text: catalog.i18nc("@action:button", "Edit");
iconName: "document-edit";
+ enabled: base.currentItem != null && !base.currentItem.readOnly
+
checkable: true
}
}
@@ -113,7 +144,7 @@ UM.ManagementPage
bottom: parent.bottom
}
- editingEnabled: editButton.checked;
+ editingEnabled: base.currentItem != null && !base.currentItem.readOnly && editButton.checked;
properties: materialProperties
containerId: base.currentItem.id
@@ -147,7 +178,83 @@ UM.ManagementPage
{
id: confirmDialog
object: base.currentItem != null ? base.currentItem.name : ""
- onYes: Cura.ContainerManager.removeContainer(base.currentItem.id)
+ onYes:
+ {
+ var containers = Cura.ContainerManager.findInstanceContainers({"GUID": base.currentItem.metadata.GUID})
+ for(var i in containers)
+ {
+ Cura.ContainerManager.removeContainer(containers[i])
+ }
+ }
+ }
+
+ FileDialog
+ {
+ id: importDialog;
+ title: catalog.i18nc("@title:window", "Import Material");
+ selectExisting: true;
+ nameFilters: Cura.ContainerManager.getContainerNameFilters("material")
+ folder: CuraApplication.getDefaultPath()
+ onAccepted:
+ {
+ var result = Cura.ContainerManager.importContainer(fileUrl)
+
+ messageDialog.title = catalog.i18nc("@title:window", "Import Material")
+ messageDialog.text = catalog.i18nc("@info:status", "Could not import material %1: %2").arg(fileUrl).arg(result.message)
+ if(result.status == "success")
+ {
+ messageDialog.icon = StandardIcon.Information
+ messageDialog.text = catalog.i18nc("@info:status", "Successfully imported material %1").arg(fileUrl)
+ }
+ else if(result.status == "duplicate")
+ {
+ messageDialog.icon = StandardIcon.Warning
+ }
+ else
+ {
+ messageDialog.icon = StandardIcon.Critical
+ }
+ messageDialog.open()
+ }
+ }
+
+ FileDialog
+ {
+ id: exportDialog;
+ title: catalog.i18nc("@title:window", "Export Material");
+ selectExisting: false;
+ nameFilters: Cura.ContainerManager.getContainerNameFilters("material")
+ folder: CuraApplication.getDefaultPath()
+ onAccepted:
+ {
+ if(base.currentItem.metadata.base_file)
+ {
+ var result = Cura.ContainerManager.exportContainer(base.currentItem.metadata.base_file, selectedNameFilter, fileUrl)
+ }
+ else
+ {
+ var result = Cura.ContainerManager.exportContainer(base.currentItem.id, selectedNameFilter, fileUrl)
+ }
+
+ messageDialog.title = catalog.i18nc("@title:window", "Export Material")
+ if(result.status == "error")
+ {
+ messageDialog.icon = StandardIcon.Critical
+ messageDialog.text = catalog.i18nc("@info:status", "Failed to export material to %1: %2").arg(fileUrl).arg(result.message)
+ messageDialog.open()
+ }
+ else if(result.status == "success")
+ {
+ messageDialog.icon = StandardIcon.Information
+ messageDialog.text = catalog.i18nc("@info:status", "Successfully exported material to %1").arg(fileUrl)
+ messageDialog.open()
+ }
+ }
+ }
+
+ MessageDialog
+ {
+ id: messageDialog
}
}