From 601ebac1779653985bf866cf23a6b68b717acb89 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Sat, 29 Aug 2009 14:11:18 +0200 Subject: [PATCH] Library: improved filtering. it now hide all the items it should, not just the toplevel ones. it might be a little slower now, but works acceptably fast here. --- nephilim/plugins/Library.py | 79 +++++++++++++++++++++++++++++++++------------ 1 file changed, 59 insertions(+), 20 deletions(-) diff --git a/nephilim/plugins/Library.py b/nephilim/plugins/Library.py index 48650c2..50079ad 100644 --- a/nephilim/plugins/Library.py +++ b/nephilim/plugins/Library.py @@ -86,13 +86,15 @@ class Library(Plugin): return self.SettingsWidgetLibrary(self) class LibraryWidget(QtGui.QWidget): - library_view = None - library_model = None - search_txt = None - grouping = None - settings = None - plugin = None - logger = None + library_view = None + library_model = None + search_txt = None + grouping = None + settings = None + plugin = None + logger = None + filtered_items = None + filter = None class LibrarySongItem(QtGui.QStandardItem): # public @@ -144,15 +146,18 @@ class LibraryWidget(QtGui.QWidget): def __init__(self, plugin): QtGui.QWidget.__init__(self) - self.plugin = plugin - self.logger = plugin.logger - self.settings = QtCore.QSettings() + self.plugin = plugin + self.logger = plugin.logger + self.settings = QtCore.QSettings() + self.filter = QtCore.QString() + self.filtered_items = [] self.settings.beginGroup(self.plugin.name) self.grouping = QtGui.QLabel() self.search_txt = QtGui.QLineEdit() - self.search_txt.textChanged.connect(self.filter_changed) + self.search_txt.setToolTip('Filter library') + self.search_txt.textChanged.connect(self.filter_library) self.search_txt.returnPressed.connect(self.add_filtered) #construct the library @@ -178,15 +183,49 @@ class LibraryWidget(QtGui.QWidget): self.grouping.setText(self.settings.value('grouping').toStringList().join('/')) self.library_model.fill(self.plugin.mpclient.library(), self.settings.value('grouping').toStringList()) - def filter_changed(self, text): - items = self.library_model.findItems(text, QtCore.Qt.MatchContains|QtCore.Qt.MatchRecursive) - for i in range(self.library_model.rowCount()): - self.library_view.setRowHidden(i, QtCore.QModelIndex(), True) - for item in items: - while item.parent(): - item = item.parent() - self.library_view.setRowHidden(item.row(), QtCore.QModelIndex(), False) - self.filtered_items = items + @QtCore.pyqtSlot(QtCore.QString) + def filter_library(self, text): + """Hide all items that don't contain text.""" + to_hide = [] + to_show = [] + filtered_items = [] + if not text: # show all items + to_show = self.library_model.findItems('*', QtCore.Qt.MatchWildcard|QtCore.Qt.MatchRecursive) + elif self.filter and text.contains(self.filter, QtCore.Qt.CaseInsensitive): + for item in self.filtered_items: + if item.text().contains(text, QtCore.Qt.CaseInsensitive): + filtered_items.append(item) + while item: + to_show.append(item) + item = item.parent() + else: + while item: + to_hide.append(item) + item = item.parent() + else: + for item in self.library_model.findItems('*', QtCore.Qt.MatchWildcard|QtCore.Qt.MatchRecursive): + if item.text().contains(text, QtCore.Qt.CaseInsensitive): + filtered_items.append(item) + while item: + to_show.append(item) + item = item.parent() + else: + while item: + to_hide.append(item) + item = item.parent() + for item in to_hide: + self.library_view.setRowHidden(item.row(), self.library_model.indexFromItem(item.parent()), True) + for item in to_show: + self.library_view.setRowHidden(item.row(), self.library_model.indexFromItem(item.parent()), False) + + if len(filtered_items) < 5: + for item in filtered_items: + while item: + item = item.parent() + self.library_view.setExpanded(self.library_model.indexFromItem(item), True) + + self.filtered_items = filtered_items + self.filter = text def add_filtered(self): self.add_items(self.filtered_items) -- 2.11.4.GIT