diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py
index 186d30fe89..aefe870e5f 100755
--- a/cura/CuraApplication.py
+++ b/cura/CuraApplication.py
@@ -51,7 +51,7 @@ from cura.Arranging.ArrangeObjectsJob import ArrangeObjectsJob
from cura.Arranging.ArrangeObjectsAllBuildPlatesJob import ArrangeObjectsAllBuildPlatesJob
from cura.Arranging.ShapeArray import ShapeArray
from cura.MultiplyObjectsJob import MultiplyObjectsJob
-from cura.PrintersModel import PrintersModel
+from cura.GlobalStacksModel import GlobalStacksModel
from cura.Scene.ConvexHullDecorator import ConvexHullDecorator
from cura.Operations.SetParentOperation import SetParentOperation
from cura.Scene.SliceableObjectDecorator import SliceableObjectDecorator
@@ -972,7 +972,7 @@ class CuraApplication(QtApplication):
qmlRegisterType(MultiBuildPlateModel, "Cura", 1, 0, "MultiBuildPlateModel")
qmlRegisterType(InstanceContainer, "Cura", 1, 0, "InstanceContainer")
qmlRegisterType(ExtrudersModel, "Cura", 1, 0, "ExtrudersModel")
- qmlRegisterType(PrintersModel, "Cura", 1, 0, "PrintersModel")
+ qmlRegisterType(GlobalStacksModel, "Cura", 1, 0, "GlobalStacksModel")
qmlRegisterType(FavoriteMaterialsModel, "Cura", 1, 0, "FavoriteMaterialsModel")
qmlRegisterType(GenericMaterialsModel, "Cura", 1, 0, "GenericMaterialsModel")
diff --git a/cura/PrintersModel.py b/cura/GlobalStacksModel.py
similarity index 87%
rename from cura/PrintersModel.py
rename to cura/GlobalStacksModel.py
index 8b5d2f6cc9..939809151d 100644
--- a/cura/PrintersModel.py
+++ b/cura/GlobalStacksModel.py
@@ -12,7 +12,8 @@ from cura.PrinterOutputDevice import ConnectionType
from cura.Settings.GlobalStack import GlobalStack
-class PrintersModel(ListModel):
+
+class GlobalStacksModel(ListModel):
NameRole = Qt.UserRole + 1
IdRole = Qt.UserRole + 2
HasRemoteConnectionRole = Qt.UserRole + 3
@@ -41,21 +42,14 @@ class PrintersModel(ListModel):
if isinstance(container, GlobalStack):
self._update()
- ## Handler for container name change events.
- def _onContainerNameChanged(self):
- self._update()
-
def _update(self) -> None:
items = []
- for container in self._container_stacks:
- container.nameChanged.disconnect(self._onContainerNameChanged)
container_stacks = ContainerRegistry.getInstance().findContainerStacks(type = "machine")
for container_stack in container_stacks:
- connection_type = container_stack.getMetaDataEntry("connection_type")
+ connection_type = int(container_stack.getMetaDataEntry("connection_type", ConnectionType.NotConnected.value))
has_remote_connection = connection_type in [ConnectionType.NetworkConnection.value, ConnectionType.CloudConnection.value]
-
if container_stack.getMetaDataEntry("hidden", False) in ["True", True]:
continue
diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py
index aeeb0381b2..99e8835c2f 100644
--- a/cura/PrinterOutputDevice.py
+++ b/cura/PrinterOutputDevice.py
@@ -36,7 +36,7 @@ class ConnectionState(IntEnum):
class ConnectionType(IntEnum):
- Unknown = 0
+ NotConnected = 0
UsbConnection = 1
NetworkConnection = 2
CloudConnection = 3
@@ -74,7 +74,7 @@ class PrinterOutputDevice(QObject, OutputDevice):
# Signal to indicate that the configuration of one of the printers has changed.
uniqueConfigurationsChanged = pyqtSignal()
- def __init__(self, device_id: str, connection_type: "ConnectionType" = ConnectionType.Unknown, parent: QObject = None) -> None:
+ def __init__(self, device_id: str, connection_type: "ConnectionType" = ConnectionType.NotConnected, parent: QObject = None) -> None:
super().__init__(device_id = device_id, parent = parent) # type: ignore # MyPy complains with the multiple inheritance
self._printers = [] # type: List[PrinterOutputModel]
diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py
index 2185bbce9d..32b83ead28 100755
--- a/cura/Settings/MachineManager.py
+++ b/cura/Settings/MachineManager.py
@@ -527,7 +527,7 @@ class MachineManager(QObject):
@pyqtProperty(bool, notify = printerConnectedStatusChanged)
def activeMachineHasRemoteConnection(self) -> bool:
if self._global_container_stack:
- connection_type = self._global_container_stack.getMetaDataEntry("connection_type")
+ connection_type = int(self._global_container_stack.getMetaDataEntry("connection_type", ConnectionType.NotConnected.value))
return connection_type in [ConnectionType.NetworkConnection.value, ConnectionType.CloudConnection.value]
return False
diff --git a/plugins/SimulationView/LayerSlider.qml b/plugins/SimulationView/LayerSlider.qml
index 42b8cf0ba0..88f298d1f5 100644
--- a/plugins/SimulationView/LayerSlider.qml
+++ b/plugins/SimulationView/LayerSlider.qml
@@ -163,9 +163,9 @@ Item
id: rangleHandleLabel
height: sliderRoot.handleSize + UM.Theme.getSize("default_margin").height
- x: parent.x + parent.width + UM.Theme.getSize("default_margin").width
+ x: parent.x - width - UM.Theme.getSize("default_margin").width
anchors.verticalCenter: parent.verticalCenter
- target: Qt.point(sliderRoot.width + width, y + height / 2)
+ target: Qt.point(sliderRoot.width, y + height / 2)
visible: sliderRoot.activeHandle == parent
// custom properties
diff --git a/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py
index bebccc54e3..5e8aaa9fa9 100644
--- a/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py
+++ b/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py
@@ -620,8 +620,9 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice):
if material_group_list is None:
material_name = i18n_catalog.i18nc("@label:material", "Empty") if len(material_data.get("guid", "")) == 0 \
else i18n_catalog.i18nc("@label:material", "Unknown")
+
return MaterialOutputModel(guid = material_data.get("guid", ""),
- type = material_data.get("type", ""),
+ type = material_data.get("material", ""),
color = material_data.get("color", ""),
brand = material_data.get("brand", ""),
name = material_data.get("name", material_name)
diff --git a/resources/qml/Menus/ConfigurationMenu/ConfigurationItem.qml b/resources/qml/Menus/ConfigurationMenu/ConfigurationItem.qml
index 862e1475a9..51ba77d012 100644
--- a/resources/qml/Menus/ConfigurationMenu/ConfigurationItem.qml
+++ b/resources/qml/Menus/ConfigurationMenu/ConfigurationItem.qml
@@ -12,7 +12,23 @@ Button
id: configurationItem
property var configuration: null
- hoverEnabled: true
+ hoverEnabled: isValidMaterial
+
+ property bool isValidMaterial:
+ {
+ var extruderConfigurations = configuration.extruderConfigurations
+
+ for (var index in extruderConfigurations)
+ {
+ var name = extruderConfigurations[index].material ? extruderConfigurations[index].material.name : ""
+
+ if (name == "" || name == "Unknown")
+ {
+ return false
+ }
+ }
+ return true
+ }
background: Rectangle
{
@@ -40,17 +56,104 @@ Button
right: parent.right
rightMargin: UM.Theme.getSize("wide_margin").width
}
-
+ height: childrenRect.height
spacing: UM.Theme.getSize("default_margin").width
Repeater
{
id: repeater
model: configuration.extruderConfigurations
+
delegate: PrintCoreConfiguration
{
width: Math.round(parent.width / 2)
printCoreConfiguration: modelData
+ visible: configurationItem.isValidMaterial
+ }
+ }
+
+ // Unknown material
+ Item
+ {
+ id: unknownMaterial
+ height: unknownMaterialMessage.height + UM.Theme.getSize("thin_margin").width / 2
+ width: parent.width
+
+ anchors.top: parent.top
+ anchors.topMargin: UM.Theme.getSize("thin_margin").width / 2
+
+ visible: !configurationItem.isValidMaterial
+
+ UM.RecolorImage
+ {
+ id: icon
+ anchors.verticalCenter: unknownMaterialMessage.verticalCenter
+
+ source: UM.Theme.getIcon("warning")
+ color: UM.Theme.getColor("warning")
+ width: UM.Theme.getSize("section_icon").width
+ height: width
+ }
+
+ Label
+ {
+ id: unknownMaterialMessage
+ text:
+ {
+ var extruderConfigurations = configuration.extruderConfigurations
+ var unknownMaterials = []
+ for (var index in extruderConfigurations)
+ {
+ var name = extruderConfigurations[index].material ? extruderConfigurations[index].material.name : ""
+ if (name == "" || name == "Unknown")
+ {
+ var materialType = extruderConfigurations[index].material.type
+ if (extruderConfigurations[index].material.type == "")
+ {
+ materialType = "Unknown"
+ }
+
+ var brand = extruderConfigurations[index].material.brand
+ if (brand == "")
+ {
+ brand = "Unknown"
+ }
+
+ name = materialType + " (" + brand + ")"
+ unknownMaterials.push(name)
+ }
+ }
+
+ unknownMaterials = "" + unknownMaterials + ""
+ var draftResult = catalog.i18nc("@label", "This configuration is not available because %1 is not recognized. Please visit %2 to download the correct material profile.");
+ var result = draftResult.arg(unknownMaterials).arg("" + catalog.i18nc("@label","Marketplace") + " ")
+
+ return result
+ }
+ width: extruderRow.width
+
+ anchors.left: icon.right
+ anchors.right: unknownMaterial.right
+ anchors.leftMargin: UM.Theme.getSize("wide_margin").height
+ anchors.top: unknownMaterial.top
+
+ wrapMode: Text.WordWrap
+ font: UM.Theme.getFont("default")
+ color: UM.Theme.getColor("text")
+ verticalAlignment: Text.AlignVCenter
+ linkColor: UM.Theme.getColor("text_link")
+
+ onLinkActivated:
+ {
+ Cura.Actions.browsePackages.trigger()
+ }
+ }
+
+ MouseArea
+ {
+ anchors.fill: parent
+ cursorShape: unknownMaterialMessage.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor
+ acceptedButtons: Qt.NoButton
}
}
}
@@ -125,6 +228,9 @@ Button
onClicked:
{
- Cura.MachineManager.applyRemoteConfiguration(configuration)
+ if(isValidMaterial)
+ {
+ Cura.MachineManager.applyRemoteConfiguration(configuration);
+ }
}
}
diff --git a/resources/qml/Menus/LocalPrinterMenu.qml b/resources/qml/Menus/LocalPrinterMenu.qml
index e7c5037814..4da1de2abf 100644
--- a/resources/qml/Menus/LocalPrinterMenu.qml
+++ b/resources/qml/Menus/LocalPrinterMenu.qml
@@ -9,7 +9,7 @@ import Cura 1.0 as Cura
Instantiator
{
- model: Cura.PrintersModel {}
+ model: Cura.GlobalStacksModel {}
MenuItem
{
diff --git a/resources/qml/Menus/NetworkPrinterMenu.qml b/resources/qml/Menus/NetworkPrinterMenu.qml
index 8c607bc5ae..3cb0aae016 100644
--- a/resources/qml/Menus/NetworkPrinterMenu.qml
+++ b/resources/qml/Menus/NetworkPrinterMenu.qml
@@ -9,7 +9,7 @@ import Cura 1.0 as Cura
Instantiator
{
- model: Cura.PrintersModel {}
+ model: Cura.GlobalStacksModel {}
MenuItem
{
text: model.metadata["connect_group_name"]
diff --git a/resources/qml/PrinterSelector/MachineSelector.qml b/resources/qml/PrinterSelector/MachineSelector.qml
index 28e01c7ae9..9f0d3b4ac6 100644
--- a/resources/qml/PrinterSelector/MachineSelector.qml
+++ b/resources/qml/PrinterSelector/MachineSelector.qml
@@ -93,14 +93,16 @@ Cura.ExpandablePopup
width: scroll.width - scroll.leftPadding - scroll.rightPadding
property real maximumHeight: UM.Theme.getSize("machine_selector_widget_content").height - buttonRow.height
- onHeightChanged:
+ // We use an extra property here, since we only want to to be informed about the content size changes.
+ onContentHeightChanged:
{
- scroll.height = Math.min(height, maximumHeight)
+ scroll.height = Math.min(contentHeight, maximumHeight)
popup.height = scroll.height + buttonRow.height
}
+
Component.onCompleted:
{
- scroll.height = Math.min(height, maximumHeight)
+ scroll.height = Math.min(contentHeight, maximumHeight)
popup.height = scroll.height + buttonRow.height
}
diff --git a/resources/qml/PrinterSelector/MachineSelectorList.qml b/resources/qml/PrinterSelector/MachineSelectorList.qml
index ea8068fa95..604e0f668d 100644
--- a/resources/qml/PrinterSelector/MachineSelectorList.qml
+++ b/resources/qml/PrinterSelector/MachineSelectorList.qml
@@ -10,9 +10,9 @@ import Cura 1.0 as Cura
ListView
{
id: listView
- height: childrenRect.height
- model: Cura.PrintersModel {}
+ model: Cura.GlobalStacksModel {}
section.property: "hasRemoteConnection"
+ property real contentHeight: childrenRect.height
section.delegate: Label
{