summaryrefslogtreecommitdiff
path: root/nephilim/plugins/Library.py
diff options
context:
space:
mode:
Diffstat (limited to 'nephilim/plugins/Library.py')
-rw-r--r--nephilim/plugins/Library.py155
1 files changed, 155 insertions, 0 deletions
diff --git a/nephilim/plugins/Library.py b/nephilim/plugins/Library.py
new file mode 100644
index 0000000..60490d9
--- /dev/null
+++ b/nephilim/plugins/Library.py
@@ -0,0 +1,155 @@
+from PyQt4 import QtGui, QtCore
+from PyQt4.QtCore import QVariant
+
+from ..clPlugin import Plugin
+from ..misc import ORGNAME, APPNAME
+
+class pluginLibrary(Plugin):
+ o=None
+ DEFAULTS = {'modes' : 'artist\n'\
+ 'artist/album\n'\
+ 'artist/date/album\n'\
+ 'genre\n'\
+ 'genre/artist\n'\
+ 'genre/artist/album\n'}
+
+ def __init__(self, winMain):
+ Plugin.__init__(self, winMain, 'Library')
+ self.settings = QtCore.QSettings(ORGNAME, APPNAME)
+ def _load(self):
+ self.o = LibraryWidget(self)
+ self.mpclient.add_listener('onReady', self.o.fill_library)
+ self.mpclient.add_listener('onDisconnect', self.o.fill_library)
+ self.mpclient.add_listener('onUpdateDBFinish', self.o.fill_library)
+ def _unload(self):
+ self.o = None
+
+ def getInfo(self):
+ return "List showing all the songs allowing filtering and grouping."
+
+ def _getDockWidget(self):
+ return self._createDock(self.o)
+
+ class SettingsWidgetLibrary(Plugin.SettingsWidget):
+ modes = None
+ def __init__(self, plugin):
+ Plugin.SettingsWidget.__init__(self, plugin)
+ self.setLayout(QtGui.QVBoxLayout())
+
+ self.modes = QtGui.QTextEdit()
+ self.modes.insertPlainText(self.settings.value(self.plugin.getName() + '/modes').toString())
+ self.layout().addWidget(self.modes)
+
+ def save_settings(self):
+ self.settings.setValue(self.plugin.getName() + '/modes', QVariant(self.modes.toPlainText()))
+ self.plugin.o.refresh_modes()
+
+ def get_settings_widget(self):
+ return self.SettingsWidgetLibrary(self)
+
+class LibraryWidget(QtGui.QWidget):
+ library = None
+ search_txt = None
+ modes = None
+ settings = None
+ plugin = None
+
+ def __init__(self, plugin):
+ QtGui.QWidget.__init__(self)
+ self.plugin = plugin
+ self.settings = QtCore.QSettings(ORGNAME, APPNAME)
+ self.settings.beginGroup(self.plugin.getName())
+
+ self.modes = QtGui.QComboBox()
+ self.refresh_modes()
+ self.connect(self.modes, QtCore.SIGNAL('activated(int)'), self.modes_activated)
+
+ self.search_txt = QtGui.QLineEdit()
+ self.connect(self.search_txt, QtCore.SIGNAL('textChanged(const QString&)'),
+ self.filter_changed)
+ self.connect(self.search_txt, QtCore.SIGNAL('returnPressed()'), self.add_filtered)
+
+ #construct the library
+ self.library = QtGui.QTreeWidget()
+ self.library.setColumnCount(1)
+ self.library.setAlternatingRowColors(True)
+ self.library.setSelectionMode(QtGui.QTreeWidget.ExtendedSelection)
+ self.library.headerItem().setHidden(True)
+ self.fill_library()
+ self.connect(self.library, QtCore.SIGNAL('itemActivated(QTreeWidgetItem*, int)'), self.add_selection)
+
+ self.setLayout(QtGui.QVBoxLayout())
+ self.layout().setSpacing(2)
+ self.layout().setMargin(0)
+ self.layout().addWidget(self.modes)
+ self.layout().addWidget(self.search_txt)
+ self.layout().addWidget(self.library)
+
+ def refresh_modes(self):
+ self.modes.clear()
+ for mode in self.settings.value('/modes').toString().split('\n'):
+ self.modes.addItem(mode)
+ self.modes.setCurrentIndex(self.settings.value('current_mode').toInt()[0])
+
+
+ def fill_library(self, params = None):
+ self.library.clear()
+
+ #build a tree from library
+ tree = [{},self.library.invisibleRootItem()]
+ for song in self.plugin.mpclient.listLibrary():
+ cur_item = tree
+ for part in str(self.modes.currentText()).split('/'):
+ tag = song.getTag(part)
+ if isinstance(tag, list):
+ tag = tag[0] #FIXME hack to make songs with multiple genres work.
+ if not tag:
+ tag = 'Unknown'
+ if tag in cur_item[0]:
+ cur_item = cur_item[0][tag]
+ else:
+ it = QtGui.QTreeWidgetItem([tag])
+ cur_item[1].addChild(it)
+ cur_item[0][tag] = [{}, it]
+ cur_item = cur_item[0][tag]
+ it = QtGui.QTreeWidgetItem(['%02d %s'%(song.getTrack() if song.getTrack() else 0,
+ song.getTitle() if song.getTitle() else song.getFilepath())], 1000)
+ it.setData(0, QtCore.Qt.UserRole, QVariant(song))
+ cur_item[1].addChild(it)
+
+ self.library.sortItems(0, QtCore.Qt.AscendingOrder)
+
+ def filter_changed(self, text):
+ items = self.library.findItems(text, QtCore.Qt.MatchContains|QtCore.Qt.MatchRecursive)
+ for i in range(self.library.topLevelItemCount()):
+ self.library.topLevelItem(i).setHidden(True)
+ for item in items:
+ while item.parent():
+ item = item.parent()
+ item.setHidden(False)
+ self.filtered_items = items
+
+ def add_filtered(self):
+ self.library.clearSelection()
+ for item in self.filtered_items:
+ item.setSelected(True)
+ self.add_selection()
+ self.library.clearSelection()
+ self.search_txt.clear()
+
+ def add_selection(self):
+ paths = []
+ for item in self.library.selectedItems():
+ self.item_to_playlist(item, paths)
+ self.plugin.mpclient.addToPlaylist(paths)
+
+ def item_to_playlist(self, item, add_queue):
+ if item.type() == 1000:
+ add_queue.append(item.data(0, QtCore.Qt.UserRole).toPyObject().getFilepath())
+ else:
+ for i in range(item.childCount()):
+ self.item_to_playlist(item.child(i), add_queue)
+
+ def modes_activated(self):
+ self.settings.setValue('current_mode', QVariant(self.modes.currentIndex()))
+ self.fill_library()