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)