_ = lambda a : gettext.dgettext("ibus", a)
class EngineComboBox(gtk.ComboBox):
- def __init__(self, engines):
+ __gtype_name__ = 'EngineComboBox'
+ __gproperties__ = {
+ 'active-engine' : (
+ gobject.TYPE_PYOBJECT,
+ 'selected engine',
+ 'selected engine',
+ gobject.PARAM_READABLE)
+ }
+
+ def __init__(self):
super(EngineComboBox, self).__init__()
+ self.connect("notify::active", self.__notify_active_cb)
+ self.__model = None
+
+ renderer = gtk.CellRendererPixbuf()
+ renderer.set_property("xalign", 0)
+ self.pack_start(renderer, False)
+ self.set_cell_data_func(renderer, self.__icon_cell_data_cb)
+
+ renderer = gtk.CellRendererText()
+ renderer.set_property("xalign", 0)
+ self.pack_start(renderer, True)
+ self.set_cell_data_func(renderer, self.__name_cell_data_cb)
+
+ def set_engines(self, engines):
self.__model = gtk.TreeStore(gobject.TYPE_PYOBJECT)
iter1 = self.__model.append(None)
self.__model.set(iter2, 0, e)
self.set_model(self.__model)
-
- renderer = gtk.CellRendererPixbuf()
- renderer.set_property("xalign", 0)
- self.pack_start(renderer, False)
- self.set_cell_data_func(renderer, self.__icon_cell_data_cb)
-
- renderer = gtk.CellRendererText()
- renderer.set_property("xalign", 0)
- self.pack_start(renderer, True)
- self.set_cell_data_func(renderer, self.__name_cell_data_cb)
-
self.set_active(0)
def __icon_cell_data_cb(self, celllayout, renderer, model, iter):
renderer.set_property("sensitive", True)
renderer.set_property("text", engine.longname)
+ def __notify_active_cb(self, combobox, property):
+ self.notify("active-engine")
+
+ def do_get_property(self, property):
+ if property.name == "active-engine":
+ i = self.get_active()
+ if i == 0 or i == -1:
+ return None
+ iter = self.get_active_iter()
+ return self.get_model()[iter][0]
+ else:
+ raise AttributeError, 'unknown property %s' % property.name
+
def get_active_engine(self):
- i = self.get_active()
- iter = self.get_active_iter()
- if i == 0 or i == -1:
- return None
- return self.get_model()[iter][0]
+ return self.get_property("active-engine")
+
+
N_ = lambda a : a
class EngineTreeView(gtk.TreeView):
+ __gtype_name__ = 'EngineTreeView'
__gsignals__ = {
'changed' : (
gobject.SIGNAL_RUN_LAST,
gobject.TYPE_NONE,
())
}
+ __gproperties__ = {
+ 'active-engine' : (
+ gobject.TYPE_PYOBJECT,
+ 'selected engine',
+ 'selected engine',
+ gobject.PARAM_READABLE),
+ 'engines' : (
+ gobject.TYPE_PYOBJECT,
+ 'engines',
+ 'engines',
+ gobject.PARAM_READABLE)
+ }
- def __init__(self, engines):
+ def __init__(self):
super(EngineTreeView, self).__init__()
self.__engines = set([])
column.set_cell_data_func(renderer, self.__layout_cell_data_cb)
# self.append_column(column)
- self.set_engines(engines)
+ self.get_selection().connect("changed", lambda *args: self.notify("active-engine"))
def __emit_changed(self, *args):
if self.__changed:
self.__changed = False
- self.emit("changed")
+ self.notify("engines")
def __emit_changed_delay_cb(self, *args):
if not self.__changed:
layout = combo.get_property("model").get_value(iter, 0)
self.__model.set_value(i, 1, layout)
+ def do_get_property(self, property):
+ if property.name == "active-engine":
+ iter = self.get_selected_iter()
+ if iter == None:
+ return None
+ row = self.__model.get(iter, 0)
+ return row[0]
+ elif property.name == "engines":
+ engines = [ r[0] for r in self.__model if r[0] != None]
+ return engines
+ else:
+ raise AttributeError, 'unknown property %s' % property.name
+
def set_engines(self, engines):
self.__model.clear()
self.__engines = set([])
return selection.get_selected()[1]
def get_engines(self):
- engines = [ r[0] for r in self.__model if r[0] != None]
- return engines
+ return self.get_property("engines")
- def get_select_engine(self):
- iter = self.get_selected_iter()
- if iter == None:
- return None
- row = self.__model.get(iter, 0)
- return row[0]
+ def get_active_engine(self):
+ return self.get_property("active-engine")
def prepend_engine(self, engine):
if engine == None or engine in self.__engines:
# init engine page
self.__engines = self.__bus.list_engines()
- self.__combobox = EngineComboBox(self.__engines)
- self.__combobox.show()
- self.__builder.get_object("alignment_engine_combobox").add(self.__combobox)
+ self.__combobox = self.__builder.get_object("combobox_engines")
+ self.__combobox.set_engines(self.__engines)
tmp_dict = {}
for e in self.__engines:
tmp_dict[e.name] = e
engine_names = self.__config.get_value("general", "preload_engines", [])
- engines = []
- for n in engine_names:
- if n in tmp_dict:
- engines.append(tmp_dict[n])
- self.__treeview = EngineTreeView(engines)
- self.__treeview.show()
- self.__builder.get_object("scrolledwindow_engine_treeview").add(self.__treeview)
+ engines = [tmp_dict[name] for name in engine_names if name in tmp_dict]
- self.__treeview.connect("changed", self.__treeview_changed_cb)
+ self.__treeview = self.__builder.get_object("treeview_engines")
+ self.__treeview.set_engines(engines)
button = self.__builder.get_object("button_engine_add")
- button.connect("clicked",
- lambda *args:self.__treeview.append_engine(self.__combobox.get_active_engine()))
+ button.connect("clicked", self.__button_engine_add_cb)
button = self.__builder.get_object("button_engine_remove")
button.connect("clicked", lambda *args:self.__treeview.remove_engine())
button = self.__builder.get_object("button_engine_up")
button = self.__builder.get_object("button_engine_about")
button.connect("clicked", self.__button_engine_about_cb)
+ self.__combobox.connect("notify::active-engine", self.__combobox_notify_active_engine_cb)
+ self.__treeview.connect("notify", self.__treeview_notify_cb)
+
+ def __combobox_notify_active_engine_cb(self, combobox, property):
+ engine = self.__combobox.get_active_engine()
+ button = self.__builder.get_object("button_engine_add")
+ button.set_sensitive(engine != None and engine not in self.__treeview.get_engines())
+
+ def __treeview_notify_cb(self, treeview, property):
+ if property.name != "active-engine" and property.name != "engines":
+ return
+
+ engines = self.__treeview.get_engines()
+ engine = self.__treeview.get_active_engine()
+
+ self.__builder.get_object("button_engine_remove").set_sensitive(engine != None)
+ self.__builder.get_object("button_engine_about").set_sensitive(engine != None)
+ self.__builder.get_object("button_engine_up").set_sensitive(engine not in engines[:1])
+ self.__builder.get_object("button_engine_down").set_sensitive(engine not in engines[-1:])
+
+ if property.name == engines:
+ engine_names = map(lambda e: e.name, engines)
+ self.__config.set_list("general", "preload_engines", engine_names, "s")
+
+ def __button_engine_add_cb(self, button):
+ engine = self.__combobox.get_active_engine()
+ self.__treeview.append_engine(engine)
+
def __button_engine_about_cb(self, button):
engine = self.__treeview.get_select_engine()
if engine:
about.run()
about.destroy()
- def __treeview_changed_cb(self, treeview):
- engines = self.__treeview.get_engines()
- engine_names = map(lambda e: e.name, engines)
- self.__config.set_list("general", "preload_engines", engine_names, "s")
-
def __init_bus(self):
try:
self.__bus = ibus.Bus()
<object class="GtkAlignment" id="alignment_engine_combobox">
<property name="visible">True</property>
<child>
- <object class="GtkComboBox" id="combobox_engines">
+ <object class="EngineComboBox" id="combobox_engines">
<property name="visible">True</property>
</object>
</child>
<property name="vscrollbar_policy">automatic</property>
<property name="shadow_type">in</property>
<child>
- <object class="GtkTreeView" id="treeview_engines">
+ <object class="EngineTreeView" id="treeview_engines">
<property name="visible">True</property>
<property name="can_focus">True</property>
</object>