summaryrefslogtreecommitdiff
path: root/nephilim/plugins/Playlist.py
diff options
context:
space:
mode:
Diffstat (limited to 'nephilim/plugins/Playlist.py')
-rw-r--r--nephilim/plugins/Playlist.py92
1 files changed, 92 insertions, 0 deletions
diff --git a/nephilim/plugins/Playlist.py b/nephilim/plugins/Playlist.py
new file mode 100644
index 0000000..2258701
--- /dev/null
+++ b/nephilim/plugins/Playlist.py
@@ -0,0 +1,92 @@
+from PyQt4 import QtGui, QtCore
+from PyQt4.QtCore import QVariant
+
+from ..clPlugin import Plugin
+
+# Dependencies:
+# playcontrol
+class pluginPlaylist(Plugin):
+ o = None
+ DEFAULTS = {'columns': ['track', 'title', 'artist',
+ 'date', 'album', 'length']}
+
+ def __init__(self, winMain):
+ Plugin.__init__(self, winMain, 'Playlist')
+ def _load(self):
+ self.o = PlaylistWidget(self)
+ self.mpclient.add_listener('onPlaylistChange', self.on_playlist_change)
+ self.mpclient.add_listener('onDisconnect', self.on_playlist_change)
+ self.mpclient.add_listener('onReady', self.on_playlist_change)
+
+ def _unload(self):
+ self.o = None
+ def getInfo(self):
+ return "The playlist showing the songs that will be played."
+
+ def _getDockWidget(self):
+ return self._createDock(self.o)
+
+ def on_playlist_change(self, params = None):
+ self.o.fill_playlist()
+
+class PlaylistWidget(QtGui.QWidget):
+ plugin = None
+ playlist = None
+
+ def __init__(self, plugin):
+ QtGui.QWidget.__init__(self)
+ self.plugin = plugin
+
+ self.playlist = self.Playlist(self.plugin)
+
+ self.setLayout(QtGui.QVBoxLayout())
+ self.layout().setSpacing(0)
+ self.layout().setMargin(0)
+ self.layout().addWidget(self.playlist)
+
+ class Playlist(QtGui.QTreeWidget):
+ song = None
+ plugin = None
+
+ def __init__(self, plugin):
+ QtGui.QTreeWidget.__init__(self)
+ self.plugin = plugin
+
+ self.setSelectionMode(QtGui.QTreeWidget.ExtendedSelection)
+ self.setAlternatingRowColors(True)
+ self.setRootIsDecorated(False)
+ columns = self.plugin.settings.value(self.plugin.getName() + '/columns').toStringList()
+ self.setColumnCount(len(columns))
+ self.setHeaderLabels(columns)
+ self.header().restoreState(self.plugin.settings.value(self.plugin.getName() + '/header_state').toByteArray())
+ self.connect(self, QtCore.SIGNAL('itemActivated(QTreeWidgetItem*, int)'), self._song_activated)
+ self.connect(self.header(), QtCore.SIGNAL('geometriesChanged()'), self._save_state)
+
+ def _save_state(self):
+ self.plugin.settings.setValue(self.plugin.getName() + '/header_state', QVariant(self.header().saveState()))
+
+ def _song_activated(self, item):
+ self.plugin.mpclient.play(item.data(0, QtCore.Qt.UserRole).toPyObject().getID())
+
+ def fill(self):
+ columns = self.plugin.settings.value(self.plugin.getName() + '/columns').toStringList()
+ self.clear()
+ for song in self.plugin.mpclient.listPlaylist():
+ item = QtGui.QTreeWidgetItem()
+ for i in range(len(columns)):
+ item.setText(i, unicode(song.getTag(str(columns[i]))))
+ item.setData(0, QtCore.Qt.UserRole, QVariant(song))
+ self.addTopLevelItem(item)
+
+ def keyPressEvent(self, event):
+ if event.matches(QtGui.QKeySequence.Delete):
+ ids = []
+ for item in self.selectedItems():
+ ids.append(item.data(0, QtCore.Qt.UserRole).toPyObject().getID())
+
+ self.plugin.mpclient.deleteFromPlaylist(ids)
+ else:
+ QtGui.QTreeWidget.keyPressEvent(self, event)
+
+ def fill_playlist(self):
+ self.playlist.fill()