Attachment 'gtk-simple-list-01-handle-toggle-renderers.diff'

Download

   1 From 61455fd689d71d9f51f5e25cd2aa9aec1e0714ec Mon Sep 17 00:00:00 2001
   2 From: Kristian Rietveld <kris@gtk.org>
   3 Date: Sun, 21 Sep 2008 00:48:58 +0200
   4 Subject: Implement default handling for toggle renderers; improve edited_callback().
   5 
   6 ---
   7  gtk/gtksimplelist.c    |  144 ++++++++++++++++++++++++++++++++++++++++-------
   8  tests/testsimplelist.c |    9 ++-
   9  2 files changed, 128 insertions(+), 25 deletions(-)
  10 
  11 diff --git a/gtk/gtksimplelist.c b/gtk/gtksimplelist.c
  12 index c6cc688..f29f4ae 100644
  13 --- a/gtk/gtksimplelist.c
  14 +++ b/gtk/gtksimplelist.c
  15 @@ -71,6 +71,14 @@ static void gtk_simple_list_row_activated     (GtkTreeView       *tree_view,
  16  static void gtk_simple_list_selection_changed (GtkTreeSelection  *selection,
  17                                                 gpointer           user_data);
  18  
  19 +/* default signal handlers for the convenience editable support */
  20 +static void gtk_simple_list_edited_callback  (GtkCellRendererText   *renderer,
  21 +                                              const gchar           *path_string,
  22 +                                              const gchar           *new_text,
  23 +                                              gpointer               user_data);
  24 +static void gtk_simple_list_toggled_callback (GtkCellRendererToggle *renderer,
  25 +                                              const gchar           *path_string,
  26 +                                              gpointer               user_data);
  27  
  28  static guint simple_list_signals[LAST_SIGNAL] = { 0, };
  29  
  30 @@ -337,6 +345,13 @@ gtk_simple_list_newv (int                  n_columns,
  31                                                     renderer,
  32                                                     attribute, i,
  33                                                     NULL);
  34 +
  35 +      /* The toggle renderer is activatable by default, so we connect
  36 +       * our toggled callback here.
  37 +       */
  38 +      if (column_types[i] == GTK_SIMPLE_LIST_COLUMN_TOGGLE)
  39 +        g_signal_connect (renderer, "toggled",
  40 +                          G_CALLBACK (gtk_simple_list_toggled_callback), list);
  41      }
  42  
  43    list->priv->n_columns = n_columns;
  44 @@ -550,7 +565,6 @@ gtk_simple_list_get_row (GtkSimpleList *list,
  45                           int            position,
  46                           ...)
  47  {
  48 -  int i;
  49    GtkTreeIter iter;
  50    GtkTreeModel *model;
  51    va_list args;
  52 @@ -787,7 +801,7 @@ gtk_simple_list_edited_callback (GtkCellRendererText *renderer,
  53      {
  54        GList *cells;
  55  
  56 -      cells = gtk_tree_view_column_get_cell_renderers (clist->data);
  57 +      cells = gtk_tree_view_column_get_cell_renderers (l->data);
  58  
  59        if (cells->data == renderer)
  60          {
  61 @@ -798,7 +812,7 @@ gtk_simple_list_edited_callback (GtkCellRendererText *renderer,
  62        g_list_free (cells);
  63      }
  64  
  65 -  g_return_if_fail (column <= list->priv->n_columns);
  66 +  g_return_if_fail (column < list->priv->n_columns);
  67  
  68    path = gtk_tree_path_new_from_string (path_string);
  69    gtk_tree_model_get_iter (model, &iter, path);
  70 @@ -808,6 +822,102 @@ gtk_simple_list_edited_callback (GtkCellRendererText *renderer,
  71                        column, new_text, -1);
  72  }
  73  
  74 +static void
  75 +gtk_simple_list_set_text_editable (GtkSimpleList       *list,
  76 +                                   GtkCellRendererText *celltext,
  77 +                                   gboolean             editable)
  78 +{
  79 +  gboolean is_editable;
  80 +
  81 +  g_object_get (celltext, "editable", &is_editable, NULL);
  82 +  if (editable == !!is_editable)
  83 +    return;
  84 +
  85 +  g_object_set (celltext, "editable", editable, NULL);
  86 +
  87 +  if (editable)
  88 +    {
  89 +      g_signal_connect (celltext, "edited",
  90 +                        G_CALLBACK (gtk_simple_list_edited_callback), list);
  91 +    }
  92 +  else
  93 +    {
  94 +      g_signal_handlers_disconnect_by_func (celltext,
  95 +                                            gtk_simple_list_edited_callback,
  96 +                                            list);
  97 +    }
  98 +}
  99 +
 100 +static void
 101 +gtk_simple_list_toggled_callback (GtkCellRendererToggle *renderer,
 102 +                                  const gchar           *path_string,
 103 +                                  gpointer               user_data)
 104 +{
 105 +  int column = 0;
 106 +  gboolean active;
 107 +  GList *clist, *l;
 108 +  GtkTreeIter iter;
 109 +  GtkTreePath *path;
 110 +  GtkSimpleList *list;
 111 +  GtkTreeModel *model;
 112 +
 113 +  list = GTK_SIMPLE_LIST (user_data);
 114 +  model = gtk_tree_view_get_model (GTK_TREE_VIEW (list));
 115 +
 116 +  /* We need to find the column containing this renderer */
 117 +  clist = gtk_tree_view_get_columns (GTK_TREE_VIEW (user_data));
 118 +
 119 +  for (l = clist; l; l = l->next, column++)
 120 +    {
 121 +      GList *cells;
 122 +
 123 +      cells = gtk_tree_view_column_get_cell_renderers (l->data);
 124 +
 125 +      if (cells->data == renderer)
 126 +        {
 127 +          g_list_free (cells);
 128 +          break;
 129 +        }
 130 +
 131 +      g_list_free (cells);
 132 +    }
 133 +
 134 +  g_return_if_fail (column < list->priv->n_columns);
 135 +
 136 +  path = gtk_tree_path_new_from_string (path_string);
 137 +  gtk_tree_model_get_iter (model, &iter, path);
 138 +  gtk_tree_path_free (path);
 139 +
 140 +  gtk_tree_model_get (model, &iter, column, &active, -1);
 141 +  gtk_list_store_set (GTK_LIST_STORE (model), &iter,
 142 +                      column, !active, -1);
 143 +}
 144 +
 145 +static void
 146 +gtk_simple_list_set_toggle_editable (GtkSimpleList         *list,
 147 +                                     GtkCellRendererToggle *celltoggle,
 148 +                                     gboolean               editable)
 149 +{
 150 +  gboolean is_activatable;
 151 +
 152 +  g_object_get (celltoggle, "activatable", &is_activatable, NULL);
 153 +  if (editable == !!is_activatable)
 154 +    return;
 155 +
 156 +  g_object_set (celltoggle, "activatable", editable, NULL);
 157 +
 158 +  if (editable)
 159 +    {
 160 +      g_signal_connect (celltoggle, "toggled",
 161 +                        G_CALLBACK (gtk_simple_list_toggled_callback), list);
 162 +    }
 163 +  else
 164 +    {
 165 +      g_signal_handlers_disconnect_by_func (celltoggle,
 166 +                                            gtk_simple_list_toggled_callback,
 167 +                                            list);
 168 +    }
 169 +}
 170  
 171  void
 172  gtk_simple_list_column_set_editable (GtkSimpleList   *list,
 173 @@ -815,7 +925,6 @@ gtk_simple_list_column_set_editable (GtkSimpleList   *list,
 174                                       gboolean         editable)
 175  {
 176    GList *cells;
 177 -  gboolean is_editable;
 178    GtkCellRenderer *renderer;
 179    GtkTreeViewColumn *column;
 180  
 181 @@ -832,26 +941,17 @@ gtk_simple_list_column_set_editable (GtkSimpleList   *list,
 182    renderer = cells->data;
 183    g_list_free (cells);
 184  
 185 -  if (!GTK_IS_CELL_RENDERER_TEXT (renderer))
 186 -    return;
 187 -
 188 -  g_object_get (renderer, "editable", &is_editable, NULL);
 189 -  if (editable == !!is_editable)
 190 -    return;
 191  
 192 -  g_object_set (renderer, "editable", editable, NULL);
 193 -
 194 -  if (editable)
 195 -    {
 196 -      g_signal_connect (renderer, "edited",
 197 -                        G_CALLBACK (gtk_simple_list_edited_callback), list);
 198 -    }
 199 +  if (GTK_IS_CELL_RENDERER_TEXT (renderer))
 200 +    gtk_simple_list_set_text_editable (list,
 201 +                                       GTK_CELL_RENDERER_TEXT (renderer),
 202 +                                       editable);
 203 +  else if (GTK_IS_CELL_RENDERER_TOGGLE (renderer))
 204 +    gtk_simple_list_set_toggle_editable (list,
 205 +                                         GTK_CELL_RENDERER_TOGGLE (renderer),
 206 +                                         editable);
 207    else
 208 -    {
 209 -      g_signal_handlers_disconnect_by_func (renderer,
 210 -                                            gtk_simple_list_edited_callback,
 211 -                                            list);
 212 -    }
 213 +    return;
 214  }
 215  
 216  void
 217 diff --git a/tests/testsimplelist.c b/tests/testsimplelist.c
 218 index 8e5426a..aba695e 100644
 219 --- a/tests/testsimplelist.c
 220 +++ b/tests/testsimplelist.c
 221 @@ -37,10 +37,11 @@ main (int argc, char **argv)
 222                                     GTK_ICON_SIZE_SMALL_TOOLBAR,
 223                                     NULL);
 224  
 225 -  list = gtk_simple_list_new (3,
 226 +  list = gtk_simple_list_new (4,
 227                                GTK_SIMPLE_LIST_COLUMN_TEXT,
 228                                GTK_SIMPLE_LIST_COLUMN_INT,
 229 -                              GTK_SIMPLE_LIST_COLUMN_PIXBUF);
 230 +                              GTK_SIMPLE_LIST_COLUMN_PIXBUF,
 231 +                              GTK_SIMPLE_LIST_COLUMN_TOGGLE);
 232  
 233    gtk_simple_list_set_selection_mode (GTK_SIMPLE_LIST (list),
 234                                        GTK_SELECTION_MULTIPLE);
 235 @@ -54,7 +55,8 @@ main (int argc, char **argv)
 236    gtk_simple_list_append_row (GTK_SIMPLE_LIST (list),
 237                                0, "Hoi", 1, 3, 2, pixbuf, -1);
 238    gtk_simple_list_append_row (GTK_SIMPLE_LIST (list), 0, "Boe", 1, 2, -1);
 239 -  gtk_simple_list_append_row (GTK_SIMPLE_LIST (list), 0, "Bleh", 1, 5, -1);
 240 +  gtk_simple_list_append_row (GTK_SIMPLE_LIST (list),
 241 +                              0, "Bleh", 1, 5, 3, TRUE, -1);
 242    gtk_simple_list_append_row (GTK_SIMPLE_LIST (list), 0, "Fooo", 1, 8, -1);
 243    gtk_simple_list_append_row (GTK_SIMPLE_LIST (list),
 244                                0, "Bier", 1, 1, 2, pixbuf, -1);
 245 @@ -63,6 +65,7 @@ main (int argc, char **argv)
 246    gtk_simple_list_unselect_indices (GTK_SIMPLE_LIST (list), 2, 4, -1);
 247  
 248    gtk_simple_list_column_set_editable (GTK_SIMPLE_LIST (list), 0, TRUE);
 249 +  gtk_simple_list_column_set_editable (GTK_SIMPLE_LIST (list), 3, TRUE);
 250  
 251    g_signal_connect (list, "index-activated",
 252                      G_CALLBACK (index_activated_cb), NULL);
 253 -- 
 254 1.6.4

Attached Files

To refer to attachments on a page, use attachment:filename, as shown below in the list of files. Do NOT use the URL of the [get] link, since this is subject to change and can break easily.
  • [get | view] (2021-02-25 09:59:00, 9.1 KB) [[attachment:gtk-simple-list-01-handle-toggle-renderers.diff]]
  • [get | view] (2021-02-25 09:59:00, 1.7 KB) [[attachment:gtk-simple-list-02-remove-set-cell-renderer-stub.diff]]
  • [get | view] (2021-02-25 09:59:00, 2.2 KB) [[attachment:gtk-simple-list-03-add-new-with-titles-constructor.diff]]
  • [get | view] (2021-02-25 09:59:00, 34.7 KB) [[attachment:gtk-simple-list-20sep2008.diff]]
  • [get | view] (2021-02-25 09:59:00, 50.1 KB) [[attachment:gtk-tree-extra-space-API-jul2008.tar.gz]]
  • [get | view] (2021-02-25 09:59:00, 111.2 KB) [[attachment:gtk-tree-new-dnd-28oct2008.diff]]
  • [get | view] (2021-02-25 09:59:00, 26.2 KB) [[attachment:gtk-tree-no-validation-jul2008.diff]]
  • [get | view] (2021-02-25 09:59:00, 17.3 KB) [[attachment:gtk-tree-refactor-dec2009.tar.gz]]
 All files | Selected Files: delete move to page copy to page

You are not allowed to attach a file to this page.