From cbd1b8fbf738a3e9c09df0a8d8274f60d05eba9d Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 28 Oct 2021 18:59:03 +0200 Subject: [PATCH] Implement filter on PackageList The filter affects the URL. So we can't just start a request in the init. We need to request once all of the properties have been set. We also can't start the request when the filter changes, because there will be more filters and we don't want to start multiple requests. It needs to be manual. Contributes to issue CURA-8557. --- plugins/Marketplace/PackageList.py | 35 +++++++++++++++++-- .../Marketplace/resources/qml/Materials.qml | 1 + .../Marketplace/resources/qml/Packages.qml | 2 ++ plugins/Marketplace/resources/qml/Plugins.qml | 1 + 4 files changed, 36 insertions(+), 3 deletions(-) diff --git a/plugins/Marketplace/PackageList.py b/plugins/Marketplace/PackageList.py index b93cec1183..b34d40c1d2 100644 --- a/plugins/Marketplace/PackageList.py +++ b/plugins/Marketplace/PackageList.py @@ -40,12 +40,12 @@ class PackageList(ListModel): self._is_loading = True self._scope = JsonDecoratorScope(UltimakerCloudScope(CuraApplication.getInstance())) - self._request_url = f"{Marketplace.PACKAGES_URL}?limit={self.ITEMS_PER_PAGE}" self._error_message = "" - self.addRoleName(self.PackageRole, "package") + self._package_type_filter = "" + self._request_url = self._initialRequestUrl() - self.request() + self.addRoleName(self.PackageRole, "package") @pyqtSlot() def request(self) -> None: @@ -65,6 +65,10 @@ class PackageList(ListModel): error_callback = self._onError ) + def reset(self) -> None: + self.clear() + self._request_url = self._initialRequestUrl() + isLoadingChanged = pyqtSignal() def setIsLoading(self, is_loading: bool) -> None: @@ -91,6 +95,22 @@ class PackageList(ListModel): """ return self._request_url != "" + packageTypeFilterChanged = pyqtSignal() + + def setPackageTypeFilter(self, new_filter: str) -> None: + if new_filter != self._package_type_filter: + self._package_type_filter = new_filter + self.reset() + self.packageTypeFilterChanged.emit() + + @pyqtProperty(str, notify = packageTypeFilterChanged, fset = setPackageTypeFilter) + def packageTypeFilter(self) -> str: + """ + Get the package type this package list is filtering on, like ``plugin`` or ``material``. + :return: The package type this list is filtering on. + """ + return self._package_type_filter + def setErrorMessage(self, error_message: str) -> None: if self._error_message != error_message: self._error_message = error_message @@ -108,6 +128,15 @@ class PackageList(ListModel): """ return self._error_message + def _initialRequestUrl(self) -> str: + """ + Get the URL to request the first paginated page with. + :return: A URL to request. + """ + if self._package_type_filter != "": + return f"{Marketplace.PACKAGES_URL}?package_type={self._package_type_filter}&limit={self.ITEMS_PER_PAGE}" + return f"{Marketplace.PACKAGES_URL}?limit={self.ITEMS_PER_PAGE}" + def _parseResponse(self, reply: "QNetworkReply") -> None: """ Parse the response from the package list API request. diff --git a/plugins/Marketplace/resources/qml/Materials.qml b/plugins/Marketplace/resources/qml/Materials.qml index 7ed5323941..4f3c59d9fb 100644 --- a/plugins/Marketplace/resources/qml/Materials.qml +++ b/plugins/Marketplace/resources/qml/Materials.qml @@ -7,5 +7,6 @@ Packages { model: Marketplace.PackageList { + packageTypeFilter: "material" } } \ No newline at end of file diff --git a/plugins/Marketplace/resources/qml/Packages.qml b/plugins/Marketplace/resources/qml/Packages.qml index fc58910fa2..390fba2977 100644 --- a/plugins/Marketplace/resources/qml/Packages.qml +++ b/plugins/Marketplace/resources/qml/Packages.qml @@ -13,6 +13,8 @@ ScrollView property alias model: pluginColumn.model + Component.onCompleted: model.request() + ListView { id: pluginColumn diff --git a/plugins/Marketplace/resources/qml/Plugins.qml b/plugins/Marketplace/resources/qml/Plugins.qml index 7ed5323941..71814f54ad 100644 --- a/plugins/Marketplace/resources/qml/Plugins.qml +++ b/plugins/Marketplace/resources/qml/Plugins.qml @@ -7,5 +7,6 @@ Packages { model: Marketplace.PackageList { + packageTypeFilter: "plugin" } } \ No newline at end of file