diff -r 3ee18a3a0f58 -r 2947214c450e plover-gtk/packagestore.c --- a/plover-gtk/packagestore.c Mon Nov 02 19:01:50 2015 +0000 +++ b/plover-gtk/packagestore.c Tue Apr 25 17:41:00 2023 +0100 @@ -298,35 +298,64 @@ return strcmp(plover_package_get_name(pa),plover_package_get_name(pb)); } +static gint + plover__sequence_iter_compar(gconstpointer a,gconstpointer b) +{ + GSequenceIter *sia=(GSequenceIter *)a; + GSequenceIter *sib=(GSequenceIter *)b; + return g_sequence_iter_get_position(sia)-g_sequence_iter_get_position(sib); +} + void plover_package_store_add_set(PloverPackageStore *store, PloverPackageSet *set) { - GSList *packages,*link; + GSList *packages,*lnk; GSequenceIter *si; GtkTreeIter ti; GtkTreePath *path; - gint *indices; PloverPackageStorePrivate *priv; g_return_if_fail(PLOVER_IS_PACKAGE_STORE(store)); g_return_if_fail(PLOVER_IS_PACKAGE_SET(set)); priv=PLOVER_PACKAGE_STORE_GET_PRIVATE(store); g_return_if_fail(g_slist_find(priv->sets,set) == NULL); g_object_ref(set); + /* + * This is a little complicated because we don't want to + * emit row-inserted until we have actually added set to + * the list of sets. On the other hand, we don't want to + * add set to the list of sets until all the packages it + * contains have been added to the sequence. + * Thus, this two phase implementation. + * However, this introduces an addition complication in + * that the original row numbers are no longer valid as + * we keep inserting rows. GSequenceIter should deal with + * this, but it seems to be giving us problems. Just go + * with the simple solution. + * Finally, the positions of the result have to be + * published in increasing order to avoid confusing + * subscribers. + */ + packages=plover_package_set_get_packages(set); + for(lnk=packages;lnk;lnk=lnk->next) + g_sequence_insert_sorted(priv->seq,lnk->data, + plover__package_compar,NULL); + priv->sets=g_slist_prepend(priv->sets,set); + priv->stamp++; path=gtk_tree_path_new(); gtk_tree_path_append_index(path,0); - indices=gtk_tree_path_get_indices(path); - packages=plover_package_set_get_packages(set); - for(link=packages;link;link=link->next) + si=g_sequence_get_begin_iter(priv->seq); + while(!g_sequence_iter_is_end(si)) { - si=g_sequence_insert_sorted(priv->seq,link->data, - plover__package_compar,NULL); - *indices=g_sequence_iter_get_position(si); - ti.stamp=priv->stamp; - ti.user_data=si; - gtk_tree_model_row_inserted(GTK_TREE_MODEL(store),path,&ti); + if (g_slist_find(packages,g_sequence_get(si))) + { + ti.stamp=priv->stamp; + ti.user_data=si; + gtk_tree_model_row_inserted(GTK_TREE_MODEL(store),path,&ti); + } + si=g_sequence_iter_next(si); + gtk_tree_path_next(path); } gtk_tree_path_free(path); - priv->sets=g_slist_prepend(priv->sets,set); } void plover_package_store_remove_set(PloverPackageStore *store,