From c86cc3ae5a08df085d59caba949efce414b1c92d Mon Sep 17 00:00:00 2001 From: Dimitriovski Date: Fri, 10 Jan 2020 16:48:45 +0100 Subject: [PATCH 1/7] Added 'dismiss' link and logic for removing the item from the dialog CURA-7090 --- .../qml/dialogs/CompatibilityDialog.qml | 19 +++++++++++++- .../Toolbox/src/SubscribedPackagesModel.py | 26 +++++++++++++++++-- plugins/Toolbox/src/Toolbox.py | 5 ++++ 3 files changed, 47 insertions(+), 3 deletions(-) diff --git a/plugins/Toolbox/resources/qml/dialogs/CompatibilityDialog.qml b/plugins/Toolbox/resources/qml/dialogs/CompatibilityDialog.qml index a6ce7fc865..93945871a3 100644 --- a/plugins/Toolbox/resources/qml/dialogs/CompatibilityDialog.qml +++ b/plugins/Toolbox/resources/qml/dialogs/CompatibilityDialog.qml @@ -104,7 +104,7 @@ UM.Dialog{ { width: parent.width property int lineHeight: 60 - visible: !model.is_compatible + visible: !model.is_compatible && !model.is_dismissed height: visible ? (lineHeight + UM.Theme.getSize("default_margin").height) : 0 // We only show the incompatible packages here Image { @@ -117,6 +117,7 @@ UM.Dialog{ } Label { + id: packageName text: model.name font: UM.Theme.getFont("medium_bold") anchors.left: packageIcon.right @@ -125,6 +126,22 @@ UM.Dialog{ color: UM.Theme.getColor("text") elide: Text.ElideRight } + + Label + { + id: dismissLabel + text: "(Dismiss)" + font: UM.Theme.getFont("small") + anchors.right: parent.right + anchors.verticalCenter: packageIcon.verticalCenter + color: UM.Theme.getColor("text") + + MouseArea + { + anchors.fill: parent + onClicked: toolbox.dismissIncompatiblePackage(model.package_id) + } + } } } } diff --git a/plugins/Toolbox/src/SubscribedPackagesModel.py b/plugins/Toolbox/src/SubscribedPackagesModel.py index cf0d07c153..118048eec2 100644 --- a/plugins/Toolbox/src/SubscribedPackagesModel.py +++ b/plugins/Toolbox/src/SubscribedPackagesModel.py @@ -5,6 +5,10 @@ from PyQt5.QtCore import Qt from UM.Qt.ListModel import ListModel from cura import ApplicationMetadata +from PyQt5.QtCore import pyqtSlot + +from UM.Logger import Logger + class SubscribedPackagesModel(ListModel): def __init__(self, parent = None): @@ -18,6 +22,9 @@ class SubscribedPackagesModel(ListModel): self.addRoleName(Qt.UserRole + 1, "name") self.addRoleName(Qt.UserRole + 2, "icon_url") self.addRoleName(Qt.UserRole + 3, "is_compatible") + self.addRoleName(Qt.UserRole + 4, "is_dismissed") + self.addRoleName(Qt.UserRole + 5, "package_id") + def setMetadata(self, data): if self._metadata != data: @@ -33,7 +40,11 @@ class SubscribedPackagesModel(ListModel): for item in self._metadata: if item["package_id"] not in self._discrepancies: continue - package = {"name": item["display_name"], "sdk_versions": item["sdk_versions"]} + package = {"package_id": item["package_id"], + "name": item["display_name"], + "sdk_versions": item["sdk_versions"], + "is_dismissed": False + } if self._sdk_version not in item["sdk_versions"]: package.update({"is_compatible": False}) else: @@ -44,8 +55,10 @@ class SubscribedPackagesModel(ListModel): package.update({"icon_url": ""}) self._items.append(package) + print("All items:: %s" % self._items) self.setItems(self._items) + def hasCompatiblePackages(self) -> bool: has_compatible_items = False for item in self._items: @@ -58,4 +71,13 @@ class SubscribedPackagesModel(ListModel): for item in self._items: if item['is_compatible'] == False: has_incompatible_items = True - return has_incompatible_items \ No newline at end of file + return has_incompatible_items + + @pyqtSlot(str) + def setDismiss(self, package_id) -> None: + package_id_in_list_of_items = self.find(key="package_id", value=package_id) + if package_id_in_list_of_items != -1: + self.setProperty(package_id_in_list_of_items, property="is_dismissed", value=True) + Logger.debug("Package {} has been dismissed".format(package_id)) + + # Now store this package_id as DISMISSED somewhere in local files \ No newline at end of file diff --git a/plugins/Toolbox/src/Toolbox.py b/plugins/Toolbox/src/Toolbox.py index f28178b99e..c77e148140 100644 --- a/plugins/Toolbox/src/Toolbox.py +++ b/plugins/Toolbox/src/Toolbox.py @@ -556,6 +556,11 @@ class Toolbox(QObject, Extension): populated += 1 return populated == len(self._server_response_data.items()) + @pyqtSlot(str) + def dismissIncompatiblePackage(self, package_id): + print("---in toolbox: %s" % package_id) + self._models["subscribed_packages"].setDismiss(package_id) + # Make API Calls # -------------------------------------------------------------------------- def _makeRequestByType(self, request_type: str) -> None: From 071326b890f92d8b16fb094a310f29ea03df9764 Mon Sep 17 00:00:00 2001 From: Dimitriovski Date: Sat, 11 Jan 2020 01:11:49 +0100 Subject: [PATCH 2/7] Added logic for dismissing packages from the Incompatible list CURA-7090 --- plugins/Toolbox/src/SubscribedPackagesModel.py | 8 +++++--- plugins/Toolbox/src/Toolbox.py | 11 ++++++++--- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/plugins/Toolbox/src/SubscribedPackagesModel.py b/plugins/Toolbox/src/SubscribedPackagesModel.py index 118048eec2..d2ed486de2 100644 --- a/plugins/Toolbox/src/SubscribedPackagesModel.py +++ b/plugins/Toolbox/src/SubscribedPackagesModel.py @@ -55,7 +55,6 @@ class SubscribedPackagesModel(ListModel): package.update({"icon_url": ""}) self._items.append(package) - print("All items:: %s" % self._items) self.setItems(self._items) @@ -73,11 +72,14 @@ class SubscribedPackagesModel(ListModel): has_incompatible_items = True return has_incompatible_items - @pyqtSlot(str) def setDismiss(self, package_id) -> None: package_id_in_list_of_items = self.find(key="package_id", value=package_id) if package_id_in_list_of_items != -1: self.setProperty(package_id_in_list_of_items, property="is_dismissed", value=True) Logger.debug("Package {} has been dismissed".format(package_id)) - # Now store this package_id as DISMISSED somewhere in local files \ No newline at end of file + def addDismissed(self, list_of_dismissed) -> None: + for package in list_of_dismissed: + item = self.find(key="package_id", value=package) + if item != -1: + self.setProperty(item, property="is_dismissed", value=True) diff --git a/plugins/Toolbox/src/Toolbox.py b/plugins/Toolbox/src/Toolbox.py index c77e148140..f12cc3ba3d 100644 --- a/plugins/Toolbox/src/Toolbox.py +++ b/plugins/Toolbox/src/Toolbox.py @@ -558,8 +558,8 @@ class Toolbox(QObject, Extension): @pyqtSlot(str) def dismissIncompatiblePackage(self, package_id): - print("---in toolbox: %s" % package_id) self._models["subscribed_packages"].setDismiss(package_id) + self._package_manager.setAsDismissed(package_id) # Make API Calls # -------------------------------------------------------------------------- @@ -668,12 +668,17 @@ class Toolbox(QObject, Extension): def _checkCompatibilities(self, json_data) -> None: user_subscribed_packages = [plugin["package_id"] for plugin in json_data] user_installed_packages = self._package_manager.getUserInstalledPackages() + user_dismissed_packages = list(self._package_manager.getDismissedPackages()) + + user_installed_packages += user_dismissed_packages # We check if there are packages installed in Cloud Marketplace but not in Cura marketplace (discrepancy) package_discrepancy = list(set(user_subscribed_packages).difference(user_installed_packages)) + if package_discrepancy: self._models["subscribed_packages"].addValue(package_discrepancy) self._models["subscribed_packages"].update() + self._models["subscribed_packages"].addDismissed(user_dismissed_packages) Logger.log("d", "Discrepancy found between Cloud subscribed packages and Cura installed packages") sync_message = Message(i18n_catalog.i18nc( "@info:generic", @@ -802,11 +807,11 @@ class Toolbox(QObject, Extension): return cast(SubscribedPackagesModel, self._models["subscribed_packages"]) @pyqtProperty(bool, constant=True) - def has_compatible_packages(self) -> str: + def has_compatible_packages(self) -> bool: return self._models["subscribed_packages"].hasCompatiblePackages() @pyqtProperty(bool, constant=True) - def has_incompatible_packages(self) -> str: + def has_incompatible_packages(self) -> bool: return self._models["subscribed_packages"].hasIncompatiblePackages() @pyqtProperty(QObject, constant = True) From fbe38dc6587053f6cf45f8b0aaac1c234c3dcf71 Mon Sep 17 00:00:00 2001 From: Dimitriovski Date: Mon, 13 Jan 2020 09:55:18 +0100 Subject: [PATCH 3/7] added typing, refactored some functions CURA-7090 --- .../qml/dialogs/CompatibilityDialog.qml | 6 +-- .../Toolbox/src/SubscribedPackagesModel.py | 51 +++++++++---------- plugins/Toolbox/src/Toolbox.py | 22 ++++---- 3 files changed, 36 insertions(+), 43 deletions(-) diff --git a/plugins/Toolbox/resources/qml/dialogs/CompatibilityDialog.qml b/plugins/Toolbox/resources/qml/dialogs/CompatibilityDialog.qml index 93945871a3..c2cc1ce4d6 100644 --- a/plugins/Toolbox/resources/qml/dialogs/CompatibilityDialog.qml +++ b/plugins/Toolbox/resources/qml/dialogs/CompatibilityDialog.qml @@ -74,7 +74,7 @@ UM.Dialog{ } Label { - text: model.name + text: model.display_name font: UM.Theme.getFont("medium_bold") anchors.left: packageIcon.right anchors.leftMargin: UM.Theme.getSize("default_margin").width @@ -117,8 +117,7 @@ UM.Dialog{ } Label { - id: packageName - text: model.name + text: model.display_name font: UM.Theme.getFont("medium_bold") anchors.left: packageIcon.right anchors.leftMargin: UM.Theme.getSize("default_margin").width @@ -129,7 +128,6 @@ UM.Dialog{ Label { - id: dismissLabel text: "(Dismiss)" font: UM.Theme.getFont("small") anchors.right: parent.right diff --git a/plugins/Toolbox/src/SubscribedPackagesModel.py b/plugins/Toolbox/src/SubscribedPackagesModel.py index d2ed486de2..acbf4c13f7 100644 --- a/plugins/Toolbox/src/SubscribedPackagesModel.py +++ b/plugins/Toolbox/src/SubscribedPackagesModel.py @@ -4,10 +4,8 @@ from PyQt5.QtCore import Qt from UM.Qt.ListModel import ListModel from cura import ApplicationMetadata - -from PyQt5.QtCore import pyqtSlot - from UM.Logger import Logger +from typing import List class SubscribedPackagesModel(ListModel): @@ -19,32 +17,30 @@ class SubscribedPackagesModel(ListModel): self._discrepancies = None self._sdk_version = ApplicationMetadata.CuraSDKVersion - self.addRoleName(Qt.UserRole + 1, "name") - self.addRoleName(Qt.UserRole + 2, "icon_url") - self.addRoleName(Qt.UserRole + 3, "is_compatible") - self.addRoleName(Qt.UserRole + 4, "is_dismissed") - self.addRoleName(Qt.UserRole + 5, "package_id") + self.addRoleName(Qt.UserRole + 1, "package_id") + self.addRoleName(Qt.UserRole + 2, "display_name") + self.addRoleName(Qt.UserRole + 3, "icon_url") + self.addRoleName(Qt.UserRole + 4, "is_compatible") + self.addRoleName(Qt.UserRole + 5, "is_dismissed") - - def setMetadata(self, data): + def setMetadata(self, data) -> None: if self._metadata != data: self._metadata = data - def addValue(self, discrepancy): + def addDiscrepancies(self, discrepancy: List[str]) -> None: if self._discrepancies != discrepancy: self._discrepancies = discrepancy - def update(self): + def initialize(self) -> None: self._items.clear() for item in self._metadata: if item["package_id"] not in self._discrepancies: continue - package = {"package_id": item["package_id"], - "name": item["display_name"], - "sdk_versions": item["sdk_versions"], - "is_dismissed": False - } + package = {"package_id": item["package_id"], + "display_name": item["display_name"], + "sdk_versions": item["sdk_versions"], + "is_dismissed": False} if self._sdk_version not in item["sdk_versions"]: package.update({"is_compatible": False}) else: @@ -57,7 +53,6 @@ class SubscribedPackagesModel(ListModel): self._items.append(package) self.setItems(self._items) - def hasCompatiblePackages(self) -> bool: has_compatible_items = False for item in self._items: @@ -72,14 +67,16 @@ class SubscribedPackagesModel(ListModel): has_incompatible_items = True return has_incompatible_items - def setDismiss(self, package_id) -> None: - package_id_in_list_of_items = self.find(key="package_id", value=package_id) - if package_id_in_list_of_items != -1: - self.setProperty(package_id_in_list_of_items, property="is_dismissed", value=True) + # Sets the "is_compatible" to True for the given package, in memory + def dismissPackage(self, package_id: str) -> None: + package = self.find(key="package_id", value=package_id) + if package != -1: + self.setProperty(package, property="is_dismissed", value=True) Logger.debug("Package {} has been dismissed".format(package_id)) - def addDismissed(self, list_of_dismissed) -> None: - for package in list_of_dismissed: - item = self.find(key="package_id", value=package) - if item != -1: - self.setProperty(item, property="is_dismissed", value=True) + # Reads the dismissed_packages from user config file and applies them so they won't be shown in the Compatibility Dialog + def applyDismissedPackages(self, dismissed_packages: List[str]) -> None: + for package in dismissed_packages: + exists = self.find(key="package_id", value=package) + if exists != -1: + self.setProperty(exists, property="is_dismissed", value=True) diff --git a/plugins/Toolbox/src/Toolbox.py b/plugins/Toolbox/src/Toolbox.py index f12cc3ba3d..eaaf8d94e9 100644 --- a/plugins/Toolbox/src/Toolbox.py +++ b/plugins/Toolbox/src/Toolbox.py @@ -557,9 +557,9 @@ class Toolbox(QObject, Extension): return populated == len(self._server_response_data.items()) @pyqtSlot(str) - def dismissIncompatiblePackage(self, package_id): - self._models["subscribed_packages"].setDismiss(package_id) - self._package_manager.setAsDismissed(package_id) + def dismissIncompatiblePackage(self, package_id: str): + self._models["subscribed_packages"].dismissPackage(package_id) # sets "is_compatible" to True, in-memory + self._package_manager.dismissPackage(package_id) # adds this package_id as dismissed in the user config file # Make API Calls # -------------------------------------------------------------------------- @@ -668,17 +668,15 @@ class Toolbox(QObject, Extension): def _checkCompatibilities(self, json_data) -> None: user_subscribed_packages = [plugin["package_id"] for plugin in json_data] user_installed_packages = self._package_manager.getUserInstalledPackages() - user_dismissed_packages = list(self._package_manager.getDismissedPackages()) - - user_installed_packages += user_dismissed_packages - - # We check if there are packages installed in Cloud Marketplace but not in Cura marketplace (discrepancy) + user_dismissed_packages = self._package_manager.getDismissedPackages() + if user_dismissed_packages: + user_installed_packages += user_dismissed_packages + # We check if there are packages installed in Cloud Marketplace but not in Cura marketplace package_discrepancy = list(set(user_subscribed_packages).difference(user_installed_packages)) - if package_discrepancy: - self._models["subscribed_packages"].addValue(package_discrepancy) - self._models["subscribed_packages"].update() - self._models["subscribed_packages"].addDismissed(user_dismissed_packages) + self._models["subscribed_packages"].addDiscrepancies(package_discrepancy) + self._models["subscribed_packages"].initialize() + self._models["subscribed_packages"].applyDismissedPackages(user_dismissed_packages) Logger.log("d", "Discrepancy found between Cloud subscribed packages and Cura installed packages") sync_message = Message(i18n_catalog.i18nc( "@info:generic", From 071cf5517e759cdd41583587323065b05f64d9eb Mon Sep 17 00:00:00 2001 From: Dimitriovski Date: Mon, 13 Jan 2020 10:37:40 +0100 Subject: [PATCH 4/7] linting CURA-7090 --- plugins/Toolbox/resources/qml/dialogs/CompatibilityDialog.qml | 2 -- 1 file changed, 2 deletions(-) diff --git a/plugins/Toolbox/resources/qml/dialogs/CompatibilityDialog.qml b/plugins/Toolbox/resources/qml/dialogs/CompatibilityDialog.qml index c2cc1ce4d6..bd858b4fd9 100644 --- a/plugins/Toolbox/resources/qml/dialogs/CompatibilityDialog.qml +++ b/plugins/Toolbox/resources/qml/dialogs/CompatibilityDialog.qml @@ -125,7 +125,6 @@ UM.Dialog{ color: UM.Theme.getColor("text") elide: Text.ElideRight } - Label { text: "(Dismiss)" @@ -133,7 +132,6 @@ UM.Dialog{ anchors.right: parent.right anchors.verticalCenter: packageIcon.verticalCenter color: UM.Theme.getColor("text") - MouseArea { anchors.fill: parent From 7359492e115855a4fa3e943d91fe888c06a7727e Mon Sep 17 00:00:00 2001 From: Dimitriovski Date: Mon, 13 Jan 2020 11:44:23 +0100 Subject: [PATCH 5/7] Added a Tooltip over the Dismiss button. Changed the cursor on hover. --- .../qml/dialogs/CompatibilityDialog.qml | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/plugins/Toolbox/resources/qml/dialogs/CompatibilityDialog.qml b/plugins/Toolbox/resources/qml/dialogs/CompatibilityDialog.qml index bd858b4fd9..41020f2415 100644 --- a/plugins/Toolbox/resources/qml/dialogs/CompatibilityDialog.qml +++ b/plugins/Toolbox/resources/qml/dialogs/CompatibilityDialog.qml @@ -125,17 +125,24 @@ UM.Dialog{ color: UM.Theme.getColor("text") elide: Text.ElideRight } - Label + UM.TooltipArea { - text: "(Dismiss)" - font: UM.Theme.getFont("small") + width: childrenRect.width; + height: childrenRect.height; + text: catalog.i18nc("@info:tooltip", "Dismisses the package and won't be shown in this dialog anymore") anchors.right: parent.right anchors.verticalCenter: packageIcon.verticalCenter - color: UM.Theme.getColor("text") - MouseArea + Label { - anchors.fill: parent - onClicked: toolbox.dismissIncompatiblePackage(model.package_id) + text: "(Dismiss)" + font: UM.Theme.getFont("small") + color: UM.Theme.getColor("text") + MouseArea + { + cursorShape: Qt.PointingHandCursor + anchors.fill: parent + onClicked: toolbox.dismissIncompatiblePackage(model.package_id) + } } } } From e8f22beb276078a8abbae60a12583d7bacea699b Mon Sep 17 00:00:00 2001 From: Dimitriovski Date: Tue, 14 Jan 2020 11:50:47 +0100 Subject: [PATCH 6/7] Removed unnecessary function and a call to it. Added some typing. CURA-7090 --- plugins/Toolbox/src/SubscribedPackagesModel.py | 13 +++---------- plugins/Toolbox/src/Toolbox.py | 4 +--- 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/plugins/Toolbox/src/SubscribedPackagesModel.py b/plugins/Toolbox/src/SubscribedPackagesModel.py index acbf4c13f7..53d6eba932 100644 --- a/plugins/Toolbox/src/SubscribedPackagesModel.py +++ b/plugins/Toolbox/src/SubscribedPackagesModel.py @@ -5,7 +5,7 @@ from PyQt5.QtCore import Qt from UM.Qt.ListModel import ListModel from cura import ApplicationMetadata from UM.Logger import Logger -from typing import List +from typing import List, Dict, Any class SubscribedPackagesModel(ListModel): @@ -23,12 +23,12 @@ class SubscribedPackagesModel(ListModel): self.addRoleName(Qt.UserRole + 4, "is_compatible") self.addRoleName(Qt.UserRole + 5, "is_dismissed") - def setMetadata(self, data) -> None: + def setMetadata(self, data: List[Dict[str, List[Any]]]) -> None: if self._metadata != data: self._metadata = data def addDiscrepancies(self, discrepancy: List[str]) -> None: - if self._discrepancies != discrepancy: + if set(self._discrepancies) != set(discrepancy): # convert to set() to check if they are same list, regardless of list order self._discrepancies = discrepancy def initialize(self) -> None: @@ -73,10 +73,3 @@ class SubscribedPackagesModel(ListModel): if package != -1: self.setProperty(package, property="is_dismissed", value=True) Logger.debug("Package {} has been dismissed".format(package_id)) - - # Reads the dismissed_packages from user config file and applies them so they won't be shown in the Compatibility Dialog - def applyDismissedPackages(self, dismissed_packages: List[str]) -> None: - for package in dismissed_packages: - exists = self.find(key="package_id", value=package) - if exists != -1: - self.setProperty(exists, property="is_dismissed", value=True) diff --git a/plugins/Toolbox/src/Toolbox.py b/plugins/Toolbox/src/Toolbox.py index eaaf8d94e9..dd01458a32 100644 --- a/plugins/Toolbox/src/Toolbox.py +++ b/plugins/Toolbox/src/Toolbox.py @@ -676,8 +676,7 @@ class Toolbox(QObject, Extension): if package_discrepancy: self._models["subscribed_packages"].addDiscrepancies(package_discrepancy) self._models["subscribed_packages"].initialize() - self._models["subscribed_packages"].applyDismissedPackages(user_dismissed_packages) - Logger.log("d", "Discrepancy found between Cloud subscribed packages and Cura installed packages") + Logger.debug("Discrepancy found between Cloud subscribed packages and Cura installed packages") sync_message = Message(i18n_catalog.i18nc( "@info:generic", "\nDo you want to sync material and software packages with your account?"), @@ -688,7 +687,6 @@ class Toolbox(QObject, Extension): icon="", description="Sync your Cloud subscribed packages to your local environment.", button_align=Message.ActionButtonAlignment.ALIGN_RIGHT) - sync_message.actionTriggered.connect(self._onSyncButtonClicked) sync_message.show() From 15a3922436e82eff3371a840b99b1e77549860b8 Mon Sep 17 00:00:00 2001 From: Dimitriovski Date: Tue, 14 Jan 2020 14:07:55 +0100 Subject: [PATCH 7/7] Removed unnecessary checks CURA-7090 --- plugins/Toolbox/src/SubscribedPackagesModel.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/plugins/Toolbox/src/SubscribedPackagesModel.py b/plugins/Toolbox/src/SubscribedPackagesModel.py index 53d6eba932..e6886f23ce 100644 --- a/plugins/Toolbox/src/SubscribedPackagesModel.py +++ b/plugins/Toolbox/src/SubscribedPackagesModel.py @@ -24,16 +24,13 @@ class SubscribedPackagesModel(ListModel): self.addRoleName(Qt.UserRole + 5, "is_dismissed") def setMetadata(self, data: List[Dict[str, List[Any]]]) -> None: - if self._metadata != data: - self._metadata = data + self._metadata = data def addDiscrepancies(self, discrepancy: List[str]) -> None: - if set(self._discrepancies) != set(discrepancy): # convert to set() to check if they are same list, regardless of list order - self._discrepancies = discrepancy + self._discrepancies = discrepancy def initialize(self) -> None: self._items.clear() - for item in self._metadata: if item["package_id"] not in self._discrepancies: continue @@ -49,7 +46,6 @@ class SubscribedPackagesModel(ListModel): package.update({"icon_url": item["icon_url"]}) except KeyError: # There is no 'icon_url" in the response payload for this package package.update({"icon_url": ""}) - self._items.append(package) self.setItems(self._items)