46 |
gpointer data; |
gpointer data; |
47 |
} sel; |
} sel; |
48 |
|
|
49 |
|
struct { |
50 |
|
void(*func)(GtkTreeSelection *, gpointer); |
51 |
|
gpointer data; |
52 |
|
} change; |
53 |
|
|
54 |
GtkWidget *table; |
GtkWidget *table; |
55 |
|
|
56 |
struct { |
struct { |
253 |
gtk_tree_view_get_selection(GTK_TREE_VIEW(priv->view)); |
gtk_tree_view_get_selection(GTK_TREE_VIEW(priv->view)); |
254 |
|
|
255 |
GList *slist = gtk_tree_selection_get_selected_rows(sel, model); |
GList *slist = gtk_tree_selection_get_selected_rows(sel, model); |
|
printf("%d are selected\n", g_list_length(slist)); |
|
256 |
|
|
257 |
if(g_list_length(slist) == 1) |
if(g_list_length(slist) == 1) |
258 |
retval = gtk_tree_model_get_iter(*model, iter, slist->data); |
retval = gtk_tree_model_get_iter(*model, iter, slist->data); |
436 |
|
|
437 |
static void changed(GtkTreeSelection *treeselection, gpointer user_data) { |
static void changed(GtkTreeSelection *treeselection, gpointer user_data) { |
438 |
GtkWidget *list = (GtkWidget*)user_data; |
GtkWidget *list = (GtkWidget*)user_data; |
439 |
|
list_priv_t *priv = g_object_get_data(G_OBJECT(list), "priv"); |
440 |
|
|
441 |
GtkTreeModel *model; |
GtkTreeModel *model; |
442 |
GtkTreeIter iter; |
GtkTreeIter iter; |
443 |
gboolean selected = list_get_selected(list, &model, &iter); |
gboolean selected = list_get_selected(list, &model, &iter); |
444 |
|
|
445 |
|
/* scroll to selected entry if exactly one is selected */ |
446 |
|
if(selected) { |
447 |
|
/* check if the entry isn't already visible */ |
448 |
|
GtkTreePath *start = NULL, *end = NULL; |
449 |
|
GtkTreePath *path = gtk_tree_model_get_path(model, &iter); |
450 |
|
|
451 |
|
gtk_tree_view_get_visible_range(GTK_TREE_VIEW(priv->view), &start, &end); |
452 |
|
|
453 |
|
/* check if path is before start of visible area or behin end of it */ |
454 |
|
if((start && (gtk_tree_path_compare(path, start)) < 0) || |
455 |
|
(end && (gtk_tree_path_compare(path, end) > 0))) |
456 |
|
gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(priv->view), |
457 |
|
path, NULL, TRUE, 0.5, 0.5); |
458 |
|
|
459 |
|
if(start) gtk_tree_path_free(start); |
460 |
|
if(end) gtk_tree_path_free(end); |
461 |
|
gtk_tree_path_free(path); |
462 |
|
} |
463 |
|
|
464 |
|
/* the change event handler is overridden */ |
465 |
|
if(priv->change.func) { |
466 |
|
priv->change.func(treeselection, priv->change.data); |
467 |
|
return; |
468 |
|
} |
469 |
|
|
470 |
list_button_enable(GTK_WIDGET(list), LIST_BUTTON_REMOVE, selected); |
list_button_enable(GTK_WIDGET(list), LIST_BUTTON_REMOVE, selected); |
471 |
list_button_enable(GTK_WIDGET(list), LIST_BUTTON_EDIT, selected); |
list_button_enable(GTK_WIDGET(list), LIST_BUTTON_EDIT, selected); |
472 |
} |
} |
503 |
gtk_tree_view_get_selection(GTK_TREE_VIEW(priv->view)); |
gtk_tree_view_get_selection(GTK_TREE_VIEW(priv->view)); |
504 |
|
|
505 |
gtk_tree_selection_set_select_function(sel, |
gtk_tree_selection_set_select_function(sel, |
506 |
list_selection_function, vbox, NULL); |
list_selection_function, vbox, NULL); |
507 |
|
|
508 |
g_signal_connect(G_OBJECT(sel), "changed", G_CALLBACK(changed), vbox); |
g_signal_connect(G_OBJECT(sel), "changed", G_CALLBACK(changed), vbox); |
509 |
|
|
539 |
return vbox; |
return vbox; |
540 |
} |
} |
541 |
|
|
542 |
|
void list_override_changed_event(GtkWidget *list, |
543 |
|
void(*handler)(GtkTreeSelection*,gpointer), gpointer data) { |
544 |
|
list_priv_t *priv = g_new0(list_priv_t, 1); |
545 |
|
g_assert(priv); |
546 |
|
|
547 |
|
priv->change.func = handler; |
548 |
|
priv->change.data = data; |
549 |
|
} |