diff options
| author | Huang Peng <shawn.p.huang@gmail.com> | 2008-06-24 10:32:48 +0800 |
|---|---|---|
| committer | Huang Peng <shawn.p.huang@gmail.com> | 2008-06-24 10:32:48 +0800 |
| commit | e78200efea42e564d5aefef76627450a7988024f (patch) | |
| tree | f949007e0ba2081466c9e7369bb0ff8c437ab15e /panel/menu.py | |
| parent | 15770e7875d9ab79d950f0e1828f9e9e3ff8e16b (diff) | |
| download | ibus-e78200efea42e564d5aefef76627450a7988024f.tar.gz ibus-e78200efea42e564d5aefef76627450a7988024f.tar.xz ibus-e78200efea42e564d5aefef76627450a7988024f.zip | |
WIP property.
Diffstat (limited to 'panel/menu.py')
| -rw-r--r-- | panel/menu.py | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/panel/menu.py b/panel/menu.py index f57cc95..75cf914 100644 --- a/panel/menu.py +++ b/panel/menu.py @@ -19,6 +19,140 @@ # Free Software Foundation, Inc., 59 Temple Place, Suite 330, # Boston, MA 02111-1307 USA +import gtk +import gobject +import ibus + +class Menu (gtk.Menu): + __gsignals__ = { + "property-activate" : ( + gobject.SIGNAL_RUN_FIRST, + gobject.TYPE_NONE, + (gobject.TYPE_STRING, gobject.TYPE_INT)), + } + + def __init__ (self, prop): + self._prop = prop + self._items = [] + gtk.Menu.__init__ (self) + self.set_take_focus (False) + self._create_items (self._prop.get_sub_props ()) + self.show_all () + + def _create_items (self, props): + radio_group = None + + for prop in props: + if prop._type == ibus.PROP_TYPE_NORMAL: + item = gtk.ImageMenuItem (prop) + elif prop._type == ibus.PROP_TYPE_TOGGLE: + item = CheckMenuItem (prop) + elif prop._type == ibus.PROP_TYPE_RADIO: + item = RadioMenuItem (radio_group, prop) + radio_group = item + elif prop._type == ibus.PROP_TYPE_SEPARATOR: + item = SeparatorMenuItem () + radio_group = None + elif prop._type == ibus.PROP_TYPE_MENU: + item = gtk.ImageMenuItem (prop) + item.set_submenu (Menu (prop)) + else: + assert Fasle + + item.set_sensitive (prop._sensitive) + item.set_no_show_all (True) + if prop._visible: + item.show () + else: + item.hide () + + item.connect ("property-activate", lambda w,n,s: self.emit ("property-activate", n, s)) + + self.append (item) + self._items.append (item) + + def popup (self, button, active_time, widget): + gtk.Menu.popup (self, None, None, menu_position, + button, active_time, widget) + + def _property_clicked (self, item, prop): + pass + + +class ImageMenuItem (gtk.ImageMenuItem): + __gsignals__ = { + "property-activate" : ( + gobject.SIGNAL_RUN_FIRST, + gobject.TYPE_NONE, + (gobject.TYPE_STRING, gobject.TYPE_INT)), + } + + def __init__ (self, prop): + self._prop = prop + gtk.ImageMenuItem.__init__ (self, label = prop._label) + if prop._icon: + self.set_image (gtk.image_new_from_icon_name (prop._icon, gtk.ICON_SIZE_MENU)) + + def do_activate (self): + self.emit ("property-activate", self._prop._name, self._prop._state) + + +class CheckMenuItem (gtk.CheckMenuItem): + __gsignals__ = { + "property-activate" : ( + gobject.SIGNAL_RUN_FIRST, + gobject.TYPE_NONE, + (gobject.TYPE_STRING, gobject.TYPE_INT)), + } + + def __init__ (self, prop): + self._prop = prop + gtk.CheckMenuItem.__init__ (self, label = prop._label) + self.set_active (prop._state == ibus.PROP_STATE_CHECKED) + + def do_toggled (self): + if self.get_active (): + self._prop._state = ibus.PROP_STATE_CHECKED + else: + self._prop._state = ibus.PROP_STATE_UNCHECKED + self.emit ("property-activate", self._prop._name, self._prop._state) + + +class RadioMenuItem (gtk.RadioMenuItem): + __gsignals__ = { + "property-activate" : ( + gobject.SIGNAL_RUN_FIRST, + gobject.TYPE_NONE, + (gobject.TYPE_STRING, gobject.TYPE_INT)), + } + + def __init__ (self, group, prop): + self._prop = prop + gtk.RadioMenuItem.__init__ (self, group, label = prop._label) + self.set_active (prop._state == ibus.PROP_STATE_CHECKED) + + def do_toggled (self): + if self.get_active (): + self._prop._state = ibus.PROP_STATE_CHECKED + else: + self._prop._state = ibus.PROP_STATE_UNCHECKED + self.emit ("property-activate", self._prop._name, self._prop._state) + +class SeparatorMenuItem (gtk.SeparatorMenuItem): + __gsignals__ = { + "property-activate" : ( + gobject.SIGNAL_RUN_FIRST, + gobject.TYPE_NONE, + (gobject.TYPE_STRING, gobject.TYPE_INT)), + } + + +gobject.type_register (Menu, "IBusMenu") +gobject.type_register (ImageMenuItem, "IBusImageMenuItem") +gobject.type_register (CheckMenuItem, "IBusCheckMenuItem") +gobject.type_register (RadioMenuItem, "IBusRadioMenuItem") +gobject.type_register (SeparatorMenuItem, "IBusSeparatorMenuItem") + def menu_position (menu, button): screen = button.get_screen () monitor = screen.get_monitor_at_window (button.window) |
