From 98ac2d8800545090bdf2c2fa851eea69f36e508f Mon Sep 17 00:00:00 2001 From: Enrico Zini Date: Mon, 15 Jun 2009 16:53:14 +0800 Subject: [PATCH] Test adding of toggle actions --- zavai/__init__.py | 2 +- zavai/app.py | 16 +++++++++++----- zavai/menu.py | 28 ++++++++++++++++++++++------ zavai/registry.py | 21 +++++++++++++++++++++ 4 files changed, 55 insertions(+), 12 deletions(-) diff --git a/zavai/__init__.py b/zavai/__init__.py index 0acc477..1a3b58a 100644 --- a/zavai/__init__.py +++ b/zavai/__init__.py @@ -19,7 +19,7 @@ from conf import read_config from plugins import load_plugins from registry import Registry, Resource, get_parent -from menu import Menu, MenuButton, LinkButton +from menu import Menu, MenuButton, LinkButton, ToggleButton from app import Zavai, Applet from gps import GPS, GPX diff --git a/zavai/app.py b/zavai/app.py index 537ff85..29311de 100644 --- a/zavai/app.py +++ b/zavai/app.py @@ -26,9 +26,18 @@ class Zavai(gtk.Window, zavai.Resource): super(Zavai, self).__init__() self.registry = registry self.current = None - self.show_widget("menu.main") + self.activate_resource("menu.main") - def show_widget(self, name): + def activate_resource(self, name): + widget = self.registry.resource(name) + if widget is None: + widget = self.registry.resource("menu.main") + if isinstance(widget, gtk.Action): + widget.activate() + else: + self.show_widget(name, widget) + + def show_widget(self, name, widget): # Remove the current widget. # If it is an Applet, stop it if self.current is not None: @@ -39,9 +48,6 @@ class Zavai(gtk.Window, zavai.Resource): self.current = None # Add the new widget. If it is an applet, start it - widget = self.registry.resource(name) - if widget is None: - widget = self.registry.resource("menu.main") self.add(widget) self.current = name if isinstance(widget, zavai.Applet): diff --git a/zavai/menu.py b/zavai/menu.py index 424ee07..629495a 100644 --- a/zavai/menu.py +++ b/zavai/menu.py @@ -42,11 +42,27 @@ class Menu(gtk.VBox, zavai.Resource): self.vbox.pack_start(widget, False, False) class LinkButton(MenuButton, zavai.Resource): - def __init__(self, registry, targetName, label): - super(LinkButton, self).__init__(label) - self.target = targetName - self.registry = registry - self.connect("clicked", self.on_click) + def __init__(self, registry, targetName, label=None, action=None): + if action is not None: + super(LinkButton, self).__init__() + self.target = targetName + self.registry = registry + self.action = action + action.connect_proxy(self) + self.connect("clicked", self.on_click) + else: + super(LinkButton, self).__init__(label) + self.target = targetName + self.registry = registry + self.action = None + self.connect("clicked", self.on_click) def on_click(self, *args): - self.registry.resource("app").show_widget(self.target) + self.registry.resource("app").activate_resource(self.target) + +class ToggleButton(gtk.ToggleButton): + def __init__(self, registry, targetName, action, *args, **kw): + super(ToggleButton, self).__init__() + # TODO: take this from the configuration + self.set_size_request(0, 80) + action.connect_proxy(self) diff --git a/zavai/registry.py b/zavai/registry.py index ac46759..63e9412 100644 --- a/zavai/registry.py +++ b/zavai/registry.py @@ -17,6 +17,7 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import zavai +import gtk def get_parent(s): "Get the parent name for s" @@ -74,6 +75,26 @@ class Registry(object): if name.startswith("menu."): self.add_to_menu(name) + def register_action(self, name, obj): + """Register an object at the given path. + + Name the path to this object, like "menu.gps.monitor". + """ + if name in self.objects: + return KeyError("%s is already registered", name) + zavai.info("Registering action", name) + self.objects[name] = obj + + if name.startswith("menu."): + parent = get_parent(name) + if parent is not None: + zavai.info("Add action to menu", name, parent) + menu = self.menu(parent) + if isinstance(obj, gtk.ToggleAction): + menu.add_child(zavai.ToggleButton(self, name, action=obj)) + else: + menu.add_child(zavai.LinkButton(self, name, action=obj)) + def add_to_menu(self, name): "Add the applet with the given name to the menu structure" parent = get_parent(name) -- 2.30.2