Re: How to draw GtkCellRendererCombo in (inside) a custom cell renderer?



On 6 June 2012 09:51, Osmo Antero <osmoma gmail com> wrote:

Hello,
I wanted to study the GtkCellRendererCombo so I added it directly to the
treeview (as column).
The combobox is initially hidden, only the "text" value is shown.
The combo becomes visible after user clicks or double-clicks the column in
the row.

Unfortunately the click event does not work (or pass through) when the
GtkCellRendererCombo is baked inside a custom-renderer class. Therefore it
simply shows the "text" value, the combo-list itself is not accessible or
visible.

This might explain why GTK3 has NO renderer for very common type of
widgets, like GtkButton.
There is no GtkCellRendererButton class because it cannot handle the
events.

I may need to use the low-level painting functions directly, like
gtk_paint_arrow(...)
gtk_paint_shadow(...)
gtk_paint_box(...)
And somehow calculate the co-ordinates for click-events.

Ref: http://developer.gnome.org/gtk3/3.4/GtkStyle.html

All comments are welcome.
// Osmo Antero

/*
Adding GtkCellRendererCombo directly (as column) to the treeview, just to
study its behaviour.

GtkTreeStore *store = gtk_tree_store_new(NUM_COLS,
                              G_TYPE_INT,
                              G_TYPE_POINTER,
                              G_TYPE_STRING); // <-- combo "text" field
...

// Combo cell renderer (directly as column)
renderer = gtk_cell_renderer_combo_new();

GtkTreeIter iter;
GtkListStore *combo_store = gtk_list_store_new (1, G_TYPE_STRING);
gtk_list_store_append(combo_store, &iter);
gtk_list_store_set(combo_store, &iter, 0, "First Item", -1);
gtk_list_store_append(combo_store, &iter);
gtk_list_store_set(combo_store, &iter, 0, "Second Item", -1);

g_object_set (renderer, "editable", FALSE,
                       "has-entry", TRUE,
                       "model", combo_store,
                       "text-column", 0,
                       NULL);

col = gtk_tree_view_column_new();
gtk_tree_view_column_pack_start (col, renderer, TRUE);
gtk_tree_view_column_add_attribute(col, renderer, "text", COL_2);
gtk_tree_view_column_set_title (col, "Combo");
gtk_tree_view_append_column(GTK_TREE_VIEW(tv),col);
*/


On Tue, Jun 5, 2012 at 8:38 PM, Osmo Antero <osmoma gmail com> wrote:

Hello,
I want to create my own cell-renderer for a treeview widget.
This custom cell will contain a text string and a combobox with some
values.
So my custom cell (row) contains both GtkCellRendererText and
GtkCellRendererCombo widgets.

The cell renderer works well that it displays the text string, but the
combobox is *invisible*.

In cell-renderer.c, I carefully get the size of the combobox:
    gtk_cell_renderer_get_preferred_size(p->combo_renderer, widget, NULL,
&size);
    combo_area.width = size.width;
    combo_area.height = size.height;

And then render it to cell with:
    combo_area.x = title_area.x + title_area.width + GUI_PAD;
    combo_area.y = fill_area.y + (fill_area.height - combo_area.height
)/2;
    gtk_cell_renderer_render(p->combo_renderer, window, widget,
background_area, &combo_area, flags);

See the render_row(...) function in "cell-renderer.c" file.
But the p->combo_renderer (of type GtkCellRendererCombo) will not show
up.

The treeview row should display:
 "Node 1-0 text  [Combobox with values]"
 "Node 1-1 text [Combobox with values]"
 "Node 1-2 text [Combobox with values]"
...
What could be wrong with my code?

Here is a complete example of this:
http://www.futuredesktop.org/tmp/Test6.tar.gz

Use the "m.sh" script to compile it:
$ ./m.sh

Then run:
$ ./main

You should see this:
http://bildr.no/view/1197967



I've implemented a custom combo in a cell renderer for Libgda, see the code
at
http://git.gnome.org/browse/libgda/tree/libgda-ui/data-entries/gdaui-data-cell-renderer-combo.c
and specifically the  gdaui_data_cell_renderer_combo_start_editing() method.

Hope it helps you,
regards

Vivien



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