Make some buttons disabled, when they are not useful.
authorPeng Huang <shawn.p.huang@gmail.com>
Thu, 24 Dec 2009 02:42:23 +0000 (10:42 +0800)
committerPeng Huang <shawn.p.huang@gmail.com>
Thu, 24 Dec 2009 02:42:23 +0000 (10:42 +0800)
setup/enginecombobox.py
setup/enginetreeview.py
setup/main.py
setup/setup.ui

index 6c554e5..aa52325 100644 (file)
@@ -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")
+
+
 
index 700f5bb..7a1e317 100644 (file)
@@ -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:
index 1ac0de7..9d5a8a2 100644 (file)
@@ -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()
index 145e35a..7d0f08d 100644 (file)
                                   <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>