diff --git a/resources/qml/ColorDialog.qml b/resources/qml/ColorDialog.qml
index 3818ea5cb4..be587a4f25 100644
--- a/resources/qml/ColorDialog.qml
+++ b/resources/qml/ColorDialog.qml
@@ -21,17 +21,6 @@ UM.Dialog
property alias swatchGridColumns: colorSwatchGrid.columns
- // In this case we would like to let the content of the dialog determine the size of the dialog
- // however with the current implementation of the dialog this is not possible, so instead we calculate
- // the size of the dialog ourselves.
- minimumWidth: content.width + 4 * margin
- minimumHeight:
- content.height // content height
- + buttonRow.height // button row height
- + 5 * margin // top and bottom margin and margin between buttons and content
- width: minimumWidth
- height: minimumHeight
-
property alias color: colorInput.text
property var swatchColors: [
"#2161AF", "#57AFB2", "#F7B32D", "#E33D4A", "#C088AD",
diff --git a/resources/qml/Preferences/Materials/MaterialsPage.qml b/resources/qml/Preferences/Materials/MaterialsPage.qml
index c9e6cf07a1..a9012e91b6 100644
--- a/resources/qml/Preferences/Materials/MaterialsPage.qml
+++ b/resources/qml/Preferences/Materials/MaterialsPage.qml
@@ -3,13 +3,12 @@
import QtQuick 2.7
import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.3
import QtQuick.Dialogs 1.2
import UM 1.5 as UM
import Cura 1.5 as Cura
-Item
+UM.ManagementPage
{
id: base
@@ -36,12 +35,6 @@ Item
property var extruder_position: Cura.ExtruderManager.activeExtruderIndex
property var active_root_material_id: Cura.MachineManager.currentRootMaterialId[extruder_position]
- UM.I18nCatalog
- {
- id: catalog
- name: "cura"
- }
-
function resetExpandedActiveMaterial()
{
materialListView.expandActiveMaterial(active_root_material_id)
@@ -74,57 +67,14 @@ Item
}
}
- // Main layout
- Label
- {
- id: titleLabel
- anchors
- {
- top: parent.top
- left: parent.left
- right: parent.right
- margins: 5 * screenScaleFactor
- }
- font.pointSize: 18
- text: catalog.i18nc("@title:tab", "Materials")
- }
+ title: catalog.i18nc("@title:tab", "Materials")
+ scrollviewCaption: catalog.i18nc("@label", "Materials compatible with active printer:") + `
${Cura.MachineManager.activeMachine.name}`
- // Button Row
- Row
- {
- id: buttonRow
- anchors
- {
- left: parent.left
- right: parent.right
- top: titleLabel.bottom
- }
- height: childrenRect.height
-
- // Activate button
- Button
- {
- id: activateMenuButton
- text: catalog.i18nc("@action:button", "Activate")
- icon.name: "list-activate"
- enabled: !isCurrentItemActivated && Cura.MachineManager.activeMachine.hasMaterials
- onClicked:
- {
- forceActiveFocus()
-
- // Set the current material as the one to be activated (needed to force the UI update)
- base.newRootMaterialIdToSwitchTo = base.currentItem.root_material_id
- const extruder_position = Cura.ExtruderManager.activeExtruderIndex
- Cura.MachineManager.setMaterial(extruder_position, base.currentItem.container_node)
- }
- }
-
- // Create button
- Button
+ buttons: [
+ Cura.SecondaryButton
{
id: createMenuButton
- text: catalog.i18nc("@action:button", "Create")
- icon.name: "list-add"
+ text: catalog.i18nc("@action:button", "Create new")
enabled: Cura.MachineManager.activeMachine.hasMaterials
onClicked:
{
@@ -132,72 +82,22 @@ Item
base.newRootMaterialIdToSwitchTo = base.materialManagementModel.createMaterial();
base.toActivateNewMaterial = true;
}
- }
-
- // Duplicate button
- Button
- {
- id: duplicateMenuButton
- text: catalog.i18nc("@action:button", "Duplicate");
- icon.name: "list-add"
- enabled: base.hasCurrentItem
- onClicked:
- {
- forceActiveFocus();
- base.newRootMaterialIdToSwitchTo = base.materialManagementModel.duplicateMaterial(base.currentItem.container_node);
- base.toActivateNewMaterial = true;
- }
- }
-
- // Remove button
- Button
- {
- id: removeMenuButton
- text: catalog.i18nc("@action:button", "Remove")
- icon.name: "list-remove"
- enabled: base.hasCurrentItem && !base.currentItem.is_read_only && !base.isCurrentItemActivated && base.materialManagementModel.canMaterialBeRemoved(base.currentItem.container_node)
-
- onClicked:
- {
- forceActiveFocus();
- confirmRemoveMaterialDialog.open();
- }
- }
-
- // Import button
- Button
+ },
+ Cura.SecondaryButton
{
id: importMenuButton
text: catalog.i18nc("@action:button", "Import")
- icon.name: "document-import"
onClicked:
{
forceActiveFocus();
importMaterialDialog.open();
}
enabled: Cura.MachineManager.activeMachine.hasMaterials
- }
-
- // Export button
- Button
- {
- id: exportMenuButton
- text: catalog.i18nc("@action:button", "Export")
- icon.name: "document-export"
- onClicked:
- {
- forceActiveFocus();
- exportMaterialDialog.open();
- }
- enabled: base.hasCurrentItem
- }
-
- //Sync button.
- Button
+ },
+ Cura.SecondaryButton
{
id: syncMaterialsButton
- text: catalog.i18nc("@action:button Sending materials to printers", "Sync with Printers")
- icon.name: "sync-synchronizing"
+ text: catalog.i18nc("@action:button", "Sync with Printers")
onClicked:
{
forceActiveFocus();
@@ -205,181 +105,176 @@ Item
}
visible: Cura.MachineManager.activeMachine.supportsMaterialExport
}
- }
+ ]
- Item
+ onHamburgeButtonClicked: menu.popup(content_item, content_item.width - menu.width, hamburger_button.height)
+
+ listContent: ScrollView
{
- id: contentsItem
- anchors
- {
- top: titleLabel.bottom
- left: parent.left
- right: parent.right
- bottom: parent.bottom
- margins: 5 * screenScaleFactor
- bottomMargin: 0
- }
+ id: materialScrollView
+ anchors.fill: parent
+ anchors.margins: parent.border.width
+ width: (parent.width * 0.4) | 0
+
clip: true
- }
-
- Item
- {
- anchors
+ ScrollBar.vertical: UM.ScrollBar
{
- top: buttonRow.bottom
- topMargin: UM.Theme.getSize("default_margin").height
- left: parent.left
- right: parent.right
- bottom: parent.bottom
- }
-
- SystemPalette { id: palette }
-
- Label
- {
- id: captionLabel
+ id: materialScrollBar
+ parent: materialScrollView
anchors
{
top: parent.top
- left: parent.left
- }
- visible: text != ""
- text:
- {
- var caption = catalog.i18nc("@action:label", "Printer") + ": " + Cura.MachineManager.activeMachine.name;
- if (Cura.MachineManager.activeMachine.hasVariants)
- {
- var activeVariantName = ""
- if(Cura.MachineManager.activeStack != null)
- {
- activeVariantName = Cura.MachineManager.activeStack.variant.name
- }
- caption += ", " + Cura.MachineManager.activeDefinitionVariantsName + ": " + activeVariantName;
- }
- return caption;
- }
- width: materialScrollView.width
- elide: Text.ElideRight
- }
-
- ScrollView
- {
- id: materialScrollView
- anchors
- {
- top: captionLabel.visible ? captionLabel.bottom : parent.top
- topMargin: captionLabel.visible ? UM.Theme.getSize("default_margin").height : 0
+ right: parent.right
bottom: parent.bottom
- left: parent.left
}
- width: (parent.width * 0.4) | 0
+ }
+ contentHeight: materialListView.height //For some reason, this is not determined automatically with this ScrollView. Very weird!
- clip: true
- ScrollBar.vertical: UM.ScrollBar
+ MaterialsList
+ {
+ id: materialListView
+ width: materialScrollView.width - materialScrollBar.width
+ }
+ }
+
+
+ Item
+ {
+ id: content_item
+ anchors.fill: parent
+
+ Cura.Menu
+ {
+ id: menu
+ Cura.MenuItem
{
- id: materialScrollBar
- parent: materialScrollView
- anchors
+ id: activateMenuButton
+ text: catalog.i18nc("@action:button", "Activate")
+ onClicked:
{
- top: parent.top
- right: parent.right
- bottom: parent.bottom
+ forceActiveFocus()
+
+ // Set the current material as the one to be activated (needed to force the UI update)
+ base.newRootMaterialIdToSwitchTo = base.currentItem.root_material_id
+ const extruder_position = Cura.ExtruderManager.activeExtruderIndex
+ Cura.MachineManager.setMaterial(extruder_position, base.currentItem.container_node)
}
}
- contentHeight: materialListView.height //For some reason, this is not determined automatically with this ScrollView. Very weird!
-
- MaterialsList
+ Cura.MenuItem
{
- id: materialListView
- width: materialScrollView.width - materialScrollBar.width
+ id: duplicateMenuButton
+ text: catalog.i18nc("@action:button", "Duplicate");
+ enabled: base.hasCurrentItem
+ onClicked:
+ {
+ forceActiveFocus();
+ base.newRootMaterialIdToSwitchTo = base.materialManagementModel.duplicateMaterial(base.currentItem.container_node);
+ base.toActivateNewMaterial = true;
+ }
+ }
+ Cura.MenuItem
+ {
+ id: removeMenuButton
+ text: catalog.i18nc("@action:button", "Remove")
+ enabled: base.hasCurrentItem && !base.currentItem.is_read_only && !base.isCurrentItemActivated && base.materialManagementModel.canMaterialBeRemoved(base.currentItem.container_node)
+
+ onClicked:
+ {
+ forceActiveFocus();
+ confirmRemoveMaterialDialog.open();
+ }
+ }
+ Cura.MenuItem
+ {
+ id: exportMenuButton
+ text: catalog.i18nc("@action:button", "Export")
+ onClicked:
+ {
+ forceActiveFocus();
+ exportMaterialDialog.open();
+ }
+ enabled: base.hasCurrentItem
}
}
MaterialsDetailsPanel
{
id: materialDetailsPanel
- anchors
+ anchors.fill: parent
+ }
+
+ // Dialogs
+ Cura.MessageDialog
+ {
+ id: confirmRemoveMaterialDialog
+ title: catalog.i18nc("@title:window", "Confirm Remove")
+ property string materialName: base.currentItem !== null ? base.currentItem.name : ""
+
+ text: catalog.i18nc("@label (%1 is object name)", "Are you sure you wish to remove %1? This cannot be undone!").arg(materialName)
+ standardButtons: Dialog.Yes | Dialog.No
+ onAccepted:
{
- left: materialScrollView.right
- leftMargin: UM.Theme.getSize("default_margin").width
- top: parent.top
- bottom: parent.bottom
- right: parent.right
+ // Set the active material as the fallback. It will be selected when the current material is deleted
+ base.newRootMaterialIdToSwitchTo = base.active_root_material_id
+ base.materialManagementModel.removeMaterial(base.currentItem.container_node);
}
}
- }
- // Dialogs
- Cura.MessageDialog
- {
- id: confirmRemoveMaterialDialog
- title: catalog.i18nc("@title:window", "Confirm Remove")
- property string materialName: base.currentItem !== null ? base.currentItem.name : ""
-
- text: catalog.i18nc("@label (%1 is object name)", "Are you sure you wish to remove %1? This cannot be undone!").arg(materialName)
- standardButtons: Dialog.Yes | Dialog.No
- onAccepted:
+ FileDialog
{
- // Set the active material as the fallback. It will be selected when the current material is deleted
- base.newRootMaterialIdToSwitchTo = base.active_root_material_id
- base.materialManagementModel.removeMaterial(base.currentItem.container_node);
- }
- }
-
- FileDialog
- {
- id: importMaterialDialog
- title: catalog.i18nc("@title:window", "Import Material")
- selectExisting: true
- nameFilters: Cura.ContainerManager.getContainerNameFilters("material")
- folder: CuraApplication.getDefaultPath("dialog_material_path")
- onAccepted:
- {
- const result = Cura.ContainerManager.importMaterialContainer(fileUrl);
-
- const messageDialog = Qt.createQmlObject("import Cura 1.5 as Cura; Cura.MessageDialog { onClosed: destroy() }", base);
- messageDialog.standardButtons = Dialog.Ok;
- messageDialog.title = catalog.i18nc("@title:window", "Import Material");
- switch (result.status)
+ id: importMaterialDialog
+ title: catalog.i18nc("@title:window", "Import Material")
+ selectExisting: true
+ nameFilters: Cura.ContainerManager.getContainerNameFilters("material")
+ folder: CuraApplication.getDefaultPath("dialog_material_path")
+ onAccepted:
{
- case "success":
- messageDialog.text = catalog.i18nc("@info:status Don't translate the XML tag !", "Successfully imported material %1").arg(fileUrl);
- break;
- default:
- messageDialog.text = catalog.i18nc("@info:status Don't translate the XML tags or !", "Could not import material %1: %2").arg(fileUrl).arg(result.message);
- break;
+ const result = Cura.ContainerManager.importMaterialContainer(fileUrl);
+
+ const messageDialog = Qt.createQmlObject("import Cura 1.5 as Cura; Cura.MessageDialog { onClosed: destroy() }", base);
+ messageDialog.standardButtons = Dialog.Ok;
+ messageDialog.title = catalog.i18nc("@title:window", "Import Material");
+ switch (result.status)
+ {
+ case "success":
+ messageDialog.text = catalog.i18nc("@info:status Don't translate the XML tag !", "Successfully imported material %1").arg(fileUrl);
+ break;
+ default:
+ messageDialog.text = catalog.i18nc("@info:status Don't translate the XML tags or !", "Could not import material %1: %2").arg(fileUrl).arg(result.message);
+ break;
+ }
+ messageDialog.open();
+ CuraApplication.setDefaultPath("dialog_material_path", folder);
}
- messageDialog.open();
- CuraApplication.setDefaultPath("dialog_material_path", folder);
}
- }
- FileDialog
- {
- id: exportMaterialDialog
- title: catalog.i18nc("@title:window", "Export Material")
- selectExisting: false
- nameFilters: Cura.ContainerManager.getContainerNameFilters("material")
- folder: CuraApplication.getDefaultPath("dialog_material_path")
- onAccepted:
+ FileDialog
{
- const result = Cura.ContainerManager.exportContainer(base.currentItem.root_material_id, selectedNameFilter, fileUrl);
-
- const messageDialog = Qt.createQmlObject("import Cura 1.5 as Cura; Cura.MessageDialog { onClosed: destroy() }", base);
- messageDialog.title = catalog.i18nc("@title:window", "Export Material");
- messageDialog.standardButtons = Dialog.Ok;
- switch (result.status)
+ id: exportMaterialDialog
+ title: catalog.i18nc("@title:window", "Export Material")
+ selectExisting: false
+ nameFilters: Cura.ContainerManager.getContainerNameFilters("material")
+ folder: CuraApplication.getDefaultPath("dialog_material_path")
+ onAccepted:
{
- case "error":
- messageDialog.text = catalog.i18nc("@info:status Don't translate the XML tags and !", "Failed to export material to %1: %2").arg(fileUrl).arg(result.message);
- break;
- case "success":
- messageDialog.text = catalog.i18nc("@info:status Don't translate the XML tag !", "Successfully exported material to %1").arg(result.path);
- break;
- }
- messageDialog.open();
+ const result = Cura.ContainerManager.exportContainer(base.currentItem.root_material_id, selectedNameFilter, fileUrl);
- CuraApplication.setDefaultPath("dialog_material_path", folder);
+ const messageDialog = Qt.createQmlObject("import Cura 1.5 as Cura; Cura.MessageDialog { onClosed: destroy() }", base);
+ messageDialog.title = catalog.i18nc("@title:window", "Export Material");
+ messageDialog.standardButtons = Dialog.Ok;
+ switch (result.status)
+ {
+ case "error":
+ messageDialog.text = catalog.i18nc("@info:status Don't translate the XML tags and !", "Failed to export material to %1: %2").arg(fileUrl).arg(result.message);
+ break;
+ case "success":
+ messageDialog.text = catalog.i18nc("@info:status Don't translate the XML tag !", "Successfully exported material to %1").arg(result.path);
+ break;
+ }
+ messageDialog.open();
+
+ CuraApplication.setDefaultPath("dialog_material_path", folder);
+ }
}
}
}
diff --git a/resources/qml/Preferences/Materials/MaterialsSlot.qml b/resources/qml/Preferences/Materials/MaterialsSlot.qml
index cd8c05fbf9..03c7d5dc9d 100644
--- a/resources/qml/Preferences/Materials/MaterialsSlot.qml
+++ b/resources/qml/Preferences/Materials/MaterialsSlot.qml
@@ -35,10 +35,9 @@ Rectangle
{
id: swatch
color: material != null ? material.color_code : "transparent"
- border.width: UM.Theme.getSize("default_lining").width
- border.color: "black"
- width: UM.Theme.getSize("favorites_button_icon").width
- height: UM.Theme.getSize("favorites_button_icon").height
+ width: UM.Theme.getSize("icon_indicator").width
+ height: UM.Theme.getSize("icon_indicator").height
+ radius: width / 2
anchors.verticalCenter: materialSlot.verticalCenter
anchors.left: materialSlot.left
anchors.leftMargin: UM.Theme.getSize("default_margin").width
diff --git a/resources/qml/Preferences/Materials/MaterialsView.qml b/resources/qml/Preferences/Materials/MaterialsView.qml
index 915d36ff57..56b71efe34 100644
--- a/resources/qml/Preferences/Materials/MaterialsView.qml
+++ b/resources/qml/Preferences/Materials/MaterialsView.qml
@@ -4,6 +4,7 @@
import QtQuick 2.7
import QtQuick.Controls 2.15
import QtQuick.Dialogs 1.2
+import QtQuick.Layouts 1.3
import UM 1.5 as UM
import Cura 1.0 as Cura
@@ -82,398 +83,520 @@ Item
}
}
- ScrollView
+ Rectangle
{
- id: informationPage
+ color: UM.Theme.getColor("main_background")
+
anchors
{
top: pageSelectorTabRow.bottom
+ topMargin: -UM.Theme.getSize("default_lining").width
left: parent.left
right: parent.right
bottom: parent.bottom
}
+ border.width: UM.Theme.getSize("default_lining").width
+ border.color: UM.Theme.getColor("thick_lining")
+ visible: base.hasCurrentItem
- ScrollBar.vertical: UM.ScrollBar
+ ScrollView
{
- parent: informationPage
+ id: informationPage
anchors
{
- top: parent.top
+ fill: parent
+ topMargin: UM.Theme.getSize("thin_margin").height
+ bottomMargin: UM.Theme.getSize("thin_margin").height
+ leftMargin: UM.Theme.getSize("thin_margin").width
+ rightMargin: UM.Theme.getSize("thin_margin").width
+ }
+
+ ScrollBar.vertical: UM.ScrollBar
+ {
+ parent: informationPage
+ anchors
+ {
+ top: parent.top
+ right: parent.right
+ bottom: parent.bottom
+ }
+ }
+ ScrollBar.horizontal.policy: ScrollBar.AlwaysOff
+ clip: true
+ visible: pageSelectorTabRow.currentItem.activeView === "information"
+
+ property real columnWidth: Math.floor(width / 2 - UM.Theme.getSize("narrow_margin").width)
+ property real rowHeight: UM.Theme.getSize("setting_control").height
+
+ Column
+ {
+ width: informationPage.width
+ spacing: UM.Theme.getSize("narrow_margin").height
+
+ Cura.MessageDialog
+ {
+ id: confirmDiameterChangeDialog
+
+ title: catalog.i18nc("@title:window", "Confirm Diameter Change")
+ text: catalog.i18nc("@label (%1 is a number)", "The new filament diameter is set to %1 mm, which is not compatible with the current extruder. Do you wish to continue?".arg(new_diameter_value))
+ standardButtons: Dialog.Yes | Dialog.No
+
+ property var new_diameter_value: null
+ property var old_diameter_value: null
+ property var old_approximate_diameter_value: null
+
+ onAccepted:
+ {
+ base.setMetaDataEntry("approximate_diameter", old_approximate_diameter_value, getApproximateDiameter(new_diameter_value).toString());
+ base.setMetaDataEntry("properties/diameter", properties.diameter, new_diameter_value);
+ // CURA-6868 Make sure to update the extruder to user a diameter-compatible material.
+ Cura.MachineManager.updateMaterialWithVariant()
+ base.resetSelectedMaterial()
+ }
+
+ onRejected:
+ {
+ base.properties.diameter = old_diameter_value;
+ diameterSpinBox.value = Qt.binding(function() { return base.properties.diameter })
+ }
+ }
+
+ Row
+ {
+ spacing: UM.Theme.getSize("narrow_margin").width
+ UM.Label
+ {
+ height: informationPage.rowHeight
+ width: informationPage.columnWidth
+ text: catalog.i18nc("@label", "Display Name")
+ }
+ Cura.TextField
+ {
+ id: displayNameTextField;
+ width: informationPage.columnWidth;
+ text: properties.name;
+ enabled: base.editingEnabled;
+ onEditingFinished: base.updateMaterialDisplayName(properties.name, text)
+ }
+ }
+
+ Row
+ {
+ spacing: UM.Theme.getSize("narrow_margin").width
+ UM.Label
+ {
+ height: informationPage.rowHeight
+ width: informationPage.columnWidth
+ text: catalog.i18nc("@label", "Brand")
+ }
+ Cura.TextField
+ {
+ id: brandTextField
+ width: informationPage.columnWidth
+ text: properties.brand
+ enabled: base.editingEnabled
+ onEditingFinished: base.updateMaterialBrand(properties.brand, text)
+ }
+ }
+
+ Row
+ {
+ spacing: UM.Theme.getSize("narrow_margin").width
+ UM.Label
+ {
+ height: informationPage.rowHeight
+ width: informationPage.columnWidth
+ text: catalog.i18nc("@label", "Material Type")
+ }
+ Cura.TextField
+ {
+ id: materialTypeField
+ width: informationPage.columnWidth
+ text: properties.material
+ enabled: base.editingEnabled
+ onEditingFinished: base.updateMaterialType(properties.material, text)
+ }
+ }
+
+ Row
+ {
+ spacing: UM.Theme.getSize("narrow_margin").width
+ UM.Label
+ {
+ height: informationPage.rowHeight
+ width: informationPage.columnWidth
+ verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Color")
+ }
+
+ Row
+ {
+ width: informationPage.columnWidth
+ spacing: Math.round(UM.Theme.getSize("default_margin").width / 2)
+
+ // color indicator square
+ Item
+ {
+ id: colorSelector
+
+ anchors.verticalCenter: parent.verticalCenter
+
+ width: childrenRect.width + 2 * UM.Theme.getSize("narrow_margin").width
+ height: childrenRect.height + 2 * UM.Theme.getSize("narrow_margin").height
+
+ Rectangle
+ {
+ color: properties.color_code
+ width: UM.Theme.getSize("icon_indicator").width
+ height: UM.Theme.getSize("icon_indicator").height
+ radius: width / 2
+ anchors.centerIn: parent
+ }
+
+ // open the color selection dialog on click
+ MouseArea
+ {
+ anchors.fill: parent
+ onClicked: colorDialog.open()
+ enabled: base.editingEnabled
+ }
+ }
+
+ // pretty color name text field
+ Cura.TextField
+ {
+ id: colorLabel;
+ width: parent.width - colorSelector.width - parent.spacing
+ text: properties.color_name;
+ enabled: base.editingEnabled
+ onEditingFinished: base.setMetaDataEntry("color_name", properties.color_name, text)
+ }
+
+ // popup dialog to select a new color
+ // if successful it sets the properties.color_code value to the new color
+ Cura.ColorDialog
+ {
+ id: colorDialog
+ title: catalog.i18nc("@title", "Material color picker")
+ color: properties.color_code
+ onAccepted: base.setMetaDataEntry("color_code", properties.color_code, color)
+ }
+ }
+ }
+
+ UM.Label
+ {
+ width: parent.width
+ height: parent.rowHeight
+ font: UM.Theme.getFont("default_bold")
+ verticalAlignment: Qt.AlignVCenter
+ text: catalog.i18nc("@label", "Properties")
+ }
+
+ Row
+ {
+ height: parent.rowHeight
+ spacing: UM.Theme.getSize("narrow_margin").width
+ UM.Label
+ {
+ height: informationPage.rowHeight
+ width: informationPage.columnWidth
+ text: catalog.i18nc("@label", "Density")
+ }
+ Cura.SpinBox
+ {
+ enabled: base.editingEnabled
+ id: densitySpinBox
+ width: informationPage.columnWidth
+ value: properties.density
+ decimals: 2
+ suffix: " g/cm³"
+ stepSize: 0.01
+
+ onEditingFinished: base.setMetaDataEntry("properties/density", properties.density, value)
+ onValueChanged: updateCostPerMeter()
+ }
+ }
+
+ Row
+ {
+ height: parent.rowHeight
+ spacing: UM.Theme.getSize("narrow_margin").width
+ UM.Label
+ {
+ height: informationPage.rowHeight
+ width: informationPage.columnWidth
+ text: catalog.i18nc("@label", "Diameter")
+ }
+ Cura.SpinBox
+ {
+ enabled: base.editingEnabled
+ id: diameterSpinBox
+ width: informationPage.columnWidth
+ value: properties.diameter
+ decimals: 2
+ suffix: " mm"
+ stepSize: 0.01
+
+ onEditingFinished:
+ {
+ // This does not use a SettingPropertyProvider, because we need to make the change to all containers
+ // which derive from the same base_file
+ var old_diameter = Cura.ContainerManager.getContainerMetaDataEntry(base.containerId, "properties/diameter");
+ var old_approximate_diameter = Cura.ContainerManager.getContainerMetaDataEntry(base.containerId, "approximate_diameter");
+ var new_approximate_diameter = getApproximateDiameter(value);
+ if (new_approximate_diameter != Cura.ExtruderManager.getActiveExtruderStack().approximateMaterialDiameter)
+ {
+ confirmDiameterChangeDialog.old_diameter_value = old_diameter;
+ confirmDiameterChangeDialog.new_diameter_value = value;
+ confirmDiameterChangeDialog.old_approximate_diameter_value = old_approximate_diameter;
+
+ confirmDiameterChangeDialog.open()
+ }
+ else {
+ base.setMetaDataEntry("approximate_diameter", old_approximate_diameter, getApproximateDiameter(value).toString());
+ base.setMetaDataEntry("properties/diameter", properties.diameter, value);
+ }
+ }
+ onValueChanged: updateCostPerMeter()
+ }
+ }
+
+ Row
+ {
+ height: parent.rowHeight
+ spacing: UM.Theme.getSize("narrow_margin").width
+ UM.Label
+ {
+ height: informationPage.rowHeight
+ width: informationPage.columnWidth
+ text: catalog.i18nc("@label", "Filament Cost")
+ }
+ Cura.SpinBox
+ {
+ id: spoolCostSpinBox
+ width: informationPage.columnWidth
+ value: base.getMaterialPreferenceValue(properties.guid, "spool_cost")
+ to: 100000000
+ editable: true
+ prefix: base.currency + " "
+ decimals: 2
+
+ onValueChanged:
+ {
+ base.setMaterialPreferenceValue(properties.guid, "spool_cost", parseFloat(value))
+ updateCostPerMeter()
+ }
+ }
+ }
+
+ Row
+ {
+ height: parent.rowHeight
+ spacing: UM.Theme.getSize("narrow_margin").width
+ UM.Label
+ {
+ height: informationPage.rowHeight
+ width: informationPage.columnWidth
+ text: catalog.i18nc("@label", "Filament weight")
+ }
+ Cura.SpinBox
+ {
+ id: spoolWeightSpinBox
+ width: informationPage.columnWidth
+ value: base.getMaterialPreferenceValue(properties.guid, "spool_weight", Cura.ContainerManager.getContainerMetaDataEntry(properties.container_id, "properties/weight"))
+ stepSize: 100
+ to: 10000
+ editable: true
+ suffix: " g"
+
+ onValueChanged:
+ {
+ base.setMaterialPreferenceValue(properties.guid, "spool_weight", parseFloat(value))
+ updateCostPerMeter()
+ }
+ }
+ }
+
+ Row
+ {
+ height: parent.rowHeight
+ spacing: UM.Theme.getSize("narrow_margin").width
+ UM.Label
+ {
+ height: informationPage.rowHeight
+ width: informationPage.columnWidth
+ text: catalog.i18nc("@label", "Filament length")
+ }
+ UM.Label
+ {
+ width: informationPage.columnWidth
+ text: "~ %1 m".arg(Math.round(base.spoolLength))
+ height: informationPage.rowHeight
+ }
+ }
+
+ Row
+ {
+ height: parent.rowHeight
+ spacing: UM.Theme.getSize("narrow_margin").width
+ UM.Label
+ {
+ height: informationPage.rowHeight
+ width: informationPage.columnWidth
+ text: catalog.i18nc("@label", "Cost per Meter")
+ }
+ UM.Label
+ {
+ height: informationPage.rowHeight
+ width: informationPage.columnWidth
+ text: "~ %1 %2/m".arg(base.costPerMeter.toFixed(2)).arg(base.currency)
+ }
+ }
+
+ UM.Label
+ {
+ height: parent.rowHeight
+ width: informationPage.width
+ text: catalog.i18nc("@label", "This material is linked to %1 and shares some of its properties.").arg(base.linkedMaterialNames)
+ wrapMode: Text.WordWrap
+ visible: unlinkMaterialButton.visible
+ }
+ Cura.SecondaryButton
+ {
+ id: unlinkMaterialButton
+ text: catalog.i18nc("@label", "Unlink Material")
+ visible: base.linkedMaterialNames != ""
+ onClicked:
+ {
+ Cura.ContainerManager.unlinkMaterial(base.currentMaterialNode)
+ base.reevaluateLinkedMaterials = true
+ }
+ }
+
+ UM.Label
+ {
+ width: informationPage.width
+ height: parent.rowHeight
+ text: catalog.i18nc("@label", "Description")
+ }
+ ReadOnlyTextArea
+ {
+ text: properties.description
+ width: informationPage.width
+ height: 0.4 * informationPage.width
+ wrapMode: Text.WordWrap
+
+ readOnly: !base.editingEnabled
+
+ onEditingFinished: base.setMetaDataEntry("description", properties.description, text)
+ }
+
+ UM.Label
+ {
+ width: informationPage.width
+ height: parent.rowHeight
+ text: catalog.i18nc("@label", "Adhesion Information")
+ }
+
+ ReadOnlyTextArea
+ {
+ text: properties.adhesion_info
+ width: informationPage.width
+ height: 0.4 * informationPage.width
+ wrapMode: Text.WordWrap
+ readOnly: !base.editingEnabled
+
+ onEditingFinished: base.setMetaDataEntry("adhesion_info", properties.adhesion_info, text)
+ }
+ }
+ }
+
+ ListView
+ {
+ anchors
+ {
+ top: pageSelectorTabRow.bottom
+ left: parent.left
right: parent.right
bottom: parent.bottom
}
- }
- ScrollBar.horizontal.policy: ScrollBar.AlwaysOff
- clip: true
- visible: pageSelectorTabRow.currentItem.activeView === "information"
- property real columnWidth: (width * 0.5 - UM.Theme.getSize("default_margin").width) | 0
-
- Flow
- {
- id: containerGrid
-
- x: UM.Theme.getSize("default_margin").width
- y: UM.Theme.getSize("default_lining").height
-
- width: base.width
- property real rowHeight: brandTextField.height + UM.Theme.getSize("default_lining").height
-
- Cura.MessageDialog
+ model: UM.SettingDefinitionsModel
{
- id: confirmDiameterChangeDialog
-
- title: catalog.i18nc("@title:window", "Confirm Diameter Change")
- text: catalog.i18nc("@label (%1 is a number)", "The new filament diameter is set to %1 mm, which is not compatible with the current extruder. Do you wish to continue?".arg(new_diameter_value))
- standardButtons: Dialog.Yes | Dialog.No
-
- property var new_diameter_value: null
- property var old_diameter_value: null
- property var old_approximate_diameter_value: null
-
- onAccepted:
- {
- base.setMetaDataEntry("approximate_diameter", old_approximate_diameter_value, getApproximateDiameter(new_diameter_value).toString());
- base.setMetaDataEntry("properties/diameter", properties.diameter, new_diameter_value);
- // CURA-6868 Make sure to update the extruder to user a diameter-compatible material.
- Cura.MachineManager.updateMaterialWithVariant()
- base.resetSelectedMaterial()
- }
-
- onRejected:
- {
- base.properties.diameter = old_diameter_value;
- diameterSpinBox.value = Qt.binding(function() { return base.properties.diameter })
- }
- }
-
- Label { width: informationPage.columnWidth; height: parent.rowHeight; verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Display Name") }
- Cura.TextField
- {
- id: displayNameTextField;
- width: informationPage.columnWidth;
- text: properties.name;
- enabled: base.editingEnabled;
- onEditingFinished: base.updateMaterialDisplayName(properties.name, text)
- }
-
- Label { width: informationPage.columnWidth; height: parent.rowHeight; verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Brand") }
- Cura.TextField
- {
- id: brandTextField
- width: informationPage.columnWidth
- text: properties.brand
- enabled: base.editingEnabled
- onEditingFinished: base.updateMaterialBrand(properties.brand, text)
- }
-
- Label { width: informationPage.columnWidth; height: parent.rowHeight; verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Material Type") }
- Cura.TextField
- {
- id: materialTypeField
- width: informationPage.columnWidth
- text: properties.material
- enabled: base.editingEnabled
- onEditingFinished: base.updateMaterialType(properties.material, text)
- }
-
- Label { width: informationPage.columnWidth; height: parent.rowHeight; verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Color") }
- Row
- {
- width: informationPage.columnWidth
- height: parent.rowHeight
- spacing: Math.round(UM.Theme.getSize("default_margin").width / 2)
-
- // color indicator square
- Rectangle
- {
- id: colorSelector
- color: properties.color_code
-
- width: Math.round(colorLabel.height * 0.75)
- height: Math.round(colorLabel.height * 0.75)
- border.width: UM.Theme.getSize("default_lining").height
-
- anchors.verticalCenter: parent.verticalCenter
-
- // open the color selection dialog on click
- MouseArea
- {
- anchors.fill: parent
- onClicked: colorDialog.open()
- enabled: base.editingEnabled
- }
- }
-
- // pretty color name text field
- Cura.TextField
- {
- id: colorLabel;
- width: parent.width - colorSelector.width - parent.spacing
- text: properties.color_name;
- enabled: base.editingEnabled
- onEditingFinished: base.setMetaDataEntry("color_name", properties.color_name, text)
- }
-
- // popup dialog to select a new color
- // if successful it sets the properties.color_code value to the new color
- Cura.ColorDialog
- {
- id: colorDialog
- title: catalog.i18nc("@title", "Material color picker")
- color: properties.color_code
- onAccepted: base.setMetaDataEntry("color_code", properties.color_code, color)
- }
- }
-
- Item { width: parent.width; height: UM.Theme.getSize("default_margin").height }
-
- Label { width: parent.width; height: parent.rowHeight; font.bold: true; verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Properties") }
-
- Label { width: informationPage.columnWidth; height: parent.rowHeight; verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Density") }
-
- Cura.SpinBox
- {
- enabled: base.editingEnabled
- id: densitySpinBox
- width: informationPage.columnWidth
- value: properties.density
- decimals: 2
- suffix: " g/cm³"
- stepSize: 0.01
-
- onEditingFinished: base.setMetaDataEntry("properties/density", properties.density, value)
- onValueChanged: updateCostPerMeter()
- }
-
- Label { width: informationPage.columnWidth; height: parent.rowHeight; verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Diameter") }
- Cura.SpinBox
- {
- enabled: base.editingEnabled
- id: diameterSpinBox
- width: informationPage.columnWidth
- value: properties.diameter
- decimals: 2
- suffix: " mm"
- stepSize: 0.01
-
- onEditingFinished:
- {
- // This does not use a SettingPropertyProvider, because we need to make the change to all containers
- // which derive from the same base_file
- var old_diameter = Cura.ContainerManager.getContainerMetaDataEntry(base.containerId, "properties/diameter");
- var old_approximate_diameter = Cura.ContainerManager.getContainerMetaDataEntry(base.containerId, "approximate_diameter");
- var new_approximate_diameter = getApproximateDiameter(value);
- if (new_approximate_diameter != Cura.ExtruderManager.getActiveExtruderStack().approximateMaterialDiameter)
- {
- confirmDiameterChangeDialog.old_diameter_value = old_diameter;
- confirmDiameterChangeDialog.new_diameter_value = value;
- confirmDiameterChangeDialog.old_approximate_diameter_value = old_approximate_diameter;
-
- confirmDiameterChangeDialog.open()
- }
- else {
- base.setMetaDataEntry("approximate_diameter", old_approximate_diameter, getApproximateDiameter(value).toString());
- base.setMetaDataEntry("properties/diameter", properties.diameter, value);
- }
- }
- onValueChanged: updateCostPerMeter()
- }
-
- Label { width: informationPage.columnWidth; height: parent.rowHeight; verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Filament Cost") }
-
- Cura.SpinBox
- {
- id: spoolCostSpinBox
- width: informationPage.columnWidth
- value: base.getMaterialPreferenceValue(properties.guid, "spool_cost")
- to: 100000000
- editable: true
- prefix: base.currency + " "
- decimals: 2
-
- onValueChanged:
- {
- base.setMaterialPreferenceValue(properties.guid, "spool_cost", parseFloat(value))
- updateCostPerMeter()
- }
- }
-
- Label { width: informationPage.columnWidth; height: parent.rowHeight; verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Filament weight") }
- Cura.SpinBox
- {
- id: spoolWeightSpinBox
- width: informationPage.columnWidth
- value: base.getMaterialPreferenceValue(properties.guid, "spool_weight", Cura.ContainerManager.getContainerMetaDataEntry(properties.container_id, "properties/weight"))
- stepSize: 100
- to: 10000
- editable: true
- suffix: " g"
-
- onValueChanged:
- {
- base.setMaterialPreferenceValue(properties.guid, "spool_weight", parseFloat(value))
- updateCostPerMeter()
- }
- }
-
- Label { width: informationPage.columnWidth; height: parent.rowHeight; verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Filament length") }
- Label
- {
- width: informationPage.columnWidth
- text: "~ %1 m".arg(Math.round(base.spoolLength))
- verticalAlignment: Qt.AlignVCenter
- height: parent.rowHeight
- }
-
- Label { width: informationPage.columnWidth; height: parent.rowHeight; verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Cost per Meter") }
- Label
- {
- width: informationPage.columnWidth
- text: "~ %1 %2/m".arg(base.costPerMeter.toFixed(2)).arg(base.currency)
- verticalAlignment: Qt.AlignVCenter
- height: parent.rowHeight
- }
-
- Item { width: parent.width; height: UM.Theme.getSize("default_margin").height; visible: unlinkMaterialButton.visible }
- Label
- {
- width: 2 * informationPage.columnWidth
- verticalAlignment: Qt.AlignVCenter
- text: catalog.i18nc("@label", "This material is linked to %1 and shares some of its properties.").arg(base.linkedMaterialNames)
- wrapMode: Text.WordWrap
- visible: unlinkMaterialButton.visible
- }
- Button
- {
- id: unlinkMaterialButton
- text: catalog.i18nc("@label", "Unlink Material")
- visible: base.linkedMaterialNames != ""
- onClicked:
- {
- Cura.ContainerManager.unlinkMaterial(base.currentMaterialNode)
- base.reevaluateLinkedMaterials = true
- }
- }
-
- Item { width: parent.width; height: UM.Theme.getSize("default_margin").height }
-
- Label { width: parent.width; height: parent.rowHeight; verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Description") }
-
- ReadOnlyTextArea
- {
- text: properties.description;
- width: informationPage.columnWidth * 2
- height: 0.75 * informationPage.columnWidth
- wrapMode: Text.WordWrap
-
- readOnly: !base.editingEnabled
-
- onEditingFinished: base.setMetaDataEntry("description", properties.description, text)
- }
-
- Label { width: parent.width; height: parent.rowHeight; verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Adhesion Information") }
-
- ReadOnlyTextArea
- {
- text: properties.adhesion_info
- width: 2 * informationPage.columnWidth
- wrapMode: Text.WordWrap
- height: 0.75 * informationPage.columnWidth
- readOnly: !base.editingEnabled
-
- onEditingFinished: base.setMetaDataEntry("adhesion_info", properties.adhesion_info, text)
- }
-
- Item { width: parent.width; height: UM.Theme.getSize("default_margin").height }
- }
- }
-
- ListView
- {
- anchors
- {
- top: pageSelectorTabRow.bottom
- left: parent.left
- right: parent.right
- bottom: parent.bottom
- }
-
- model: UM.SettingDefinitionsModel
- {
- containerId: Cura.MachineManager.activeMachine != null ? Cura.MachineManager.activeMachine.definition.id: ""
- visibilityHandler: Cura.MaterialSettingsVisibilityHandler { }
- expanded: ["*"]
- }
- ScrollBar.vertical: UM.ScrollBar {}
- clip: true
- visible: pageSelectorTabRow.currentItem.activeView === "settings"
-
- delegate: UM.TooltipArea
- {
- width: childrenRect.width
- height: childrenRect.height
- text: model.description
- Label
- {
- id: label
- width: base.firstColumnWidth;
- height: spinBox.height + UM.Theme.getSize("default_lining").height
- text: model.label
- elide: Text.ElideRight
- verticalAlignment: Qt.AlignVCenter
- }
- Cura.SpinBox
- {
- id: spinBox
- anchors.left: label.right
- value:
- {
- // In case the setting is not in the material...
- if (!isNaN(parseFloat(materialPropertyProvider.properties.value)))
- {
- return parseFloat(materialPropertyProvider.properties.value);
- }
- // ... we search in the variant, and if it is not there...
- if (!isNaN(parseFloat(variantPropertyProvider.properties.value)))
- {
- return parseFloat(variantPropertyProvider.properties.value);
- }
- // ... then look in the definition container.
- if (!isNaN(parseFloat(machinePropertyProvider.properties.value)))
- {
- return parseFloat(machinePropertyProvider.properties.value);
- }
- return 0;
- }
- width: base.secondColumnWidth
- suffix: " " + model.unit
- to: 99999
- decimals: model.unit == "mm" ? 2 : 0
-
- onEditingFinished: materialPropertyProvider.setPropertyValue("value", value)
- }
-
- UM.ContainerPropertyProvider
- {
- id: materialPropertyProvider
- containerId: base.containerId
- watchedProperties: [ "value" ]
- key: model.key
- }
- UM.ContainerPropertyProvider
- {
- id: variantPropertyProvider
- containerId: Cura.MachineManager.activeStack.variant.id
- watchedProperties: [ "value" ]
- key: model.key
- }
- UM.ContainerPropertyProvider
- {
- id: machinePropertyProvider
containerId: Cura.MachineManager.activeMachine != null ? Cura.MachineManager.activeMachine.definition.id: ""
- watchedProperties: [ "value" ]
- key: model.key
+ visibilityHandler: Cura.MaterialSettingsVisibilityHandler { }
+ expanded: ["*"]
+ }
+ ScrollBar.vertical: UM.ScrollBar {}
+ clip: true
+ visible: pageSelectorTabRow.currentItem.activeView === "settings"
+
+ delegate: UM.TooltipArea
+ {
+ width: childrenRect.width
+ height: childrenRect.height
+ text: model.description
+ UM.Label
+ {
+ id: label
+ width: base.firstColumnWidth;
+ height: spinBox.height + UM.Theme.getSize("default_lining").height
+ text: model.label
+ elide: Text.ElideRight
+ verticalAlignment: Qt.AlignVCenter
+ }
+ Cura.SpinBox
+ {
+ id: spinBox
+ anchors.left: label.right
+ value:
+ {
+ // In case the setting is not in the material...
+ if (!isNaN(parseFloat(materialPropertyProvider.properties.value)))
+ {
+ return parseFloat(materialPropertyProvider.properties.value);
+ }
+ // ... we search in the variant, and if it is not there...
+ if (!isNaN(parseFloat(variantPropertyProvider.properties.value)))
+ {
+ return parseFloat(variantPropertyProvider.properties.value);
+ }
+ // ... then look in the definition container.
+ if (!isNaN(parseFloat(machinePropertyProvider.properties.value)))
+ {
+ return parseFloat(machinePropertyProvider.properties.value);
+ }
+ return 0;
+ }
+ width: base.secondColumnWidth
+ suffix: " " + model.unit
+ to: 99999
+ decimals: model.unit == "mm" ? 2 : 0
+
+ onEditingFinished: materialPropertyProvider.setPropertyValue("value", value)
+ }
+
+ UM.ContainerPropertyProvider
+ {
+ id: materialPropertyProvider
+ containerId: base.containerId
+ watchedProperties: [ "value" ]
+ key: model.key
+ }
+ UM.ContainerPropertyProvider
+ {
+ id: variantPropertyProvider
+ containerId: Cura.MachineManager.activeStack.variant.id
+ watchedProperties: [ "value" ]
+ key: model.key
+ }
+ UM.ContainerPropertyProvider
+ {
+ id: machinePropertyProvider
+ containerId: Cura.MachineManager.activeMachine != null ? Cura.MachineManager.activeMachine.definition.id: ""
+ watchedProperties: [ "value" ]
+ key: model.key
+ }
}
}
}