diff options
-rw-r--r-- | clMonty.py | 2 | ||||
-rw-r--r-- | plugins/Playlist.py | 157 | ||||
-rw-r--r-- | plugins/Systray.py | 2 |
3 files changed, 75 insertions, 86 deletions
@@ -95,7 +95,7 @@ class Monty(QtCore.QObject): def listPlaylist(self): """Returns the current playlist.""" if not self.isConnected(): - return None + return [] return self._curPlaylist def listLibrary(self): diff --git a/plugins/Playlist.py b/plugins/Playlist.py index b7e0563..39408f3 100644 --- a/plugins/Playlist.py +++ b/plugins/Playlist.py @@ -1,109 +1,34 @@ from PyQt4 import QtGui, QtCore from PyQt4.QtCore import QVariant -import logging from clPlugin import Plugin -from misc import * -from wgPlaylist import Playlist import plugins # Dependencies: # playcontrol -class pluginPlaylist(Plugin, plugins.IPlaylist): - o = None - clr_plst_btn = None - DEFAULTS = {'modes' : '$artist\n'\ - '$artist/$date - $album\n'\ - '$artist - $album\n'\ - '$album ($artist)\n'\ - '$genre\n'\ - '$genre/$artist\n'\ - '$genre/$artist - $album\n'} +class pluginPlaylist(Plugin): + o = None + DEFAULTS = {'columns': ['track', 'title', 'artist', + 'date', 'album', 'length']} def __init__(self, winMain): Plugin.__init__(self, winMain, 'Playlist') - self.addMontyListener('onSongChange', self.onSongChange) - self.addMontyListener('onPlaylistChange', self.on_playlist_change) - self.addMontyListener('onDisconnect', self.on_playlist_change) def _load(self): - self.o=Playlist(self.winMain, self, ['artist', 'title', 'track', 'album'], 'Playlist' - , self.onDoubleClick, self.onKeyPress, unicode(self.settings.value('modes').toString().split('\n'))) - - # clear playlist button - self.clrPlstBtn = QtGui.QPushButton(QtGui.QIcon('gfx/button_cancel.png'), '') - self.clrPlstBtn.setToolTip("Clear playlist") - self.o.connect(self.clrPlstBtn, QtCore.SIGNAL('clicked()'), self.clearPlaylistPressed) - self.clrPlstBtn.palette().setColor(QtGui.QPalette.Button, self.o.palette().color(QtGui.QPalette.Window)) - self.o.filterLayout.insertWidget(0, self.clrPlstBtn) + self.o = PlaylistWidget(self) + self.monty.add_listener('onPlaylistChange', self.on_playlist_change) + self.monty.add_listener('onDisconnect', self.on_playlist_change) + self.monty.add_listener('onReady', self.on_playlist_change) def _unload(self): - self.o=None - def getPlaylist(self): - return self.o + self.o = None def getInfo(self): return "The playlist showing the songs that will be played." - def getList(self): - return self.o - def _getDockWidget(self): return self._createDock(self.o) - def onDoubleClick(self): - self.monty.play(self.o.getSelItemID()) - - def onKeyPress(self, event): - if event.matches(QtGui.QKeySequence.Delete): - # remove selection from playlist using DELETE-key - ids=self.o.selectedIds() - self.setStatus('Deleting '+str(len(ids))+' songs from playlist ...') - doEvents() - - self.monty.deleteFromPlaylist(ids) - - self.setStatus('') - doEvents() - - elif event.key()==QtCore.Qt.Key_Q: - # queue selected songs - # Hoho, this one needs the playcontrol plugin! - plugins.getPlugin('playcontrol').addSongsToQueue(self.o.selectedIds()) - return QtGui.QWidget.keyPressEvent(self.o, event) - - def clearPlaylistPressed(self): - self.setStatus('Clearing playlist...') - doEvents() - self.monty.clear_playlist() - self.setStatus('') - doEvents() - - def onSongChange(self, params): - lst=self.o - lst.colorID(int(params['newSongID']), self.o.palette().color(QtGui.QPalette.Highlight)) - - if params['newSongID']!=-1: - lst.ensureVisible(params['newSongID']) - - _rowColorModifier=0 - _rowColorAdder=1 - def timerEvent(self, event): - curSong=self.monty.getCurrentSong() - if curSong: - lst=self.lstPlaylist - # color current playing song - lst.colorID(curSong.getID(), self.o.palette().color(QtGui.QPalette.Highlight)) - - # make sure color changes nicely over time - self._rowColorModifier=self._rowColorModifier+self._rowColorAdder - if abs(self._rowColorModifier)>4: - self._rowColorAdder=-1*self._rowColorAdder - - def ensureVisible(self, id): - """Make sure song with ID id is visible.""" - self.o.ensureVisible(id) - def on_playlist_change(self, params = None): - self.getList().updateSongs(self.monty.listPlaylist()) + self.o.fill_playlist() class SettingsWidgetPlaylist(Plugin.SettingsWidget): modes = None @@ -121,3 +46,65 @@ class pluginPlaylist(Plugin, plugins.IPlaylist): def get_settings_widget(self): return self.SettingsWidgetPlaylist(self) + +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.monty.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.monty.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.monty.deleteFromPlaylist(ids) + else: + QtGui.QTreeWidget.keyPressEvent(self, event) + + def fill_playlist(self): + self.playlist.fill() diff --git a/plugins/Systray.py b/plugins/Systray.py index 524697f..9aa5e7f 100644 --- a/plugins/Systray.py +++ b/plugins/Systray.py @@ -52,6 +52,8 @@ class pluginSystray(Plugin): def update(self, params): status = self.monty.getStatus() + if not status: + return song = self.monty.getCurrentSong() values={'state':''} |