Hi. I'm afraid that the ideal solution cannot be achieved since you would need 2 different renderers on the same place. The second proposed solution can be achieved and it's quite simple to code.
And since the example can say more than a thousand words, I wrote a simple application to demonstrate some techniques I use (they may not be the best, but they work). --------------- #include <gtk/gtk.h> enum { TYPE_COL, TEXT_COL, TEXT_SENS_COL, INT_COL, INT_SENS_COL, NO_COLS }; static void cb_type_changed( GtkCellRendererText *renderer, gchar *path, gchar *new_text, GtkListStore *master ) { GtkTreeIter iter; gchar *old_text; gboolean text_sens = FALSE; gboolean int_sens = FALSE; /* Get previous value from master model */ gtk_tree_model_get_iter_from_string( GTK_TREE_MODEL( master ), &iter, path ); gtk_tree_model_get( GTK_TREE_MODEL( master ), &iter, TYPE_COL, &old_text, -1 ); /* Do we need to change anything? */ if( ! g_strcmp0( old_text, new_text ) ) return; /* What changes are needed? */ if( ! g_strcmp0( new_text, "String" ) ) text_sens = TRUE; else if( ! g_strcmp0( new_text, "Integer" ) ) int_sens = TRUE; /* Update master model */ gtk_list_store_set( master, &iter, TYPE_COL, new_text, TEXT_SENS_COL, text_sens, INT_SENS_COL, int_sens, -1 ); } static void cb_string_param_changed( GtkCellRendererText *renderer, gchar *path, gchar *new_text, GtkListStore *master ) { GtkTreeIter iter; /* Update master model */ gtk_tree_model_get_iter_from_string( GTK_TREE_MODEL( master ), &iter, path ); gtk_list_store_set( master, &iter, TEXT_COL, new_text, -1 ); } static void cb_integer_param_changed( GtkCellRendererText *renderer, gchar *path, gchar *new_text, GtkListStore *master ) { GtkTreeIter iter; gint value; /* Update master model */ gtk_tree_model_get_iter_from_string( GTK_TREE_MODEL( master ), &iter, path ); value = (gint)strtol( new_text, NULL, 10 ); gtk_list_store_set( master, &iter, INT_COL, value, -1 ); } int main( int argc, char **argv ) { GtkWidget *window; GtkWidget *treeview; GtkListStore *model; GtkListStore *master; GtkTreeIter iter; GtkCellRenderer *renderer; GtkAdjustment *adj; GtkTreeViewColumn *col; gtk_init( &argc, &argv ); window = gtk_window_new( GTK_WINDOW_TOPLEVEL ); g_signal_connect( G_OBJECT( window ), "destroy", G_CALLBACK( gtk_main_quit ), NULL ); /* create treeview */ treeview = gtk_tree_view_new(); gtk_tree_view_set_reorderable( GTK_TREE_VIEW( treeview ), TRUE ); gtk_container_add( GTK_CONTAINER( window ), treeview ); /* Create "master" model for treeview and add 2 entries */ master = gtk_list_store_new( NO_COLS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_INT, G_TYPE_BOOLEAN ); gtk_list_store_append( master, &iter ); gtk_list_store_set( master, &iter, TYPE_COL, "None", TEXT_COL, "Parameter 1", TEXT_SENS_COL, FALSE, INT_COL, 0, INT_SENS_COL, FALSE, -1 ); gtk_list_store_append( master, &iter ); gtk_list_store_set( master, &iter, TYPE_COL, "Integer", TEXT_COL, "Parameter 1", TEXT_SENS_COL, FALSE, INT_COL, 5, INT_SENS_COL, TRUE, -1 ); gtk_tree_view_set_model( GTK_TREE_VIEW( treeview ), GTK_TREE_MODEL( master ) ); /* column 1 */ /* Create model for combo renderer and populate it */ model = gtk_list_store_new( 2, G_TYPE_STRING, G_TYPE_INT ); gtk_list_store_append( model, &iter ); gtk_list_store_set( model, &iter, 0, "None", 1, 0, -1 ); gtk_list_store_append( model, &iter ); gtk_list_store_set( model, &iter, 0, "String", 1, 1, -1 ); gtk_list_store_append( model, &iter ); gtk_list_store_set( model, &iter, 0, "Integer", 1, 2, -1 ); /* Create column and add renderer to it */ col = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable( col, TRUE ); renderer = gtk_cell_renderer_combo_new(); g_signal_connect( G_OBJECT( renderer ), "edited", G_CALLBACK( cb_type_changed ), master ); g_object_set( G_OBJECT( renderer ), "model", GTK_TREE_MODEL( model ), "text-column", 0, "editable", TRUE, "has_entry", FALSE, NULL ); gtk_tree_view_column_pack_start( col, renderer, TRUE ); gtk_tree_view_column_set_attributes( col, renderer, "text", TYPE_COL, NULL ); gtk_tree_view_append_column( GTK_TREE_VIEW( treeview ), col ); /* column 2 */ /* Again create model for combo renderer and populate it */ model = gtk_list_store_new( 1, G_TYPE_STRING ); gtk_list_store_append( model, &iter ); gtk_list_store_set( model, &iter, 0, "Parameter 1", -1 ); gtk_list_store_append( model, &iter ); gtk_list_store_set( model, &iter, 0, "Parameter 2", -1 ); gtk_list_store_append( model, &iter ); gtk_list_store_set( model, &iter, 0, "Parameter 3", -1 ); /* Create column and add renderer to it */ col = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable( col, TRUE ); renderer = gtk_cell_renderer_combo_new(); g_signal_connect( G_OBJECT( renderer ), "edited", G_CALLBACK( cb_string_param_changed ), master ); g_object_set( G_OBJECT( renderer ), "model", GTK_TREE_MODEL( model ), "text-column", 0, "has_entry", FALSE, NULL ); gtk_tree_view_column_pack_start( col, renderer, TRUE ); gtk_tree_view_column_set_attributes( col, renderer, "text", TEXT_COL, "sensitive", TEXT_SENS_COL, "editable", TEXT_SENS_COL, NULL ); gtk_tree_view_append_column( GTK_TREE_VIEW( treeview ), col ); /* column 3 */ /* Create adjustment for spin renderer */ adj = GTK_ADJUSTMENT( gtk_adjustment_new( 0, 0, 100, 1, 10, 0 ) ); /* Create column and add renderer to it */ col = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable( col, TRUE ); renderer = gtk_cell_renderer_spin_new(); g_signal_connect( G_OBJECT( renderer ), "edited", G_CALLBACK( cb_integer_param_changed ), master ); g_object_set( G_OBJECT( renderer ), "adjustment", adj, "editable", TRUE, NULL ); gtk_tree_view_column_pack_start( col, renderer, TRUE ); gtk_tree_view_column_set_attributes( col, renderer, "text", INT_COL, "sensitive", INT_SENS_COL, "editable", INT_SENS_COL, NULL ); gtk_tree_view_append_column( GTK_TREE_VIEW( treeview ), col ); gtk_widget_show_all( window ); gtk_main(); return( 0); } ------------------ Hope you'll find it useful. 2008/12/10 John M Collins <[EMAIL PROTECTED]>: > In my application I am trying to build a dialog box to display and allow > the user to create/delete/edit a list of some structures. > > According to the "type" field in the structures, some variants of the > structures use a string as a parameter, others use an integer. (There is > a "null" option which doesn't take anything). > > Ideally I'd like to have a TreeView with 2 columns (there are some other > ones too relating to other fields in the structure but we'll ignore them > for the purposes of the question), with a GtkCellRenderCombo for the > "type" and the second column either an editable text field or a spin box > depending on what was selected in the ComboBox. Obviously it would be > different for each row depending on what "type" was selected for the > structure represented by that row. > > If that can't be done simply - and it probably isn't worth having huge > lumps of code to do just one bit of one dialog the way I want it in one > part of one application - is it possible to selectively make a given > cell non-sensitive or invisible according to the selected value of the > combo box without affecting different rows in the same column? And how > do I reach the "changed" signal for the ComboBox? > > Another more trivial question relates to the initial size of the > TreeView (I am using a scroll as well) which is fine if I have existing > structures to display when I start, but if the list is empty to start > with I get a pathetic weedy little window I can only see half a line in. > Is there a nice clean way I can set a minimum size - preferably not > mentioning pixels for the benefit of people using big default fonts? > > > John Collins Xi Software Ltd www.xisl.com > > _______________________________________________ > gtk-app-devel-list mailing list > gtk-app-devel-list@gnome.org > http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list > -- Tadej Borovšak 00386 (0)40 613 131 [EMAIL PROTECTED] [EMAIL PROTECTED] _______________________________________________ gtk-app-devel-list mailing list gtk-app-devel-list@gnome.org http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list