Re: Dynamic changing values at a GtkTreeStore with pointers



First of all: Thank you very much for your reply. It was essential for
me to understand what was going on. And you were right about the "put
some code" part. I am too inexperienced yet.
Ok, let's go:

It took me all theses days to understand it and I am quite sure I didn't
get it all.
One point that took me most of my time was this thing that I considered
a flaw: When we assume that one attribute of a model will be
G_TYPE_POINTER and we want to store there a string pointer, we don't
pass a "&pointer", but just a "pointer". It is a little confusing to me
because I assume that POINTERS are address and address are passed using
& key. But maybe (or for sure) my understanding of it is wrong.
Now, I can change my pointers values and the values at the tree_view is
updated. I did not implement yet the change_row signed, but I sure will.
Just one thing still bothers me: I noticed that every time I pass my
mouse pointer throw the row, the cells renderer functions are called. Is
this right or I made something wrong? Everything is working ok, but I am
a little concerned about performance.

Here is my code:
PS: I am sorry about the names of my variables, but I am developing code
for my country mates, so It needed to mean something at my language,
which is portuguese.

/*Where I create my tree*/
enum
{
	SEMESTRE,
	ANO,
	CODIGO,
	NOME,
	NUM_COLUNAS_DADOS
};

GtkWidget *sc_arvore_dados = NULL;
GtkTreeStore *armazena = NULL;
GtkWidget *arvore_dados = NULL;	

/*arvore_dados***************************************************************/

	armazena = gtk_tree_store_new( 	NUM_COLUNAS_DADOS,
									G_TYPE_POINTER,
									G_TYPE_POINTER,
									G_TYPE_POINTER,
									G_TYPE_POINTER
									);

	sc_arvore_dados = gtk_scrolled_window_new( NULL, NULL );
	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sc_arvore_dados),
			GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
	arvore_dados = gtk_tree_view_new_with_model (GTK_TREE_MODEL (armazena));
	gtk_container_add( GTK_CONTAINER( sc_arvore_dados ), arvore_dados );

	/*Here I used your idea of adding columns. I had my own
	*function which would create a entire tree at once
	*but it was very bloated and your idea is much
	*elegant that my was*/
	add_coluna( GTK_TREE_VIEW( arvore_dados ), "Semestre",
renderiza_semestre, NULL );
	add_coluna( GTK_TREE_VIEW( arvore_dados ), "Ano", renderiza_ano, NULL );
	add_coluna( GTK_TREE_VIEW( arvore_dados ), "Codigo", renderiza_codigo,
NULL );
	add_coluna( GTK_TREE_VIEW( arvore_dados ), "Nome", renderiza_nome, NULL );

	gtk_widget_show( arvore_dados );
	gtk_widget_show( sc_arvore_dados );
	/**************************************************************************/

/*Here is the add_coluna function, which is your add_column function*/
static void
add_coluna(GtkTreeView *treeview,
          const gchar *title,
          GtkCellLayoutDataFunc func,
          gpointer func_data)
{
	GtkTreeViewColumn *column;
	GtkCellRenderer *renderer;

	renderer = gtk_cell_renderer_text_new();
	g_object_set(renderer, "family", "Monospace", NULL);
	column = gtk_tree_view_column_new();
	gtk_tree_view_column_set_title(column, title);
	gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(column), renderer, TRUE);
	gtk_cell_layout_set_cell_data_func(GTK_CELL_LAYOUT(column), renderer,
		   func, func_data, NULL);
	gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
}

/*And here are the cell data functions*/
static void
renderiza_semestre(G_GNUC_UNUSED GtkCellLayout *layout,
           GtkCellRenderer *renderer,
           GtkTreeModel *model,
           GtkTreeIter *iter,
           G_GNUC_UNUSED gpointer user_data)
{
	gchar *str = ( gchar* ) g_malloc( sizeof( gchar ) * 10 );
	gint *num = NULL;
	gtk_tree_model_get(model, iter, SEMESTRE, &num, -1);
	if( !num ) return;
	g_snprintf( str, 10, "%d", *num  );
	g_object_set(renderer, "text", str, NULL);
}

static void
renderiza_ano(G_GNUC_UNUSED GtkCellLayout *layout,
           GtkCellRenderer *renderer,
           GtkTreeModel *model,
           GtkTreeIter *iter,
           G_GNUC_UNUSED gpointer user_data)
{
	gchar *str = ( gchar* ) g_malloc( sizeof( gchar ) * 10 );
	gint *num = NULL;
	gtk_tree_model_get(model, iter, ANO, &num, -1);
	if( !num ) return;
	g_snprintf( str, 10, "%d", *num  );
	g_object_set(renderer, "text", str, NULL);
}

static void
renderiza_codigo(G_GNUC_UNUSED GtkCellLayout *layout,
           GtkCellRenderer *renderer,
           GtkTreeModel *model,
           GtkTreeIter *iter,
           G_GNUC_UNUSED gpointer user_data)
{
	gchar *str = NULL;
	gtk_tree_model_get(model, iter, CODIGO, &str, -1);
	if( !str ) g_object_set(renderer, "text", "", NULL);
	g_object_set(renderer, "text", str, NULL);
}

static void
renderiza_nome(G_GNUC_UNUSED GtkCellLayout *layout,
           GtkCellRenderer *renderer,
           GtkTreeModel *model,
           GtkTreeIter *iter,
           G_GNUC_UNUSED gpointer user_data)
{
	gchar *str = NULL;
	gtk_tree_model_get(model, iter, NOME, &str, -1);
	if( !str ) g_object_set(renderer, "text", "", NULL);
	g_object_set(renderer, "text", str, NULL);
}

So, thats it.
Again, thank you very much for your reply.

David Nečas (Yeti) escreveu:
> On Wed, Mar 21, 2007 at 03:01:39PM -0300, Diogo Ramos wrote:
>> This question is cracking my head off. I am days at it and i can't figure it
>> out, although I thing a got pretty close.
>> Here is the deal:
>> I have a GtkTreeStore that I use to show some values.
>> This values can be changed.
>> So, my idea is to store a pointer at a cell so, every time I change the
>> value of my data, the data is changed at the GtkTreeStore throw the pointer.
>> I don't know if it's possible, but I am trying, :-)
>> My last idea was change the GtkCellRendererText using
>> gtk_tree_view_column_set_cell_data_func so, every time the render is called,
>> a function of mine would translate a pointer, which is stored in the tree,
>> to a text. But it didn't work. It wont stop complaining.
>> Here is the menssage: GLib-GObject-WARNING **: unable to set property `text'
>> of type `gchararray' from value of type `gpointer'
>> I think it's because I set G_TYPE_POINTER at the model but the render I am
>> using is for text, although I change the value when It has to be rendered.
> 
> If I understand what you are trying to achieve (some code
> would be a better description), you probably call
> 
>   gtk_tree_view_column_add_attribute(column, renderer, "text", id);
> 
> *in addition* to setting up a cell data function.  In that
> case don't.  It tells the tree view to attempt to set the
> "text" property itself -- which inevitably fails as it
> doesn't know how to make a string from a pointer.
> 
> On the other hand, if `translate' means just type-cast, then
> you should use a G_TYPE_STRING column directly.
> 
> Anyway, working code using a G_TYPE_POINTER model column
> with a cell data function to render text in
> GtkCellRendererText view columns is attached.
> 
> Yeti
> 
> --
> http://gwyddion.net/
-- 
Diogo F. S. Ramos



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]