hooke.ui.gui was getting complicated, so I stripped it down for a moment.
[hooke.git] / hooke / ui / __init__.py
index 778eadfab8d3b6e27bd16f0d836e53b556701da9..47f97351d2f747bbaca71c30470e0e3fe64d5ed4 100644 (file)
@@ -1,17 +1,34 @@
+# Copyright (C) 2010 W. Trevor King <wking@drexel.edu>
+#
+# This file is part of Hooke.
+#
+# Hooke is free software: you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation, either
+# version 3 of the License, or (at your option) any later version.
+#
+# Hooke is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with Hooke.  If not, see
+# <http://www.gnu.org/licenses/>.
+
 """The `ui` module provides :class:`UserInterface` and various subclasses.
 """
 
 import ConfigParser as configparser
 
 from .. import version
-from ..compat.odict import odict
 from ..config import Setting
-from ..plugin import IsSubclass
+from ..util.pluggable import IsSubclass, construct_odict
 
 
 USER_INTERFACE_MODULES = [
     'commandline',
-    #'gui',
+    'gui',
     ]
 """List of user interface modules.  TODO: autodiscovery
 """
@@ -20,6 +37,7 @@ USER_INTERFACE_SETTING_SECTION = 'user interfaces'
 """Name of the config section which controls UI selection.
 """
 
+
 class QueueMessage (object):
     def __str__(self):
         return self.__class__.__name__
@@ -33,8 +51,10 @@ class CommandMessage (QueueMessage):
     a :class:`dict` with `argname` keys and `value` values to be
     passed to the command.
     """
-    def __init__(self, command, arguments):
+    def __init__(self, command, arguments=None):
         self.command = command
+        if arguments == None:
+            arguments = {}
         self.arguments = arguments
 
 class UserInterface (object):
@@ -42,9 +62,9 @@ class UserInterface (object):
     """
     def __init__(self, name):
         self.name = name
-        self.setting_section = '%s user interface' % self.name
+        self.setting_section = '%s user interface' % (self.name)
         self.config = {}
-    
+
     def default_settings(self):
         """Return a list of :class:`hooke.config.Setting`\s for any
         configurable UI settings.
@@ -55,14 +75,26 @@ class UserInterface (object):
         """
         return []
 
-    def run(self, hooke, ui_to_command_queue, command_to_ui_queue):
+    def reload_config(self, config):
+        """Update the user interface for new config settings.
+
+        Should be called with the new `config` upon recipt of
+        `ReloadUserInterfaceConfig` from the `CommandEngine` or when
+        loading the initial configuration.
+        """
+        try:
+            self.config = dict(config.items(self.setting_section))
+        except configparser.NoSectionError:
+            self.config = {}
+
+    def run(self, commands, ui_to_command_queue, command_to_ui_queue):
         return
 
     # Assorted useful tidbits for subclasses
 
     def _splash_text(self):
         return ("""
-This is Hooke, version %s
+Hooke version %s
 
 COPYRIGHT
 ----
@@ -75,27 +107,6 @@ COPYRIGHT
         return 'The playlist %s does not contain any valid force curve data.' \
             % self.name
 
-def construct_odict(this_modname, submodnames, class_selector):
-    """Search the submodules `submodnames` of a module `this_modname`
-    for class objects for which `class_selector(class)` returns
-    `True`.  These classes are instantiated and stored in the returned
-    :class:`hooke.compat.odict.odict` in the order in which they were
-    discovered.
-    """
-    instances = odict()
-    for submodname in submodnames:
-        count = len([s for s in submodnames if s == submodname])
-        assert count > 0, 'No %s entries: %s' % (submodname, submodnames)
-        assert count == 1, 'Multiple (%d) %s entries: %s' \
-            % (count, submodname, submodnames)
-        this_mod = __import__(this_modname, fromlist=[submodname])
-        submod = getattr(this_mod, submodname)
-        for objname in dir(submod):
-            obj = getattr(submod, objname)
-            if class_selector(obj):
-                instance = obj()
-                instances[instance.name] = instance
-    return instances
 
 USER_INTERFACES = construct_odict(
     this_modname=__name__,
@@ -117,13 +128,11 @@ def default_settings():
         settings.extend(ui.default_settings())
     return settings
 
-def load_ui(config):
-    uis = [c for c,v in config.items(USER_INTERFACE_SETTING_SECTION) if v == 'True']
-    assert len(uis) == 1, 'Can only select one UI, not %d: %s' % (len(uis),uis)
-    ui_name = uis[0]
-    ui = USER_INTERFACES[ui_name]
-    try:
-        ui.config = dict(config.items(ui.setting_section))
-    except configparser.NoSectionError:
-        pass
+def load_ui(config, name=None):
+    if name == None:
+        uis = [c for c,v in config.items(USER_INTERFACE_SETTING_SECTION) if v == 'True']
+        assert len(uis) == 1, 'Can only select one UI, not %d: %s' % (len(uis),uis)
+        name = uis[0]
+    ui = USER_INTERFACES[name]
+    ui.reload_config(config)
     return ui