On Mon, Feb 28, 2011 at 10:48:50AM +0000, jpka wrote: > Krzysztof Kościuszkiewicz wrote: > > * to have GtkTreeView updated you need to emit > > "row-changed" signal, like: > > > > gtk_tree_model_row_changed (GTK_TREE_MODEL (model), path, &iter); > > I find it, but unfortunately i can't write callback function correct > (don't know or even can't imagine which arguments i must pass, i need > complete > example)
There's no need to write a callback; default one will refresh the GtkTreeView widget to include your changes to the model. Please have a look at the attached patch. BTW - selecting a grid that does have 0 spacing segfaults pcb. BTW2 - why do you store grid mm and mil spacings as strings?? -- Krzysztof Kościuszkiewicz "Simplicity is the ultimate sophistication" -- Leonardo da Vinci
>From 73574b2f6d6736257bf22c9683ba2b9a45196a03 Mon Sep 17 00:00:00 2001 From: Krzysztof Kosciuszkiewicz <k.kosciuszkiew...@gmail.com> Date: Thu, 3 Mar 2011 01:12:06 +0100 Subject: [PATCH] hid/gtk: improvements to grid preferences window --- src/hid/gtk/gui-config.c | 76 ++++++++++++++++++++++----------------------- 1 files changed, 37 insertions(+), 39 deletions(-) diff --git a/src/hid/gtk/gui-config.c b/src/hid/gtk/gui-config.c index 9eacfc0..e864da1 100644 --- a/src/hid/gtk/gui-config.c +++ b/src/hid/gtk/gui-config.c @@ -1394,42 +1394,42 @@ void dummy (void) { } -void on_changed(GtkWidget *widget) -//void on_changed(GtkWidget *widget, gpointer treeview) -{ - GtkTreeIter iter; - GtkTreeModel *model; - GtkTreePath *path; - gint *indexes; - //GtkListStore *store; - int i; - - if (gtk_tree_selection_get_selected( - GTK_TREE_SELECTION(widget), &model, &iter)) { - path = gtk_tree_model_get_path(model, &iter); - indexes = gtk_tree_path_get_indices(path); - i = indexes[0]; - if (i<0) i = 0; - if (i>(MAX_USER_GRIDS-1)) i = MAX_USER_GRIDS-1; -//g_print("Row number %i selected.\n", i); /* FIXME remove after debug */ - PCB->CurrentGrid = i; - - if (Settings.DrawGrid) UpdateAll (); - ghid_set_status_line_label(); - -/* FIXME */ g_print("Please fixme: \n" - "here's word 'Yes' must be placed at 'Current?' column and (i) line, \n" - "but i can't find a way to do it after a day fighting with gtk and hair tearing...\n"); - -// store = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (treeview))); -// gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (store), &iter, path); -// gtk_list_store_set (store, &iter, COL_GRIDCURRENT, "Yes", -1); - +static gboolean refresh_gridcurrent (GtkTreeModel *model, + GtkTreePath *path, + GtkTreeIter *iter, + gpointer data) +{ + GtkTreePath *selectedPath = (GtkTreePath*) data; + gtk_list_store_set (GTK_LIST_STORE (model), + iter, + COL_GRIDCURRENT, + gtk_tree_path_compare (path, selectedPath) == 0 ? TRUE : FALSE, + -1); + gtk_tree_model_row_changed (model, path, iter); + return FALSE; // continue iterating +} + + +static void cb_toggled_active (GtkCellRendererToggle *cell, + gchar *path_string, + GtkTreeView *view) +{ + GtkTreePath *path = gtk_tree_path_new_from_string (path_string); + gint *indices = gtk_tree_path_get_indices (path); + int i = CLAMP (indices[0], 0, MAX_USER_GRIDS-1); + if (PCB->CurrentGrid != i) { + PCB->CurrentGrid = i; + if (Settings.DrawGrid) + UpdateAll (); + ghid_set_status_line_label(); + gtk_tree_model_foreach (gtk_tree_view_get_model (view), + refresh_gridcurrent, + path); } + gtk_tree_path_free (path); } - static GtkWidget *create_grid_treeview (void) { GtkCellRenderer *renderer; GtkTreeView *treeview; @@ -1439,7 +1439,7 @@ static GtkWidget *create_grid_treeview (void) { int i; char /*yyyyy[256],*/yyyyy2[256]; /* FIXME remove this ugly stuff */ - store = gtk_list_store_new (NUM_COLS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_STRING); + store = gtk_list_store_new (NUM_COLS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_BOOLEAN); for (i=0; i<MAX_USER_GRIDS; i++) { // strcpy(yyyyy, c_dtostr((PCB->Grid[i])*COOR_TO_MM)); strcpy(yyyyy2, c_dtostr((PCB->Grid[i]*COOR_TO_MIL))); @@ -1449,12 +1449,18 @@ static GtkWidget *create_grid_treeview (void) { // COL_GRID_MIL, c_dtostr((PCB->Grid[i])*COOR_TO_MIL), - not work! :( COL_GRID_MIL, yyyyy2, // work but ugly... COL_GRIDSTEP, PCB->GridStep[i], - COL_GRIDCURRENT, (i == PCB->CurrentGrid) ? "Yes":"", + COL_GRIDCURRENT, (i == PCB->CurrentGrid) ? TRUE : FALSE, -1); } treeview = GTK_TREE_VIEW (gtk_tree_view_new_with_model (GTK_TREE_MODEL(store))); g_object_unref (store); + renderer = gtk_cell_renderer_toggle_new (); + gtk_cell_renderer_toggle_set_radio(renderer, true); + gtk_cell_renderer_toggle_set_activatable(renderer, true); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), -1, "Current?", renderer, "active", COL_GRIDCURRENT, NULL); + g_signal_connect(renderer, "toggled", (GCallback) cb_toggled_active, treeview); + renderer = gtk_cell_renderer_text_new (); g_object_set_data(G_OBJECT(renderer), "column", GUINT_TO_POINTER(COL_GRID_MM)); //give this column a some number to receive it in edit function g_object_set(renderer, "editable", TRUE, NULL); @@ -1475,19 +1481,11 @@ static GtkWidget *create_grid_treeview (void) { gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), -1, "Step", renderer, "text", COL_GRIDSTEP, NULL); g_signal_connect(renderer, "edited", (GCallback) cb_edited_step, treeview); - renderer = gtk_cell_renderer_text_new (); - gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), -1, "Current?", renderer, "text", COL_GRIDCURRENT, NULL); - select = gtk_tree_view_get_selection (treeview); /* FIXME next line is not work and looks as bug in GTK: * must be one line always selected, but no, when dialog opens, * no lines selected. */ gtk_tree_selection_set_mode (select, GTK_SELECTION_BROWSE); -// g_signal_connect (G_OBJECT (select), "changed", G_CALLBACK (cb_get_selected), GTK_TREE_VIEW (treeview)); -// g_signal_connect(select, "changed", G_CALLBACK(on_changed), NULL); -// g_signal_connect(select, "changed", G_CALLBACK(on_changed), GTK_TREE_VIEW (treeview)); - g_signal_connect(select, "changed", G_CALLBACK(on_changed), select); - // return treeview; // this was in example code, -- 1.7.1
_______________________________________________ geda-user mailing list geda-user@moria.seul.org http://www.seul.org/cgi-bin/mailman/listinfo/geda-user