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 ()
**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):
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):
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 ()
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)
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
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:
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"
def RegisterProperties (self, props): pass
@signal (signature="v")
- def UpdateProperties (self, prop): pass
+ def UpdateProperty (self, prop): pass
@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
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
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)
main.py \
menu.py \
panel.py \
+ propitem.py \
toolitem.py \
$(NULL)
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)
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,
}
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 ()
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,
pass
-class ImageMenuItem (gtk.ImageMenuItem):
+class ImageMenuItem (gtk.ImageMenuItem, PropItem):
__gsignals__ = {
"property-activate" : (
gobject.SIGNAL_RUN_FIRST,
}
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,
}
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 ():
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,
}
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 ():
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,
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)
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):
--- /dev/null
+# 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
+
+
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,
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)
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,
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)
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 ():
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__ = {
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)