summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjerous <jerous@gmail.com>2008-09-17 02:10:59 +0200
committerjerous <jerous@gmail.com>2008-09-17 02:10:59 +0200
commit3750d2f7570920364b55d5a71c9be5f8420e58fe (patch)
treead39ff2bd178041e620e24198f873e4a2ea58d6d
parent8ca7c3c857894991fa879920ef755c9f68f16b72 (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.py5
-rw-r--r--clPlugin.py14
-rw-r--r--plugins/AlbumCover.py40
-rw-r--r--plugins/Library.py2
-rw-r--r--plugins/Lyrics.py23
-rw-r--r--plugins/Notify.py44
-rw-r--r--plugins/PlayControl.py29
-rw-r--r--plugins/Playlist.py4
-rw-r--r--plugins/Scrobbler.py8
-rw-r--r--plugins/SongStatus.py18
-rw-r--r--plugins/Systray.py1
-rw-r--r--plugins/Tabs.py22
12 files changed, 132 insertions, 78 deletions
diff --git a/clMonty.py b/clMonty.py
index d5d11c1..5893f64 100644
--- a/clMonty.py
+++ b/clMonty.py
@@ -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()