[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]
Re: Question about TreeView particularly GtkCellRendererCombo
- From: "Tadej Borovšak" <tadeboro gmail com>
- To: "John M Collins" <jmc xisl com>
- Cc: gtk-app-devel-list <gtk-app-devel-list gnome org>
- Subject: Re: Question about TreeView particularly GtkCellRendererCombo
- Date: Wed, 10 Dec 2008 20:13:56 +0100
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 <jmc xisl com>:
> 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
tadeboro gmail com
tadej borovsak gmail com
[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]