From 1b6c172e6dcd2b55da62e2cc81ddf269e1fe7b40 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Thu, 12 Jul 2018 16:42:48 +0200 Subject: [PATCH 1/5] CURA-5536 Add the icon indicating when a plugin is already installed. --- .../Toolbox/resources/images/installed_check.svg | 8 ++++++++ .../resources/qml/ToolboxDownloadsGridTile.qml | 15 +++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 plugins/Toolbox/resources/images/installed_check.svg diff --git a/plugins/Toolbox/resources/images/installed_check.svg b/plugins/Toolbox/resources/images/installed_check.svg new file mode 100644 index 0000000000..1f1302770b --- /dev/null +++ b/plugins/Toolbox/resources/images/installed_check.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/plugins/Toolbox/resources/qml/ToolboxDownloadsGridTile.qml b/plugins/Toolbox/resources/qml/ToolboxDownloadsGridTile.qml index 17b28fe136..89966caba4 100644 --- a/plugins/Toolbox/resources/qml/ToolboxDownloadsGridTile.qml +++ b/plugins/Toolbox/resources/qml/ToolboxDownloadsGridTile.qml @@ -40,6 +40,21 @@ Item source: model.icon_url || "../images/logobot.svg" mipmap: true } + UM.RecolorImage + { + width: (parent.width * 0.4) | 0 + height: (parent.height * 0.4) | 0 + anchors + { + bottom: parent.bottom + right: parent.right + } + sourceSize.width: width + sourceSize.height: height + visible: toolbox.isInstalled(model.id) + color: UM.Theme.getColor("primary") + source: "../images/installed_check.svg" + } } Column { From 96cc1be2ffe34cd950dd97794c2c1676f4bcedfb Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Fri, 13 Jul 2018 11:59:19 +0200 Subject: [PATCH 2/5] CURA-5536 Calculate the number of installed packages by author. --- .../qml/ToolboxDownloadsGridTile.qml | 2 +- plugins/Toolbox/src/AuthorsModel.py | 2 +- plugins/Toolbox/src/Toolbox.py | 23 +++++++++++++------ 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/plugins/Toolbox/resources/qml/ToolboxDownloadsGridTile.qml b/plugins/Toolbox/resources/qml/ToolboxDownloadsGridTile.qml index 89966caba4..41d09d19ab 100644 --- a/plugins/Toolbox/resources/qml/ToolboxDownloadsGridTile.qml +++ b/plugins/Toolbox/resources/qml/ToolboxDownloadsGridTile.qml @@ -63,7 +63,7 @@ Item Label { id: name - text: model.name + text: toolbox.viewCategory == "material" ? model.name + " (" + toolbox.getNumberOfInstalledPackagesByAuthor(model.id) + "/" + model.package_count + ")" : model.name width: parent.width wrapMode: Text.WordWrap color: UM.Theme.getColor("text") diff --git a/plugins/Toolbox/src/AuthorsModel.py b/plugins/Toolbox/src/AuthorsModel.py index 880ecbe2a0..45424d7e42 100644 --- a/plugins/Toolbox/src/AuthorsModel.py +++ b/plugins/Toolbox/src/AuthorsModel.py @@ -43,7 +43,7 @@ class AuthorsModel(ListModel): "package_count": author["package_count"] if "package_count" in author else 0, "package_types": author["package_types"] if "package_types" in author else [], "icon_url": author["icon_url"] if "icon_url" in author else None, - "description": "Material and quality profiles from {author_name}".format( author_name = author["display_name"]) + "description": "Material and quality profiles from {author_name}".format(author_name = author["display_name"]) }) # Filter on all the key-word arguments. diff --git a/plugins/Toolbox/src/Toolbox.py b/plugins/Toolbox/src/Toolbox.py index b1128722e9..bf91b817a0 100644 --- a/plugins/Toolbox/src/Toolbox.py +++ b/plugins/Toolbox/src/Toolbox.py @@ -501,6 +501,15 @@ class Toolbox(QObject, Extension): def isInstalled(self, package_id: str) -> bool: return self._package_manager.isPackageInstalled(package_id) + @pyqtSlot(str, result = int) + def getNumberOfInstalledPackagesByAuthor(self, author_id: str) -> int: + count = 0 + for package in self._metadata["materials_installed"]: + if package["author"]["author_id"] == author_id: + if self.isInstalled(package["package_id"]): + count += 1 + return count + @pyqtSlot(str, result = bool) def isEnabled(self, package_id: str) -> bool: if package_id in self._plugin_registry.getActivePlugins(): @@ -722,27 +731,27 @@ class Toolbox(QObject, Extension): # -------------------------------------------------------------------------- @pyqtProperty(QObject, notify = metadataChanged) def authorsModel(self) -> AuthorsModel: - return self._models["authors"] + return cast(AuthorsModel, self._models["authors"]) @pyqtProperty(QObject, notify = metadataChanged) def packagesModel(self) -> PackagesModel: - return self._models["packages"] + return cast(PackagesModel, self._models["packages"]) @pyqtProperty(QObject, notify = metadataChanged) def pluginsShowcaseModel(self) -> PackagesModel: - return self._models["plugins_showcase"] + return cast(PackagesModel, self._models["plugins_showcase"]) @pyqtProperty(QObject, notify = metadataChanged) def pluginsInstalledModel(self) -> PackagesModel: - return self._models["plugins_installed"] + return cast(PackagesModel, self._models["plugins_installed"]) @pyqtProperty(QObject, notify = metadataChanged) - def materialsShowcaseModel(self) -> PackagesModel: - return self._models["materials_showcase"] + def materialsShowcaseModel(self) -> AuthorsModel: + return cast(AuthorsModel, self._models["materials_showcase"]) @pyqtProperty(QObject, notify = metadataChanged) def materialsInstalledModel(self) -> PackagesModel: - return self._models["materials_installed"] + return cast(PackagesModel, self._models["materials_installed"]) From 62b1d361fada21120462606df1f4024cdc655f10 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Fri, 13 Jul 2018 13:16:44 +0200 Subject: [PATCH 3/5] CURA-5536 Set different colors indicating that all the inner packages are installed of just some. --- .../Toolbox/resources/qml/ToolboxDownloadsGridTile.qml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/plugins/Toolbox/resources/qml/ToolboxDownloadsGridTile.qml b/plugins/Toolbox/resources/qml/ToolboxDownloadsGridTile.qml index 41d09d19ab..a69904d840 100644 --- a/plugins/Toolbox/resources/qml/ToolboxDownloadsGridTile.qml +++ b/plugins/Toolbox/resources/qml/ToolboxDownloadsGridTile.qml @@ -9,6 +9,8 @@ import UM 1.1 as UM Item { + property int packageCount: toolbox.viewCategory == "material" ? model.package_count : 1 + property int installedPackages: toolbox.viewCategory == "material" ? toolbox.getNumberOfInstalledPackagesByAuthor(model.id) : (toolbox.isInstalled(model.id) ? 1 : 0) height: childrenRect.height Layout.alignment: Qt.AlignTop | Qt.AlignLeft Rectangle @@ -51,8 +53,8 @@ Item } sourceSize.width: width sourceSize.height: height - visible: toolbox.isInstalled(model.id) - color: UM.Theme.getColor("primary") + visible: installedPackages != 0 + color: (installedPackages == packageCount) ? UM.Theme.getColor("primary") : UM.Theme.getColor("border") source: "../images/installed_check.svg" } } @@ -63,7 +65,7 @@ Item Label { id: name - text: toolbox.viewCategory == "material" ? model.name + " (" + toolbox.getNumberOfInstalledPackagesByAuthor(model.id) + "/" + model.package_count + ")" : model.name + text: model.name width: parent.width wrapMode: Text.WordWrap color: UM.Theme.getColor("text") From dd7168e8b80ae30dca1488c48a05aba2389f8f72 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Fri, 13 Jul 2018 13:41:19 +0200 Subject: [PATCH 4/5] CURA-5536 Add the installed check also to the featured items. --- .../qml/ToolboxDownloadsShowcaseTile.qml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/plugins/Toolbox/resources/qml/ToolboxDownloadsShowcaseTile.qml b/plugins/Toolbox/resources/qml/ToolboxDownloadsShowcaseTile.qml index 561b2b4046..90829789e5 100644 --- a/plugins/Toolbox/resources/qml/ToolboxDownloadsShowcaseTile.qml +++ b/plugins/Toolbox/resources/qml/ToolboxDownloadsShowcaseTile.qml @@ -9,6 +9,8 @@ import UM 1.1 as UM Rectangle { + property int packageCount: toolbox.viewCategory == "material" ? model.package_count : 1 + property int installedPackages: toolbox.viewCategory == "material" ? toolbox.getNumberOfInstalledPackagesByAuthor(model.id) : (toolbox.isInstalled(model.id) ? 1 : 0) id: tileBase width: UM.Theme.getSize("toolbox_thumbnail_large").width + (2 * UM.Theme.getSize("default_lining").width) height: thumbnail.height + packageNameBackground.height + (2 * UM.Theme.getSize("default_lining").width) @@ -36,6 +38,22 @@ Rectangle source: model.icon_url || "../images/logobot.svg" mipmap: true } + UM.RecolorImage + { + width: (parent.width * 0.3) | 0 + height: (parent.height * 0.3) | 0 + anchors + { + bottom: parent.bottom + right: parent.right + bottomMargin: UM.Theme.getSize("default_lining").width + } + sourceSize.width: width + sourceSize.height: height + visible: installedPackages != 0 + color: (installedPackages == packageCount) ? UM.Theme.getColor("primary") : UM.Theme.getColor("border") + source: "../images/installed_check.svg" + } } Rectangle { From af697c69990df049d21d8916cb46cdf2afaea93f Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Fri, 13 Jul 2018 15:13:38 +0200 Subject: [PATCH 5/5] CURA-5536 The api call does not return the package_count for the showcase, so we can't trust in that value. The total number of material packages by author is now calculated. --- .../resources/qml/ToolboxDownloadsGridTile.qml | 2 +- .../resources/qml/ToolboxDownloadsShowcaseTile.qml | 2 +- plugins/Toolbox/src/Toolbox.py | 12 ++++++++++-- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/plugins/Toolbox/resources/qml/ToolboxDownloadsGridTile.qml b/plugins/Toolbox/resources/qml/ToolboxDownloadsGridTile.qml index a69904d840..dbaa2c83dc 100644 --- a/plugins/Toolbox/resources/qml/ToolboxDownloadsGridTile.qml +++ b/plugins/Toolbox/resources/qml/ToolboxDownloadsGridTile.qml @@ -9,7 +9,7 @@ import UM 1.1 as UM Item { - property int packageCount: toolbox.viewCategory == "material" ? model.package_count : 1 + property int packageCount: toolbox.viewCategory == "material" ? toolbox.getTotalNumberOfPackagesByAuthor(model.id) : 1 property int installedPackages: toolbox.viewCategory == "material" ? toolbox.getNumberOfInstalledPackagesByAuthor(model.id) : (toolbox.isInstalled(model.id) ? 1 : 0) height: childrenRect.height Layout.alignment: Qt.AlignTop | Qt.AlignLeft diff --git a/plugins/Toolbox/resources/qml/ToolboxDownloadsShowcaseTile.qml b/plugins/Toolbox/resources/qml/ToolboxDownloadsShowcaseTile.qml index 90829789e5..2ca0b522fe 100644 --- a/plugins/Toolbox/resources/qml/ToolboxDownloadsShowcaseTile.qml +++ b/plugins/Toolbox/resources/qml/ToolboxDownloadsShowcaseTile.qml @@ -9,7 +9,7 @@ import UM 1.1 as UM Rectangle { - property int packageCount: toolbox.viewCategory == "material" ? model.package_count : 1 + property int packageCount: toolbox.viewCategory == "material" ? toolbox.getTotalNumberOfPackagesByAuthor(model.id) : 1 property int installedPackages: toolbox.viewCategory == "material" ? toolbox.getNumberOfInstalledPackagesByAuthor(model.id) : (toolbox.isInstalled(model.id) ? 1 : 0) id: tileBase width: UM.Theme.getSize("toolbox_thumbnail_large").width + (2 * UM.Theme.getSize("default_lining").width) diff --git a/plugins/Toolbox/src/Toolbox.py b/plugins/Toolbox/src/Toolbox.py index bf91b817a0..e0c73cd7fc 100644 --- a/plugins/Toolbox/src/Toolbox.py +++ b/plugins/Toolbox/src/Toolbox.py @@ -228,6 +228,7 @@ class Toolbox(QObject, Extension): self._makeRequestByType("authors") self._makeRequestByType("plugins_showcase") self._makeRequestByType("materials_showcase") + self._makeRequestByType("materials_available") # Gather installed packages: self._updateInstalledModels() @@ -506,8 +507,15 @@ class Toolbox(QObject, Extension): count = 0 for package in self._metadata["materials_installed"]: if package["author"]["author_id"] == author_id: - if self.isInstalled(package["package_id"]): - count += 1 + count += 1 + return count + + @pyqtSlot(str, result = int) + def getTotalNumberOfPackagesByAuthor(self, author_id: str) -> int: + count = 0 + for package in self._metadata["materials_available"]: + if package["author"]["author_id"] == author_id: + count += 1 return count @pyqtSlot(str, result = bool)