From 4461bafa4ce442cc79ee73d74cb0ed7bd93614e4 Mon Sep 17 00:00:00 2001 From: Huang Peng Date: Fri, 27 Jun 2008 21:43:32 +0800 Subject: [PATCH] WIP. --- daemon/bus.py | 5 +++- daemon/panel.py | 2 +- engine/anthy/engine.py | 68 ++++++++++++++++++++++++++++++++++++++++++----- ibus/interface/iengine.py | 2 +- ibus/interface/iibus.py | 2 +- ibus/property.py | 39 +++++++++++++++++++++++++++ panel/Makefile.am | 1 + panel/languagebar.py | 1 + panel/menu.py | 43 ++++++++++++++++++++---------- panel/panel.py | 4 +-- panel/propitem.py | 62 ++++++++++++++++++++++++++++++++++++++++++ panel/toolitem.py | 61 ++++++++++-------------------------------- 12 files changed, 216 insertions(+), 74 deletions(-) create mode 100644 panel/propitem.py diff --git a/daemon/bus.py b/daemon/bus.py index 7cb1854..d882093 100644 --- a/daemon/bus.py +++ b/daemon/bus.py @@ -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 () diff --git a/daemon/panel.py b/daemon/panel.py index 9189702..ef43e27 100644 --- a/daemon/panel.py +++ b/daemon/panel.py @@ -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): diff --git a/engine/anthy/engine.py b/engine/anthy/engine.py index 8bbb60c..ed8a0ac 100644 --- a/engine/anthy/engine.py +++ b/engine/anthy/engine.py @@ -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" diff --git a/ibus/interface/iengine.py b/ibus/interface/iengine.py index 25ccb0a..6ba754d 100644 --- a/ibus/interface/iengine.py +++ b/ibus/interface/iengine.py @@ -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 diff --git a/ibus/interface/iibus.py b/ibus/interface/iibus.py index df79b36..a196acb 100644 --- a/ibus/interface/iibus.py +++ b/ibus/interface/iibus.py @@ -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 diff --git a/ibus/property.py b/ibus/property.py index a5eb040..d061f36 100644 --- a/ibus/property.py +++ b/ibus/property.py @@ -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) diff --git a/panel/Makefile.am b/panel/Makefile.am index 63079e9..60087c7 100644 --- a/panel/Makefile.am +++ b/panel/Makefile.am @@ -28,6 +28,7 @@ panel_PYTHON = \ main.py \ menu.py \ panel.py \ + propitem.py \ toolitem.py \ $(NULL) diff --git a/panel/languagebar.py b/panel/languagebar.py index 7e9d380..8c15cc2 100644 --- a/panel/languagebar.py +++ b/panel/languagebar.py @@ -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) diff --git a/panel/menu.py b/panel/menu.py index 62adb01..6e300c8 100644 --- a/panel/menu.py +++ b/panel/menu.py @@ -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, diff --git a/panel/panel.py b/panel/panel.py index 1c466c1..0a24ee0 100644 --- a/panel/panel.py +++ b/panel/panel.py @@ -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 index 0000000..2cb9713 --- /dev/null +++ b/panel/propitem.py @@ -0,0 +1,62 @@ +# vim:set noet ts=4: +# +# ibus - The Input Bus +# +# Copyright (c) 2007-2008 Huang Peng +# +# 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 + + diff --git a/panel/toolitem.py b/panel/toolitem.py index a6d542d..4f462c9 100644 --- a/panel/toolitem.py +++ b/panel/toolitem.py @@ -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) -- 2.7.4