1.1 --- a/plover-gtk/packagestore.c Mon Nov 02 19:01:50 2015 +0000
1.2 +++ b/plover-gtk/packagestore.c Tue Apr 25 17:41:00 2023 +0100
1.3 @@ -298,35 +298,64 @@
1.4 return strcmp(plover_package_get_name(pa),plover_package_get_name(pb));
1.5 }
1.6
1.7 +static gint
1.8 + plover__sequence_iter_compar(gconstpointer a,gconstpointer b)
1.9 +{
1.10 + GSequenceIter *sia=(GSequenceIter *)a;
1.11 + GSequenceIter *sib=(GSequenceIter *)b;
1.12 + return g_sequence_iter_get_position(sia)-g_sequence_iter_get_position(sib);
1.13 +}
1.14 +
1.15 void plover_package_store_add_set(PloverPackageStore *store,
1.16 PloverPackageSet *set)
1.17 {
1.18 - GSList *packages,*link;
1.19 + GSList *packages,*lnk;
1.20 GSequenceIter *si;
1.21 GtkTreeIter ti;
1.22 GtkTreePath *path;
1.23 - gint *indices;
1.24 PloverPackageStorePrivate *priv;
1.25 g_return_if_fail(PLOVER_IS_PACKAGE_STORE(store));
1.26 g_return_if_fail(PLOVER_IS_PACKAGE_SET(set));
1.27 priv=PLOVER_PACKAGE_STORE_GET_PRIVATE(store);
1.28 g_return_if_fail(g_slist_find(priv->sets,set) == NULL);
1.29 g_object_ref(set);
1.30 + /*
1.31 + * This is a little complicated because we don't want to
1.32 + * emit row-inserted until we have actually added set to
1.33 + * the list of sets. On the other hand, we don't want to
1.34 + * add set to the list of sets until all the packages it
1.35 + * contains have been added to the sequence.
1.36 + * Thus, this two phase implementation.
1.37 + * However, this introduces an addition complication in
1.38 + * that the original row numbers are no longer valid as
1.39 + * we keep inserting rows. GSequenceIter should deal with
1.40 + * this, but it seems to be giving us problems. Just go
1.41 + * with the simple solution.
1.42 + * Finally, the positions of the result have to be
1.43 + * published in increasing order to avoid confusing
1.44 + * subscribers.
1.45 + */
1.46 + packages=plover_package_set_get_packages(set);
1.47 + for(lnk=packages;lnk;lnk=lnk->next)
1.48 + g_sequence_insert_sorted(priv->seq,lnk->data,
1.49 + plover__package_compar,NULL);
1.50 + priv->sets=g_slist_prepend(priv->sets,set);
1.51 + priv->stamp++;
1.52 path=gtk_tree_path_new();
1.53 gtk_tree_path_append_index(path,0);
1.54 - indices=gtk_tree_path_get_indices(path);
1.55 - packages=plover_package_set_get_packages(set);
1.56 - for(link=packages;link;link=link->next)
1.57 + si=g_sequence_get_begin_iter(priv->seq);
1.58 + while(!g_sequence_iter_is_end(si))
1.59 {
1.60 - si=g_sequence_insert_sorted(priv->seq,link->data,
1.61 - plover__package_compar,NULL);
1.62 - *indices=g_sequence_iter_get_position(si);
1.63 - ti.stamp=priv->stamp;
1.64 - ti.user_data=si;
1.65 - gtk_tree_model_row_inserted(GTK_TREE_MODEL(store),path,&ti);
1.66 + if (g_slist_find(packages,g_sequence_get(si)))
1.67 + {
1.68 + ti.stamp=priv->stamp;
1.69 + ti.user_data=si;
1.70 + gtk_tree_model_row_inserted(GTK_TREE_MODEL(store),path,&ti);
1.71 + }
1.72 + si=g_sequence_iter_next(si);
1.73 + gtk_tree_path_next(path);
1.74 }
1.75 gtk_tree_path_free(path);
1.76 - priv->sets=g_slist_prepend(priv->sets,set);
1.77 }
1.78
1.79 void plover_package_store_remove_set(PloverPackageStore *store,