Added inclusion logic to hooke.plugin
[hooke.git] / hooke / plugin / __init__.py
index bd85e3cab9eaa162a0a89ad396ca25c6d22a3790..b9e7988253342a3e061680d53c09a36bd804350a 100644 (file)
-#!/usr/bin/env python\r
-'''\r
-Commands and settings panel for Hooke\r
-\r
-Displays commands and settings for Hooke in a tree control\r
-(c) Dr. Rolf Schmidt, 2009\r
-'''\r
-\r
-from configobj import ConfigObj\r
-import os.path\r
-from validate import Validator\r
-import wx\r
-\r
-import libhooke as lh\r
-\r
-class Commands(wx.Panel):\r
-\r
-    def __init__(self, parent):\r
-        # Use the WANTS_CHARS style so the panel doesn't eat the Return key.\r
-        wx.Panel.__init__(self, parent, -1, style=wx.WANTS_CHARS|wx.NO_BORDER, size=(160, 200))\r
-\r
-        self.CommandsTree = wx.TreeCtrl(self, -1, wx.Point(0, 0), wx.Size(160, 250), wx.TR_DEFAULT_STYLE|wx.NO_BORDER|wx.TR_HIDE_ROOT)\r
-        imglist = wx.ImageList(16, 16, True, 2)\r
-        imglist.Add(wx.ArtProvider.GetBitmap(wx.ART_FOLDER, wx.ART_OTHER, wx.Size(16, 16)))\r
-        imglist.Add(wx.ArtProvider.GetBitmap(wx.ART_EXECUTABLE_FILE, wx.ART_OTHER, wx.Size(16, 16)))\r
-        self.CommandsTree.AssignImageList(imglist)\r
-        self.CommandsTree.AddRoot('Commands and Settings', 0)\r
-\r
-        self.ExecuteButton = wx.Button(self, -1, 'Execute')\r
-\r
-        sizer = wx.BoxSizer(wx.VERTICAL)\r
-        sizer.Add(self.CommandsTree, 1, wx.EXPAND)\r
-        sizer.Add(self.ExecuteButton, 0, wx.EXPAND)\r
-\r
-        self.SetSizer(sizer)\r
-        sizer.Fit(self)\r
-\r
-    def Initialize(self, plugins):\r
-        tree_root = self.CommandsTree.GetRootItem()\r
-        for plugin in plugins:\r
-            filename = ''.join([plugin, '.ini'])\r
-            path = lh.get_file_path(filename, ['plugins'])\r
-            config = ConfigObj()\r
-            if os.path.isfile(path):\r
-                config.filename = path\r
-                config.reload()\r
-                #append the ini file to the plugin\r
-                plugin_root = self.CommandsTree.AppendItem(tree_root, plugin, 0, data=wx.TreeItemData(config))\r
-            else:\r
-                plugin_root = self.CommandsTree.AppendItem(tree_root, plugin, 0)\r
-\r
-            #add all commands to the tree\r
-            for command in plugins[plugin]:\r
-                command_label = command.replace('do_', '')\r
-                #do not add the ini file to the command (we'll access the ini file of the plugin (ie parent) instead, see above)\r
-                self.CommandsTree.AppendItem(plugin_root, command_label, 1)\r
-            self.CommandsTree.Expand(plugin_root)\r
+#!/usr/bin/env python
+"""The plugin module provides optional submodules that add new Hooke
+commands.
+
+All of the science happens in here.
+"""
+
+import os.path
+
+from ..config import Setting
+from ..util.graph import Node, Graph
+
+PLUGIN_MODULES = [
+    ('autopeak', True),
+    ('curvetools', True),
+    ('cut', True),
+    ('fit', True),
+    ('flatfilts-rolf', True),
+    ('flatfilts', True),
+    ('generalclamp', True),
+    ('generaltccd', True),
+    ('generalvclamp', True),
+    ('jumpstat', True),
+    ('macro', True),
+    ('massanalysis', True),
+    ('multidistance', True),
+    ('multifit', True),
+    ('pcluster', True),
+    ('procplots', True),
+    ('review', True),
+    ('showconvoluted', True),
+    ('superimpose', True),
+    ('tutorial', True),
+    ('viewer', True),
+    ]
+"""List of plugin modules and whether they should be included by
+default.
+"""
+
+def Plugin (object):
+    """The pluggable collection of Hooke commands.
+
+    Fulfills the same role for Hooke that a software package does for
+    an operating system.
+    """
+    def dependencies(self):
+        """Return a list of Plugins we require."""
+        return []
+    def commands(self):
+        """Return a list of Commands provided."""
+        return []
+    def default_settings(self):
+        """Return a list of hooke.config.Settings() for any
+        configurable module settings."""
+        return []
+
+PLUGINS = {}
+"""(name,instance) :class:`dict` of all possible :class:`Plugin`\s.
+"""
+
+print __name__
+for plugin_modname,value in PLUGIN_MODULES:
+    this_mod = __import__(__name__, fromlist=[plugin_modname])
+    plugin_mod = getattr(this_mod, plugin_modname)
+    for objname in dir(plugin_mod):
+        obj = getattr(plugin_mod, objname)
+        if type(obj) == Plugin:
+            obj.module_name = plugin_modname
+            PLUGINS[p.name] = p
+
+PLUGIN_GRAPH = Graph([Node(
+            [PLUGINS[name] for name in p.dependencies()]
+            )])
+PLUGIN_GRAPH.topological_sort()
+
+#class Commands(wx.Panel):
+#
+#    def __init__(self, parent):
+#        # Use the WANTS_CHARS style so the panel doesn't eat the Return key.
+#        wx.Panel.__init__(self, parent, -1, style=wx.WANTS_CHARS|wx.NO_BORDER, size=(160, 200))
+#
+#        self.CommandsTree = wx.TreeCtrl(self, -1, wx.Point(0, 0), wx.Size(160, 250), wx.TR_DEFAULT_STYLE|wx.NO_BORDER|wx.TR_HIDE_ROOT)
+#        imglist = wx.ImageList(16, 16, True, 2)
+#        imglist.Add(wx.ArtProvider.GetBitmap(wx.ART_FOLDER, wx.ART_OTHER, wx.Size(16, 16)))
+#        imglist.Add(wx.ArtProvider.GetBitmap(wx.ART_EXECUTABLE_FILE, wx.ART_OTHER, wx.Size(16, 16)))
+#        self.CommandsTree.AssignImageList(imglist)
+#        self.CommandsTree.AddRoot('Commands and Settings', 0)
+#
+#        self.ExecuteButton = wx.Button(self, -1, 'Execute')
+#
+#        sizer = wx.BoxSizer(wx.VERTICAL)
+#        sizer.Add(self.CommandsTree, 1, wx.EXPAND)
+#        sizer.Add(self.ExecuteButton, 0, wx.EXPAND)
+#
+#        self.SetSizer(sizer)
+#        sizer.Fit(self)
+#
+#    def Initialize(self, plugins):
+#        tree_root = self.CommandsTree.GetRootItem()
+#        for plugin in plugins:
+#            filename = ''.join([plugin, '.ini'])
+#            path = lh.get_file_path(filename, ['plugins'])
+#            config = ConfigObj()
+#            if os.path.isfile(path):
+#                config.filename = path
+#                config.reload()
+#                #append the ini file to the plugin
+#                plugin_root = self.CommandsTree.AppendItem(tree_root, plugin, 0, data=wx.TreeItemData(config))
+#            else:
+#                plugin_root = self.CommandsTree.AppendItem(tree_root, plugin, 0)
+#
+#            #add all commands to the tree
+#            for command in plugins[plugin]:
+#                command_label = command.replace('do_', '')
+#                #do not add the ini file to the command (we'll access the ini file of the plugin (ie parent) instead, see above)
+#                self.CommandsTree.AppendItem(plugin_root, command_label, 1)
+#            self.CommandsTree.Expand(plugin_root)
+
+def default_settings(self):
+    settings = [Setting(
+            'plugins', help='Enable/disable default plugins.')]
+    for pnode in PLUGIN_GRAPH:
+        settings.append(Setting(p.name, str(PLUGIN_MODULES[p.module_name][1])))      
+    for pnode in PLUGIN_GRAPH:
+        plugin = pnode.data
+        settings.extend(plugin.default_settings())
+    return settings
+
+class Command (object):
+    pass