#!/usr/bin/env python
-'''
-Commands and settings panel for Hooke
+"""The plugin module provides optional submodules that add new Hooke
+commands.
-Displays commands and settings for Hooke in a tree control
-(c) Dr. Rolf Schmidt, 2009
-'''
+All of the science happens in here.
+"""
-from configobj import ConfigObj
import os.path
-from validate import Validator
-import wx
-
-import libhooke as lh
-
-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)
+
+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