from PyQt4 import QtGui, QtCore import sys import traceback import logging import plugins from clSettings import settings, mpdSettings from misc import * class Plugin: name=None dockWidget=None settingsWidget=None settings=None winMain=None loaded=None listeners=[] monty = None def __init__(self, winMain, name): self.name=name self.winMain=winMain self.loaded=False self.listeners=[] self.monty = winMain.monty def getName(self, lower=False): if lower: return self.name.lower() return self.name def getInfo(self): return '' def getExtInfo(self): return '' def getWinMain(self): return self.winMain def setStatus(self, status): self.winMain.setStatus(status) def load(self): logging.info("loading") if len(self.listeners): logging.debug("adding %s listeners"%(len(self.listeners))) for listener in self.listeners: self.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): if self.loaded==False: return logging.info("unloading") if len(self.listeners): logging.debug("removing %s listeners"%(len(self.listeners))) for listener in self.listeners: self.monty.removeListener(listener[0], listener[1]) self._unload() self.winMain.removeDock(self.getDockWidget()) self.dockWidget=None self.settingsWidget=None self.loaded=False 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: self.dockWidget=self._getDockWidget() self.dockWidget.setFeatures(opts) self.dockWidget.setAllowedAreas(QtCore.Qt.AllDockWidgetAreas) except: pass return self.dockWidget def getSettingsWidget(self): """Get the widget containing all settings.""" # is the widget constructed yet? if not self.settingsWidget: self.settings=self._getSettings() # do we have any settings? if len(self.settings): # create a widget self.settingsWidget=QtGui.QWidget(None) layout=QtGui.QGridLayout() self.settingsWidget.setLayout(layout) # add for every setting a new entry for i in xrange(len(self.settings)): setting=self.settings[i] try: setting[4] except: # if setting[0] doesn't contain a dot, it means it # is for this one, else it might be a setting from # another plugin. But this only applies when using # the default settings-manager if setting[0] and setting[0].count('.')==0: setting[0]="%s.%s"%(self._getPluginClassname(self.__class__), setting[0]) setting.append(settings) tooltip="%s\n\n(%s)"%(setting[2],setting[0]) label=QtGui.QLabel(setting[1]) wg=setting[3] label.setToolTip(tooltip) wg.setToolTip(tooltip) layout.addWidget(label) layout.addWidget(wg, i, 1) layout.addWidget(Button('Save settings for '+self.getName(), self.saveSettings), i+1,1) return self.settingsWidget def resetSettingCache(self): self.settings=None self.settingsWidget=None def saveSettings(self): if not self.settings: self.important('Plugin::saveSettings - no settings to save?') return for i in xrange(len(self.settings)): setting=self.settings[i] name=setting[0] obj=setting[3] settingsMgr=setting[4] if isinstance(obj,QtGui.QLineEdit): settingsMgr.set(setting[0], setting[3].text()) elif isinstance(obj,QtGui.QComboBox): settingsMgr.set(setting[0], setting[3].currentIndex()) elif isinstance(obj,QtGui.QTextEdit): settingsMgr.set(setting[0], setting[3].toPlainText()) elif isinstance(obj,QtGui.QCheckBox): settingsMgr.set(setting[0], "1" if setting[3].checkState()==QtCore.Qt.Checked else "0") elif isinstance(obj,QtGui.QPushButton): # what the *#$ should we do with this? Just skip! logging.info("I don't know what to do with my object!") else: logging.info("Can't handle %s"%(obj.__class__)) if self.isLoaded(): self.afterSaveSettings() def getSettingWidget(self, name): for i in xrange(len(self.settings)): setting=self.settings[i] if name==setting[0]: return setting[3] return None def _getPluginClassname(self, cl): """Returns the name of a plugin (without 'plugin'-prefix)""" return str(cl).split('.')[-1].lower()[len('plugin'):] def getSetting(self, setting, default=None, pluginClass=None): if pluginClass==None: pluginClass=self.__class__ # fetch the name pluginClass=self._getPluginClassname(pluginClass) if default==None: # what module is this class in? module='.'.join(str(self.__class__).split('.')[0:2]) # import the module __import__(module, globals(), locals(), [], -1) # set the default default=eval("%s.%s_%s_DEFAULT"%(module, pluginClass.upper(), setting.upper())) return settings.get("%s.%s"%(str(pluginClass).lower(), setting), default) def setSetting(self, setting, value, pluginClass=None): if pluginClass==None: pluginClass=self.__class__ # fetch the name pluginClass=self._getPluginClassname(pluginClass) settings.set("%s.%s"%(str(pluginClass).lower(), setting), value) def afterSaveSettings(self): """Override this one.""" pass def _getDockWidget(self): """Override this one.""" return None def _getSettings(self): """Override this one. This method must return a list of arrays. Format: [ [setting, title, tooltip, widget, opt settingsmgr]+ ]""" # setting[0] == setting. If setting contains a dot (.), setting is absolute, i.e. # it belongs to a plugin. If it doesn't contain a dot, it belongs to the # current class. E.g. 'lyrics.engine' and 'engine' are equal, if we are in # the class pluginLyrics. Note that this only applies when setting[4] is # not set. # setting[1] == caption # setting[2] == help message # setting[3] == widget containing the value # setting[4] == setting-class to use return [] def _createDock(self, widget): """Creates a QDockWidget with parent $parent containing widget $widget.""" dock=QtGui.QDockWidget(self.name, self.winMain) dock.setObjectName(self.name) dock.setWidget(widget) return dock def _load(self): """Override this one.""" return def _unload(self): """Override this one.""" return