[view] improvement: sorting packages by closest match instead of considering installed first (search)

This commit is contained in:
Vinicius Moreira
2022-03-11 11:55:07 -03:00
parent b1a131950c
commit 508e9169c2
5 changed files with 46 additions and 71 deletions

View File

@@ -5,7 +5,7 @@ import traceback
from datetime import datetime, timedelta
from io import StringIO
from pathlib import Path
from typing import List, Type, Set, Tuple, Optional
from typing import List, Type, Set, Tuple, Optional, Iterable
import requests
from PyQt5.QtCore import QThread, pyqtSignal, QObject
@@ -27,6 +27,7 @@ from bauh.commons.system import get_human_size_str, ProcessHandler, SimpleProces
from bauh.view.core import timeshift
from bauh.view.core.config import CoreConfigManager
from bauh.view.qt import commons
from bauh.view.qt.commons import sort_packages
from bauh.view.qt.view_model import PackageView, PackageViewStatus
from bauh.view.util.translation import I18n
@@ -704,8 +705,7 @@ class SearchPackages(AsyncAction):
if self.word:
try:
res = self.manager.search(words=self.word, disk_loader=None, limit=-1, is_url=False)
search_res['pkgs_found'].extend(res.installed)
search_res['pkgs_found'].extend(res.new)
search_res['pkgs_found'] = sort_packages((*(res.installed or ()), *(res.new or ())), self.word)
except NoInternetException:
search_res['error'] = 'internet.required'
finally:
@@ -951,48 +951,6 @@ class ApplyFilters(AsyncAction):
def stop_waiting(self):
self.wait_table_update = False
def _sort_by_word(self, word: str, pkgs: List[PackageView], limit: int) -> List[PackageView]:
norm_word = word.strip().lower()
exact_installed, exact_not_installed = [], []
starts_installed, starts_not_installed = [], []
contains_installed, contains_not_installed = [], []
for p in pkgs:
lower_name = p.model.name.lower()
if norm_word == lower_name:
if p.model.installed:
exact_installed.append(p)
else:
exact_not_installed.append(p)
elif lower_name.startswith(norm_word):
if p.model.installed:
starts_installed.append(p)
else:
starts_not_installed.append(p)
else:
if p.model.installed:
contains_installed.append(p)
else:
contains_not_installed.append(p)
res = []
for matches in (exact_installed, exact_not_installed,
starts_installed, starts_not_installed,
contains_installed, contains_not_installed):
if matches:
matches.sort(key=lambda p: p.model.name.lower())
if limit:
res.extend(matches[0:limit - len(res)])
if len(res) == limit:
break
else:
res.extend(matches)
return res
def run(self):
if self.pkgs:
pkgs_info = commons.new_pkgs_info()
@@ -1004,9 +962,9 @@ class ApplyFilters(AsyncAction):
commons.apply_filters(pkgv, self.filters, pkgs_info, limit=not name_filtering)
if name_filtering and pkgs_info['pkgs_displayed']:
pkgs_info['pkgs_displayed'] = self._sort_by_word(word=self.filters['name'],
pkgs=pkgs_info['pkgs_displayed'],
limit=self.filters['display_limit'])
pkgs_info['pkgs_displayed'] = sort_packages(word=self.filters['name'],
pkgs=pkgs_info['pkgs_displayed'],
limit=self.filters['display_limit'])
self.wait_table_update = True
self.signal_table.emit(pkgs_info)