summaryrefslogtreecommitdiff
path: root/nephilim/plugins/PlayControl.py
diff options
context:
space:
mode:
Diffstat (limited to 'nephilim/plugins/PlayControl.py')
-rw-r--r--nephilim/plugins/PlayControl.py169
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)