diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py
index 5677106782..72b6319020 100644
--- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py
+++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py
@@ -180,10 +180,11 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice):
self._createNetworkManager()
assert (self._manager is not None)
- def put(self, target: str, data: Union[str, bytes], on_finished: Optional[Callable[[QNetworkReply], None]],
+ def put(self, target: str, data: Union[str, bytes], content_type: str = None,
+ on_finished: Optional[Callable[[QNetworkReply], None]] = None,
on_progress: Optional[Callable] = None) -> None:
self._validateManager()
- request = self._createEmptyRequest(target)
+ request = self._createEmptyRequest(target, content_type = content_type)
self._last_request_time = time()
if self._manager is not None:
reply = self._manager.put(request, data if isinstance(data, bytes) else data.encode())
diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py
index e2957cacae..747d911407 100644
--- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py
+++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py
@@ -6,7 +6,7 @@ import os
from json import JSONDecodeError
from typing import List, Optional, Dict, cast, Union, Tuple
-from PyQt5.QtCore import QObject, pyqtSignal, QUrl, pyqtProperty
+from PyQt5.QtCore import QObject, pyqtSignal, QUrl, pyqtProperty, pyqtSlot
from PyQt5.QtNetwork import QNetworkReply, QNetworkRequest
from UM import i18nCatalog
@@ -209,6 +209,16 @@ class CloudOutputDevice(NetworkedPrinterOutputDevice):
return [print_job for print_job in self._print_jobs
if print_job.state == "queued" or print_job.state == "error"]
+ ## Get remote print jobs that are assigned to a printer.
+ @pyqtProperty("QVariantList", notify = printJobsChanged)
+ def activePrintJobs(self) -> List[UM3PrintJobOutputModel]:
+ return [print_job for print_job in self._print_jobs if
+ print_job.assignedPrinter is not None and print_job.state != "queued"]
+
+ @pyqtProperty(bool, notify = printJobsChanged)
+ def receivedPrintJobs(self) -> bool:
+ return not self._sending_job
+
## Called when the connection to the cluster changes.
def connect(self) -> None:
super().connect()
@@ -375,7 +385,7 @@ class CloudOutputDevice(NetworkedPrinterOutputDevice):
# TODO: Multipart upload
job_response = JobUploadResponse(**response.get("data"))
Logger.log("i", "Print job created successfully: %s", job_response.__dict__)
- self.put(job_response.upload_url, data = mesh,
+ self.put(job_response.upload_url, data = mesh, content_type = job_response.content_type,
on_finished = lambda r: self._onPrintJobUploaded(job_response.job_id, r),
on_progress = self._onUploadPrintJobProgress)
@@ -448,3 +458,22 @@ class CloudOutputDevice(NetworkedPrinterOutputDevice):
message.show()
self._sending_job = False # the upload has finished so we're not sending a job anymore
self.writeFinished.emit()
+
+ ## TODO: The following methods are required by the monitor page QML, but are not actually available using cloud.
+ # TODO: We fake the methods here to not break the monitor page.
+
+ @pyqtProperty(QObject, notify = printersChanged)
+ def activePrinter(self) -> Optional[PrinterOutputModel]:
+ return self._printers[0] or None
+
+ @pyqtSlot(QObject)
+ def setActivePrinter(self, printer: Optional[PrinterOutputModel]) -> None:
+ pass
+
+ @pyqtProperty(QUrl, notify = printersChanged)
+ def activeCameraUrl(self) -> "QUrl":
+ return QUrl()
+
+ @pyqtSlot(QUrl)
+ def setActiveCameraUrl(self, camera_url: "QUrl") -> None:
+ pass
diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py
index e50cd6540c..37198fd7c6 100644
--- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py
+++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py
@@ -131,6 +131,7 @@ class CloudOutputDeviceManager(NetworkClient):
device = CloudOutputDevice(cluster.cluster_id)
self._output_device_manager.addOutputDevice(device)
self._remote_clusters[cluster.cluster_id] = device
+ device.connect() # TODO: remove this
self._connectToActiveMachine()
## Remove a CloudOutputDevice
diff --git a/resources/qml/ActionPanel/OutputProcessWidget.qml b/resources/qml/ActionPanel/OutputProcessWidget.qml
index 45cb1fdb41..6ab8dc6fbb 100644
--- a/resources/qml/ActionPanel/OutputProcessWidget.qml
+++ b/resources/qml/ActionPanel/OutputProcessWidget.qml
@@ -112,6 +112,8 @@ Column
id: previewStageShortcut
height: UM.Theme.getSize("action_panel_button").height
+ leftPadding: UM.Theme.getSize("default_margin").width
+ rightPadding: UM.Theme.getSize("default_margin").width
text: catalog.i18nc("@button", "Preview")
onClicked: UM.Controller.setActiveStage("PreviewStage")
diff --git a/resources/qml/ActionPanel/PrintInformationWidget.qml b/resources/qml/ActionPanel/PrintInformationWidget.qml
index 82707576e0..25e380dea8 100644
--- a/resources/qml/ActionPanel/PrintInformationWidget.qml
+++ b/resources/qml/ActionPanel/PrintInformationWidget.qml
@@ -11,9 +11,6 @@ UM.RecolorImage
{
id: widget
- //implicitHeight: UM.Theme.getSize("section_icon").height
- //implicitWidth: UM.Theme.getSize("section_icon").width
-
source: UM.Theme.getIcon("info")
width: UM.Theme.getSize("section_icon").width
height: UM.Theme.getSize("section_icon").height
diff --git a/resources/qml/ActionPanel/SliceProcessWidget.qml b/resources/qml/ActionPanel/SliceProcessWidget.qml
index 3329ac4b23..14e149dddb 100644
--- a/resources/qml/ActionPanel/SliceProcessWidget.qml
+++ b/resources/qml/ActionPanel/SliceProcessWidget.qml
@@ -44,7 +44,7 @@ Column
{
id: autoSlicingLabel
width: parent.width
- visible: prepareButtons.autoSlice && widget.backendState == UM.Backend.Processing
+ visible: prepareButtons.autoSlice && (widget.backendState == UM.Backend.Processing || widget.backendState == UM.Backend.NotStarted)
text: catalog.i18nc("@label:PrintjobStatus", "Auto slicing...")
color: UM.Theme.getColor("text")
@@ -71,7 +71,8 @@ Column
width: parent.width
height: UM.Theme.getSize("progressbar").height
value: progress
- visible: widget.backendState == UM.Backend.Processing
+ indeterminate: widget.backendState == UM.Backend.NotStarted
+ visible: (widget.backendState == UM.Backend.Processing || (prepareButtons.autoSlice && widget.backendState == UM.Backend.NotStarted))
background: Rectangle
{
diff --git a/resources/qml/Toolbar.qml b/resources/qml/Toolbar.qml
index 07522dd535..5fbddea9ac 100644
--- a/resources/qml/Toolbar.qml
+++ b/resources/qml/Toolbar.qml
@@ -115,6 +115,7 @@ Item
}
radius: UM.Theme.getSize("default_radius").width
color: UM.Theme.getColor("lining")
+ visible: extrudersModel.items.length > 1
}
Column
@@ -131,8 +132,7 @@ Item
id: extruders
width: childrenRect.width
height: childrenRect.height
- property var _model: Cura.ExtrudersModel { id: extrudersModel }
- model: _model.items.length > 1 ? _model : 0
+ model: extrudersModel.items.length > 1 ? extrudersModel : 0
delegate: ExtruderButton
{
@@ -144,13 +144,18 @@ Item
}
}
+ Cura.ExtrudersModel
+ {
+ id: extrudersModel
+ }
+
UM.PointingRectangle
{
- id: panelBorder;
+ id: panelBorder
- anchors.left: parent.right;
- anchors.leftMargin: UM.Theme.getSize("default_margin").width;
- anchors.top: base.top;
+ anchors.left: parent.right
+ anchors.leftMargin: UM.Theme.getSize("default_margin").width
+ anchors.top: base.top
anchors.topMargin: base.activeY
z: buttons.z - 1
@@ -161,14 +166,14 @@ Item
{
if (panel.item && panel.width > 0)
{
- return Math.max(panel.width + 2 * UM.Theme.getSize("default_margin").width);
+ return Math.max(panel.width + 2 * UM.Theme.getSize("default_margin").width)
}
else
{
return 0;
}
}
- height: panel.item ? panel.height + 2 * UM.Theme.getSize("default_margin").height : 0;
+ height: panel.item ? panel.height + 2 * UM.Theme.getSize("default_margin").height : 0
opacity: panel.item && panel.width > 0 ? 1 : 0
Behavior on opacity { NumberAnimation { duration: 100 } }
@@ -186,11 +191,11 @@ Item
{
id: panel
- x: UM.Theme.getSize("default_margin").width;
- y: UM.Theme.getSize("default_margin").height;
+ x: UM.Theme.getSize("default_margin").width
+ y: UM.Theme.getSize("default_margin").height
source: UM.ActiveTool.valid ? UM.ActiveTool.activeToolPanel : ""
- enabled: UM.Controller.toolsEnabled;
+ enabled: UM.Controller.toolsEnabled
}
}
diff --git a/resources/themes/cura-light/icons/info.svg b/resources/themes/cura-light/icons/info.svg
index 97e4fc4f35..9896b3dac8 100644
--- a/resources/themes/cura-light/icons/info.svg
+++ b/resources/themes/cura-light/icons/info.svg
@@ -1,48 +1,13 @@
-
-
-
+
+
\ No newline at end of file