WIP.
authorHuang Peng <shawn.p.huang@gmail.com>
Fri, 27 Jun 2008 13:43:32 +0000 (21:43 +0800)
committerHuang Peng <shawn.p.huang@gmail.com>
Fri, 27 Jun 2008 13:43:32 +0000 (21:43 +0800)
12 files changed:
daemon/bus.py
daemon/panel.py
engine/anthy/engine.py
ibus/interface/iengine.py
ibus/interface/iibus.py
ibus/property.py
panel/Makefile.am
panel/languagebar.py
panel/menu.py
panel/panel.py
panel/propitem.py [new file with mode: 0644]
panel/toolitem.py

index 7cb1854..d882093 100644 (file)
@@ -290,10 +290,13 @@ class IBus (ibus.Object):
                factory = self._factory_manager.get_factory (factory_path)
                engine = factory.create_engine ()
                self._focused_context.set_engine (engine)
+               engine.focus_in ()
 
        def get_input_context_states (self, ic, dbusconn):
                context = self._lookup_context (ic, dbusconn)
-               factory_path = "" if context.get_factory () == None else context.get_factory ().get_object_path ()
+               factory_path = ""
+               if context.get_factory () != None:
+                       factory_path = context.get_factory ().get_object_path ()
                return factory_path, context.is_enabled ()
 
 
index 9189702..ef43e27 100644 (file)
@@ -85,7 +85,7 @@ class Panel (ibus.Object):
                                **ibus.DEFAULT_ASYNC_HANDLERS)
 
        def update_property (self, prop):
-               self._panel.UpdateProperties (prop,
+               self._panel.UpdateProperty (prop,
                                **ibus.DEFAULT_ASYNC_HANDLERS)
 
        def show_language_bar (self):
index 8bbb60c..ed8a0ac 100644 (file)
@@ -29,6 +29,13 @@ import anthy
 from tables import *
 from ibus import keysyms
 from ibus import interface
+MODE_HIRAGANA, \
+MODE_KATAKANA, \
+MODE_HALF_WIDTH_KATAKANA, \
+MODE_LATIN, \
+MODE_WIDE_LATIN = range (0, 5)
+
+_ = lambda a: a
 
 class Engine (interface.IEngine):
        def __init__ (self, dbusconn, object_path):
@@ -39,6 +46,10 @@ class Engine (interface.IEngine):
                self._context = anthy.anthy_context ()
                self._context._set_encoding (anthy.ANTHY_UTF8_ENCODING)
 
+               # init state
+               self._input_mode = MODE_HIRAGANA
+               self._prop_dict = {}
+
                self._lookup_table = ibus.LookupTable ()
                self._prop_list = self._init_props ()
 
@@ -53,23 +64,30 @@ class Engine (interface.IEngine):
                                                        type = ibus.PROP_TYPE_MENU,
                                                        label = "あ",
                                                        tooltip = "Switch input mode")
+               self._prop_dict["InputMode"] = mode_prop
+
                mode_props = ibus.PropList ()
                mode_props.append (ibus.Property (name = "InputMode.Hiragana",
                                                                                type = ibus.PROP_TYPE_RADIO,
-                                                                               label = "Hiragana",
-                                                                               state = ibus.PROP_STATE_CHECKED))
-               mode_props.append (ibus.Property (name = "InputMode.Katagana",
+                                                                               label = "Hiragana"))
+               mode_props.append (ibus.Property (name = "InputMode.Katakana",
                                                                                type = ibus.PROP_TYPE_RADIO,
-                                                                               label = "Katagana"))
-               mode_props.append (ibus.Property (name = "InputMode.HalfWidthKatagana",
+                                                                               label = "Katakana"))
+               mode_props.append (ibus.Property (name = "InputMode.HalfWidthKatakana",
                                                                                type = ibus.PROP_TYPE_RADIO,
-                                                                               label = "Half width katagana"))
+                                                                               label = "Half width katakana"))
                mode_props.append (ibus.Property (name = "InputMode.Latin",
                                                                                type = ibus.PROP_TYPE_RADIO,
                                                                                label = "Latin"))
                mode_props.append (ibus.Property (name = "InputMode.WideLatin",
                                                                                type = ibus.PROP_TYPE_RADIO,
                                                                                label = "Wide Latin"))
+
+               mode_props[self._input_mode].set_state (ibus.PROP_STATE_CHECKED)
+
+               for prop in mode_props:
+                       self._prop_dict[prop.get_name ()] = prop
+
                mode_prop.set_sub_props (mode_props)
                props.append (mode_prop)
 
@@ -79,8 +97,10 @@ class Engine (interface.IEngine):
                                                        type = ibus.PROP_TYPE_TOGGLE,
                                                        label = "あ",
                                                        tooltip = "test property")
+               self._prop_dict["TestProp"] = test_prop
                props.append (test_prop)
 
+
                return props
 
        # reset values of engine
@@ -429,6 +449,40 @@ class Engine (interface.IEngine):
 
                return False
 
+       def _property_activate (self, prop_name, state):
+               prop = self._prop_dict[prop_name]
+               prop.set_state (state)
+
+               if state == ibus.PROP_STATE_CHECKED:
+                       if prop_name == "InputMode.Hiragana":
+                               prop = self._prop_dict["InputMode"]
+                               prop.set_label (_("あ"))
+                               self._input_mode = MODE_HIRAGANA
+                               self._update_property (prop)
+                       elif prop_name == "InputMode.Katakana":
+                               prop = self._prop_dict["InputMode"]
+                               prop.set_label (_("ア"))
+                               self._input_mode = MODE_KATAKANA
+                               self._update_property (prop)
+                       elif prop_name == "InputMode.HalfWidthKatakana":
+                               prop = self._prop_dict["InputMode"]
+                               prop.set_label (_("ア"))
+                               self._input_mode = MODE_HALF_WIDTH_KATAKANA
+                               self._update_property (prop)
+                       elif prop_name == "InputMode.Latin":
+                               prop = self._prop_dict["InputMode"]
+                               self._input_mode = MODE_LATIN
+                               prop.set_label (_("A"))
+                               self._update_property (prop)
+                       elif prop_name == "InputMode.WideLatin":
+                               prop = self._prop_dict["InputMode"]
+                               prop.set_label (_("A"))
+                               self._input_mode = MODE_WIDE_LATIN
+                               self._update_property (prop)
+
+       def _update_property (self, prop):
+               self.UpdateProperty (prop.to_dbus_value ())
+
        # methods for dbus rpc
        def ProcessKeyEvent (self, keyval, is_press, state):
                try:
@@ -468,7 +522,7 @@ class Engine (interface.IEngine):
                        self.RegisterProperties (self._prop_list.to_dbus_value ())
 
        def PropertyActivate (self, prop_name, prop_state):
-               print "PropertyActivate (%s, %d)" % (prop_name, prop_state)
+               self._property_activate (prop_name, prop_state)
 
        def Destroy (self):
                print "Destroy"
index 25ccb0a..6ba754d 100644 (file)
@@ -105,5 +105,5 @@ class IEngine (dbus.service.Object):
        def RegisterProperties (self, props): pass
 
        @signal (signature="v")
-       def UpdateProperties (self, prop): pass
+       def UpdateProperty (self, prop): pass
 
index df79b36..a196acb 100644 (file)
@@ -88,7 +88,7 @@ class IIBus (dbus.service.Object):
        @method (in_signature = "o")
        def SetFactory (self, factory_path, dbusconn): pass
 
-       @method (in_signature = "s", out_signature = "ob")
+       @method (in_signature = "s", out_signature = "sb")
        def GetInputContextStates (self, ic, dbusconn): pass
 
        #sigals
index a5eb040..d061f36 100644 (file)
@@ -71,6 +71,42 @@ class Property:
        def get_sub_props (self):
                return self._sub_props
 
+       def get_name (self):
+               return self._name
+
+       def get_type (self):
+               return self._type
+
+       def set_label (self, label):
+               self._label = label
+
+       def get_label (self):
+               return self._label
+
+       def set_tooltip (self, tooltip):
+               self._tooltip = tooltip
+
+       def get_tooltip (self):
+               return self._tooltip
+
+       def set_state (self, state):
+               self._state = state
+
+       def get_state (self):
+               return self._state
+
+       def set_sensitive (self, sensitive):
+               self._sensitive = sensitive
+
+       def get_sensitive (self):
+               return self._sensitive
+
+       def set_visible (self, visible):
+               self._visible = visible
+
+       def get_visible (self):
+               return self._visible
+
        def is_same (self, prop, test_all = True):
                if self._name != prop._name or self._type != prop._type:
                        return False
@@ -155,6 +191,9 @@ class PropList:
        def __iter__ (self):
                return self._props.__iter__ ()
 
+       def __getitem__ (self, i):
+               return self._props.__getitem__ (i)
+
 def prop_list_from_dbus_value (value):
        props = PropList ()
        props.from_dbus_value (value)
index 63079e9..60087c7 100644 (file)
@@ -28,6 +28,7 @@ panel_PYTHON = \
        main.py \
        menu.py \
        panel.py \
+       propitem.py \
        toolitem.py \
        $(NULL)
 
index 7e9d380..8c15cc2 100644 (file)
@@ -126,6 +126,7 @@ class LanguageBar (gtk.Toolbar):
 
                        item.connect ("property-activate",
                                                lambda w, n, s: self.emit ("property-activate", n, s))
+                       item.connect ("size-request", lambda w, s: self.check_resize ())
 
                        item.set_sensitive (prop._sensitive)
 
index 62adb01..6e300c8 100644 (file)
@@ -22,8 +22,9 @@
 import gtk
 import gobject
 import ibus
+from propitem import PropItem
 
-class Menu (gtk.Menu):
+class Menu (gtk.Menu, PropItem):
        __gsignals__ = {
        "property-activate" : (
                gobject.SIGNAL_RUN_FIRST,
@@ -32,9 +33,9 @@ class Menu (gtk.Menu):
        }
 
        def __init__ (self, prop):
-               self._prop = prop
-               self._items = []
                gtk.Menu.__init__ (self)
+               PropItem.__init__ (self, prop)
+
                self.set_take_focus (False)
                self._create_items (self._prop.get_sub_props ())
                self.show_all ()
@@ -71,7 +72,7 @@ class Menu (gtk.Menu):
                        item.connect ("property-activate", lambda w,n,s: self.emit ("property-activate", n, s))
 
                        self.append (item)
-                       self._items.append (item)
+                       self._sub_items.append (item)
 
        def popup (self, button, active_time, widget):
                gtk.Menu.popup (self, None, None, menu_position,
@@ -81,7 +82,7 @@ class Menu (gtk.Menu):
                pass
 
 
-class ImageMenuItem (gtk.ImageMenuItem):
+class ImageMenuItem (gtk.ImageMenuItem, PropItem):
        __gsignals__ = {
        "property-activate" : (
                gobject.SIGNAL_RUN_FIRST,
@@ -90,16 +91,20 @@ class ImageMenuItem (gtk.ImageMenuItem):
        }
 
        def __init__ (self, prop):
-               self._prop = prop
                gtk.ImageMenuItem.__init__ (self, label = prop._label)
-               if prop._icon:
+               PropItem.__init__ (self, prop)
+
+               if self._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)
 
+       def property_changed (self):
+               self.set_sensitive (self._prop._sensitive)
 
-class CheckMenuItem (gtk.CheckMenuItem):
+
+class CheckMenuItem (gtk.CheckMenuItem, PropItem):
        __gsignals__ = {
        "property-activate" : (
                gobject.SIGNAL_RUN_FIRST,
@@ -108,9 +113,10 @@ class CheckMenuItem (gtk.CheckMenuItem):
        }
 
        def __init__ (self, prop):
-               self._prop = prop
                gtk.CheckMenuItem.__init__ (self, label = prop._label)
-               self.set_active (prop._state == ibus.PROP_STATE_CHECKED)
+               PropItem.__init__ (self, prop)
+
+               self.set_active (self._prop._state == ibus.PROP_STATE_CHECKED)
 
        def do_toggled (self):
                if self.get_active ():
@@ -119,8 +125,12 @@ class CheckMenuItem (gtk.CheckMenuItem):
                        self._prop._state = ibus.PROP_STATE_UNCHECKED
                self.emit ("property-activate", self._prop._name, self._prop._state)
 
+       def property_changed (self):
+               self.set_active (self._prop._state == ibus.PROP_STATE_CHECKED)
+               self.set_sensitive (self._prop._sensitive)
 
-class RadioMenuItem (gtk.RadioMenuItem):
+
+class RadioMenuItem (gtk.RadioMenuItem, PropItem):
        __gsignals__ = {
        "property-activate" : (
                gobject.SIGNAL_RUN_FIRST,
@@ -129,9 +139,14 @@ class RadioMenuItem (gtk.RadioMenuItem):
        }
 
        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)
+               PropItem.__init__ (self, prop)
+
+               self.set_active (self._prop._state == ibus.PROP_STATE_CHECKED)
+
+       def property_changed (self):
+               self.set_active (self._prop._state == ibus.PROP_STATE_CHECKED)
+               self.set_sensitive (self._prop._sensitive)
 
        def do_toggled (self):
                if self.get_active ():
@@ -140,7 +155,7 @@ class RadioMenuItem (gtk.RadioMenuItem):
                        self._prop._state = ibus.PROP_STATE_UNCHECKED
                self.emit ("property-activate", self._prop._name, self._prop._state)
 
-class SeparatorMenuItem (gtk.SeparatorMenuItem):
+class SeparatorMenuItem (gtk.SeparatorMenuItem, PropItem):
        __gsignals__ = {
        "property-activate" : (
                gobject.SIGNAL_RUN_FIRST,
index 1c466c1..0a24ee0 100644 (file)
@@ -103,7 +103,7 @@ class Panel (ibus.Object):
                self._language_bar.register_properties (props)
 
        def update_property (self, prop):
-               self._language_bar.update_property (self, prop)
+               self._language_bar.update_property (prop)
 
        def _set_im_icon (self, icon_name):
                self._language_bar.set_im_icon (icon_name)
@@ -246,7 +246,7 @@ class PanelProxy (interface.IPanel):
                self._panel.register_properties (props)
 
        def UpdateProperty (self, prop):
-               prop = ibus.property_from_dbus_value (props)
+               prop = ibus.property_from_dbus_value (prop)
                self._panel.update_property (prop)
 
        def FocusIn (self, ic):
diff --git a/panel/propitem.py b/panel/propitem.py
new file mode 100644 (file)
index 0000000..2cb9713
--- /dev/null
@@ -0,0 +1,62 @@
+# vim:set noet ts=4:
+#
+# ibus - The Input Bus
+#
+# Copyright (c) 2007-2008 Huang Peng <shawn.p.huang@gmail.com>
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this program; if not, write to the
+# Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+# Boston, MA  02111-1307  USA
+
+class PropItem:
+       def __init__ (self, prop):
+               self._prop = prop
+               self._sub_items = []
+
+       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_items)):
+                       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
+
+
index a6d542d..4f462c9 100644 (file)
@@ -23,50 +23,11 @@ import gtk
 import gtk.gdk as gdk
 import gobject
 import ibus
+from propitem import PropItem
 from menu import *
 
-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):
+class ToolButton (gtk.ToolButton, PropItem):
        __gsignals__ = {
                "property-activate" : (
                        gobject.SIGNAL_RUN_FIRST,
@@ -76,7 +37,7 @@ class ToolButton (gtk.ToolButton, ToolItem):
 
        def __init__ (self, prop):
                gtk.ToolButton.__init__ (self, label = prop._label)
-               ToolItem.__init__ (self, prop)
+               PropItem.__init__ (self, prop)
 
                self.set_icon_name (prop._icon)
                self.set_tooltip_text (prop._tooltip)
@@ -112,12 +73,13 @@ class ToolButton (gtk.ToolButton, ToolItem):
                self.set_icon_name (self._prop._icon)
                self.set_tooltip_text (self._prop._tooltip)
                self.set_label (self._prop._label)
+               self.set_sensitive (self._prop._sensitive)
 
        def do_clicked (self):
                self.emit ("property-activate", self._prop._name, self._prop._state)
 
 
-class ToggleToolButton (gtk.ToggleToolButton, ToolItem):
+class ToggleToolButton (gtk.ToggleToolButton, PropItem):
        __gsignals__ = {
                "property-activate" : (
                        gobject.SIGNAL_RUN_FIRST,
@@ -127,12 +89,12 @@ class ToggleToolButton (gtk.ToggleToolButton, ToolItem):
 
        def __init__ (self, prop):
                gtk.ToggleToolButton.__init__ (self)
-               ToolItem.__init__ (self, prop)
+               PropItem.__init__ (self, prop)
 
                self.set_label (prop._label)
                self.set_icon_name (prop._icon)
                self.set_tooltip_text (prop._tooltip)
-               self.set_state (prop._state)
+               self.set_active (prop._state == ibus.PROP_STATE_CHECKED)
                self.set_sensitive (prop._sensitive)
                if prop._visible:
                        self.set_no_show_all (False)
@@ -164,6 +126,7 @@ class ToggleToolButton (gtk.ToggleToolButton, ToolItem):
                self.set_tooltip_text (self._prop._tooltip)
                self.set_label (self._prop._label)
                self.set_active (self._prop._state == ibus.PROP_STATE_CHECKED)
+               self.set_sensitive (self._prop._sensitive)
 
        def do_toggled (self):
                if self.get_active ():
@@ -172,10 +135,10 @@ class ToggleToolButton (gtk.ToggleToolButton, ToolItem):
                        self._prop._state = ibus.PROP_STATE_UNCHECKED
                self.emit ("property-activate", self._prop._name, self._prop._state)
 
-class SeparatorToolItem (gtk.SeparatorToolItem, ToolItem):
+class SeparatorToolItem (gtk.SeparatorToolItem, PropItem):
        def __init__ (self, prop):
                gtk.SeparatorToolItem.__init__ (self)
-               ToolItem.__init__ (self, prop)
+               PropItem.__init__ (self, prop)
 
 class MenuToolButton (ToggleToolButton):
        # __gsignals__ = {
@@ -191,6 +154,10 @@ class MenuToolButton (ToggleToolButton):
                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))
 
+       def update_property (self, prop):
+               PropItem.update_property (self, prop)
+               self._menu.update_property (prop)
+
        def do_toggled (self):
                if self.get_active ():
                        self._menu.popup (0, gtk.get_current_event_time (), self)