From 41c472c2ed5e840fa22c30951f263faad27ca9bc Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Wed, 22 Apr 2020 16:09:24 +0200 Subject: [PATCH 01/25] Add "Add a Cloud printer" QML page CURA-7022 --- .../qml/WelcomePages/AddCloudPrintersView.qml | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 resources/qml/WelcomePages/AddCloudPrintersView.qml diff --git a/resources/qml/WelcomePages/AddCloudPrintersView.qml b/resources/qml/WelcomePages/AddCloudPrintersView.qml new file mode 100644 index 0000000000..73fe1f433e --- /dev/null +++ b/resources/qml/WelcomePages/AddCloudPrintersView.qml @@ -0,0 +1,60 @@ +// Copyright (c) 2019 Ultimaker B.V. +// Cura is released under the terms of the LGPLv3 or higher. + +import QtQuick 2.10 +import QtQuick.Controls 2.3 +import QtQuick.Layouts 1.3 + +import UM 1.3 as UM +import Cura 1.5 as Cura + + +// +// This component contains the content for the 'by IP' page of the "Add New Printer" flow of the on-boarding process. +// +Item +{ + UM.I18nCatalog { id: catalog; name: "cura" } + + id: addCloudPrinterScreen + + Label + { + id: titleLabel + anchors.top: parent.top + anchors.horizontalCenter: parent.horizontalCenter + horizontalAlignment: Text.AlignHCenter + text: catalog.i18nc("@label", "Add a Cloud printer") + color: UM.Theme.getColor("primary_button") + font: UM.Theme.getFont("huge") + renderType: Text.NativeRendering + } + + Cura.SecondaryButton + { + id: backButton + anchors.left: parent.left + anchors.bottom: parent.bottom + text: catalog.i18nc("@button", "Add printer manually") + onClicked: + { + CuraApplication.getDiscoveredPrintersModel().cancelCurrentManualDeviceRequest() + base.showPreviousPage() + } + } + + Cura.PrimaryButton + { + id: connectButton + anchors.right: parent.right + anchors.bottom: parent.bottom + text: catalog.i18nc("@button", "Finish") + onClicked: + { + CuraApplication.getDiscoveredPrintersModel().createMachineFromDiscoveredPrinter(discoveredPrinter) + base.showNextPage() + } + + enabled: addPrinterByIpScreen.canAddPrinter + } +} From a4c5e63355091261a1d3aff9f0cf497af0f1dc56 Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Wed, 22 Apr 2020 16:10:31 +0200 Subject: [PATCH 02/25] Add "Add cloud printer" button in "Add a printer" page CURA-7022 --- .../qml/WelcomePages/AddNetworkPrinterScrollView.qml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml b/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml index b4d4fee42c..cbb27c66ea 100644 --- a/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml +++ b/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml @@ -24,6 +24,7 @@ Item signal refreshButtonClicked() signal addByIpButtonClicked() + signal addCloudPrinterButtonClicked() Item { @@ -193,6 +194,17 @@ Item onClicked: base.addByIpButtonClicked() } + Cura.SecondaryButton + { + id: addCloudPrinterButton + anchors.left: addPrinterByIpButton.right + anchors.leftMargin: UM.Theme.getSize("default_margin").width + anchors.verticalCenter: parent.verticalCenter + text: catalog.i18nc("@label", "Add cloud printer") + height: UM.Theme.getSize("message_action_button").height + onClicked: base.addCloudPrinterButtonClicked() + } + Item { id: troubleshootingButton From 1d7c327b368a26e27ab0d1868a870f25be602f2c Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Wed, 22 Apr 2020 16:15:24 +0200 Subject: [PATCH 03/25] Redirect to "Add cloud printer" page when button clicked CURA-7022 --- cura/UI/AddPrinterPagesModel.py | 3 +++ .../AddNetworkOrLocalPrinterContent.qml | 14 ++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/cura/UI/AddPrinterPagesModel.py b/cura/UI/AddPrinterPagesModel.py index d40da59b2a..a72b1a7729 100644 --- a/cura/UI/AddPrinterPagesModel.py +++ b/cura/UI/AddPrinterPagesModel.py @@ -25,6 +25,9 @@ class AddPrinterPagesModel(WelcomePagesModel): "page_url": self._getBuiltinWelcomePagePath("FirstStartMachineActionsContent.qml"), "should_show_function": self.shouldShowMachineActions, }) + self._pages.append({"id": "add_cloud_printers", + "page_url": self._getBuiltinWelcomePagePath("AddCloudPrintersView.qml"), + }) self.setItems(self._pages) diff --git a/resources/qml/WelcomePages/AddNetworkOrLocalPrinterContent.qml b/resources/qml/WelcomePages/AddNetworkOrLocalPrinterContent.qml index e3018a6825..51f73c2618 100644 --- a/resources/qml/WelcomePages/AddNetworkOrLocalPrinterContent.qml +++ b/resources/qml/WelcomePages/AddNetworkOrLocalPrinterContent.qml @@ -65,6 +65,20 @@ Item { base.goToPage("add_printer_by_ip") } + + onAddCloudPrinterButtonClicked: + { + base.goToPage("add_cloud_printers") + if (!Cura.API.account.isLoggedIn) + { + Cura.API.account.login() + } + else + { + Qt.openUrlExternally("https://mycloud.ultimaker.com/app/manage/printers") + } + + } } } } From 1aea28a8ebe3d4bb63d26b6671f1724c0e4a4634 Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Thu, 23 Apr 2020 15:10:45 +0200 Subject: [PATCH 04/25] Add busyIndicator and text in AddCloudPrintersView CURA-7022 --- .../qml/WelcomePages/AddCloudPrintersView.qml | 76 +++++++++++++++---- 1 file changed, 63 insertions(+), 13 deletions(-) diff --git a/resources/qml/WelcomePages/AddCloudPrintersView.qml b/resources/qml/WelcomePages/AddCloudPrintersView.qml index 73fe1f433e..05351341f6 100644 --- a/resources/qml/WelcomePages/AddCloudPrintersView.qml +++ b/resources/qml/WelcomePages/AddCloudPrintersView.qml @@ -18,16 +18,66 @@ Item id: addCloudPrinterScreen - Label + property bool searchingForCloudPrinters: true + + + + Rectangle { - id: titleLabel - anchors.top: parent.top - anchors.horizontalCenter: parent.horizontalCenter - horizontalAlignment: Text.AlignHCenter - text: catalog.i18nc("@label", "Add a Cloud printer") - color: UM.Theme.getColor("primary_button") - font: UM.Theme.getFont("huge") - renderType: Text.NativeRendering + id: cloudPrintersContent + //color: "steelblue" + //opacity: 0.3 + width: parent.width + border.width: 1 + anchors + { + top: parent.top + bottom: finishButton.top + left: parent.left + right: parent.right + bottomMargin: UM.Theme.getSize("default_margin").height + } + + Label + { + id: titleLabel + anchors.top: parent.top + anchors.horizontalCenter: parent.horizontalCenter + horizontalAlignment: Text.AlignHCenter + text: catalog.i18nc("@label", "Add a Cloud printer") + color: UM.Theme.getColor("primary_button") + font: UM.Theme.getFont("huge") + renderType: Text.NativeRendering + } + + Rectangle + { + id: waitingContent + width: parent.width + height: waitingIndicator.height + waitingLabel.height + border.width: 1 + anchors.verticalCenter: parent.verticalCenter + anchors.horizontalCenter: parent.horizontalCenter + BusyIndicator + { + id: waitingIndicator + anchors.horizontalCenter: parent.horizontalCenter + running: searchingForCloudPrinters + } + Label + { + id: waitingLabel + anchors.top: waitingIndicator.bottom + anchors.horizontalCenter: parent.horizontalCenter + horizontalAlignment: Text.AlignHCenter + text: catalog.i18nc("@label", "Waiting for Cloud response") + font: UM.Theme.getFont("medium") + renderType: Text.NativeRendering + } + visible: false + } + + } Cura.SecondaryButton @@ -38,23 +88,23 @@ Item text: catalog.i18nc("@button", "Add printer manually") onClicked: { - CuraApplication.getDiscoveredPrintersModel().cancelCurrentManualDeviceRequest() + Cura.API.account.test("Back button pressed in AddCloudPrintersView.qml") base.showPreviousPage() } } Cura.PrimaryButton { - id: connectButton + id: finishButton anchors.right: parent.right anchors.bottom: parent.bottom text: catalog.i18nc("@button", "Finish") onClicked: { - CuraApplication.getDiscoveredPrintersModel().createMachineFromDiscoveredPrinter(discoveredPrinter) + Cura.API.account.test("Finish button pressed in AddCloudPrintersView.qml") base.showNextPage() } - enabled: addPrinterByIpScreen.canAddPrinter + // enabled: 1 === 1 addPrinterByIpScreen.canAddPrinter } } From cd8a0fc0bcd4355f55d38e60312ecab88d38c7f9 Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Fri, 24 Apr 2020 19:09:50 +0200 Subject: [PATCH 05/25] Introduce DiscoveredUltimakerCloudPrintersModel Have a separate model to hold the discovered ultimaker cloud printers. This model will be used to communicate across the application that new cloud printers have been found which they weren't seen before. CURA-7022 --- .../DiscoveredUltimakerCloudPrintersModel.py | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 cura/Machines/Models/DiscoveredUltimakerCloudPrintersModel.py diff --git a/cura/Machines/Models/DiscoveredUltimakerCloudPrintersModel.py b/cura/Machines/Models/DiscoveredUltimakerCloudPrintersModel.py new file mode 100644 index 0000000000..f2c5cf0374 --- /dev/null +++ b/cura/Machines/Models/DiscoveredUltimakerCloudPrintersModel.py @@ -0,0 +1,56 @@ +from typing import Optional, TYPE_CHECKING + +from PyQt5.QtCore import QObject, pyqtSlot, Qt + +from UM.Qt.ListModel import ListModel + +if TYPE_CHECKING: + from cura.CuraApplication import CuraApplication + + +class DiscoveredUltimakerCloudPrintersModel(ListModel): + IpAddressRole = Qt.UserRole + 1 + DeviceKeyRole = Qt.UserRole + 2 + DeviceNameRole = Qt.UserRole + 3 + DeviceTypeRole = Qt.UserRole + 4 + DeviceFirmwareVersionRole = Qt.UserRole + 5 + + def __init__(self, application: "CuraApplication", parent: Optional["QObject"] = None) -> None: + super().__init__(parent) + + self.addRoleName(self.IpAddressRole, "ip_address") + self.addRoleName(self.DeviceKeyRole, "key") + self.addRoleName(self.DeviceNameRole, "name") + self.addRoleName(self.DeviceTypeRole, "machine_type") + self.addRoleName(self.DeviceFirmwareVersionRole, "firmware_version") + + self._discovered_ultimaker_cloud_printers_list = [] + self._application = application + + def addDiscoveredUltimakerCloudPrinter(self, new_devices) -> None: + for device in new_devices: + self._discovered_ultimaker_cloud_printers_list.append({ + "ip_address": device.key, + "key": device.getId(), + "name": device.name, + "machine_type": device.printerTypeName, + "firmware_version": device.firmwareVersion + }) + self._update() + + @pyqtSlot() + def clearDiscoveredUltimakerCloudPrinters(self): + self._discovered_ultimaker_cloud_printers_list = [] + self._update() + + def _update(self): + items = [] + + for cloud_printer in self._discovered_ultimaker_cloud_printers_list: + items.append(cloud_printer) + + # Execute all filters. + filtered_items = list(items) + + filtered_items.sort(key = lambda k: k["name"]) + self.setItems(filtered_items) From c8e86175cd0ab686d6325a5f9ece98eafed561b5 Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Fri, 24 Apr 2020 19:16:24 +0200 Subject: [PATCH 06/25] Create a DiscoveredUltimakerPrintersModel in the CuraApplication CURA-7022 --- cura/CuraApplication.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 993bb15ae2..9c8b0265d1 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -56,6 +56,7 @@ from cura.Machines.MachineErrorChecker import MachineErrorChecker from cura.Machines.Models.BuildPlateModel import BuildPlateModel from cura.Machines.Models.CustomQualityProfilesDropDownMenuModel import CustomQualityProfilesDropDownMenuModel from cura.Machines.Models.DiscoveredPrintersModel import DiscoveredPrintersModel +from cura.Machines.Models.DiscoveredUltimakerCloudPrintersModel import DiscoveredUltimakerCloudPrintersModel from cura.Machines.Models.ExtrudersModel import ExtrudersModel from cura.Machines.Models.FavoriteMaterialsModel import FavoriteMaterialsModel from cura.Machines.Models.FirstStartMachineActionsModel import FirstStartMachineActionsModel @@ -201,6 +202,7 @@ class CuraApplication(QtApplication): self._quality_management_model = None self._discovered_printer_model = DiscoveredPrintersModel(self, parent = self) + self._discovered_ultimaker_cloud_printers_model = DiscoveredUltimakerCloudPrintersModel(self, parent = self) self._first_start_machine_actions_model = None self._welcome_pages_model = WelcomePagesModel(self, parent = self) self._add_printer_pages_model = AddPrinterPagesModel(self, parent = self) @@ -886,6 +888,10 @@ class CuraApplication(QtApplication): def getDiscoveredPrintersModel(self, *args) -> "DiscoveredPrintersModel": return self._discovered_printer_model + @pyqtSlot(result=QObject) + def getDiscoveredUltimakerCloudPrintersModel(self, *args) -> "DiscoveredUltimakerCloudPrintersModel": + return self._discovered_ultimaker_cloud_printers_model + @pyqtSlot(result = QObject) def getFirstStartMachineActionsModel(self, *args) -> "FirstStartMachineActionsModel": if self._first_start_machine_actions_model is None: @@ -1084,6 +1090,7 @@ class CuraApplication(QtApplication): self.processEvents() qmlRegisterType(DiscoveredPrintersModel, "Cura", 1, 0, "DiscoveredPrintersModel") + qmlRegisterType(DiscoveredUltimakerCloudPrintersModel, "Cura", 1, 7, "DiscoveredUltimakerCloudPrintersModel") qmlRegisterSingletonType(QualityProfilesDropDownMenuModel, "Cura", 1, 0, "QualityProfilesDropDownMenuModel", self.getQualityProfilesDropDownMenuModel) qmlRegisterSingletonType(CustomQualityProfilesDropDownMenuModel, "Cura", 1, 0, From 49cb1d325e5f2bbd49fbb9346df186e375ba023a Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Fri, 24 Apr 2020 19:17:34 +0200 Subject: [PATCH 07/25] Update the DiscoveredCloudUltimakerPrinters model Whenever new cloud devices are detected on the ultimaker account, add them to the model CURA-7022 --- .../UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py index 65625df3bc..c8dbbfd121 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py @@ -141,10 +141,13 @@ class CloudOutputDeviceManager: if machine_manager.getMachine(device.printerType, {self.META_CLUSTER_ID: device.key}) is None \ and machine_manager.getMachine(device.printerType, {self.META_NETWORK_KEY: cluster_data.host_name + "*"}) is None: # The host name is part of the network key. new_devices.append(device) + elif device.getId() not in self._remote_clusters: self._remote_clusters[device.getId()] = device remote_clusters_added = True + CuraApplication.getInstance().getDiscoveredUltimakerCloudPrintersModel().addDiscoveredUltimakerCloudPrinter(new_devices) + if not new_devices: if remote_clusters_added: self._connectToActiveMachine() From 1d4225a44a791c0a576f7b2e14156cfd49044109 Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Fri, 24 Apr 2020 19:21:01 +0200 Subject: [PATCH 08/25] Refine the AddCloudPrinter page to display the new cloud printers Added a scrollView to the page, which depends on the DiscoveredUltimakerCloudPrinters model and displays the printer name, type, and firmware version. If the model is empty, this page displays a busy indicator and a message instead. In addition, whenever the "Add printer manually" or "Finish" button are pressed, they also reset the DiscoveredUltimakerCloudPrintersModel. CURA-7022 --- .../qml/WelcomePages/AddCloudPrintersView.qml | 107 +++++++++++++++--- 1 file changed, 94 insertions(+), 13 deletions(-) diff --git a/resources/qml/WelcomePages/AddCloudPrintersView.qml b/resources/qml/WelcomePages/AddCloudPrintersView.qml index 05351341f6..170563ccaf 100644 --- a/resources/qml/WelcomePages/AddCloudPrintersView.qml +++ b/resources/qml/WelcomePages/AddCloudPrintersView.qml @@ -6,11 +6,14 @@ import QtQuick.Controls 2.3 import QtQuick.Layouts 1.3 import UM 1.3 as UM -import Cura 1.5 as Cura +import Cura 1.7 as Cura // -// This component contains the content for the 'by IP' page of the "Add New Printer" flow of the on-boarding process. +// This component gets activated when the user presses the "Add cloud printers" button from the "Add a Printer" page. +// It contains a busy indicator that remains active until the user logs in and adds a cloud printer in his/her account. +// Once a cloud printer is added in mycloud.ultimaker.com, Cura discovers it (in a time window of 30 sec) and displays +// the newly added printers in this page. // Item { @@ -19,21 +22,19 @@ Item id: addCloudPrinterScreen property bool searchingForCloudPrinters: true - - + property var discoveredCloudPrintersModel: CuraApplication.getDiscoveredUltimakerCloudPrintersModel() Rectangle { id: cloudPrintersContent - //color: "steelblue" - //opacity: 0.3 width: parent.width - border.width: 1 + height: parent.height anchors { top: parent.top bottom: finishButton.top left: parent.left + leftMargin: UM.Theme.getSize("default_margin").width right: parent.right bottomMargin: UM.Theme.getSize("default_margin").height } @@ -50,12 +51,12 @@ Item renderType: Text.NativeRendering } + // Component that contains a busy indicator and a message, while it waits for Cura to discover a cloud printer Rectangle { id: waitingContent width: parent.width height: waitingIndicator.height + waitingLabel.height - border.width: 1 anchors.verticalCenter: parent.verticalCenter anchors.horizontalCenter: parent.horizontalCenter BusyIndicator @@ -71,13 +72,93 @@ Item anchors.horizontalCenter: parent.horizontalCenter horizontalAlignment: Text.AlignHCenter text: catalog.i18nc("@label", "Waiting for Cloud response") - font: UM.Theme.getFont("medium") + font: UM.Theme.getFont("large") renderType: Text.NativeRendering } - visible: false + visible: addCloudPrinterScreen.discoveredCloudPrintersModel.count == 0 } + // Label displayed when a new cloud printer is discovered + Label + { + anchors.top: titleLabel.bottom + anchors.topMargin: 2 * UM.Theme.getSize("default_margin").height + id: cloudPrintersAddedTitle + font: UM.Theme.getFont("medium") + text: catalog.i18nc("@label", "The following printers in your account have been added in Cura:") + height: contentHeight + 2 * UM.Theme.getSize("default_margin").height + visible: addCloudPrinterScreen.discoveredCloudPrintersModel.count > 0 + } + // The scrollView that contains the list of newly discovered Ultimaker Cloud printers. Visible only when + // there is at least a new cloud printer. + ScrollView + { + id: discoveredCloudPrintersScrollView + width: parent.width + clip : true + ScrollBar.horizontal.policy: ScrollBar.AsNeeded + ScrollBar.vertical.policy: ScrollBar.AsNeeded + visible: discoveredCloudPrintersModel.count > 0 + anchors + { + top: cloudPrintersAddedTitle.bottom + topMargin: UM.Theme.getSize("default_margin").height + left: parent.left + leftMargin: UM.Theme.getSize("default_margin").width + right: parent.right + } + + Column + { + id: discoveredPrintersColumn + spacing: 2 * UM.Theme.getSize("default_margin").height + + Repeater + { + id: discoveredCloudPrintersRepeater + model: addCloudPrinterScreen.discoveredCloudPrintersModel + delegate: Item + { + width: discoveredCloudPrintersScrollView.width + height: contentColumn.height + + Column + { + id: contentColumn + Label + { + id: cloudPrinterNameLabel + leftPadding: UM.Theme.getSize("default_margin").width + text: model.name + font: UM.Theme.getFont("large_bold") + color: UM.Theme.getColor("text") + elide: Text.ElideRight + } + Label + { + id: cloudPrinterTypeLabel + leftPadding: 2 * UM.Theme.getSize("default_margin").width + topPadding: UM.Theme.getSize("thin_margin").height + text: {"Type: " + model.machine_type} + font: UM.Theme.getFont("medium") + color: UM.Theme.getColor("text") + elide: Text.ElideRight + } + Label + { + id: cloudPrinterFirmwareVersionLabel + leftPadding: 2 * UM.Theme.getSize("default_margin").width + text: {"Firmware version: " + model.firmware_version} + font: UM.Theme.getFont("medium") + color: UM.Theme.getColor("text") + elide: Text.ElideRight + } + } + } + } + } + } } Cura.SecondaryButton @@ -88,7 +169,7 @@ Item text: catalog.i18nc("@button", "Add printer manually") onClicked: { - Cura.API.account.test("Back button pressed in AddCloudPrintersView.qml") + discoveredCloudPrintersModel.clearDiscoveredUltimakerCloudPrinters() base.showPreviousPage() } } @@ -101,10 +182,10 @@ Item text: catalog.i18nc("@button", "Finish") onClicked: { - Cura.API.account.test("Finish button pressed in AddCloudPrintersView.qml") + addCloudPrinterScreen.discoveredCloudPrintersModel.clearDiscoveredUltimakerCloudPrinters() base.showNextPage() } - // enabled: 1 === 1 addPrinterByIpScreen.canAddPrinter + enabled: !waitingContent.visible } } From 6583f5f5ac0beb95ec6456b3f475697801c793fb Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Tue, 28 Apr 2020 12:08:48 +0200 Subject: [PATCH 09/25] Reset the model when pressing the Add cloud printer button CURA-7022 --- .../Machines/Models/DiscoveredUltimakerCloudPrintersModel.py | 4 ++-- .../UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py | 2 +- resources/qml/WelcomePages/AddCloudPrintersView.qml | 4 ++-- resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml | 5 ++++- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/cura/Machines/Models/DiscoveredUltimakerCloudPrintersModel.py b/cura/Machines/Models/DiscoveredUltimakerCloudPrintersModel.py index f2c5cf0374..32e432ea68 100644 --- a/cura/Machines/Models/DiscoveredUltimakerCloudPrintersModel.py +++ b/cura/Machines/Models/DiscoveredUltimakerCloudPrintersModel.py @@ -27,7 +27,7 @@ class DiscoveredUltimakerCloudPrintersModel(ListModel): self._discovered_ultimaker_cloud_printers_list = [] self._application = application - def addDiscoveredUltimakerCloudPrinter(self, new_devices) -> None: + def addDiscoveredUltimakerCloudPrinters(self, new_devices) -> None: for device in new_devices: self._discovered_ultimaker_cloud_printers_list.append({ "ip_address": device.key, @@ -39,7 +39,7 @@ class DiscoveredUltimakerCloudPrintersModel(ListModel): self._update() @pyqtSlot() - def clearDiscoveredUltimakerCloudPrinters(self): + def clear(self): self._discovered_ultimaker_cloud_printers_list = [] self._update() diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py index c8dbbfd121..40dbeadbec 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py @@ -146,7 +146,7 @@ class CloudOutputDeviceManager: self._remote_clusters[device.getId()] = device remote_clusters_added = True - CuraApplication.getInstance().getDiscoveredUltimakerCloudPrintersModel().addDiscoveredUltimakerCloudPrinter(new_devices) + CuraApplication.getInstance().getDiscoveredUltimakerCloudPrintersModel().addDiscoveredUltimakerCloudPrinters(new_devices) if not new_devices: if remote_clusters_added: diff --git a/resources/qml/WelcomePages/AddCloudPrintersView.qml b/resources/qml/WelcomePages/AddCloudPrintersView.qml index 170563ccaf..11823101e7 100644 --- a/resources/qml/WelcomePages/AddCloudPrintersView.qml +++ b/resources/qml/WelcomePages/AddCloudPrintersView.qml @@ -169,7 +169,7 @@ Item text: catalog.i18nc("@button", "Add printer manually") onClicked: { - discoveredCloudPrintersModel.clearDiscoveredUltimakerCloudPrinters() + discoveredCloudPrintersModel.clear() base.showPreviousPage() } } @@ -182,7 +182,7 @@ Item text: catalog.i18nc("@button", "Finish") onClicked: { - addCloudPrinterScreen.discoveredCloudPrintersModel.clearDiscoveredUltimakerCloudPrinters() + discoveredCloudPrintersModel.clear() base.showNextPage() } diff --git a/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml b/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml index cbb27c66ea..0139064258 100644 --- a/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml +++ b/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml @@ -202,7 +202,10 @@ Item anchors.verticalCenter: parent.verticalCenter text: catalog.i18nc("@label", "Add cloud printer") height: UM.Theme.getSize("message_action_button").height - onClicked: base.addCloudPrinterButtonClicked() + onClicked: { + CuraApplication.getDiscoveredUltimakerCloudPrintersModel().clear() + base.addCloudPrinterButtonClicked() + } } Item From 0ad9464131bd4968e0d5cc06b98312fd1603992f Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Tue, 28 Apr 2020 13:19:19 +0200 Subject: [PATCH 10/25] Remove IP Address from DiscoveredCloudPrintersModel CURA-7022 --- .../Models/DiscoveredUltimakerCloudPrintersModel.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/cura/Machines/Models/DiscoveredUltimakerCloudPrintersModel.py b/cura/Machines/Models/DiscoveredUltimakerCloudPrintersModel.py index 32e432ea68..2f8ddb3f40 100644 --- a/cura/Machines/Models/DiscoveredUltimakerCloudPrintersModel.py +++ b/cura/Machines/Models/DiscoveredUltimakerCloudPrintersModel.py @@ -9,16 +9,14 @@ if TYPE_CHECKING: class DiscoveredUltimakerCloudPrintersModel(ListModel): - IpAddressRole = Qt.UserRole + 1 - DeviceKeyRole = Qt.UserRole + 2 - DeviceNameRole = Qt.UserRole + 3 - DeviceTypeRole = Qt.UserRole + 4 - DeviceFirmwareVersionRole = Qt.UserRole + 5 + DeviceKeyRole = Qt.UserRole + 1 + DeviceNameRole = Qt.UserRole + 2 + DeviceTypeRole = Qt.UserRole + 3 + DeviceFirmwareVersionRole = Qt.UserRole + 4 def __init__(self, application: "CuraApplication", parent: Optional["QObject"] = None) -> None: super().__init__(parent) - self.addRoleName(self.IpAddressRole, "ip_address") self.addRoleName(self.DeviceKeyRole, "key") self.addRoleName(self.DeviceNameRole, "name") self.addRoleName(self.DeviceTypeRole, "machine_type") @@ -30,7 +28,6 @@ class DiscoveredUltimakerCloudPrintersModel(ListModel): def addDiscoveredUltimakerCloudPrinters(self, new_devices) -> None: for device in new_devices: self._discovered_ultimaker_cloud_printers_list.append({ - "ip_address": device.key, "key": device.getId(), "name": device.name, "machine_type": device.printerTypeName, From ea404af973d37af5285119b12a161ccf01b5f16a Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Tue, 28 Apr 2020 14:19:28 +0200 Subject: [PATCH 11/25] Transfer cloudPrintersDetectedChanged in DiscoveredUltimakerCloudPrintersModel CURA-7022 --- cura/API/Account.py | 5 ----- .../DiscoveredUltimakerCloudPrintersModel.py | 15 ++++++++++++++- .../src/Cloud/CloudOutputDeviceManager.py | 4 ---- resources/qml/WelcomePages/CloudContent.qml | 2 +- 4 files changed, 15 insertions(+), 11 deletions(-) diff --git a/cura/API/Account.py b/cura/API/Account.py index 9864de1aaa..7273479de4 100644 --- a/cura/API/Account.py +++ b/cura/API/Account.py @@ -29,7 +29,6 @@ class Account(QObject): # Signal emitted when user logged in or out. loginStateChanged = pyqtSignal(bool) accessTokenChanged = pyqtSignal() - cloudPrintersDetectedChanged = pyqtSignal(bool) def __init__(self, application: "CuraApplication", parent = None) -> None: super().__init__(parent) @@ -76,10 +75,6 @@ class Account(QObject): def isLoggedIn(self) -> bool: return self._logged_in - @pyqtProperty(bool, notify=cloudPrintersDetectedChanged) - def newCloudPrintersDetected(self) -> bool: - return self._new_cloud_printers_detected - def _onLoginStateChanged(self, logged_in: bool = False, error_message: Optional[str] = None) -> None: if error_message: if self._error_message: diff --git a/cura/Machines/Models/DiscoveredUltimakerCloudPrintersModel.py b/cura/Machines/Models/DiscoveredUltimakerCloudPrintersModel.py index 2f8ddb3f40..b02b79bc71 100644 --- a/cura/Machines/Models/DiscoveredUltimakerCloudPrintersModel.py +++ b/cura/Machines/Models/DiscoveredUltimakerCloudPrintersModel.py @@ -1,6 +1,6 @@ from typing import Optional, TYPE_CHECKING -from PyQt5.QtCore import QObject, pyqtSlot, Qt +from PyQt5.QtCore import QObject, pyqtSlot, Qt, pyqtSignal, pyqtProperty from UM.Qt.ListModel import ListModel @@ -14,6 +14,8 @@ class DiscoveredUltimakerCloudPrintersModel(ListModel): DeviceTypeRole = Qt.UserRole + 3 DeviceFirmwareVersionRole = Qt.UserRole + 4 + cloudPrintersDetectedChanged = pyqtSignal() + def __init__(self, application: "CuraApplication", parent: Optional["QObject"] = None) -> None: super().__init__(parent) @@ -23,6 +25,7 @@ class DiscoveredUltimakerCloudPrintersModel(ListModel): self.addRoleName(self.DeviceFirmwareVersionRole, "firmware_version") self._discovered_ultimaker_cloud_printers_list = [] + self._new_cloud_printers_detected = False self._application = application def addDiscoveredUltimakerCloudPrinters(self, new_devices) -> None: @@ -35,10 +38,16 @@ class DiscoveredUltimakerCloudPrintersModel(ListModel): }) self._update() + # Inform whether new cloud printers have been detected. If they have, the welcome wizard can close. + self._new_cloud_printers_detected = len(new_devices) > 0 + self.cloudPrintersDetectedChanged.emit() + @pyqtSlot() def clear(self): self._discovered_ultimaker_cloud_printers_list = [] self._update() + self._new_cloud_printers_detected = False + self.cloudPrintersDetectedChanged.emit() def _update(self): items = [] @@ -51,3 +60,7 @@ class DiscoveredUltimakerCloudPrintersModel(ListModel): filtered_items.sort(key = lambda k: k["name"]) self.setItems(filtered_items) + + @pyqtProperty(bool, notify = cloudPrintersDetectedChanged) + def newCloudPrintersDetected(self) -> bool: + return self._new_cloud_printers_detected diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py index 40dbeadbec..5e03b65279 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py @@ -106,10 +106,6 @@ class CloudOutputDeviceManager: self._onDevicesDiscovered(new_clusters) - # Inform whether new cloud printers have been detected. If they have, the welcome wizard can close. - self._account._new_cloud_printers_detected = len(new_clusters) > 0 - self._account.cloudPrintersDetectedChanged.emit(len(new_clusters) > 0) - removed_device_keys = set(self._remote_clusters.keys()) - set(online_clusters.keys()) for device_id in removed_device_keys: self._onDiscoveredDeviceRemoved(device_id) diff --git a/resources/qml/WelcomePages/CloudContent.qml b/resources/qml/WelcomePages/CloudContent.qml index a14c6600cd..2a71f877e5 100644 --- a/resources/qml/WelcomePages/CloudContent.qml +++ b/resources/qml/WelcomePages/CloudContent.qml @@ -15,7 +15,7 @@ Item { UM.I18nCatalog { id: catalog; name: "cura" } - property bool newCloudPrintersDetected: Cura.API.account.newCloudPrintersDetected + property bool newCloudPrintersDetected: CuraApplication.getDiscoveredUltimakerCloudPrintersModel().newCloudPrintersDetected onNewCloudPrintersDetectedChanged: { From d6ddfb39909bb469f3ff81d4a805ec9e461aad54 Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Tue, 28 Apr 2020 14:50:47 +0200 Subject: [PATCH 12/25] Add typing CURA-7022 --- .../Models/DiscoveredUltimakerCloudPrintersModel.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/cura/Machines/Models/DiscoveredUltimakerCloudPrintersModel.py b/cura/Machines/Models/DiscoveredUltimakerCloudPrintersModel.py index b02b79bc71..9431c5f9b6 100644 --- a/cura/Machines/Models/DiscoveredUltimakerCloudPrintersModel.py +++ b/cura/Machines/Models/DiscoveredUltimakerCloudPrintersModel.py @@ -1,4 +1,4 @@ -from typing import Optional, TYPE_CHECKING +from typing import Optional, TYPE_CHECKING, List, Dict from PyQt5.QtCore import QObject, pyqtSlot, Qt, pyqtSignal, pyqtProperty @@ -24,9 +24,9 @@ class DiscoveredUltimakerCloudPrintersModel(ListModel): self.addRoleName(self.DeviceTypeRole, "machine_type") self.addRoleName(self.DeviceFirmwareVersionRole, "firmware_version") - self._discovered_ultimaker_cloud_printers_list = [] - self._new_cloud_printers_detected = False - self._application = application + self._discovered_ultimaker_cloud_printers_list = [] # type: List[Dict[str, str]] + self._new_cloud_printers_detected = False # type: bool + self._application = application # type: CuraApplication def addDiscoveredUltimakerCloudPrinters(self, new_devices) -> None: for device in new_devices: @@ -43,13 +43,13 @@ class DiscoveredUltimakerCloudPrintersModel(ListModel): self.cloudPrintersDetectedChanged.emit() @pyqtSlot() - def clear(self): + def clear(self) -> None: self._discovered_ultimaker_cloud_printers_list = [] self._update() self._new_cloud_printers_detected = False self.cloudPrintersDetectedChanged.emit() - def _update(self): + def _update(self) -> None: items = [] for cloud_printer in self._discovered_ultimaker_cloud_printers_list: From 1981325b05838edc2ed58056d36888b7ce457b31 Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Tue, 28 Apr 2020 16:31:01 +0200 Subject: [PATCH 13/25] Make "Add printers manually" button invisible when cloud printers found CURA-7022 --- resources/qml/WelcomePages/AddCloudPrintersView.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/qml/WelcomePages/AddCloudPrintersView.qml b/resources/qml/WelcomePages/AddCloudPrintersView.qml index 11823101e7..e7e5f83bb6 100644 --- a/resources/qml/WelcomePages/AddCloudPrintersView.qml +++ b/resources/qml/WelcomePages/AddCloudPrintersView.qml @@ -172,6 +172,7 @@ Item discoveredCloudPrintersModel.clear() base.showPreviousPage() } + visible: discoveredCloudPrintersModel.count == 0 } Cura.PrimaryButton From 05e92b953acc4358f987dc368de7598e925c5b2e Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Tue, 28 Apr 2020 17:44:35 +0200 Subject: [PATCH 14/25] Size the Welcome Wizard using the theme CURA-7022 --- resources/qml/WelcomePages/WelcomeDialogItem.qml | 4 ++-- resources/themes/cura-light/theme.json | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/resources/qml/WelcomePages/WelcomeDialogItem.qml b/resources/qml/WelcomePages/WelcomeDialogItem.qml index 7da4c6e897..5b90a8732e 100644 --- a/resources/qml/WelcomePages/WelcomeDialogItem.qml +++ b/resources/qml/WelcomePages/WelcomeDialogItem.qml @@ -21,8 +21,8 @@ Item anchors.centerIn: parent - width: 580 * screenScaleFactor - height: 600 * screenScaleFactor + width: UM.Theme.getSize("welcome_wizard_window").width + height: UM.Theme.getSize("welcome_wizard_window").height property int shadowOffset: 1 * screenScaleFactor diff --git a/resources/themes/cura-light/theme.json b/resources/themes/cura-light/theme.json index 1640395c0b..b870603bd9 100644 --- a/resources/themes/cura-light/theme.json +++ b/resources/themes/cura-light/theme.json @@ -573,6 +573,7 @@ "monitor_preheat_temperature_control": [4.5, 2.0], + "welcome_wizard_window": [46.0, 45], "modal_window_minimum": [60.0, 45], "license_window_minimum": [45, 45], "wizard_progress": [10.0, 0.0], From b2382593ed67ef566ca03ae540c1a1500146a620 Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Wed, 29 Apr 2020 11:37:42 +0200 Subject: [PATCH 15/25] Add is_final_page attribute and mark the "Add Cloud Printers" page as final CURA-7022 --- cura/UI/WelcomePagesModel.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/cura/UI/WelcomePagesModel.py b/cura/UI/WelcomePagesModel.py index 611e62cfd6..b816833d67 100644 --- a/cura/UI/WelcomePagesModel.py +++ b/cura/UI/WelcomePagesModel.py @@ -119,8 +119,10 @@ class WelcomePagesModel(ListModel): return next_page_index = idx + is_final_page = page_item.get("is_final_page") + # If we have reached the last page, emit allFinished signal and reset. - if next_page_index == len(self._items): + if next_page_index == len(self._items) or is_final_page: self.atEnd() return @@ -255,6 +257,11 @@ class WelcomePagesModel(ListModel): "page_url": self._getBuiltinWelcomePagePath("AddPrinterByIpContent.qml"), "next_page_id": "machine_actions", }, + {"id": "add_cloud_printers", + "page_url": self._getBuiltinWelcomePagePath("AddCloudPrintersView.qml"), + "is_final_page": True, # If we end up in this page, the next button will close the dialog + "next_page_button_text": self._catalog.i18nc("@action:button", "Finish"), + }, {"id": "machine_actions", "page_url": self._getBuiltinWelcomePagePath("FirstStartMachineActionsContent.qml"), "should_show_function": self.shouldShowMachineActions, From d6f150a523296033fcbf298bf6f88845269c9138 Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Wed, 29 Apr 2020 11:38:36 +0200 Subject: [PATCH 16/25] Rearrange the AddPrinterPagesModel and mark "Add Cloud Printer" page as final In order to avoid cases where the "Machine actions" page would lead to the "add cloud printer" page when pressing next, the AddPrinterPagesModel was rearranged and the "add cloud printer" page was marked as final. CURA-7022 --- cura/UI/AddPrinterPagesModel.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/cura/UI/AddPrinterPagesModel.py b/cura/UI/AddPrinterPagesModel.py index a72b1a7729..b06f220374 100644 --- a/cura/UI/AddPrinterPagesModel.py +++ b/cura/UI/AddPrinterPagesModel.py @@ -21,13 +21,15 @@ class AddPrinterPagesModel(WelcomePagesModel): "page_url": self._getBuiltinWelcomePagePath("AddPrinterByIpContent.qml"), "next_page_id": "machine_actions", }) + self._pages.append({"id": "add_cloud_printers", + "page_url": self._getBuiltinWelcomePagePath("AddCloudPrintersView.qml"), + "is_final_page": True, + "next_page_button_text": self._catalog.i18nc("@action:button", "Finish"), + }) self._pages.append({"id": "machine_actions", "page_url": self._getBuiltinWelcomePagePath("FirstStartMachineActionsContent.qml"), "should_show_function": self.shouldShowMachineActions, }) - self._pages.append({"id": "add_cloud_printers", - "page_url": self._getBuiltinWelcomePagePath("AddCloudPrintersView.qml"), - }) self.setItems(self._pages) From 411a02a827d06a27f2740ffdfcbb3ab5fe46714e Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Wed, 29 Apr 2020 11:40:47 +0200 Subject: [PATCH 17/25] Simplify the DiscoveredUltimakerCloudPrintersModel reference calls CURA-7022 --- resources/qml/WelcomePages/AddCloudPrintersView.qml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/resources/qml/WelcomePages/AddCloudPrintersView.qml b/resources/qml/WelcomePages/AddCloudPrintersView.qml index e7e5f83bb6..24865a9a2d 100644 --- a/resources/qml/WelcomePages/AddCloudPrintersView.qml +++ b/resources/qml/WelcomePages/AddCloudPrintersView.qml @@ -19,8 +19,6 @@ Item { UM.I18nCatalog { id: catalog; name: "cura" } - id: addCloudPrinterScreen - property bool searchingForCloudPrinters: true property var discoveredCloudPrintersModel: CuraApplication.getDiscoveredUltimakerCloudPrintersModel() @@ -75,7 +73,7 @@ Item font: UM.Theme.getFont("large") renderType: Text.NativeRendering } - visible: addCloudPrinterScreen.discoveredCloudPrintersModel.count == 0 + visible: discoveredCloudPrintersModel.count == 0 } // Label displayed when a new cloud printer is discovered @@ -87,7 +85,7 @@ Item font: UM.Theme.getFont("medium") text: catalog.i18nc("@label", "The following printers in your account have been added in Cura:") height: contentHeight + 2 * UM.Theme.getSize("default_margin").height - visible: addCloudPrinterScreen.discoveredCloudPrintersModel.count > 0 + visible: discoveredCloudPrintersModel.count > 0 } // The scrollView that contains the list of newly discovered Ultimaker Cloud printers. Visible only when @@ -117,7 +115,7 @@ Item Repeater { id: discoveredCloudPrintersRepeater - model: addCloudPrinterScreen.discoveredCloudPrintersModel + model: discoveredCloudPrintersModel delegate: Item { width: discoveredCloudPrintersScrollView.width From fb328bd307cd9508ca0ae3d875f0685041645299 Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Wed, 29 Apr 2020 12:11:05 +0200 Subject: [PATCH 18/25] Display a summary of the Cloud printers added after login in WelcomeWizard If the user has cloud printers linked to his/her account, then the welcome wizard will display a summary of the cloud printers that were found in the account and added in Cura. CURA-7022 --- resources/qml/WelcomePages/CloudContent.qml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/resources/qml/WelcomePages/CloudContent.qml b/resources/qml/WelcomePages/CloudContent.qml index 573951ca52..83a258a3f5 100644 --- a/resources/qml/WelcomePages/CloudContent.qml +++ b/resources/qml/WelcomePages/CloudContent.qml @@ -22,10 +22,11 @@ Item onCloudPrintersDetected: { // When the user signs in successfully, it will be checked whether he/she has cloud printers connected to - // the account. If he/she does, then the welcome wizard can close. If not, then proceed to the next page (if any) + // the account. If he/she does, then the welcome wizard will show a summary of the Cloud printers linked to the + // account. If there are no cloud printers, then proceed to the next page (if any) if(newCloudPrintersDetected) { - base.endWizard() + base.goToPage("add_cloud_printers") } else { From eda868f9383cd27c36747f6a50ef92261279bbbf Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Wed, 29 Apr 2020 13:31:45 +0200 Subject: [PATCH 19/25] Make the discovered cloud printers model generic Removed the dependency of the DiscoveredCloudPrintersModel on CloudOutputDevice, which is Ultimaker specific. This can allow even external plugins to add to this model in the future. CURA-7022 --- cura/CuraApplication.py | 10 +++++----- ...ntersModel.py => DiscoveredCloudPrintersModel.py} | 12 +++--------- .../src/Cloud/CloudOutputDeviceManager.py | 9 ++++++++- resources/qml/WelcomePages/AddCloudPrintersView.qml | 2 +- .../qml/WelcomePages/AddNetworkPrinterScrollView.qml | 2 +- resources/qml/WelcomePages/CloudContent.qml | 2 +- 6 files changed, 19 insertions(+), 18 deletions(-) rename cura/Machines/Models/{DiscoveredUltimakerCloudPrintersModel.py => DiscoveredCloudPrintersModel.py} (81%) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 9c8b0265d1..67a9451282 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -56,7 +56,7 @@ from cura.Machines.MachineErrorChecker import MachineErrorChecker from cura.Machines.Models.BuildPlateModel import BuildPlateModel from cura.Machines.Models.CustomQualityProfilesDropDownMenuModel import CustomQualityProfilesDropDownMenuModel from cura.Machines.Models.DiscoveredPrintersModel import DiscoveredPrintersModel -from cura.Machines.Models.DiscoveredUltimakerCloudPrintersModel import DiscoveredUltimakerCloudPrintersModel +from cura.Machines.Models.DiscoveredCloudPrintersModel import DiscoveredCloudPrintersModel from cura.Machines.Models.ExtrudersModel import ExtrudersModel from cura.Machines.Models.FavoriteMaterialsModel import FavoriteMaterialsModel from cura.Machines.Models.FirstStartMachineActionsModel import FirstStartMachineActionsModel @@ -202,7 +202,7 @@ class CuraApplication(QtApplication): self._quality_management_model = None self._discovered_printer_model = DiscoveredPrintersModel(self, parent = self) - self._discovered_ultimaker_cloud_printers_model = DiscoveredUltimakerCloudPrintersModel(self, parent = self) + self._discovered_cloud_printers_model = DiscoveredCloudPrintersModel(self, parent = self) self._first_start_machine_actions_model = None self._welcome_pages_model = WelcomePagesModel(self, parent = self) self._add_printer_pages_model = AddPrinterPagesModel(self, parent = self) @@ -889,8 +889,8 @@ class CuraApplication(QtApplication): return self._discovered_printer_model @pyqtSlot(result=QObject) - def getDiscoveredUltimakerCloudPrintersModel(self, *args) -> "DiscoveredUltimakerCloudPrintersModel": - return self._discovered_ultimaker_cloud_printers_model + def getDiscoveredCloudPrintersModel(self, *args) -> "DiscoveredCloudPrintersModel": + return self._discovered_cloud_printers_model @pyqtSlot(result = QObject) def getFirstStartMachineActionsModel(self, *args) -> "FirstStartMachineActionsModel": @@ -1090,7 +1090,7 @@ class CuraApplication(QtApplication): self.processEvents() qmlRegisterType(DiscoveredPrintersModel, "Cura", 1, 0, "DiscoveredPrintersModel") - qmlRegisterType(DiscoveredUltimakerCloudPrintersModel, "Cura", 1, 7, "DiscoveredUltimakerCloudPrintersModel") + qmlRegisterType(DiscoveredCloudPrintersModel, "Cura", 1, 7, "DiscoveredCloudPrintersModel") qmlRegisterSingletonType(QualityProfilesDropDownMenuModel, "Cura", 1, 0, "QualityProfilesDropDownMenuModel", self.getQualityProfilesDropDownMenuModel) qmlRegisterSingletonType(CustomQualityProfilesDropDownMenuModel, "Cura", 1, 0, diff --git a/cura/Machines/Models/DiscoveredUltimakerCloudPrintersModel.py b/cura/Machines/Models/DiscoveredCloudPrintersModel.py similarity index 81% rename from cura/Machines/Models/DiscoveredUltimakerCloudPrintersModel.py rename to cura/Machines/Models/DiscoveredCloudPrintersModel.py index c92f84471c..e232afe8b9 100644 --- a/cura/Machines/Models/DiscoveredUltimakerCloudPrintersModel.py +++ b/cura/Machines/Models/DiscoveredCloudPrintersModel.py @@ -8,7 +8,7 @@ if TYPE_CHECKING: from cura.CuraApplication import CuraApplication -class DiscoveredUltimakerCloudPrintersModel(ListModel): +class DiscoveredCloudPrintersModel(ListModel): DeviceKeyRole = Qt.UserRole + 1 DeviceNameRole = Qt.UserRole + 2 DeviceTypeRole = Qt.UserRole + 3 @@ -28,14 +28,8 @@ class DiscoveredUltimakerCloudPrintersModel(ListModel): self._new_cloud_printers_detected = False # type: bool self._application = application # type: CuraApplication - def addDiscoveredUltimakerCloudPrinters(self, new_devices: List[Optional[Dict[str, str]]]) -> None: - for device in new_devices: - self._discovered_ultimaker_cloud_printers_list.append({ - "key": device.getId(), - "name": device.name, - "machine_type": device.printerTypeName, - "firmware_version": device.firmwareVersion - }) + def addDiscoveredCloudPrinters(self, new_devices: List[Dict[str, str]]) -> None: + self._discovered_ultimaker_cloud_printers_list.extend(new_devices) self._update() # Inform whether new cloud printers have been detected. If they have, the welcome wizard can close. diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py index 5e03b65279..c20456d243 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py @@ -142,7 +142,14 @@ class CloudOutputDeviceManager: self._remote_clusters[device.getId()] = device remote_clusters_added = True - CuraApplication.getInstance().getDiscoveredUltimakerCloudPrintersModel().addDiscoveredUltimakerCloudPrinters(new_devices) + # Inform the Cloud printers model about new devices. + new_devices_list_of_dicts = [{ + "key": d.getId(), + "name": d.name, + "machine_type": d.printerTypeName, + "firmware_version": d.firmwareVersion} for d in new_devices] + discovered_cloud_printers_model = CuraApplication.getInstance().getDiscoveredCloudPrintersModel() + discovered_cloud_printers_model.addDiscoveredCloudPrinters(new_devices_list_of_dicts) if not new_devices: if remote_clusters_added: diff --git a/resources/qml/WelcomePages/AddCloudPrintersView.qml b/resources/qml/WelcomePages/AddCloudPrintersView.qml index 24865a9a2d..bf7831c5c6 100644 --- a/resources/qml/WelcomePages/AddCloudPrintersView.qml +++ b/resources/qml/WelcomePages/AddCloudPrintersView.qml @@ -20,7 +20,7 @@ Item UM.I18nCatalog { id: catalog; name: "cura" } property bool searchingForCloudPrinters: true - property var discoveredCloudPrintersModel: CuraApplication.getDiscoveredUltimakerCloudPrintersModel() + property var discoveredCloudPrintersModel: CuraApplication.getDiscoveredCloudPrintersModel() Rectangle { diff --git a/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml b/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml index 0139064258..af60c9c723 100644 --- a/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml +++ b/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml @@ -203,7 +203,7 @@ Item text: catalog.i18nc("@label", "Add cloud printer") height: UM.Theme.getSize("message_action_button").height onClicked: { - CuraApplication.getDiscoveredUltimakerCloudPrintersModel().clear() + CuraApplication.getDiscoveredCloudPrintersModel().clear() base.addCloudPrinterButtonClicked() } } diff --git a/resources/qml/WelcomePages/CloudContent.qml b/resources/qml/WelcomePages/CloudContent.qml index 83a258a3f5..48410f7f12 100644 --- a/resources/qml/WelcomePages/CloudContent.qml +++ b/resources/qml/WelcomePages/CloudContent.qml @@ -17,7 +17,7 @@ Item signal cloudPrintersDetected(bool newCloudPrintersDetected) - Component.onCompleted: CuraApplication.getDiscoveredUltimakerCloudPrintersModel().cloudPrintersDetectedChanged.connect(cloudPrintersDetected) + Component.onCompleted: CuraApplication.getDiscoveredCloudPrintersModel().cloudPrintersDetectedChanged.connect(cloudPrintersDetected) onCloudPrintersDetected: { From 58b61f23316fdbef6d0c8f510c0cc805e9ae2ae9 Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Wed, 29 Apr 2020 13:47:11 +0200 Subject: [PATCH 20/25] Remove unnecessary newCloudPrintersDetected variable Variable newCloudPrintersDetected is no longer needed, as it is communicated through the signal itself. CURA-7022 --- cura/Machines/Models/DiscoveredCloudPrintersModel.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/cura/Machines/Models/DiscoveredCloudPrintersModel.py b/cura/Machines/Models/DiscoveredCloudPrintersModel.py index e232afe8b9..cdd995484b 100644 --- a/cura/Machines/Models/DiscoveredCloudPrintersModel.py +++ b/cura/Machines/Models/DiscoveredCloudPrintersModel.py @@ -25,7 +25,6 @@ class DiscoveredCloudPrintersModel(ListModel): self.addRoleName(self.DeviceFirmwareVersionRole, "firmware_version") self._discovered_ultimaker_cloud_printers_list = [] # type: List[Dict[str, str]] - self._new_cloud_printers_detected = False # type: bool self._application = application # type: CuraApplication def addDiscoveredCloudPrinters(self, new_devices: List[Dict[str, str]]) -> None: @@ -33,14 +32,12 @@ class DiscoveredCloudPrintersModel(ListModel): self._update() # Inform whether new cloud printers have been detected. If they have, the welcome wizard can close. - self._new_cloud_printers_detected = len(new_devices) > 0 self.cloudPrintersDetectedChanged.emit(len(new_devices) > 0) @pyqtSlot() def clear(self) -> None: self._discovered_ultimaker_cloud_printers_list = [] self._update() - self._new_cloud_printers_detected = False self.cloudPrintersDetectedChanged.emit(False) def _update(self) -> None: @@ -54,7 +51,3 @@ class DiscoveredCloudPrintersModel(ListModel): filtered_items.sort(key = lambda k: k["name"]) self.setItems(filtered_items) - - @pyqtProperty(bool, notify = cloudPrintersDetectedChanged) - def newCloudPrintersDetected(self) -> bool: - return self._new_cloud_printers_detected From 2fb7e6704392f2fa2771988de5f7271bca796538 Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Wed, 29 Apr 2020 13:55:03 +0200 Subject: [PATCH 21/25] Cleanup _update() CURA-7022 --- .../Machines/Models/DiscoveredCloudPrintersModel.py | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/cura/Machines/Models/DiscoveredCloudPrintersModel.py b/cura/Machines/Models/DiscoveredCloudPrintersModel.py index cdd995484b..58a73e7095 100644 --- a/cura/Machines/Models/DiscoveredCloudPrintersModel.py +++ b/cura/Machines/Models/DiscoveredCloudPrintersModel.py @@ -41,13 +41,6 @@ class DiscoveredCloudPrintersModel(ListModel): self.cloudPrintersDetectedChanged.emit(False) def _update(self) -> None: - items = [] - - for cloud_printer in self._discovered_ultimaker_cloud_printers_list: - items.append(cloud_printer) - - # Execute all filters. - filtered_items = list(items) - - filtered_items.sort(key = lambda k: k["name"]) - self.setItems(filtered_items) + items = self._discovered_ultimaker_cloud_printers_list[:] + items.sort(key = lambda k: k["name"]) + self.setItems(items) From 4a49c1cc8d1fecd592784556c26364f51875d8d2 Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Wed, 29 Apr 2020 14:14:01 +0200 Subject: [PATCH 22/25] Fix bottom margin of the discoveredCloudPrintersScrollView CURA-7022 --- resources/qml/WelcomePages/AddCloudPrintersView.qml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/resources/qml/WelcomePages/AddCloudPrintersView.qml b/resources/qml/WelcomePages/AddCloudPrintersView.qml index bf7831c5c6..e4e42d1e9e 100644 --- a/resources/qml/WelcomePages/AddCloudPrintersView.qml +++ b/resources/qml/WelcomePages/AddCloudPrintersView.qml @@ -30,10 +30,10 @@ Item anchors { top: parent.top - bottom: finishButton.top left: parent.left leftMargin: UM.Theme.getSize("default_margin").width right: parent.right + bottom: finishButton.top bottomMargin: UM.Theme.getSize("default_margin").height } @@ -105,6 +105,7 @@ Item left: parent.left leftMargin: UM.Theme.getSize("default_margin").width right: parent.right + bottom: parent.bottom } Column From b4598955892f32d6824f6a2804a757d2b325a29c Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Wed, 29 Apr 2020 14:19:28 +0200 Subject: [PATCH 23/25] Add comments CURA-7022 --- .../Models/DiscoveredCloudPrintersModel.py | 25 +++++++++++++++++++ .../qml/WelcomePages/AddCloudPrintersView.qml | 1 + 2 files changed, 26 insertions(+) diff --git a/cura/Machines/Models/DiscoveredCloudPrintersModel.py b/cura/Machines/Models/DiscoveredCloudPrintersModel.py index 58a73e7095..302ef1557b 100644 --- a/cura/Machines/Models/DiscoveredCloudPrintersModel.py +++ b/cura/Machines/Models/DiscoveredCloudPrintersModel.py @@ -9,6 +9,9 @@ if TYPE_CHECKING: class DiscoveredCloudPrintersModel(ListModel): + """ + Model used to inform the application about newly added cloud printers, which are discovered from the user's account + """ DeviceKeyRole = Qt.UserRole + 1 DeviceNameRole = Qt.UserRole + 2 DeviceTypeRole = Qt.UserRole + 3 @@ -28,6 +31,18 @@ class DiscoveredCloudPrintersModel(ListModel): self._application = application # type: CuraApplication def addDiscoveredCloudPrinters(self, new_devices: List[Dict[str, str]]) -> None: + """ + Adds all the newly discovered cloud printers into the DiscoveredCloudPrintersModel. + + :param new_devices: List of dictionaries which contain information about added cloud printers. Example: + { + "key": "YjW8pwGYcaUvaa0YgVyWeFkX3z", + "name": "NG 001", + "machine_type": "Ultimaker S5", + "firmware_version": "5.5.12.202001" + } + :return: None + """ self._discovered_ultimaker_cloud_printers_list.extend(new_devices) self._update() @@ -36,11 +51,21 @@ class DiscoveredCloudPrintersModel(ListModel): @pyqtSlot() def clear(self) -> None: + """ + Clears the contents of the DiscoveredCloudPrintersModel. + + :return: None + """ self._discovered_ultimaker_cloud_printers_list = [] self._update() self.cloudPrintersDetectedChanged.emit(False) def _update(self) -> None: + """ + Sorts the newly discovered cloud printers by name and then updates the ListModel. + + :return: None + """ items = self._discovered_ultimaker_cloud_printers_list[:] items.sort(key = lambda k: k["name"]) self.setItems(items) diff --git a/resources/qml/WelcomePages/AddCloudPrintersView.qml b/resources/qml/WelcomePages/AddCloudPrintersView.qml index e4e42d1e9e..f97d68f776 100644 --- a/resources/qml/WelcomePages/AddCloudPrintersView.qml +++ b/resources/qml/WelcomePages/AddCloudPrintersView.qml @@ -22,6 +22,7 @@ Item property bool searchingForCloudPrinters: true property var discoveredCloudPrintersModel: CuraApplication.getDiscoveredCloudPrintersModel() + // The area where either the discoveredCloudPrintersScrollView or the busyIndicator will be displayed Rectangle { id: cloudPrintersContent From 6959c9ac42da1739048bcf0d9d51ae7987677b1b Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Wed, 29 Apr 2020 15:01:50 +0200 Subject: [PATCH 24/25] Rename _discovered_ultimaker_cloud_printers_list to _discovered_cloud_printers_list CURA-7022 --- cura/Machines/Models/DiscoveredCloudPrintersModel.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cura/Machines/Models/DiscoveredCloudPrintersModel.py b/cura/Machines/Models/DiscoveredCloudPrintersModel.py index 302ef1557b..23dcba6de7 100644 --- a/cura/Machines/Models/DiscoveredCloudPrintersModel.py +++ b/cura/Machines/Models/DiscoveredCloudPrintersModel.py @@ -27,7 +27,7 @@ class DiscoveredCloudPrintersModel(ListModel): self.addRoleName(self.DeviceTypeRole, "machine_type") self.addRoleName(self.DeviceFirmwareVersionRole, "firmware_version") - self._discovered_ultimaker_cloud_printers_list = [] # type: List[Dict[str, str]] + self._discovered_cloud_printers_list = [] # type: List[Dict[str, str]] self._application = application # type: CuraApplication def addDiscoveredCloudPrinters(self, new_devices: List[Dict[str, str]]) -> None: @@ -43,7 +43,7 @@ class DiscoveredCloudPrintersModel(ListModel): } :return: None """ - self._discovered_ultimaker_cloud_printers_list.extend(new_devices) + self._discovered_cloud_printers_list.extend(new_devices) self._update() # Inform whether new cloud printers have been detected. If they have, the welcome wizard can close. @@ -56,7 +56,7 @@ class DiscoveredCloudPrintersModel(ListModel): :return: None """ - self._discovered_ultimaker_cloud_printers_list = [] + self._discovered_cloud_printers_list = [] self._update() self.cloudPrintersDetectedChanged.emit(False) @@ -66,6 +66,6 @@ class DiscoveredCloudPrintersModel(ListModel): :return: None """ - items = self._discovered_ultimaker_cloud_printers_list[:] + items = self._discovered_cloud_printers_list[:] items.sort(key = lambda k: k["name"]) self.setItems(items) From 07fcdf905ed75e7e5b88dac0a44995311ec34022 Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Wed, 29 Apr 2020 15:02:26 +0200 Subject: [PATCH 25/25] Add tests for the DiscoveredCloudPrintersModel CURA-7022 --- .../TestDiscoveredCloudPrintersModel.py | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 tests/Machines/Models/TestDiscoveredCloudPrintersModel.py diff --git a/tests/Machines/Models/TestDiscoveredCloudPrintersModel.py b/tests/Machines/Models/TestDiscoveredCloudPrintersModel.py new file mode 100644 index 0000000000..5b19178531 --- /dev/null +++ b/tests/Machines/Models/TestDiscoveredCloudPrintersModel.py @@ -0,0 +1,34 @@ +from unittest.mock import MagicMock + +import pytest + +from cura.Machines.Models.DiscoveredCloudPrintersModel import DiscoveredCloudPrintersModel + + +@pytest.fixture() +def discovered_cloud_printers_model(application) -> DiscoveredCloudPrintersModel: + return DiscoveredCloudPrintersModel(application) + + +def test_discoveredCloudPrinters(discovered_cloud_printers_model): + new_devices = [{ + "key": "Bite my shiny metal a$$", + "name": "Bender", + "machine_type": "Bender robot", + "firmware_version": "8.0.0.8.5" + }] + discovered_cloud_printers_model.cloudPrintersDetectedChanged = MagicMock() + + # Test if adding a cloud printer in the model works + discovered_cloud_printers_model.addDiscoveredCloudPrinters(new_devices) + assert len(discovered_cloud_printers_model._discovered_cloud_printers_list) == 1 + assert discovered_cloud_printers_model.cloudPrintersDetectedChanged.emit.call_count == 1 + # Make sure that the signal was called with "True" as input + discovered_cloud_printers_model.cloudPrintersDetectedChanged.emit.assert_called_with(True) + + # Test if clearing the model works + discovered_cloud_printers_model.clear() + assert len(discovered_cloud_printers_model._discovered_cloud_printers_list) == 0 + assert discovered_cloud_printers_model.cloudPrintersDetectedChanged.emit.call_count == 2 + # Make sure that the signal was called with "False" as input + discovered_cloud_printers_model.cloudPrintersDetectedChanged.emit.assert_called_with(False)