diff options
Diffstat (limited to 'nephilim/plugins/PlayControl.py')
-rw-r--r-- | nephilim/plugins/PlayControl.py | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/nephilim/plugins/PlayControl.py b/nephilim/plugins/PlayControl.py new file mode 100644 index 0000000..c5690be --- /dev/null +++ b/nephilim/plugins/PlayControl.py @@ -0,0 +1,169 @@ +from PyQt4 import QtGui, QtCore +from PyQt4.QtCore import QVariant +import logging + +from ..misc import ORGNAME, APPNAME, Button +from ..clPlugin import Plugin + +class wgPlayControl(QtGui.QToolBar): + """Displays controls for interacting with playing, like play, volume ...""" + " control buttons" + btnPlayPause = None + btnStop = None + btnPrevious = None + btnNext = None + slrVolume=None + repeat = None + random = None + p = None + + " queued songs: int*" + queuedSongs=[] + # what mode where we in before the queue started? + beforeQueuedMode=None + + class VolumeSlider(QtGui.QSlider): + + def __init__(self, parent): + QtGui.QSlider.__init__(self, parent) + self.setOrientation(parent.orientation()) + self.setMaximum(100) + self.setToolTip('Volume control') + + def paintEvent(self, event): + painter = QtGui.QPainter(self) + painter.eraseRect(self.rect()) + + grad = QtGui.QLinearGradient(0, 0, self.width(), self.height()) + grad.setColorAt(0, self.palette().color(QtGui.QPalette.Window)) + grad.setColorAt(1, self.palette().color(QtGui.QPalette.Highlight)) + if self.orientation() == QtCore.Qt.Horizontal: + rect = QtCore.QRect(0, 0, self.width() * self.value() / self.maximum(), self.height()) + else: + rect = QtCore.QRect(0, self.height() * (1 - float(self.value()) / self.maximum()), self.width(), self.height()) + painter.fillRect(rect, QtGui.QBrush(grad)) + + def __init__(self, p, parent = None): + QtGui.QToolBar.__init__(self, parent) + self.setMovable(True) + self.p = p + + self.slrVolume = self.VolumeSlider(self) + self.connect(self.slrVolume, QtCore.SIGNAL('valueChanged(int)'),self.onVolumeSliderChange) + + self.btnPlayPause=Button("play", self.onBtnPlayPauseClick, 'gfx/media-playback-start.svg', True) + self.btnStop=Button("stop", self.onBtnStopClick, 'gfx/media-playback-stop.svg', True) + self.btnPrevious=Button("prev", self.onBtnPreviousClick, 'gfx/media-skip-backward.svg', True) + self.btnNext=Button("next", self.onBtnNextClick, 'gfx/media-skip-forward.svg', True) + + self.random = QtGui.QPushButton(QtGui.QIcon('gfx/random.png'), '', self) + self.random.setToolTip('Random') + self.random.setCheckable(True) + self.connect(self.random, QtCore.SIGNAL('toggled(bool)'), self.p.mpclient.random) + + self.repeat = QtGui.QPushButton(QtGui.QIcon('gfx/repeat.png'), '', self) + self.repeat.setToolTip('Repeat') + self.repeat.setCheckable(True) + self.connect(self.repeat, QtCore.SIGNAL('toggled(bool)'), self.p.mpclient.repeat) + + self.addWidget(self.btnPlayPause) + self.addWidget(self.btnStop) + self.addWidget(self.btnPrevious) + self.addWidget(self.btnNext) + self.addSeparator() + self.addWidget(self.slrVolume) + self.addSeparator() + self.addWidget(self.random) + self.addWidget(self.repeat) + + self.connect(self, QtCore.SIGNAL('orientationChanged(Qt::Orientation)'), self.slrVolume.setOrientation) + + # queue gets loaded in _load of pluginPlayControl + self.queuedSongs=[] + + def addSongsToQueue(self, songs): + self.queuedSongs.extend(songs) + + def onStateChange(self, params): + status = self.p.mpclient.getStatus() + + if status['state'] == 'play': + self.btnPlayPause.changeIcon('gfx/media-playback-pause.svg') + self.btnPlayPause.setToolTip('pauze') + elif status['state'] == 'pause' or status['state'] == 'stop': + self.btnPlayPause.changeIcon('gfx/media-playback-start.svg') + self.btnPlayPause.setToolTip('play') + + def onVolumeChange(self, params): + self.slrVolume.setValue(params['newVolume']) + + def onBtnPlayPauseClick(self): + status=self.p.mpclient.getStatus() + if status['state']=='play': + self.p.mpclient.pause() + logging.info("Toggling playback") + elif status['state']=='stop': + self.p.mpclient.play(None) + logging.info("Pausing playback") + else: + self.p.mpclient.resume() + def onBtnStopClick(self): + self.p.mpclient.stop() + logging.info("Stopping playback") + def onBtnPreviousClick(self): + self.p.mpclient.previous() + logging.info("Playing previous") + def onBtnNextClick(self): + self.p.mpclient.next() + logging.info("Playing next") + def onVolumeSliderChange(self): + v=self.slrVolume.value() + self.p.mpclient.setVolume(v) + if v<=1: + mode='mute' + else: + mode=('0', 'min', 'med', 'max')[int(3*v/100)] + + # save and load the queue + def saveQueue(self): + # save the ids as a list of space-separated numbers + logging.info("saving queue") + self.p.settings.setValue(self.p.getName() + '/queue', QVariant(str(self.queuedSongs)[1:-1].replace(',', ''))) + def loadQueue(self): + # just read all the numbers! + logging.info("loading queue") + self.queuedSongs=[] + i=0 + ids=self.p.settings.value(self.p.getName() + '/queue').toString().split(' ') + for id in ids: + try: + self.queuedSongs.append(int(id)) + except: + pass + +class pluginPlayControl(Plugin): + o=None + DEFAULTS = {'queue' : ''} + def __init__(self, winMain): + Plugin.__init__(self, winMain, 'PlayControl') + self.addListener('onStateChange', self.onStateChange) + self.addListener('onVolumeChange', self.onVolumeChange) + self.addListener('onReady', self.onStateChange) + def _load(self): + self.o = wgPlayControl(self, None) + self.o.loadQueue() + self.winMain.addToolBar(QtCore.Qt.TopToolBarArea, self.o) + def _unload(self): + self.o.saveQueue() + self.winMain.removeToolBar(self.o) + self.o = None + def getInfo(self): + return "Have total control over the playing!" + + def addSongsToQueue(self, songs): + return self.o.addSongsToQueue(songs) + + def onStateChange(self, params): + self.o.onStateChange(params) + def onVolumeChange(self, params): + self.o.onVolumeChange(params) |