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