from PyQt4 import QtGui, QtCore from PyQt4.QtCore import QVariant from traceback import print_exc from ..misc import sec2min, ORGNAME, APPNAME, expand_tags from ..clPlugin import Plugin from .. import plugins NOTIFY_PRIORITY_SONG = 1 NOTIFY_PRIORITY_VOLUME = 2 class winNotify(QtGui.QWidget): _timerID = None winMain = None p = None _current_priority = 0 timer = None cover_label = None text_label = None def __init__(self, p, winMain, parent=None): QtGui.QWidget.__init__(self, parent) self.p = p self.winMain = winMain self.timer = QtCore.QTimer(self) self.timer.setSingleShot(True) self.connect(self.timer, QtCore.SIGNAL('timeout()'), self.hide) layout = QtGui.QHBoxLayout() self.cover_label = QtGui.QLabel() self.text_label = QtGui.QLabel() self.text_label.setWordWrap(True) self.setLayout(QtGui.QHBoxLayout()) self.layout().addWidget(self.cover_label) self.layout().addWidget(self.text_label) self.setWindowFlags(QtCore.Qt.ToolTip | QtCore.Qt.WindowStaysOnTopHint) self.setWindowOpacity(0.7) font = QtGui.QFont() font.setPixelSize(20) self.setFont(font) def mousePressEvent(self, event): self.hide() def show(self, text, time = 3000, priority = 0): if not priority >= self._current_priority: return self._current_priority = priority self.cover_label.clear() ac = self.winMain.plugins.plugin('AlbumCover') if ac: cover = ac.get_cover() if cover: self.cover_label.setPixmap(cover.scaledToHeight(self.fontInfo().pixelSize()*4)) self.text_label.setText(text) self.resize(self.layout().sizeHint()) self.centerH() self.setVisible(True) self.timer.start(time) def hide(self): if self._timerID: self.killTimer(self._timerID) self._timerID=None self.setHidden(True) self._current_priority = -1 def centerH(self): screen = QtGui.QDesktopWidget().screenGeometry() size = self.geometry() self.move((screen.width()-size.width())/2, 100) class Notify(Plugin): o=None DEFAULTS = {'songformat' : '$track - $artist - $title ($album) [$length]', 'timer' : 3000} def __init__(self, winMain): Plugin.__init__(self, winMain, 'Notify') self.addListener('onSongChange', self.onSongChange) self.addListener('onReady', self.onReady) self.addListener('onDisconnect', self.onDisconnect) self.addListener('onStateChange', self.onStateChange) self.addListener('onVolumeChange', self.onVolumeChange) def _load(self): self.o = winNotify(self, self.winMain) def _unload(self): self.o=None def getInfo(self): return "Show interesting events in a popup window." def onSongChange(self, params): song = self.mpclient.current_song() if not song: return self.settings.beginGroup(self.name) self.o.show(expand_tags(self.settings.value('songformat').toString(), (song,)), self.settings.value('timer').toInt()[0], NOTIFY_PRIORITY_SONG) self.settings.endGroup() def onReady(self, params): self.o.show('%s loaded'%APPNAME, self.settings.value(self.name + '/timer').toInt()[0]) def onDisconnect(self, params): self.o.show('Disconnected!', self.settings.value(self.name + '/timer').toInt()[0]) def onStateChange(self, params): self.o.show(params['newState'], self.settings.value(self.name + '/timer').toInt()[0]) def onVolumeChange(self, params): self.o.show('Volume: %i%%'%(params['newVolume']), self.settings.value(self.name + '/timer').toInt()[0], priority = NOTIFY_PRIORITY_VOLUME) class SettingsWidgetNotify(Plugin.SettingsWidget): format = None timer = None def __init__(self, plugin): Plugin.SettingsWidget.__init__(self, plugin) self.settings.beginGroup(self.plugin.getName()) self.format = QtGui.QLineEdit(self.settings.value('songformat').toString()) self.timer = QtGui.QLineEdit(self.settings.value('timer').toString()) self.timer.setValidator(QtGui.QIntValidator(self.timer)) self.setLayout(QtGui.QVBoxLayout()) self._add_widget(self.format, 'Format', 'Format of notifications. All tags supported by MPD\n' 'will be expanded to their values for current song,\n' 'e.g. $track, $title, $artist, $album, $length, $date, etc.') self._add_widget(self.timer, 'Duration', 'How long should notifications be displayed in ms.') self.settings.endGroup() def save_settings(self): self.settings.beginGroup(self.plugin.getName()) self.settings.setValue('songformat', QVariant(self.format.text())) self.settings.setValue('timer', QVariant(self.timer.text().toInt()[0])) self.settings.endGroup() self.plugin.onSongChange(None) def get_settings_widget(self): return self.SettingsWidgetNotify(self)