app-manager/packagelist.c
changeset 109 2947214c450e
parent 24 2b9f54d14cc2
     1.1 --- a/app-manager/packagelist.c	Sat Nov 15 19:04:45 2014 +0000
     1.2 +++ b/app-manager/packagelist.c	Tue Apr 25 17:41:00 2023 +0100
     1.3 @@ -20,8 +20,10 @@
     1.4  #include <stdlib.h>
     1.5  #include <string.h>
     1.6  #include <gtk/gtk.h>
     1.7 +#include <plover/plover.h>
     1.8  #include <plover/package.h>
     1.9  #include <plover/packageset.h>
    1.10 +#include <plover/yumrepository.h>
    1.11  #include <plover-gtk/packagestore.h>
    1.12  #include <plover-gtk/packagefilestore.h>
    1.13  #include "app-manager.h"
    1.14 @@ -32,11 +34,18 @@
    1.15  
    1.16  void package_present(PloverPackage *package)
    1.17  {
    1.18 -    gchar *s;
    1.19 +    gchar *s,*prefix,*prefix_path;
    1.20      const char *text,*t;
    1.21 +    char *multiple_prefixes="multiple";
    1.22 +    GError *tmp_err=NULL;
    1.23 +    GSList *sets,*repositories,*lnk;
    1.24      GtkWidget *w;
    1.25      GtkTextBuffer *buf;
    1.26 +    GtkTreeModel *model;
    1.27 +    struct comps *comps;
    1.28 +    PloverPackageSet *set;
    1.29      PloverPackageFileStore *store;
    1.30 +    PloverRepository *repository;
    1.31      buf=GTK_TEXT_BUFFER(gtk_builder_get_object(ui,"description"));
    1.32      if (package)
    1.33      {
    1.34 @@ -44,7 +53,99 @@
    1.35  	g_strdelimit(s,"\t\n",' ');
    1.36      }
    1.37      else
    1.38 -	s=g_strdup("");
    1.39 +    {
    1.40 +	model=gtk_tree_view_get_model(view);
    1.41 +	while(model &&
    1.42 +	  (GTK_IS_TREE_MODEL_FILTER(model) || GTK_IS_TREE_MODEL_SORT(model)))
    1.43 +	{
    1.44 +	    if (GTK_IS_TREE_MODEL_FILTER(model))
    1.45 +		model=
    1.46 +		  gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(model));
    1.47 +	    else
    1.48 +		model=gtk_tree_model_sort_get_model(GTK_TREE_MODEL_SORT(model));
    1.49 +	}
    1.50 +	repositories=NULL;
    1.51 +	prefix=NULL;
    1.52 +	if (model && PLOVER_IS_PACKAGE_STORE(model))
    1.53 +	{
    1.54 +	    sets=plover_package_store_get_sets(PLOVER_PACKAGE_STORE(model));
    1.55 +	    for(lnk=sets;lnk;lnk=lnk->next)
    1.56 +	    {
    1.57 +		set=lnk->data;
    1.58 +		repository=plover_package_set_get_repository(set);
    1.59 +		if (repository && !g_slist_find(repositories,repository))
    1.60 +		    repositories=g_slist_prepend(repositories,repository);
    1.61 +		t=plover_package_set_guess_prefix(set,tmp_err?NULL:&tmp_err);
    1.62 +		if (!t)
    1.63 +		    continue;
    1.64 +		if (!prefix)
    1.65 +		    prefix=g_strdup(t);
    1.66 +		else if (prefix!=multiple_prefixes && strcmp(prefix,t))
    1.67 +		{
    1.68 +		    g_free(prefix);
    1.69 +		    prefix=multiple_prefixes;
    1.70 +		}
    1.71 +	    }
    1.72 +	    if (prefix==multiple_prefixes)
    1.73 +		s=g_strdup("Multiple install prefixes");
    1.74 +	    else if (repositories)
    1.75 +	    {
    1.76 +		if (prefix!=multiple_prefixes)
    1.77 +		    g_free(prefix);
    1.78 +		prefix=NULL;
    1.79 +		for(lnk=repositories;lnk;lnk=lnk->next)
    1.80 +		{
    1.81 +		    repository=lnk->data;
    1.82 +		    if (PLOVER_IS_YUM_REPOSITORY(repository))
    1.83 +		    {
    1.84 +			comps=plover_yum_repository_get_comps(
    1.85 +			  PLOVER_YUM_REPOSITORY(repository),NULL);
    1.86 +			t=plover_comps_get_default_prefix(comps);
    1.87 +			if (!prefix)
    1.88 +			    prefix=g_strdup(t);
    1.89 +			else if (prefix!=multiple_prefixes && strcmp(prefix,t))
    1.90 +			{
    1.91 +			    g_free(prefix);
    1.92 +			    prefix=multiple_prefixes;
    1.93 +			}
    1.94 +		    }
    1.95 +		}
    1.96 +		if (prefix==multiple_prefixes)
    1.97 +		    s=g_strdup("Repositories intended to be installed to "
    1.98 +		      "multiple destinations");
    1.99 +		else if (prefix)
   1.100 +		{
   1.101 +		    prefix_path=razor_path_from_uri(prefix,NULL);
   1.102 +		    s=g_strdup_printf("Repository intended to be installed to: "
   1.103 +		      "%s",prefix_path?prefix_path:prefix);
   1.104 +		    g_free(prefix_path);
   1.105 +		}
   1.106 +		else
   1.107 +		    s=g_strdup("Repository with no default "
   1.108 +		      "install destination");
   1.109 +	    }
   1.110 +	    else if (prefix)
   1.111 +	    {
   1.112 +		prefix_path=razor_path_from_uri(prefix,NULL);
   1.113 +		s=g_strdup_printf("Installed in: %s",
   1.114 +		  prefix_path?prefix_path:prefix);
   1.115 +		g_free(prefix_path);
   1.116 +	    }
   1.117 +	    else if (sets)
   1.118 +		s=g_strdup("No common installation destination found");
   1.119 +	    else
   1.120 +		s=g_strdup("Empty package store");
   1.121 +	    if (prefix!=multiple_prefixes)
   1.122 +		g_free(prefix);
   1.123 +	    g_slist_free(repositories);
   1.124 +	    g_clear_error(&tmp_err);
   1.125 +	}
   1.126 +	else if (model)
   1.127 +	    s=g_strdup_printf("Unsupported package list container (%s)",
   1.128 +	      G_OBJECT_TYPE_NAME(model));
   1.129 +	else
   1.130 +	    s=g_strdup("No Package list container");
   1.131 +    }
   1.132      gtk_text_buffer_set_text(buf,s,-1);
   1.133      g_free(s);
   1.134      w=GTK_WIDGET(gtk_builder_get_object(ui,"PackageDetails"));
   1.135 @@ -149,6 +250,33 @@
   1.136      }
   1.137  }
   1.138  
   1.139 +static void package_inserted(GtkTreeModel *tree_model,GtkTreePath *path,
   1.140 +  GtkTreeIter *iter,gpointer data)
   1.141 +{
   1.142 +    gchar *s;
   1.143 +    s=gtk_tree_path_to_string(path);
   1.144 +    g_message("package_inserted(%s): %sactive package",
   1.145 +      s,active?"":"no ");
   1.146 +    g_free(s);
   1.147 +    if (!active)
   1.148 +	package_present(NULL);
   1.149 +}
   1.150 +
   1.151 +static void package_deleted(GtkTreeModel *tree_model,GtkTreePath *path,
   1.152 +  gpointer data)
   1.153 +{
   1.154 +    /*
   1.155 +     * If the deleted package was the active one, then selection-changed
   1.156 +     * will be emitted which will handle that case.
   1.157 +     */
   1.158 +    gchar *s;
   1.159 +    s=gtk_tree_path_to_string(path);
   1.160 +    g_message("package_deleted(%s): %sactive package",s,active?"":"no ");
   1.161 +    g_free(s);
   1.162 +    if (!active)
   1.163 +	package_present(NULL);
   1.164 +}
   1.165 +
   1.166  static void package_cell_data_func(GtkTreeViewColumn *column,
   1.167    GtkCellRenderer *cell,GtkTreeModel *model,GtkTreeIter *iter,gpointer data)
   1.168  {
   1.169 @@ -169,9 +297,21 @@
   1.170  void set_package_model(GtkTreeModel *model)
   1.171  {
   1.172      GtkWidget *w;
   1.173 +    GtkTreeModel *old_model;
   1.174      GtkTreeViewColumn *column;
   1.175      GtkCellRenderer *renderer;
   1.176      GtkTreeSelection *selection;
   1.177 +    if (view)
   1.178 +    {
   1.179 +	old_model=gtk_tree_view_get_model(view);
   1.180 +	if (old_model)
   1.181 +	{
   1.182 +	    g_signal_handlers_disconnect_by_func(old_model,
   1.183 +	      G_CALLBACK(package_inserted),NULL);
   1.184 +	    g_signal_handlers_disconnect_by_func(old_model,
   1.185 +	      G_CALLBACK(package_deleted),NULL);
   1.186 +	}
   1.187 +    }
   1.188      if (!view)
   1.189      {
   1.190  	w=GTK_WIDGET(gtk_builder_get_object(ui,"Packages"));
   1.191 @@ -218,9 +358,18 @@
   1.192      }
   1.193      if (view)
   1.194      {
   1.195 +	g_warning("set_package_model: Calling gtk_tree_view_set_model()");
   1.196  	gtk_tree_view_set_model(view,model);
   1.197 +	g_warning("set_package_model: gtk_tree_view_set_model() returns");
   1.198  	gtk_tree_view_set_search_column(view,
   1.199  	  PLOVER_PACKAGE_STORE_NAME_COLUMN);
   1.200 +	if (model)
   1.201 +	{
   1.202 +	    g_signal_connect(model,"row-inserted",G_CALLBACK(package_inserted),
   1.203 +	      NULL);
   1.204 +	    g_signal_connect(model,"row-deleted",G_CALLBACK(package_deleted),
   1.205 +	      NULL);
   1.206 +	}
   1.207      }
   1.208      package_present(NULL);
   1.209  }