plover-gtk/packagestore.c
changeset 109 2947214c450e
parent 30 3ee18a3a0f58
     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,