diff options
Diffstat (limited to 'libqmenumodel/src/unitymenumodel.cpp')
-rw-r--r-- | libqmenumodel/src/unitymenumodel.cpp | 45 |
1 files changed, 24 insertions, 21 deletions
diff --git a/libqmenumodel/src/unitymenumodel.cpp b/libqmenumodel/src/unitymenumodel.cpp index ebadaf7..d9dc542 100644 --- a/libqmenumodel/src/unitymenumodel.cpp +++ b/libqmenumodel/src/unitymenumodel.cpp @@ -89,8 +89,8 @@ public: static void nameAppeared(GDBusConnection *connection, const gchar *name, const gchar *owner, gpointer user_data); static void nameVanished(GDBusConnection *connection, const gchar *name, gpointer user_data); - static void menuItemInserted(GtkMenuTrackerItem *item, gint position, gpointer user_data); - static void menuItemRemoved(gint position, gpointer user_data); + static void menuItemInserted(GPtrArray *items, gint position, gpointer user_data); + static void menuItemRemoved(gint position, gint n_items, gpointer user_data); static void menuItemChanged(GObject *object, GParamSpec *pspec, gpointer user_data); static void registeredActionAdded(GtkSimpleActionObserver *observer_item, @@ -250,19 +250,19 @@ void UnityMenuModelPrivate::nameVanished(GDBusConnection *connection, const gcha priv->clearName(); } -void UnityMenuModelPrivate::menuItemInserted(GtkMenuTrackerItem *item, gint position, gpointer user_data) +void UnityMenuModelPrivate::menuItemInserted(GPtrArray *items, gint position, gpointer user_data) { UnityMenuModelPrivate *priv = (UnityMenuModelPrivate *)user_data; - UnityMenuModelAddRowEvent ummare(item, position); + UnityMenuModelAddRowEvent ummare(items, position); QCoreApplication::sendEvent(priv->model, &ummare); } -void UnityMenuModelPrivate::menuItemRemoved(gint position, gpointer user_data) +void UnityMenuModelPrivate::menuItemRemoved(gint position, gint n_items, gpointer user_data) { UnityMenuModelPrivate *priv = (UnityMenuModelPrivate *)user_data; - UnityMenuModelRemoveRowEvent ummrre(position); + UnityMenuModelRemoveRowEvent ummrre(position, n_items); QCoreApplication::sendEvent(priv->model, &ummrre); } @@ -736,7 +736,7 @@ void UnityMenuModel::aboutToShow(int index) return; } - GtkMenuTrackerItem *item = (GtkMenuTrackerItem *) g_sequence_get (it); + auto item = static_cast<GtkMenuTrackerItem*>(g_sequence_get(it)); if (!item) { return; } @@ -746,7 +746,7 @@ void UnityMenuModel::aboutToShow(int index) // Child UnityMenuModel have priv->connection null, so climb to the parent until we find a non null one UnityMenuModelPrivate *privToUse = priv; while (privToUse && !privToUse->connection) { - UnityMenuModel *pModel = dynamic_cast<UnityMenuModel*>(privToUse->model->QObject::parent()); + auto pModel = dynamic_cast<UnityMenuModel*>(privToUse->model->QObject::parent()); if (pModel) { privToUse = pModel->priv; } else { @@ -762,7 +762,7 @@ void UnityMenuModel::aboutToShow(int index) g_variant_new("(t)", actionTag), nullptr, G_DBUS_CALL_FLAGS_NO_AUTO_START, - 0, + G_MAXINT, nullptr, nullptr, nullptr); @@ -838,26 +838,29 @@ bool UnityMenuModel::event(QEvent* e) GSequenceIter *it; it = g_sequence_get_iter_at_pos (priv->items, ummrce->position); - beginInsertRows(QModelIndex(), ummrce->position, ummrce->position); + beginInsertRows(QModelIndex(), ummrce->position, ummrce->position + ummrce->items->len - 1); - it = g_sequence_insert_before (it, g_object_ref (ummrce->item)); - g_object_set_qdata (G_OBJECT (ummrce->item), unity_menu_model_quark (), this); - g_signal_connect (ummrce->item, "notify", G_CALLBACK (UnityMenuModelPrivate::menuItemChanged), it); + for (gint i = ummrce->items->len - 1; i >= 0; --i) { + GtkMenuTrackerItem *item = (GtkMenuTrackerItem*)g_ptr_array_index(ummrce->items, i); + it = g_sequence_insert_before (it, g_object_ref (item)); + g_object_set_qdata (G_OBJECT (item), unity_menu_model_quark (), this); + g_signal_connect (item, "notify", G_CALLBACK (UnityMenuModelPrivate::menuItemChanged), it); + } endInsertRows(); return true; } else if (e->type() == UnityMenuModelRemoveRowEvent::eventType) { UnityMenuModelRemoveRowEvent *ummrre = static_cast<UnityMenuModelRemoveRowEvent*>(e); - GSequenceIter *it; - it = g_sequence_get_iter_at_pos (priv->items, ummrre->position); - if (!g_sequence_iter_is_end (it)) { - beginRemoveRows(QModelIndex(), ummrre->position, ummrre->position); - - g_sequence_remove (it); - - endRemoveRows(); + beginRemoveRows(QModelIndex(), ummrre->position, ummrre->position + ummrre->nItems - 1); + for (int i = 0; i < ummrre->nItems; ++i) { + GSequenceIter *it = g_sequence_get_iter_at_pos (priv->items, ummrre->position); + if (!g_sequence_iter_is_end (it)) { + g_sequence_remove (it); + } } + endRemoveRows(); + return true; } else if (e->type() == UnityMenuModelDataChangeEvent::eventType) { UnityMenuModelDataChangeEvent *ummdce = static_cast<UnityMenuModelDataChangeEvent*>(e); |