~indicator-applet-developers/qmenumodel/trunk

« back to all changes in this revision

Viewing changes to libqmenumodel/src/gtk/gtkmenutracker.c

  • Committer: Bileto Bot
  • Author(s): Albert Astals Cid
  • Date: 2017-03-16 16:55:18 UTC
  • mfrom: (128.1.3 batch_menu_adds)
  • Revision ID: ci-train-bot@canonical.com-20170316165518-if8jh31hvmj735d6
Batch add and removes into the model

Works much better with Qt Quick views to have all the insert/removes at once (LP: #1666701)

Show diffs side-by-side

added added

removed removed

Lines of Context:
85
85
                                                                 GMenuModel            *model,
86
86
                                                                 gboolean               with_separators,
87
87
                                                                 gint                   offset,
88
 
                                                                 const gchar           *action_namespace);
 
88
                                                                 const gchar           *action_namespace,
 
89
                                                                 GPtrArray             *items_already_created);
89
90
static void                    gtk_menu_tracker_section_free    (GtkMenuTrackerSection *section);
90
91
 
91
92
static GtkMenuTrackerSection *
195
196
    {
196
197
      /* Add a separator */
197
198
      GtkMenuTrackerItem *item;
 
199
      GPtrArray *items = g_ptr_array_new ();
198
200
 
199
201
      item = _gtk_menu_tracker_item_new (tracker->observable, parent_model, parent_index, NULL, TRUE);
200
 
      (* tracker->insert_func) (item, offset, tracker->user_data);
 
202
      g_ptr_array_add (items, (gpointer) item);
 
203
      (* tracker->insert_func) (items, offset, tracker->user_data);
 
204
      g_ptr_array_unref (items);
201
205
      g_object_unref (item);
202
206
 
203
207
      section->has_separator = TRUE;
205
209
  else if (should_have_separator < section->has_separator)
206
210
    {
207
211
      /* Remove a separator */
208
 
      (* tracker->remove_func) (offset, tracker->user_data);
 
212
      (* tracker->remove_func) (offset, 1, tracker->user_data);
209
213
      section->has_separator = FALSE;
210
214
    }
211
215
 
241
245
                               gint             n_items)
242
246
{
243
247
  gint i;
 
248
  gint n_total_items = 0;
244
249
 
245
250
  for (i = 0; i < n_items; i++)
246
251
    {
253
258
      n = gtk_menu_tracker_section_measure (subsection);
254
259
      gtk_menu_tracker_section_free (subsection);
255
260
 
256
 
      while (n--)
257
 
        (* tracker->remove_func) (offset, tracker->user_data);
 
261
      n_total_items += n;
 
262
    }
 
263
 
 
264
  if (n_total_items)
 
265
    {
 
266
      (* tracker->remove_func) (offset, n_total_items, tracker->user_data);
258
267
    }
259
268
}
260
269
 
265
274
                            gint                    offset,
266
275
                            GMenuModel             *model,
267
276
                            gint                    position,
268
 
                            gint                    n_items)
 
277
                            gint                    n_items,
 
278
                            GPtrArray              *items_already_created
 
279
                           )
269
280
{
 
281
  GPtrArray *items;
 
282
  if (items_already_created)
 
283
    {
 
284
      items = items_already_created;
 
285
    }
 
286
  else
 
287
    {
 
288
      items = g_ptr_array_new ();
 
289
    }
270
290
  while (n_items--)
271
291
    {
272
292
      GMenuModel *submenu;
286
306
              gchar *namespace;
287
307
 
288
308
              namespace = g_strjoin (".", section->action_namespace, action_namespace, NULL);
289
 
              subsection = gtk_menu_tracker_section_new (tracker, submenu, FALSE, offset, namespace);
 
309
              subsection = gtk_menu_tracker_section_new (tracker, submenu, FALSE, offset, namespace, items_already_created);
290
310
              g_free (namespace);
291
311
            }
292
312
          else
293
 
            subsection = gtk_menu_tracker_section_new (tracker, submenu, FALSE, offset, section->action_namespace);
 
313
            subsection = gtk_menu_tracker_section_new (tracker, submenu, FALSE, offset, section->action_namespace, items_already_created);
294
314
 
295
315
          *change_point = g_slist_prepend (*change_point, subsection);
296
316
          g_free (action_namespace);
302
322
 
303
323
          item = _gtk_menu_tracker_item_new (tracker->observable, model, position + n_items,
304
324
                                             section->action_namespace, FALSE);
305
 
          (* tracker->insert_func) (item, offset, tracker->user_data);
306
 
          g_object_unref (item);
 
325
          g_ptr_array_insert (items, 0, (gpointer) item);
307
326
 
308
327
          *change_point = g_slist_prepend (*change_point, NULL);
309
328
        }
310
329
    }
 
330
  if (!items_already_created)
 
331
    {
 
332
      if (items->len)
 
333
        {
 
334
          (* tracker->insert_func) (items, offset, tracker->user_data);
 
335
          for (gint i = 0; i < items->len; ++i)
 
336
            g_object_unref(g_ptr_array_index(items, i));
 
337
        }
 
338
      g_ptr_array_unref (items);
 
339
    }
311
340
}
312
341
 
313
342
static void
352
381
   * would do by appending.
353
382
   */
354
383
  gtk_menu_tracker_remove_items (tracker, change_point, offset, removed);
355
 
  gtk_menu_tracker_add_items (tracker, section, change_point, offset, model, position, added);
 
384
  gtk_menu_tracker_add_items (tracker, section, change_point, offset, model, position, added, NULL);
356
385
 
357
386
  /* The offsets for insertion/removal of separators will be all over
358
387
   * the place, however...
378
407
                              GMenuModel     *model,
379
408
                              gboolean        with_separators,
380
409
                              gint            offset,
381
 
                              const gchar    *action_namespace)
 
410
                              const gchar    *action_namespace,
 
411
                              GPtrArray      *items_already_created)
382
412
{
383
413
  GtkMenuTrackerSection *section;
384
414
 
387
417
  section->with_separators = with_separators;
388
418
  section->action_namespace = g_strdup (action_namespace);
389
419
 
390
 
  gtk_menu_tracker_add_items (tracker, section, &section->items, offset, model, 0, g_menu_model_get_n_items (model));
 
420
  gtk_menu_tracker_add_items (tracker, section, &section->items, offset, model, 0, g_menu_model_get_n_items (model), items_already_created);
391
421
  section->handler = g_signal_connect (model, "items-changed", G_CALLBACK (gtk_menu_tracker_model_changed), tracker);
392
422
 
393
423
  return section;
461
491
  tracker->remove_func = remove_func;
462
492
  tracker->user_data = user_data;
463
493
 
464
 
  tracker->toplevel = gtk_menu_tracker_section_new (tracker, model, with_separators, 0, action_namespace);
 
494
  tracker->toplevel = gtk_menu_tracker_section_new (tracker, model, with_separators, 0, action_namespace, NULL);
465
495
  gtk_menu_tracker_section_sync_separators (tracker->toplevel, tracker, 0, FALSE, NULL, 0);
466
496
 
467
497
  return tracker;