Diff of /trunk/src/list.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 321 by harbaum, Sun Dec 20 15:50:57 2009 UTC revision 322 by harbaum, Mon Dec 21 16:13:51 2009 UTC
# Line 46  typedef struct { Line 46  typedef struct {
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 {
# Line 248  gboolean list_get_selected(GtkWidget *li Line 253  gboolean list_get_selected(GtkWidget *li
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);
# Line 432  static gint on_list_destroy(GtkWidget *l Line 436  static gint on_list_destroy(GtkWidget *l
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  }  }
# Line 473  GtkWidget *list_new(void) Line 503  GtkWidget *list_new(void)
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    
# Line 509  GtkWidget *list_new(void) Line 539  GtkWidget *list_new(void)
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    }

Legend:
Removed from v.321  
changed lines
  Added in v.322