summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Khirnov <wyskas@gmail.com>2009-08-29 14:11:18 +0200
committerAnton Khirnov <wyskas@gmail.com>2009-08-29 14:11:18 +0200
commit601ebac1779653985bf866cf23a6b68b717acb89 (patch)
treee1cce2bd1b10bab3dce9efe91946033910d6a578
parent1d47d404848e89f8924ac60bc28b85ab57a31a3c (diff)
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.
-rw-r--r--nephilim/plugins/Library.py79
1 files 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)