summaryrefslogtreecommitdiff
path: root/portato/plugin.py
diff options
context:
space:
mode:
authorRené 'Necoro' Neumann <necoro@necoro.net>2009-07-05 02:41:02 +0200
committerRené 'Necoro' Neumann <necoro@necoro.net>2009-07-05 02:41:02 +0200
commit80b0b50b9508b13e98842d196a806599b3044a8f (patch)
tree08af1aa8ebb493df7266f6d57da2595c2db5217a /portato/plugin.py
parentcd5751b7a49f12ae9baf33f7c692dc9da85d355e (diff)
downloadportato-80b0b50b9508b13e98842d196a806599b3044a8f.tar.gz
portato-80b0b50b9508b13e98842d196a806599b3044a8f.tar.bz2
portato-80b0b50b9508b13e98842d196a806599b3044a8f.zip
Add 'WidgetPlugin' class
Diffstat (limited to 'portato/plugin.py')
-rw-r--r--portato/plugin.py60
1 files changed, 41 insertions, 19 deletions
diff --git a/portato/plugin.py b/portato/plugin.py
index c823ac7..e627eb1 100644
--- a/portato/plugin.py
+++ b/portato/plugin.py
@@ -189,7 +189,6 @@ class Plugin (object):
:param disable: Forcefully disable the plugin
:type disable: bool
"""
- self.__widgets = [] #: List of `Widget`
self.__calls = [] #: List of `Call`
self._unresolved_deps = False #: Does this plugin has unresolved dependencies?
@@ -258,15 +257,6 @@ class Plugin (object):
return getattr(self, "__name__", self.__class__.__name__)
@property
- def widgets (self):
- """
- Returns an iterator over the widgets for this plugin.
-
- :rtype: iter<`Widget`>
- """
- return iter(self.__widgets)
-
- @property
def calls (self):
"""
Returns an iterator over the registered calls for this plugin.
@@ -298,6 +288,27 @@ class Plugin (object):
"""
return (self.status in (self.STAT_ENABLED, self.STAT_TEMP_ENABLED))
+ def add_call (self, hook, callable, type = "before", dep = None):
+ """
+ Adds a new call for this plugin.
+
+ :see: `Call`
+ """
+ self.__calls.append(Call(self, hook, callable, type, dep))
+
+class WidgetPlugin (Plugin):
+
+ def __init__ (self, *args, **kwargs):
+ Plugin.__init__(self, *args, **kwargs)
+ self.__widgets = [] #: List of `Widget`
+
+ def _widget_init (self):
+ if self.status == self.STAT_ENABLED and not self._unresolved_deps:
+ self.widget_init()
+
+ def widget_init (self):
+ debug("No widgets to initialize. Wrong class used for plugin?")
+
def add_widget (self, slot, widget):
"""
Adds a new widget for this plugin.
@@ -340,15 +351,15 @@ class Plugin (object):
w.connect(k, v)
self.add_widget(slot, w)
-
- def add_call (self, hook, callable, type = "before", dep = None):
+
+ @property
+ def widgets (self):
"""
- Adds a new call for this plugin.
+ Returns an iterator over the widgets for this plugin.
- :see: `Call`
+ :rtype: iter<`Widget`>
"""
- self.__calls.append(Call(self, hook, callable, type, dep))
-
+ return iter(self.__widgets)
class PluginQueue (object):
"""
@@ -411,6 +422,7 @@ class PluginQueue (object):
plugin_module.__path__.insert(0, PLUGIN_DIR.rstrip("/")) # make the plugins loadable as "portato.plugins.name"
# add Plugin and register to the builtins, so the plugins always have the correct version :)
plugin_module.__builtins__["Plugin"] = Plugin
+ plugin_module.__builtins__["WidgetPlugin"] = WidgetPlugin
plugin_module.__builtins__["register"] = register
for p in plugins: # import them
@@ -424,9 +436,12 @@ class PluginQueue (object):
self._organize()
+ def load_widgets(self):
for p in self.plugins:
- for w in p.widgets:
- WidgetSlot.slots[w.slot].add_widget(w)
+ if isinstance(p, WidgetPlugin):
+ p._widget_init()
+ for w in p.widgets:
+ WidgetSlot.slots[w.slot].add_widget(w)
def add (self, plugin, disable = False):
"""
@@ -443,7 +458,7 @@ class PluginQueue (object):
:raise PluginLoadException: passed plugin is not of class `Plugin`
"""
- if callable(plugin) and Plugin in plugin.__bases__:
+ if callable(plugin) and issubclass(plugin, Plugin):
p = plugin(disable = disable) # need an instance and not the class
elif isinstance(plugin, Plugin):
p = plugin
@@ -617,6 +632,13 @@ def load_plugins():
__plugins.load()
+def load_plugin_widgets():
+ """
+ Loads the widgets of the plugins.
+ """
+ if __plugins is not None:
+ __plugins.load_widgets()
+
def get_plugin_queue():
"""
Returns the actual `PluginQueue`. If it is ``None``, they are not being loaded yet.