mirror of
https://github.com/spalencsar/bearhub.git
synced 2026-07-09 23:34:17 +02:00
[view.qt] enhancement: faster packages filtering
This commit is contained in:
@@ -1,10 +1,30 @@
|
||||
from typing import Iterable, List
|
||||
from typing import List, Dict, Any, NamedTuple, Optional, Union, Collection, Iterable
|
||||
|
||||
from bauh.api.abstract.model import SoftwarePackage
|
||||
from bauh.view.qt.view_model import PackageView
|
||||
|
||||
|
||||
def new_pkgs_info() -> dict:
|
||||
class PackageFilters(NamedTuple):
|
||||
"""
|
||||
It represents the manage window selected filters
|
||||
"""
|
||||
|
||||
display_limit: int
|
||||
category: str
|
||||
name: Optional[str]
|
||||
only_apps: bool
|
||||
only_installed: bool
|
||||
only_updates: bool
|
||||
search: Optional[str] # initial search term
|
||||
type: str
|
||||
|
||||
@property
|
||||
def anything(self) -> bool:
|
||||
return not self.only_installed and not self.only_updates and not self.only_apps \
|
||||
and not self.name and self.type == "any" and self.category == "any"
|
||||
|
||||
|
||||
def new_pkgs_info() -> Dict[str, Any]:
|
||||
return {'apps_count': 0, # number of application packages
|
||||
'napps_count': 0, # number of not application packages (libraries, runtimes or something else)
|
||||
'available_types': {}, # available package types in 'new_pkgs'
|
||||
@@ -18,7 +38,7 @@ def new_pkgs_info() -> dict:
|
||||
'pkgs': []} # total packages
|
||||
|
||||
|
||||
def update_info(pkgv: PackageView, pkgs_info: dict):
|
||||
def update_info(pkgv: PackageView, pkgs_info: Dict[str, Any]):
|
||||
pkgs_info['available_types'][pkgv.model.get_type()] = {'icon': pkgv.model.get_type_icon_path(), 'label': pkgv.get_type_label()}
|
||||
|
||||
if pkgv.model.is_application():
|
||||
@@ -49,8 +69,8 @@ def update_info(pkgv: PackageView, pkgs_info: dict):
|
||||
pkgs_info['not_installed'] += 1
|
||||
|
||||
|
||||
def apply_filters(pkg: PackageView, filters: dict, info: dict, limit: bool = True):
|
||||
if not limit or not filters['display_limit'] or len(info['pkgs_displayed']) < filters['display_limit']:
|
||||
def apply_filters(pkg: PackageView, filters: PackageFilters, info: dict, limit: bool = True):
|
||||
if not limit or not filters.display_limit or len(info['pkgs_displayed']) < filters.display_limit:
|
||||
if not is_package_hidden(pkg, filters):
|
||||
info['pkgs_displayed'].append(pkg)
|
||||
|
||||
@@ -65,41 +85,48 @@ def sum_updates_displayed(info: dict) -> int:
|
||||
return updates
|
||||
|
||||
|
||||
def is_package_hidden(pkg: PackageView, filters: dict) -> bool:
|
||||
hidden = filters['only_installed'] and not pkg.model.installed
|
||||
def is_package_hidden(pkg: PackageView, filters: PackageFilters) -> bool:
|
||||
hidden = filters.only_installed and not pkg.model.installed
|
||||
|
||||
if not hidden and filters['only_apps']:
|
||||
if not hidden and filters.only_apps:
|
||||
hidden = pkg.model.installed and not pkg.model.is_application()
|
||||
|
||||
if not hidden and filters['updates']:
|
||||
if not hidden and filters.only_updates:
|
||||
hidden = not pkg.model.update or pkg.model.is_update_ignored()
|
||||
|
||||
if not hidden and filters['type'] is not None and filters['type'] != 'any':
|
||||
hidden = pkg.model.get_type() != filters['type']
|
||||
if not hidden and filters.type is not None and filters.type != "any":
|
||||
hidden = pkg.model.get_type() != filters.type
|
||||
|
||||
if not hidden and filters['category'] is not None and filters['category'] != 'any':
|
||||
hidden = not pkg.model.categories or not [c for c in pkg.model.categories if c.lower() == filters['category']]
|
||||
if not hidden and filters.category is not None and filters.category != "any":
|
||||
hidden = not pkg.model.categories or not next((c for c in pkg.model.categories if c.lower() == filters.category), None)
|
||||
|
||||
if not hidden and filters['name']:
|
||||
hidden = not filters['name'] in pkg.model.name.lower()
|
||||
if not hidden and filters.name:
|
||||
hidden = not filters.name.startswith(pkg.model.name.lower())
|
||||
|
||||
return hidden
|
||||
|
||||
|
||||
def sort_packages(pkgs: Iterable[SoftwarePackage], word: str, limit: int = 0) -> List[SoftwarePackage]:
|
||||
def _by_name(pkg: Union[SoftwarePackage, PackageView]):
|
||||
return pkg.name.lower()
|
||||
|
||||
|
||||
def sort_packages(pkgs: Iterable[Union[SoftwarePackage, PackageView]], word: Optional[str],
|
||||
limit: int = 0) -> List[SoftwarePackage]:
|
||||
exact, starts_with, contains, others = [], [], [], []
|
||||
|
||||
for p in pkgs:
|
||||
lower_name = p.name.lower()
|
||||
|
||||
if word == lower_name:
|
||||
exact.append(p)
|
||||
elif lower_name.startswith(word):
|
||||
starts_with.append(p)
|
||||
elif word in lower_name:
|
||||
contains.append(p)
|
||||
else:
|
||||
others.append(p)
|
||||
if not word:
|
||||
others.extend(pkgs)
|
||||
else:
|
||||
for p in pkgs:
|
||||
lower_name = p.name.lower()
|
||||
if word == lower_name:
|
||||
exact.append(p)
|
||||
elif lower_name.startswith(word):
|
||||
starts_with.append(p)
|
||||
elif word in lower_name:
|
||||
contains.append(p)
|
||||
else:
|
||||
others.append(p)
|
||||
|
||||
res = []
|
||||
for app_list in (exact, starts_with, contains, others):
|
||||
@@ -110,7 +137,7 @@ def sort_packages(pkgs: Iterable[SoftwarePackage], word: str, limit: int = 0) ->
|
||||
break
|
||||
|
||||
to_add = app_list[0:last]
|
||||
to_add.sort(key=lambda a: a.name.lower())
|
||||
to_add.sort(key=_by_name)
|
||||
res.extend(to_add)
|
||||
|
||||
return res
|
||||
|
||||
Reference in New Issue
Block a user