summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--clMonty.py2
-rw-r--r--plugins/Playlist.py157
-rw-r--r--plugins/Systray.py2
3 files changed, 75 insertions, 86 deletions
diff --git a/clMonty.py b/clMonty.py
index 356022f..823fd80 100644
--- a/clMonty.py
+++ b/clMonty.py
@@ -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':''}