diff -r 2b9f54d14cc2 -r 2947214c450e app-manager/packagelist.c --- a/app-manager/packagelist.c Sat Nov 15 19:04:45 2014 +0000 +++ b/app-manager/packagelist.c Tue Apr 25 17:41:00 2023 +0100 @@ -20,8 +20,10 @@ #include #include #include +#include #include #include +#include #include #include #include "app-manager.h" @@ -32,11 +34,18 @@ void package_present(PloverPackage *package) { - gchar *s; + gchar *s,*prefix,*prefix_path; const char *text,*t; + char *multiple_prefixes="multiple"; + GError *tmp_err=NULL; + GSList *sets,*repositories,*lnk; GtkWidget *w; GtkTextBuffer *buf; + GtkTreeModel *model; + struct comps *comps; + PloverPackageSet *set; PloverPackageFileStore *store; + PloverRepository *repository; buf=GTK_TEXT_BUFFER(gtk_builder_get_object(ui,"description")); if (package) { @@ -44,7 +53,99 @@ g_strdelimit(s,"\t\n",' '); } else - s=g_strdup(""); + { + model=gtk_tree_view_get_model(view); + while(model && + (GTK_IS_TREE_MODEL_FILTER(model) || GTK_IS_TREE_MODEL_SORT(model))) + { + if (GTK_IS_TREE_MODEL_FILTER(model)) + model= + gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(model)); + else + model=gtk_tree_model_sort_get_model(GTK_TREE_MODEL_SORT(model)); + } + repositories=NULL; + prefix=NULL; + if (model && PLOVER_IS_PACKAGE_STORE(model)) + { + sets=plover_package_store_get_sets(PLOVER_PACKAGE_STORE(model)); + for(lnk=sets;lnk;lnk=lnk->next) + { + set=lnk->data; + repository=plover_package_set_get_repository(set); + if (repository && !g_slist_find(repositories,repository)) + repositories=g_slist_prepend(repositories,repository); + t=plover_package_set_guess_prefix(set,tmp_err?NULL:&tmp_err); + if (!t) + continue; + if (!prefix) + prefix=g_strdup(t); + else if (prefix!=multiple_prefixes && strcmp(prefix,t)) + { + g_free(prefix); + prefix=multiple_prefixes; + } + } + if (prefix==multiple_prefixes) + s=g_strdup("Multiple install prefixes"); + else if (repositories) + { + if (prefix!=multiple_prefixes) + g_free(prefix); + prefix=NULL; + for(lnk=repositories;lnk;lnk=lnk->next) + { + repository=lnk->data; + if (PLOVER_IS_YUM_REPOSITORY(repository)) + { + comps=plover_yum_repository_get_comps( + PLOVER_YUM_REPOSITORY(repository),NULL); + t=plover_comps_get_default_prefix(comps); + if (!prefix) + prefix=g_strdup(t); + else if (prefix!=multiple_prefixes && strcmp(prefix,t)) + { + g_free(prefix); + prefix=multiple_prefixes; + } + } + } + if (prefix==multiple_prefixes) + s=g_strdup("Repositories intended to be installed to " + "multiple destinations"); + else if (prefix) + { + prefix_path=razor_path_from_uri(prefix,NULL); + s=g_strdup_printf("Repository intended to be installed to: " + "%s",prefix_path?prefix_path:prefix); + g_free(prefix_path); + } + else + s=g_strdup("Repository with no default " + "install destination"); + } + else if (prefix) + { + prefix_path=razor_path_from_uri(prefix,NULL); + s=g_strdup_printf("Installed in: %s", + prefix_path?prefix_path:prefix); + g_free(prefix_path); + } + else if (sets) + s=g_strdup("No common installation destination found"); + else + s=g_strdup("Empty package store"); + if (prefix!=multiple_prefixes) + g_free(prefix); + g_slist_free(repositories); + g_clear_error(&tmp_err); + } + else if (model) + s=g_strdup_printf("Unsupported package list container (%s)", + G_OBJECT_TYPE_NAME(model)); + else + s=g_strdup("No Package list container"); + } gtk_text_buffer_set_text(buf,s,-1); g_free(s); w=GTK_WIDGET(gtk_builder_get_object(ui,"PackageDetails")); @@ -149,6 +250,33 @@ } } +static void package_inserted(GtkTreeModel *tree_model,GtkTreePath *path, + GtkTreeIter *iter,gpointer data) +{ + gchar *s; + s=gtk_tree_path_to_string(path); + g_message("package_inserted(%s): %sactive package", + s,active?"":"no "); + g_free(s); + if (!active) + package_present(NULL); +} + +static void package_deleted(GtkTreeModel *tree_model,GtkTreePath *path, + gpointer data) +{ + /* + * If the deleted package was the active one, then selection-changed + * will be emitted which will handle that case. + */ + gchar *s; + s=gtk_tree_path_to_string(path); + g_message("package_deleted(%s): %sactive package",s,active?"":"no "); + g_free(s); + if (!active) + package_present(NULL); +} + static void package_cell_data_func(GtkTreeViewColumn *column, GtkCellRenderer *cell,GtkTreeModel *model,GtkTreeIter *iter,gpointer data) { @@ -169,9 +297,21 @@ void set_package_model(GtkTreeModel *model) { GtkWidget *w; + GtkTreeModel *old_model; GtkTreeViewColumn *column; GtkCellRenderer *renderer; GtkTreeSelection *selection; + if (view) + { + old_model=gtk_tree_view_get_model(view); + if (old_model) + { + g_signal_handlers_disconnect_by_func(old_model, + G_CALLBACK(package_inserted),NULL); + g_signal_handlers_disconnect_by_func(old_model, + G_CALLBACK(package_deleted),NULL); + } + } if (!view) { w=GTK_WIDGET(gtk_builder_get_object(ui,"Packages")); @@ -218,9 +358,18 @@ } if (view) { + g_warning("set_package_model: Calling gtk_tree_view_set_model()"); gtk_tree_view_set_model(view,model); + g_warning("set_package_model: gtk_tree_view_set_model() returns"); gtk_tree_view_set_search_column(view, PLOVER_PACKAGE_STORE_NAME_COLUMN); + if (model) + { + g_signal_connect(model,"row-inserted",G_CALLBACK(package_inserted), + NULL); + g_signal_connect(model,"row-deleted",G_CALLBACK(package_deleted), + NULL); + } } package_present(NULL); }