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._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.

View file

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

View file

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

View file

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