From 09bb49dc791ee9631bc9d856df25ce5988422064 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Tue, 25 Aug 2009 12:09:12 +0200 Subject: [PATCH] Library: safer system for grouping. --- nephilim/plugins/Library.py | 84 ++++++++++++++++++++++++--------------------- 1 file changed, 44 insertions(+), 40 deletions(-) diff --git a/nephilim/plugins/Library.py b/nephilim/plugins/Library.py index 50f85a3..f59d297 100644 --- a/nephilim/plugins/Library.py +++ b/nephilim/plugins/Library.py @@ -25,60 +25,71 @@ class Library(Plugin): info = 'Display MPD database as a tree.' # public, read-only - o=None - DEFAULTS = {'modes' : QtCore.QStringList(['artist', - 'artist/album', - 'artist/date/album', - 'genre', - 'genre/artist', - 'genre/artist/album'])} + o = None + + # private + DEFAULTS = {'grouping' : QtCore.QStringList(['artist', 'album'])} def _load(self): self.o = LibraryWidget(self) def _unload(self): self.o = None - def getInfo(self): - return "List showing all the songs allowing filtering and grouping." - def _get_dock_widget(self): return self._create_dock(self.o) - def fill_library(self, params): + def fill_library(self): if not self.o: return self.o.fill_library() class SettingsWidgetLibrary(Plugin.SettingsWidget): - modes = None + taglist = None def __init__(self, plugin): Plugin.SettingsWidget.__init__(self, plugin) + self.settings.beginGroup(self.plugin.name) + + tags_enabled = self.settings.value('grouping').toStringList() + tags = self.plugin.mpclient.tagtypes() + self.taglist = QtGui.QListWidget(self) + self.taglist.setDragDropMode(QtGui.QAbstractItemView.InternalMove) + for tag in [tag for tag in tags_enabled if tag in tags]: + it = QtGui.QListWidgetItem(tag) + it.setCheckState(QtCore.Qt.Checked) + self.taglist.addItem(it) + for tag in [tag for tag in tags if tag not in tags_enabled]: + it = QtGui.QListWidgetItem(tag) + it.setCheckState(QtCore.Qt.Unchecked) + self.taglist.addItem(it) + self.setLayout(QtGui.QVBoxLayout()) + self._add_widget(self.taglist, label = 'Group', tooltip = 'Checked items and their order determines,\n' + 'by what tags will songs be grouped in Library. Use drag and drop to change the\n' + 'order of tags.') - self.modes = QtGui.QComboBox() - self.modes.setEditable(True) - for mode in self.settings.value(self.plugin.name + '/modes').toStringList(): - self.modes.addItem(mode) - self._add_widget(self.modes, 'Modes', 'How should the songs in library be grouped.\n' - 'Should be written in form tag1/tag2/...,\n' - 'using tags supported by MPD.') + self.settings.endGroup() def save_settings(self): - modes = QtCore.QStringList() - for i in range(0, self.modes.count()): - modes.append(self.modes.itemText(i)) - self.settings.setValue(self.plugin.name + '/modes', QVariant(modes)) - self.plugin.o.refresh_modes() + self.settings.beginGroup(self.plugin.name) + + tags = QtCore.QStringList() + for i in range(self.taglist.count()): + it = self.taglist.item(i) + if it.checkState() == QtCore.Qt.Checked: + tags.append(it.text()) + self.settings.setValue('grouping', QtCore.QVariant(tags)) + + self.settings.endGroup() + self.plugin.fill_library() def get_settings_widget(self): return self.SettingsWidgetLibrary(self) - class LibraryWidget(QtGui.QWidget): library_view = None library_model = None search_txt = None - modes = None + grouping = None settings = None plugin = None logger = None @@ -89,16 +100,16 @@ class LibraryWidget(QtGui.QWidget): path = None class LibraryModel(QtGui.QStandardItemModel): - def fill(self, songs, mode): + def fill(self, songs, grouping): self.clear() tree = [{},self.invisibleRootItem()] for song in songs: cur_item = tree - for part in mode.split('/'): + for part in grouping: tag = song[part] if isinstance(tag, list): - tag = tag[0] #FIXME hack to make songs with multiple genres work. + tag = tag[0] #FIXME is this the best solution? if not tag: tag = 'Unknown' if tag in cur_item[0]: @@ -140,9 +151,7 @@ class LibraryWidget(QtGui.QWidget): self.settings = QtCore.QSettings() self.settings.beginGroup(self.plugin.name) - self.modes = QtGui.QComboBox() - self.refresh_modes() - self.modes.activated.connect(self.modes_activated) + self.grouping = QtGui.QLabel() self.search_txt = QtGui.QLineEdit() self.search_txt.textChanged.connect(self.filter_changed) @@ -159,22 +168,17 @@ class LibraryWidget(QtGui.QWidget): self.setLayout(QtGui.QVBoxLayout()) self.layout().setSpacing(2) self.layout().setMargin(0) - self.layout().addWidget(self.modes) + self.layout().addWidget(self.grouping) self.layout().addWidget(self.search_txt) self.layout().addWidget(self.library_view) self.plugin.mpclient.connect_changed.connect(self.fill_library) self.plugin.mpclient.db_updated.connect(self.fill_library) - def refresh_modes(self): - self.modes.clear() - for mode in self.settings.value('/modes').toStringList(): - self.modes.addItem(mode) - self.modes.setCurrentIndex(self.settings.value('current_mode').toInt()[0]) - def fill_library(self): self.logger.info('Refreshing library.') - self.library_model.fill(self.plugin.mpclient.library(), str(self.modes.currentText())) + 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) -- 2.11.4.GIT