From f0089093bf2a012094956aa6f66c3f3cb8442ab2 Mon Sep 17 00:00:00 2001 From: Huang Peng Date: Fri, 27 Jun 2008 15:09:38 +0800 Subject: [PATCH] WIP. --- panel/languagebar.py | 52 ++++++++++++++----------------- panel/panel.py | 4 ++- panel/toolitem.py | 88 +++++++++++++++++++++++++++++++++++++++------------- 3 files changed, 92 insertions(+), 52 deletions(-) diff --git a/panel/languagebar.py b/panel/languagebar.py index 75c5426..7e9d380 100644 --- a/panel/languagebar.py +++ b/panel/languagebar.py @@ -28,6 +28,7 @@ from handle import Handle from menu import menu_position from toolitem import ToolButton,\ ToggleToolButton, \ + SeparatorToolItem, \ MenuToolButton ICON_SIZE = gtk.ICON_SIZE_MENU @@ -49,7 +50,7 @@ class LanguageBar (gtk.Toolbar): self.set_property ("icon-size", ICON_SIZE) self._create_ui () - self._properties = {} + self._properties = [] self._toplevel = gtk.Window (gtk.WINDOW_POPUP) self._toplevel.add (self) @@ -64,7 +65,7 @@ class LanguageBar (gtk.Toolbar): self.insert (self._handle, -1) # create input methods menu - self._im_menu = ToggleToolButton (icon = "engine-default", tooltip = "Swicth engine") + self._im_menu = ToggleToolButton (ibus.Property (name = "", type = ibus.PROP_TYPE_TOGGLE, icon = "engine-default", tooltip = "Swicth engine")) self._im_menu.connect ("toggled", self._im_menu_toggled_cb) self.insert (self._im_menu, -1) @@ -82,11 +83,9 @@ class LanguageBar (gtk.Toolbar): def _remove_properties (self): # reset all properties - for name, props in self._properties.items (): - for prop, widget in props: - widget.hide () - widget.destroy () - self._properties = {} + + map (lambda i: i.destroy (), self._properties) + self._properties = [] self.check_resize () def do_show (self): @@ -115,40 +114,35 @@ class LanguageBar (gtk.Toolbar): # create new properties for prop in props: if prop._type == ibus.PROP_TYPE_NORMAL: - widget = ToolButton (prop = prop) - widget.connect ("property-activate", - lambda w, n, s: self.emit ("property-activate", n, s)) + item = ToolButton (prop = prop) elif prop._type == ibus.PROP_TYPE_TOGGLE: - widget = ToggleToolButton (prop = prop) - widget.connect ("property-activate", - lambda w, n, s: self.emit ("property-activate", n, s)) + item = ToggleToolButton (prop = prop) elif prop._type == ibus.PROP_TYPE_MENU: - widget = MenuToolButton (prop = prop) - widget.connect ("property-activate", - lambda w, n, s: self.emit ("property-activate", n, s)) + item = MenuToolButton (prop = prop) elif prop._type == PROP_TYPE_SEPARATOR: - widget = gtk.SeparatorToolItem () + item = SeparatorToolItem () else: - widget = gtk.ToolItem () + raise IBusException ("Unknown property type = %d" % prop._type) - widget.set_sensitive (prop._sensitive) + item.connect ("property-activate", + lambda w, n, s: self.emit ("property-activate", n, s)) + + item.set_sensitive (prop._sensitive) + + item.set_no_show_all (True) - widget.set_no_show_all (True) if prop._visible: - widget.show () + item.show () else: - widget.hide () - - if not self._properties.has_key (prop._name): - self._properties [prop._name] = [] + item.hide () - self._properties [prop._name].append ((prop, widget)) - self.insert (widget, -1) + self._properties.append (item) + self.insert (item, -1) self.check_resize () - def update_properties (self, props): - pass + def update_property (self, prop): + map (lambda x: x.update_property (prop), self._properties) def show_all (self): self._toplevel.show_all () diff --git a/panel/panel.py b/panel/panel.py index 303c9c2..1c466c1 100644 --- a/panel/panel.py +++ b/panel/panel.py @@ -112,8 +112,10 @@ class Panel (ibus.Object): def focus_in (self, ic): self.reset () self._focus_ic = ic + factory, enabled = self._ibus.GetInputContextStates (ic) - if not enabled: + + if factory == "" or not enabled: self._set_im_icon ("engine-default") else: name, lang, icon, authors, credits = self._ibus.GetFactoryInfo (factory) diff --git a/panel/toolitem.py b/panel/toolitem.py index c65cf71..a6d542d 100644 --- a/panel/toolitem.py +++ b/panel/toolitem.py @@ -25,7 +25,48 @@ import gobject import ibus from menu import * -class ToolButton (gtk.ToolButton): +class ToolItem: + def __init__ (self, prop): + self._prop = prop + self._sub_itmes = [] + + def update_property (self, prop): + if self._prop == None: + return False + + retval = False + + if self._prop._name == prop._name and self._prop._type == prop._type: + self._prop = prop + self.property_changed () + retval = True + + if any (map (lambda i: i.update_property (prop), self._sub_itmes)): + retval = True + + return retval + + def set_prop_label (self, label): + self._prop._label = label + self.property_changed () + + def set_icon (self, icon): + self._prop._icon = icon + self.property_changed () + + def set_tooltip (self, tooltip): + self._prop._tooltip = tooltip + self.property_changed () + + def set_state (self, state): + self._prop._state = state + self.property_changed () + + def property_changed (self): + pass + + +class ToolButton (gtk.ToolButton, ToolItem): __gsignals__ = { "property-activate" : ( gobject.SIGNAL_RUN_FIRST, @@ -33,16 +74,14 @@ class ToolButton (gtk.ToolButton): (gobject.TYPE_STRING, gobject.TYPE_INT)), } - def __init__ (self, label = None, icon = None, tooltip = None, prop = None): - if prop == None: - prop = ibus.Property (name= "", type = ibus.PROP_TYPE_NORMAL, - label = label, icon = icon, tooltip = tooltip) - self._prop = prop - + def __init__ (self, prop): gtk.ToolButton.__init__ (self, label = prop._label) + ToolItem.__init__ (self, prop) + self.set_icon_name (prop._icon) self.set_tooltip_text (prop._tooltip) self.set_sensitive (prop._sensitive) + if prop._visible: self.set_no_show_all (False) self.show_all () @@ -69,11 +108,16 @@ class ToolButton (gtk.ToolButton): self._prop._tooltip = text + def property_changed (self): + self.set_icon_name (self._prop._icon) + self.set_tooltip_text (self._prop._tooltip) + self.set_label (self._prop._label) + def do_clicked (self): self.emit ("property-activate", self._prop._name, self._prop._state) -class ToggleToolButton (gtk.ToggleToolButton): +class ToggleToolButton (gtk.ToggleToolButton, ToolItem): __gsignals__ = { "property-activate" : ( gobject.SIGNAL_RUN_FIRST, @@ -81,13 +125,10 @@ class ToggleToolButton (gtk.ToggleToolButton): (gobject.TYPE_STRING, gobject.TYPE_INT)), } - def __init__ (self, label = None, icon = None, tooltip = None, state = ibus.PROP_STATE_UNCHECKED, prop = None): - if prop == None: - prop = ibus.Property (name = "", type = ibus.PROP_TYPE_TOGGLE, - label = label, icon = icon, tooltip = tooltip, state = state) - self._prop = prop - + def __init__ (self, prop): gtk.ToggleToolButton.__init__ (self) + ToolItem.__init__ (self, prop) + self.set_label (prop._label) self.set_icon_name (prop._icon) self.set_tooltip_text (prop._tooltip) @@ -118,12 +159,11 @@ class ToggleToolButton (gtk.ToggleToolButton): self._prop._tooltip = text - def set_state (self, state): - self.set_active (state == ibus.PROP_STATE_CHECKED) - self._prop._state = state - - def get_state (self): - return self._prop._state + def property_changed (self): + self.set_icon_name (self._prop._icon) + self.set_tooltip_text (self._prop._tooltip) + self.set_label (self._prop._label) + self.set_active (self._prop._state == ibus.PROP_STATE_CHECKED) def do_toggled (self): if self.get_active (): @@ -132,6 +172,10 @@ class ToggleToolButton (gtk.ToggleToolButton): self._prop._state = ibus.PROP_STATE_UNCHECKED self.emit ("property-activate", self._prop._name, self._prop._state) +class SeparatorToolItem (gtk.SeparatorToolItem, ToolItem): + def __init__ (self, prop): + gtk.SeparatorToolItem.__init__ (self) + ToolItem.__init__ (self, prop) class MenuToolButton (ToggleToolButton): # __gsignals__ = { @@ -141,8 +185,8 @@ class MenuToolButton (ToggleToolButton): # (gobject.TYPE_STRING, gobject.TYPE_INT)), # } - def __init__ (self, label = None, icon = None, toolip = None, prop = None): - ToggleToolButton.__init__ (self, label = label, icon = icon, tooltip = None, prop = prop) + def __init__ (self, prop): + ToggleToolButton.__init__ (self, prop) self._menu = Menu (prop) self._menu.connect ("deactivate", lambda m: self.set_active (False)) self._menu.connect ("property-activate", lambda w,n,s: self.emit ("property-activate", n, s)) -- 2.11.4.GIT