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.
This commit is contained in:
Ghostkeeper 2021-10-28 18:59:03 +02:00
parent 4191f98440
commit cbd1b8fbf7
No known key found for this signature in database
GPG key ID: D2A8871EE34EC59A
4 changed files with 36 additions and 3 deletions

View file

@ -40,12 +40,12 @@ class PackageList(ListModel):
self._is_loading = True self._is_loading = True
self._scope = JsonDecoratorScope(UltimakerCloudScope(CuraApplication.getInstance())) self._scope = JsonDecoratorScope(UltimakerCloudScope(CuraApplication.getInstance()))
self._request_url = f"{Marketplace.PACKAGES_URL}?limit={self.ITEMS_PER_PAGE}"
self._error_message = "" 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() @pyqtSlot()
def request(self) -> None: def request(self) -> None:
@ -65,6 +65,10 @@ class PackageList(ListModel):
error_callback = self._onError error_callback = self._onError
) )
def reset(self) -> None:
self.clear()
self._request_url = self._initialRequestUrl()
isLoadingChanged = pyqtSignal() isLoadingChanged = pyqtSignal()
def setIsLoading(self, is_loading: bool) -> None: def setIsLoading(self, is_loading: bool) -> None:
@ -91,6 +95,22 @@ class PackageList(ListModel):
""" """
return self._request_url != "" 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: def setErrorMessage(self, error_message: str) -> None:
if self._error_message != error_message: if self._error_message != error_message:
self._error_message = error_message self._error_message = error_message
@ -108,6 +128,15 @@ class PackageList(ListModel):
""" """
return self._error_message 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: def _parseResponse(self, reply: "QNetworkReply") -> None:
""" """
Parse the response from the package list API request. Parse the response from the package list API request.

View file

@ -7,5 +7,6 @@ Packages
{ {
model: Marketplace.PackageList model: Marketplace.PackageList
{ {
packageTypeFilter: "material"
} }
} }

View file

@ -13,6 +13,8 @@ ScrollView
property alias model: pluginColumn.model property alias model: pluginColumn.model
Component.onCompleted: model.request()
ListView ListView
{ {
id: pluginColumn id: pluginColumn

View file

@ -7,5 +7,6 @@ Packages
{ {
model: Marketplace.PackageList model: Marketplace.PackageList
{ {
packageTypeFilter: "plugin"
} }
} }