From 1c02e76a0f5cca127fd34cad63aecce7b686e8c2 Mon Sep 17 00:00:00 2001 From: Peng Huang Date: Thu, 24 Dec 2009 10:42:23 +0800 Subject: [PATCH] Make some buttons disabled, when they are not useful. --- setup/enginecombobox.py | 57 ++++++++++++++++++++++++++++++++++--------------- setup/enginetreeview.py | 43 +++++++++++++++++++++++++++---------- setup/main.py | 52 ++++++++++++++++++++++++++++---------------- setup/setup.ui | 4 ++-- 4 files changed, 108 insertions(+), 48 deletions(-) diff --git a/setup/enginecombobox.py b/setup/enginecombobox.py index 6c554e5..aa52325 100644 --- a/setup/enginecombobox.py +++ b/setup/enginecombobox.py @@ -29,9 +29,32 @@ from icon import load_icon _ = 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) @@ -56,17 +79,6 @@ class EngineComboBox(gtk.ComboBox): 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): @@ -102,10 +114,21 @@ class EngineComboBox(gtk.ComboBox): 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") + + diff --git a/setup/enginetreeview.py b/setup/enginetreeview.py index 700f5bb..7a1e317 100644 --- a/setup/enginetreeview.py +++ b/setup/enginetreeview.py @@ -33,14 +33,27 @@ _ = lambda a : dgettext("ibus", a) 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([]) @@ -93,12 +106,12 @@ class EngineTreeView(gtk.TreeView): 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: @@ -149,6 +162,19 @@ class EngineTreeView(gtk.TreeView): 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([]) @@ -166,15 +192,10 @@ class EngineTreeView(gtk.TreeView): 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: diff --git a/setup/main.py b/setup/main.py index 1ac0de7..9d5a8a2 100644 --- a/setup/main.py +++ b/setup/main.py @@ -183,27 +183,20 @@ class Setup(object): # 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") @@ -215,6 +208,34 @@ class Setup(object): 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: @@ -222,11 +243,6 @@ class Setup(object): 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() diff --git a/setup/setup.ui b/setup/setup.ui index 145e35a..7d0f08d 100644 --- a/setup/setup.ui +++ b/setup/setup.ui @@ -501,7 +501,7 @@ True - + True @@ -521,7 +521,7 @@ automatic in - + True True -- 2.7.4