diff options
Diffstat (limited to 'nephilim/plugins/Playlist.py')
-rw-r--r-- | nephilim/plugins/Playlist.py | 92 |
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() |