Esta receta puede parecer sencilla, pero me ha traído de cabeza :-(

Tengo la típica tabla con los botones de añadir, editar y eliminar. Quiero que, cuando hay una fila seleccionada, todos estén habilitados. Cuando no haya filas seleccionadas, se tienen que deshabilitar los botones de editar y eliminar.

Este error lo he encontrado hasta en el gedit. Si tengo tiempo le prepararé el parche.

Lo primero que piensas es: pues me voy al TreeView y alguna de sus señales me hará el arreglo.

Para comenzar, no es una, sino dos: Por un lado, cursor-changed, para cuando se selecciona algo, pero… ¿qué ocurre si pulsan CTRL+SPACE? Pues que necesitamos de toggle-cursor-row.

Sin embargo, aunque conectemos estas dos señales no se consigue el efecto deseado: si el usuario pulsa CTRL+Click varias veces, llega un momento en el que tendremos los botones activados y ninguna fila seleccionada.

¿Es un error de GTK?

Yo creo que no. Realmente lo que ocurre es que nos estamos perdiendo señales que necesitamos. Por ello, lo mejor es olvidarnos del TreeView y atacar directamente a la fuente del problema: el TreeSelection.

Podemos obtener el TreeSelection de manera sencilla, y conectarlo con un evento. En Python, queda así:

treeview.get_selection().connect ( "changed", self.on_selection_changed)

Ahora, en la función de selección sólo tenemos que comprobar cuándo se tiene que activar:

def on_selection_changed ( self, selection ):
        editbutton = self.xml.get_widget ( "buttonEdit" )
        delbutton = self.xml.get_widget ( "buttonDel" )
        activate = selection.count_selected_rows() != 0
        editbutton.set_sensitive ( activate )
        delbutton.set_sensitive ( activate )

Y ahora sí que funciona en todos los casos.

¡¡ Un saludo !!