summaryrefslogtreecommitdiffstats
path: root/panel/menu.py
diff options
context:
space:
mode:
authorHuang Peng <shawn.p.huang@gmail.com>2008-06-24 10:32:48 +0800
committerHuang Peng <shawn.p.huang@gmail.com>2008-06-24 10:32:48 +0800
commite78200efea42e564d5aefef76627450a7988024f (patch)
treef949007e0ba2081466c9e7369bb0ff8c437ab15e /panel/menu.py
parent15770e7875d9ab79d950f0e1828f9e9e3ff8e16b (diff)
downloadibus-e78200efea42e564d5aefef76627450a7988024f.tar.gz
ibus-e78200efea42e564d5aefef76627450a7988024f.tar.xz
ibus-e78200efea42e564d5aefef76627450a7988024f.zip
WIP property.
Diffstat (limited to 'panel/menu.py')
-rw-r--r--panel/menu.py134
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)