here is test code. it is modified sample from GTK-DEMO. NUMBER column with combo box is removed, and YUMMY column with progress bar is replaced with SPIN button.
it fires two callback :
editing-started for GtkCellRendererSpin and
value-changed for GtkSpinButton. maybe it can help someone. ( tested on fedora 16 )
Code:
#include <gtk/gtk.h>
#include <string.h>
#include <stdlib.h>
static GtkWidget *window = NULL;
typedef struct
{
gchar *product;
gfloat yummy;
}
Item;
enum
{
COLUMN_ITEM_PRODUCT,
COLUMN_ITEM_YUMMY,
NUM_ITEM_COLUMNS
};
static GtkWidget *treeview;
static GtkListStore *model;
static GtkTreeModel *items_model;
static GtkAdjustment *adjust;
static GArray *articles = NULL;
static GtkTreePath *tree_path;
static gint column;
static void
add_items (void)
{
Item foo;
g_return_if_fail (articles != NULL);
foo.product = "bottles of coke";
foo.yummy = 20.0;
g_array_append_vals (articles, &foo, 1);
foo.product = "packages of noodles";
foo.yummy = 50.0;
g_array_append_vals (articles, &foo, 1);
}
static void
create_items_model (void)
{
gint i = 0;
GtkTreeIter iter;
/* create array */
articles = g_array_sized_new (FALSE, FALSE, sizeof (Item), 1);
add_items ();
/* create list store */
model = gtk_list_store_new (NUM_ITEM_COLUMNS, G_TYPE_STRING,
G_TYPE_FLOAT, G_TYPE_BOOLEAN);
/* add items */
for (i = 0; i < articles->len; i++)
{
gtk_list_store_append (model, &iter);
gtk_list_store_set (model, &iter,
COLUMN_ITEM_PRODUCT,
g_array_index (articles, Item, i).product,
COLUMN_ITEM_YUMMY,
g_array_index (articles, Item, i).yummy,
-1);
}
items_model = GTK_TREE_MODEL (model);
// g_object_unref (model);
}
static void
value_changed (GtkSpinButton *spinbutton,
gpointer user_data)
{
GtkAdjustment *adj;
GtkTreeIter iter;
// tree_path = (GtkTreePath *) user_data;
adj = gtk_spin_button_get_adjustment (spinbutton);
gdouble value = gtk_adjustment_get_value (adj);
// g_print (" %g ",value);
gtk_tree_model_get_iter (items_model, &iter, tree_path);
gtk_list_store_set (GTK_LIST_STORE (items_model), &iter,
COLUMN_ITEM_YUMMY, value, -1);
// gtk_tree_path_free (tree_path);
}
static void
editing_started (GtkCellRenderer *cell,
GtkCellEditable *editable,
const gchar *path,
gpointer user_data)
{
tree_path = gtk_tree_path_new_from_string (path);
GtkTreeIter iter;
column = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (cell), "column"));
gtk_tree_model_get_iter (items_model, &iter, tree_path);
switch (column)
{
case COLUMN_ITEM_YUMMY:
{
GtkWidget *button = GTK_SPIN_BUTTON(editable);
g_signal_connect (G_OBJECT (button), "value-changed",
G_CALLBACK (value_changed), NULL);
}
break;
}
// gtk_tree_path_free (tree_path);
}
static void
add_columns ()
{
GtkCellRenderer *renderer;
/* product column */
renderer = gtk_cell_renderer_text_new ();
g_object_set (renderer, "editable", FALSE, NULL);
g_object_set_data (G_OBJECT (renderer),
"column", GINT_TO_POINTER (COLUMN_ITEM_PRODUCT));
gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
-1, "Product", renderer,
"text", COLUMN_ITEM_PRODUCT,
NULL);
/* yummy column */
adjust = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 1000.0, 0.1, 1.0, 0.0));
renderer = gtk_cell_renderer_spin_new ();
g_object_set (renderer, "editable", TRUE, NULL);
g_object_set_data (G_OBJECT (renderer), "column", GINT_TO_POINTER (COLUMN_ITEM_YUMMY));
g_object_set (renderer, "adjustment", adjust, NULL);
// g_object_set (renderer, "climb-rate", 0.5, NULL);
g_object_set (renderer, "digits", 3, NULL);
g_signal_connect (renderer, "editing-started",
G_CALLBACK (editing_started), NULL);
gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
-1, "Yummy", renderer,
"text", COLUMN_ITEM_YUMMY,
NULL);
}
int main (int argc, char *argv[])
{
GtkWidget *vbox;
GtkWidget *hbox;
GtkWidget *sw;
GtkWidget *button;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL); // GTK_WINDOW_TOPLEVEL
gtk_widget_set_size_request(window, 800, 600);
gtk_window_set_resizable(GTK_WINDOW(window), TRUE);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_window_set_title (GTK_WINDOW (window), "Shopping list");
gtk_container_set_border_width (GTK_CONTAINER (window), 5);
g_signal_connect (window, "destroy",
G_CALLBACK (gtk_main_quit), &window);
vbox = gtk_vbox_new (FALSE, 5);
gtk_container_add (GTK_CONTAINER (window), vbox);
gtk_box_pack_start (GTK_BOX (vbox),
gtk_label_new ("Shopping list (you can edit only SPIN-BUTTON cell !)"),
FALSE, FALSE, 0);
sw = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw),
GTK_SHADOW_ETCHED_IN);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
GTK_POLICY_AUTOMATIC,
GTK_POLICY_AUTOMATIC);
gtk_box_pack_start (GTK_BOX (vbox), sw, TRUE, TRUE, 0);
/* create models */
create_items_model ();
/* create tree view */
treeview = gtk_tree_view_new_with_model (items_model);
gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (treeview), TRUE);
gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)),
GTK_SELECTION_SINGLE);
add_columns ();
// g_object_unref (items_model);
gtk_container_add (GTK_CONTAINER (sw), treeview);
/* some buttons */
hbox = gtk_hbox_new (TRUE, 4);
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
button = gtk_button_new_with_label ("EXIT");
g_signal_connect (button, "clicked", G_CALLBACK(gtk_main_quit), NULL);
gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
gtk_widget_show_all(window);
gtk_main ();
return 0;
}
you can compile from terminal with this command:
Quote:
gcc -g -Wall -o test test.c $(pkg-config --cflags --libs gtk+-3.0)