diff options
author | jerous <jerous@gmail.com> | 2008-09-17 02:10:59 +0200 |
---|---|---|
committer | jerous <jerous@gmail.com> | 2008-09-17 02:10:59 +0200 |
commit | 3750d2f7570920364b55d5a71c9be5f8420e58fe (patch) | |
tree | ad39ff2bd178041e620e24198f873e4a2ea58d6d | |
parent | 8ca7c3c857894991fa879920ef755c9f68f16b72 (diff) |
cleanup of plugins
moving callbacks to plugin instead of widget itself
automatic adding/removing of listeners at load/unload
remove unused objects
-rw-r--r-- | clMonty.py | 5 | ||||
-rw-r--r-- | clPlugin.py | 14 | ||||
-rw-r--r-- | plugins/AlbumCover.py | 40 | ||||
-rw-r--r-- | plugins/Library.py | 2 | ||||
-rw-r--r-- | plugins/Lyrics.py | 23 | ||||
-rw-r--r-- | plugins/Notify.py | 44 | ||||
-rw-r--r-- | plugins/PlayControl.py | 29 | ||||
-rw-r--r-- | plugins/Playlist.py | 4 | ||||
-rw-r--r-- | plugins/Scrobbler.py | 8 | ||||
-rw-r--r-- | plugins/SongStatus.py | 18 | ||||
-rw-r--r-- | plugins/Systray.py | 1 | ||||
-rw-r--r-- | plugins/Tabs.py | 22 |
12 files changed, 132 insertions, 78 deletions
@@ -209,8 +209,11 @@ class Monty(QtCore.QObject): """Add $callback to the listeners for $event.""" if not(event in self.events): raise Exception("Unknown event "+event) - self._listeners[event].append(callback) + def removeListener(self, event, callback): + if not(event in self.events): + raise Exception("Unknown event "+event) + self._listeners[event].remove(callback) def _updateLib(self): diff --git a/clPlugin.py b/clPlugin.py index d750bfe..84e6ad3 100644 --- a/clPlugin.py +++ b/clPlugin.py @@ -3,6 +3,7 @@ from PyQt4 import QtGui, QtSvg, QtCore from clMonty import monty from clSettings import settings, mpdSettings from misc import * +import log class Plugin: name=None @@ -11,11 +12,13 @@ class Plugin: settings=None winMain=None loaded=None + listeners=[] def __init__(self, winMain, name): self.name=name self.winMain=winMain self.loaded=False + self.listeners=[] def getName(self, lower=False): if lower: @@ -31,11 +34,19 @@ class Plugin: self.winMain.setStatus(status) def load(self): + log.debug("%s: adding %s listeners"%(self.getName(), len(self.listeners))) + for listener in self.listeners: + monty.addListener(listener[0], listener[1]) + self._load() opts=QtGui.QDockWidget.DockWidgetClosable|QtGui.QDockWidget.DockWidgetMovable self.winMain.addDock(self.getDockWidget(opts)) self.loaded=True def unload(self): + log.debug("%s: removing %s listeners"%(self.getName(), len(self.listeners))) + for listener in self.listeners: + monty.removeListener(listener[0], listener[1]) + self._unload() self.winMain.removeDock(self.getDockWidget()) self.dockWidget=None @@ -44,6 +55,9 @@ class Plugin: def isLoaded(self): return self.loaded + def addMontyListener(self, event, callback): + self.listeners.append([event, callback]) + def getDockWidget(self, opts=None): try: if not self.dockWidget: diff --git a/plugins/AlbumCover.py b/plugins/AlbumCover.py index 94ba863..117c243 100644 --- a/plugins/AlbumCover.py +++ b/plugins/AlbumCover.py @@ -24,15 +24,10 @@ class wgAlbumCover(QtGui.QWidget): QtGui.QWidget.__init__(self,parent) self.img=QtGui.QImage() - monty.addListener('onSongChange', self.onSongChange) - monty.addListener('onReady', self.onReady) - monty.addListener('onDisconnect', self.onDisconnect) - monty.addListener('onStateChange', self.onSongChange) - self.setMinimumSize(64,64) def mousePressEvent(self, event): - self.onSongChange(None) + self.refresh() def getIMG(self): if self.imgLoaded: @@ -45,7 +40,8 @@ class wgAlbumCover(QtGui.QWidget): rect=QtCore.QRectF((self.width()-l)/2,0,l,l) p.drawImage(rect,self.img) - def onSongChange(self, params): + def refresh(self): + log.extended("AlbumCover: refreshing cover") song=monty.getCurrentSong() try: song._data['file'] @@ -94,9 +90,10 @@ class wgAlbumCover(QtGui.QWidget): return False # get the url from amazon WS coverURL=AmazonAlbumImage(song.getArtist(), song.getAlbum()).fetch() + log.extended("AlbumCover: fetch from Amazon") if not coverURL: + log.normal("AlbumCover: not found on Amazon") return False - log.extended("Fetch albumcover from internet") # read the url, i.e. retrieve image data img=urllib.urlopen(coverURL) # where do we save to? @@ -113,9 +110,11 @@ class wgAlbumCover(QtGui.QWidget): self.img.load(file) return True except: + log.normal("AlbumCover: failed to download cover from Amazon") print_exc() return False if src==AC_FETCH_LOCAL_DIR: + log.extended("AlbumCover: looking in local directory") # look in local directory # create all possible album cover filenames ... coverFiles=[] @@ -126,6 +125,7 @@ class wgAlbumCover(QtGui.QWidget): elif src==AC_FETCH_ALBUM_DIR: + log.extended("AlbumCover: looking in album directory") # look in album directory path=settings.get('albumcover.dir') fInfo=QtCore.QFileInfo(path) @@ -142,26 +142,27 @@ class wgAlbumCover(QtGui.QWidget): if QtCore.QFileInfo(file).exists(): try: self.img.load(file) + log.extended("AlbumCover: cover set!") return True except: - print "wgAlbumCover::fetchCover - Failed to load %s"%(file) + log.normal("AlbumCover: failed to load %s"%(file)) return False - def onReady(self, params): - self.onSongChange(None) - self.update() - - def onDisconnect(self, params): - self.img.load('') - self.update() - class pluginAlbumCover(Plugin): o=None def __init__(self, winMain): Plugin.__init__(self, winMain, 'AlbumCover') + self.addMontyListener('onSongChange', self.onEvent) + self.addMontyListener('onReady', self.onEvent) + self.addMontyListener('onDisconnect', self.onEvent) + self.addMontyListener('onStateChange', self.onEvent) + def _load(self): self.o=wgAlbumCover(None) + self.o.refresh() + def _unload(self): + self.o=None def getInfo(self): return "Display the album cover of the currently playing album." def getExtInfo(self): @@ -183,6 +184,9 @@ class pluginAlbumCover(Plugin): def _getDockWidget(self): return self._createDock(self.o) + def onEvent(self, params): + self.o.refresh() + def _getSettings(self): ret=[] nums=['first', 'second', 'third'] @@ -206,7 +210,7 @@ class pluginAlbumCover(Plugin): return ret def afterSaveSettings(self): - self.o.onSongChange(None) + self.o.refresh() # This is the amazon cover fetcher using their webservice api diff --git a/plugins/Library.py b/plugins/Library.py index c4e9dc7..40c634a 100644 --- a/plugins/Library.py +++ b/plugins/Library.py @@ -13,6 +13,8 @@ class pluginLibrary(Plugin): def _load(self): self.o=Playlist(self.winMain, self, ['song'], 'Library' , self.onDoubleClick, self.onKeyPress) + def _unload(self): + self.o=None def getInfo(self): return "List showing all the songs allowing filtering and grouping." diff --git a/plugins/Lyrics.py b/plugins/Lyrics.py index 9a3e850..492e058 100644 --- a/plugins/Lyrics.py +++ b/plugins/Lyrics.py @@ -56,9 +56,6 @@ class wgLyrics(QtGui.QWidget): layout.addWidget(self.txtView) self.setLayout(layout) - monty.addListener('onSongChange', self.onSongChange) - monty.addListener('onReady', self.onReady) - monty.addListener('onDisconnect', self.onDisconnect) def setMode(self, mode): self.editMode=mode @@ -89,7 +86,7 @@ class wgLyrics(QtGui.QWidget): pass self.onSongChange(None) - def onSongChange(self, params): + def refresh(self): # if we're editing while song changes, too bad: we don't save, for the moment! if self.editMode: self.setMode(False) @@ -110,9 +107,6 @@ class wgLyrics(QtGui.QWidget): elif isinstance(event,AddHtmlEvent): self.txtView.insertHtml(event.html) - def onReady(self, params): - self.onSongChange(None) - def getLyricsFilePath(self, song): save_dir=settings.get('lyrics.dir', '/holy_grail') fInfo=QtCore.QFileInfo(save_dir) @@ -194,9 +188,6 @@ class wgLyrics(QtGui.QWidget): '<br />an error in the fetching regular expression')) self._fetchCnt=0 - def onDisconnect(self, params): - self.resetTxt() - def resetTxt(self, song=None): self.txtView.clear() if song: @@ -208,14 +199,26 @@ class pluginLyrics(Plugin): o=None def __init__(self, winMain): Plugin.__init__(self, winMain, 'Lyrics') + self.addMontyListener('onSongChange', self.refresh) + self.addMontyListener('onReady', self.refresh) + self.addMontyListener('onDisconnect', self.onDisconnect) def _load(self): self.o=wgLyrics(None) + self.o.refresh() + def _unload(self): + self.o=None def getInfo(self): return "Show (and fetch) the lyrics of the currently playing song." def _getDockWidget(self): return self._createDock(self.o) + def refresh(self, params): + self.o.refresh() + def onDisconnect(self, params): + self.o.resetTxt() + + def _getSettings(self): sites=QtGui.QTextEdit() sites.insertPlainText(settings.get('lyrics.sites', LY_DEFAULT_SITES)) diff --git a/plugins/Notify.py b/plugins/Notify.py index 970c55c..5ed0711 100644 --- a/plugins/Notify.py +++ b/plugins/Notify.py @@ -31,27 +31,6 @@ class winNotify(QtGui.QWidget): font.setFamily('Comic Sans Ms') self.setFont(font) - monty.addListener('onSongChange', self.onSongChange) - monty.addListener('onReady', self.onReady) - monty.addListener('onDisconnect', self.onDisconnect) - monty.addListener('onStateChange', self.onStateChange) - monty.addListener('onVolumeChange', self.onVolumeChange) - - def onSongChange(self, params): - self.show('$if($artist,$artist)$if($album, [$album #$track])\n$title ($length))', monty.getCurrentSong()) - - def onReady(self, params): - self.show('montypc loaded!') - - def onDisconnect(self, params): - self.show('Disconnected!') - - def onStateChange(self, params): - self.show(params['newState']) - - def onVolumeChange(self, params): - self.show('Volume: %i%%'%(params['newVolume'])) - def mousePressEvent(self, event): self.hide() @@ -135,11 +114,34 @@ class pluginNotify(Plugin): o=None def __init__(self, winMain): Plugin.__init__(self, winMain, 'Notify') + self.addMontyListener('onSongChange', self.onSongChange) + self.addMontyListener('onReady', self.onReady) + self.addMontyListener('onDisconnect', self.onDisconnect) + self.addMontyListener('onStateChange', self.onStateChange) + self.addMontyListener('onVolumeChange', self.onVolumeChange) + def _load(self): self.o=winNotify(self.winMain) + def _unload(self): + self.o=None def getInfo(self): return "Show interesting events in a popup window." + def onSongChange(self, params): + self.o.show('$if($artist,$artist)$if($album, [$album #$track])\n$title ($length))', monty.getCurrentSong()) + + def onReady(self, params): + self.o.show('montypc loaded!') + + def onDisconnect(self, params): + self.o.show('Disconnected!') + + def onStateChange(self, params): + self.o.show(params['newState']) + + def onVolumeChange(self, params): + self.o.show('Volume: %i%%'%(params['newVolume'])) + def _getSettings(self): return [] def afterSaveSettings(self): diff --git a/plugins/PlayControl.py b/plugins/PlayControl.py index e0a8c79..8d2160a 100644 --- a/plugins/PlayControl.py +++ b/plugins/PlayControl.py @@ -124,13 +124,6 @@ class wgPlayControl(QtGui.QWidget): self.connect(self.cmbRepeat, QtCore.SIGNAL('currentIndexChanged(int)'),self.onCmbRepeatChanged) self.connect(self.cmbShuffle, QtCore.SIGNAL('currentIndexChanged(int)'),self.onCmbShuffleChanged) - monty.addListener('onStateChange', self.onStateChange) - monty.addListener('beforeSongChange', self.beforeSongChange) - monty.addListener('onSongChange', self.onSongChange) - monty.addListener('onVolumeChange', self.onVolumeChange) - monty.addListener('onReady', self.onStateChange) - monty.addListener('onDisconnect', self.onDisconnect) - monty.addListener('onTimeChange', self.onTimeChange) def onBtnJmpCurrentClick(self): self.plugin.getWinMain().getPlugin("Playlist").getPlaylist().ensureVisible(monty.getCurrentSong().getID()) def onStateChange(self, params): @@ -275,11 +268,33 @@ class pluginPlayControl(Plugin): o=None def __init__(self, winMain): Plugin.__init__(self, winMain, 'PlayControl') + self.addMontyListener('onStateChange', self.onStateChange) + self.addMontyListener('beforeSongChange', self.beforeSongChange) + self.addMontyListener('onSongChange', self.onSongChange) + self.addMontyListener('onVolumeChange', self.onVolumeChange) + self.addMontyListener('onReady', self.onStateChange) + self.addMontyListener('onDisconnect', self.onDisconnect) + self.addMontyListener('onTimeChange', self.onTimeChange) def _load(self): self.o=wgPlayControl(self) + def _unload(self): + self.o=None def getInfo(self): return "Have total control over the playing!" + def onStateChange(self, params): + self.o.onStateChange(params) + def beforeSongChange(self, params): + self.o.beforeSongChange(params) + def onSongChange(self, params): + self.o.onSongChange(params) + def onVolumeChange(self, params): + self.o.onVolumeChange(params) + def onDisconnect(self, params): + self.o.onDisconnect(params) + def onTimeChange(self, params): + self.o.onTimeChange(params) + def _getDockWidget(self): return self._createDock(self.o) diff --git a/plugins/Playlist.py b/plugins/Playlist.py index fe23e40..f7f7d04 100644 --- a/plugins/Playlist.py +++ b/plugins/Playlist.py @@ -10,10 +10,12 @@ class pluginPlaylist(Plugin): o=None def __init__(self, winMain): Plugin.__init__(self, winMain, 'Playlist') + self.addMontyListener('onSongChange', self.onSongChange) def _load(self): self.o=Playlist(self.winMain, self, ['artist', 'title', 'track', 'album'], 'Playlist' , self.onDoubleClick, self.onKeyPress) - monty.addListener('onSongChange', self.onSongChange) + def _unload(self): + self.o=None def getPlaylist(self): return self.o def getInfo(self): diff --git a/plugins/Scrobbler.py b/plugins/Scrobbler.py index 7cb5b89..e717c0a 100644 --- a/plugins/Scrobbler.py +++ b/plugins/Scrobbler.py @@ -9,10 +9,10 @@ class pluginScrobbler(Plugin): time=None def __init__(self, winMain): Plugin.__init__(self, winMain, 'Scrobbler') + self.addMontyListener('onSongChange', self.onSongChange) + self.addMontyListener('onTimeChange', self.onTimeChange) def _load(self): - monty.addListener('onSongChange', self.onSongChange) - monty.addListener('onTimeChange', self.onTimeChange) self._login() def _login(self): @@ -41,14 +41,14 @@ class pluginScrobbler(Plugin): flush() self.submitted=True except SessionError, e: - log.important("Scrobbler: failed to sumit song - %s"%(e)) + log.important("Scrobbler: failed to submit song - %s"%(e)) log.extended("Logging in ...") self._login() try: flush() self.submitted=True except Exception, e: - log.important("Scrobbler: failed to sumit song - %s"%(e)) + log.important("Scrobbler: failed to submit song - %s"%(e)) log.debug("Scrobbler: flushed") def onSongChange(self, params): diff --git a/plugins/SongStatus.py b/plugins/SongStatus.py index 93d8311..c927e1a 100644 --- a/plugins/SongStatus.py +++ b/plugins/SongStatus.py @@ -28,12 +28,6 @@ class wgSongStatus(QtGui.QWidget): layout.addWidget(self.lblInfo) self.updateFormat() - monty.addListener('onSongChange', self.update) - monty.addListener('onTimeChange', self.update) - monty.addListener('onStateChange', self.update) - monty.addListener('onConnect', self.update) - monty.addListener('onDisconnect', self.update) - def update(self, params): status=monty.getStatus() song=monty.getCurrentSong() @@ -60,11 +54,23 @@ class pluginSongStatus(Plugin): o=None def __init__(self, winMain): Plugin.__init__(self, winMain, 'SongStatus') + self.addMontyListener('onSongChange', self.update) + self.addMontyListener('onTimeChange', self.update) + self.addMontyListener('onStateChange', self.update) + self.addMontyListener('onConnect', self.update) + self.addMontyListener('onDisconnect', self.update) + def _load(self): self.o=wgSongStatus(None) + self.update(None) + def _unload(self): + self.o=None def getInfo(self): return "Show information about the current song." + def update(self, params): + self.o.update(params) + def _getDockWidget(self): return self._createDock(self.o) diff --git a/plugins/Systray.py b/plugins/Systray.py index 3352585..36758fc 100644 --- a/plugins/Systray.py +++ b/plugins/Systray.py @@ -15,6 +15,7 @@ class pluginSystray(Plugin): , self.onSysTrayClick) def _unload(self): self.o.hide() + self.o=None def getInfo(self): return "Display the montypc icon in the systray." diff --git a/plugins/Tabs.py b/plugins/Tabs.py index 12ae0e7..9d95701 100644 --- a/plugins/Tabs.py +++ b/plugins/Tabs.py @@ -37,11 +37,8 @@ class wgTabs(QtGui.QWidget): layout.addWidget(self.txt) self.setLayout(layout) - monty.addListener('onSongChange', self.onSongChange) - monty.addListener('onReady', self.onReady) - monty.addListener('onDisconnect', self.onDisconnect) - def onSongChange(self, params): + def refresh(self): song=monty.getCurrentSong() try: song._data['file'] @@ -58,9 +55,6 @@ class wgTabs(QtGui.QWidget): elif isinstance(event,AddHtmlEvent): self.txt.insertHtml(event.html) - def onReady(self, params): - self.onSongChange(None) - _mutex=QtCore.QMutex() _fetchCnt=0 def fetchTabs(self, song): @@ -127,9 +121,6 @@ class wgTabs(QtGui.QWidget): '<br />You have an internet connection?')) self._fetchCnt=0 - def onDisconnect(self, params): - self.resetTxt() - def resetTxt(self, song=None): self.txt.clear() if song: @@ -141,13 +132,24 @@ class pluginTabs(Plugin): o=None def __init__(self, winMain): Plugin.__init__(self, winMain, 'Tabs') + self.addMontyListener('onSongChange', self.refresh) + self.addMontyListener('onReady', self.refresh) + self.addMontyListener('onDisconnect', self.onDisconnect) def _load(self): self.o=wgTabs(None) + self.refresh(None) + def _unload(self): + self.o=None def getInfo(self): return "Show (and fetch) the tabs of the currently playing song." def _getDockWidget(self): return self._createDock(self.o) + + def refresh(self, params): + self.o.refresh() + def onDisconnect(self, params): + self.o.resetTxt() def _getSettings(self): sites=QtGui.QTextEdit() |