diff options
-rw-r--r-- | pyanaconda/ui/__init__.py | 38 | ||||
-rw-r--r-- | pyanaconda/ui/gui/__init__.py | 11 |
2 files changed, 44 insertions, 5 deletions
diff --git a/pyanaconda/ui/__init__.py b/pyanaconda/ui/__init__.py index 128f67c56..4fafd4971 100644 --- a/pyanaconda/ui/__init__.py +++ b/pyanaconda/ui/__init__.py @@ -19,6 +19,8 @@ # Red Hat Author(s): Chris Lumens <clumens@redhat.com> # +__all__ = ["UserInterface", "collect"] + class UserInterface(object): """This is the base class for all kinds of install UIs. It primarily defines what kinds of dialogs and entry widgets every interface must @@ -92,3 +94,39 @@ class UserInterface(object): want to overwhelm the user with choices. """ raise NotImplementedError + + def getActionClasses(module_pattern, path, hubs, standalone_class): + standalones = collect(module_pattern, path, lambda obj: issubclass(obj, standalone_class) and \ + getattr(obj, "preForHub", False) or getattr(obj, "postForHub", False)) + + actionClasses = [] + for hub in hubs: + actionClasses.extend(sorted(filter(lambda obj: getattr(obj, "preForHub", None) == hub, standalones), + key=lambda obj: obj.priority)) + actionClasses.append(hub) + actionClasses.extend(sorted(filter(lambda obj: getattr(obj, "postForHub", None) == hub, standalones), + key=lambda obj: obj.priority)) + + return actionClasses + +def collect(module_pattern, path, pred): + """Traverse the directory (given by path) and find all classes that match + the given predicate. This is then returned as a list of classes. + + It is suggested you use collect_categories or collect_spokes instead of + this lower-level method. + """ + retval = [] + for module_file in os.listdir(path): + if not module_file.endswith(".py") or module_file == "__init__.py": + continue + + mod_name = module_file[:-3] + module = importlib.import_module(module_pattern % mod_name)) + + p = lambda obj: inspect.isclass(obj) and pred(obj) + + for (name, val) in inspect.getmembers(module, p): + retval.append(val) + + return retval diff --git a/pyanaconda/ui/gui/__init__.py b/pyanaconda/ui/gui/__init__.py index 3d2fff9f7..8cdc16849 100644 --- a/pyanaconda/ui/gui/__init__.py +++ b/pyanaconda/ui/gui/__init__.py @@ -53,8 +53,9 @@ class GraphicalUserInterface(UserInterface): self._hubs.extend([SummaryHub, ProgressHub]) # First, grab a list of all the standalone spokes. - standalones = collect("spokes", lambda obj: issubclass(obj, StandaloneSpoke) and \ - getattr(obj, "preForHub", False) or getattr(obj, "postForHub", False)) + path = os.path.join(os.path.dirname(__file__), "spokes") + standalones = collect("pyanaconda.ui.gui.spokes.%s", path, lambda obj: issubclass(obj, StandaloneSpoke) and \ + getattr(obj, "preForHub", False) or getattr(obj, "postForHub", False)) actionClasses = [] for hub in self._hubs: @@ -396,7 +397,7 @@ class QuitDialog(UIObject): rc = self.window.run() return rc -def collect(subpath, pred): +def collect(module_pattern, path, pred): """Traverse the subdirectory (given by subpath) of this module's current directory and find all classes that math the given category. This is then returned as a list of classes. If category is None, this method @@ -406,12 +407,12 @@ def collect(subpath, pred): this lower-level method. """ retval = [] - for module_file in os.listdir(os.path.dirname(__file__) + "/" + subpath): + for module_file in os.listdir( + "/" + subpath): if not module_file.endswith(".py") or module_file in [__file__, "__init__.py"]: continue mod_name = module_file[:-3] - module = importlib.import_module("pyanaconda.ui.gui.%s.%s" % (subpath, mod_name)) + module = importlib.import_module(module_pattern % mod_name)) p = lambda obj: inspect.isclass(obj) and pred(obj) |