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 }