~indicator-applet-developers/qmenumodel/trunk

« back to all changes in this revision

Viewing changes to libqmenumodel/src/unitymenumodel.cpp

  • 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:
89
89
 
90
90
    static void nameAppeared(GDBusConnection *connection, const gchar *name, const gchar *owner, gpointer user_data);
91
91
    static void nameVanished(GDBusConnection *connection, const gchar *name, gpointer user_data);
92
 
    static void menuItemInserted(GtkMenuTrackerItem *item, gint position, gpointer user_data);
93
 
    static void menuItemRemoved(gint position, gpointer user_data);
 
92
    static void menuItemInserted(GPtrArray *items, gint position, gpointer user_data);
 
93
    static void menuItemRemoved(gint position, gint n_items, gpointer user_data);
94
94
    static void menuItemChanged(GObject *object, GParamSpec *pspec, gpointer user_data);
95
95
 
96
96
    static void registeredActionAdded(GtkSimpleActionObserver    *observer_item,
250
250
    priv->clearName();
251
251
}
252
252
 
253
 
void UnityMenuModelPrivate::menuItemInserted(GtkMenuTrackerItem *item, gint position, gpointer user_data)
 
253
void UnityMenuModelPrivate::menuItemInserted(GPtrArray *items, gint position, gpointer user_data)
254
254
{
255
255
    UnityMenuModelPrivate *priv = (UnityMenuModelPrivate *)user_data;
256
256
 
257
 
    UnityMenuModelAddRowEvent ummare(item, position);
 
257
    UnityMenuModelAddRowEvent ummare(items, position);
258
258
    QCoreApplication::sendEvent(priv->model, &ummare);
259
259
}
260
260
 
261
 
void UnityMenuModelPrivate::menuItemRemoved(gint position, gpointer user_data)
 
261
void UnityMenuModelPrivate::menuItemRemoved(gint position, gint n_items, gpointer user_data)
262
262
{
263
263
    UnityMenuModelPrivate *priv = (UnityMenuModelPrivate *)user_data;
264
264
 
265
 
    UnityMenuModelRemoveRowEvent ummrre(position);
 
265
    UnityMenuModelRemoveRowEvent ummrre(position, n_items);
266
266
    QCoreApplication::sendEvent(priv->model, &ummrre);
267
267
}
268
268
 
797
797
        GSequenceIter *it;
798
798
        it = g_sequence_get_iter_at_pos (priv->items, ummrce->position);
799
799
 
800
 
        beginInsertRows(QModelIndex(), ummrce->position, ummrce->position);
 
800
        beginInsertRows(QModelIndex(), ummrce->position, ummrce->position + ummrce->items->len - 1);
801
801
 
802
 
        it = g_sequence_insert_before (it, g_object_ref (ummrce->item));
803
 
        g_object_set_qdata (G_OBJECT (ummrce->item), unity_menu_model_quark (), this);
804
 
        g_signal_connect (ummrce->item, "notify", G_CALLBACK (UnityMenuModelPrivate::menuItemChanged), it);
 
802
        for (gint i = ummrce->items->len - 1; i >= 0; --i) {
 
803
            GtkMenuTrackerItem *item = (GtkMenuTrackerItem*)g_ptr_array_index(ummrce->items, i);
 
804
            it = g_sequence_insert_before (it, g_object_ref (item));
 
805
            g_object_set_qdata (G_OBJECT (item), unity_menu_model_quark (), this);
 
806
            g_signal_connect (item, "notify", G_CALLBACK (UnityMenuModelPrivate::menuItemChanged), it);
 
807
        }
805
808
 
806
809
        endInsertRows();
807
810
        return true;
808
811
    } else if (e->type() == UnityMenuModelRemoveRowEvent::eventType) {
809
812
        UnityMenuModelRemoveRowEvent *ummrre = static_cast<UnityMenuModelRemoveRowEvent*>(e);
810
813
 
811
 
        GSequenceIter *it;
812
 
        it = g_sequence_get_iter_at_pos (priv->items, ummrre->position);
813
 
        if (!g_sequence_iter_is_end (it)) {
814
 
            beginRemoveRows(QModelIndex(), ummrre->position, ummrre->position);
815
 
 
816
 
            g_sequence_remove (it);
817
 
 
818
 
            endRemoveRows();
 
814
        beginRemoveRows(QModelIndex(), ummrre->position, ummrre->position + ummrre->nItems - 1);
 
815
        for (int i = 0; i < ummrre->nItems; ++i) {
 
816
            GSequenceIter *it = g_sequence_get_iter_at_pos (priv->items, ummrre->position);
 
817
            if (!g_sequence_iter_is_end (it)) {
 
818
                g_sequence_remove (it);
 
819
            }
819
820
        }
 
821
        endRemoveRows();
 
822
 
820
823
        return true;
821
824
    } else if (e->type() == UnityMenuModelDataChangeEvent::eventType) {
822
825
        UnityMenuModelDataChangeEvent *ummdce = static_cast<UnityMenuModelDataChangeEvent*>(e);