/* * Copyright (C) 2010 J. Ali Harlow * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "config.h" #include #include #include #include #include #include #include #include #include #include "app-manager.h" GtkTreeView *view=NULL; PloverPackage *active=NULL; gboolean view_files=FALSE; void package_present(PloverPackage *package) { 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) { s=g_strdup(plover_package_get_description(package)); g_strdelimit(s,"\t\n",' '); } else { 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")); if (!package) { gtk_widget_hide(w); w=GTK_WIDGET(gtk_builder_get_object(ui,"FilesScrolledWindow")); gtk_widget_hide(w); w=GTK_WIDGET(gtk_builder_get_object(ui,"DescriptionScrolledWindow")); gtk_widget_show(w); } else { if (view_files) gtk_widget_hide(w); else { gtk_widget_show(w); w=GTK_WIDGET(gtk_builder_get_object(ui,"HomepageBox")); text=plover_package_get_URL(package); if (!*text) gtk_widget_hide(w); else { gtk_widget_show(w); w=GTK_WIDGET(gtk_builder_get_object(ui,"Homepage")); gtk_link_button_set_uri(GTK_LINK_BUTTON(w),text); t=strstr(text,"://"); if (t) t+=3; if (t) s=g_strndup(t,strcspn(t,"/")); else s=g_strdup(text); gtk_button_set_label(GTK_BUTTON(w),s); g_free(s); } w=GTK_WIDGET(gtk_builder_get_object(ui,"Architecture")); gtk_label_set_text(GTK_LABEL(w),plover_package_get_arch(package)); w=GTK_WIDGET(gtk_builder_get_object(ui,"License")); gtk_label_set_text(GTK_LABEL(w), plover_package_get_license(package)); } w=GTK_WIDGET(gtk_builder_get_object(ui,"FilesScrolledWindow")); if (view_files) gtk_widget_show(w); else gtk_widget_hide(w); w=GTK_WIDGET(gtk_builder_get_object(ui,"DescriptionScrolledWindow")); if (view_files) { gtk_widget_hide(w); w=GTK_WIDGET(gtk_builder_get_object(ui,"Files")); store=plover_package_file_store_new_from_package(package); gtk_tree_view_set_model(GTK_TREE_VIEW(w),GTK_TREE_MODEL(store)); g_object_unref(store); } else { gtk_widget_show(w); /* Without this, Gtk+ 2.18.6 just truncates long license tags */ w=GTK_WIDGET(gtk_builder_get_object(ui,"DetailsScrolledWindow")); gtk_widget_queue_resize(w); } } } void package_filelist_present(PloverPackage *package) { } static void package_selection_changed(GtkTreeSelection *selection) { GtkTreeIter iter; GtkTreeView *view; GtkTreeModel *model; if (active) g_object_unref(active); if (gtk_tree_selection_get_selected(selection,NULL,&iter)) { view=gtk_tree_selection_get_tree_view(selection); model=gtk_tree_view_get_model(view); gtk_tree_model_get(model,&iter,PLOVER_PACKAGE_STORE_OBJ_COLUMN,&active, -1); } else active=NULL; package_present(active); } static void package_activated(GtkTreeView *view,GtkTreePath *path, GtkTreeViewColumn *column,gpointer data) { GtkTreeIter iter; GtkTreeModel *model=gtk_tree_view_get_model(view); PloverPackage *package; if (gtk_tree_model_get_iter(model,&iter,path)) { gtk_tree_model_get(model,&iter,PLOVER_PACKAGE_STORE_OBJ_COLUMN,&package, -1); package_filelist_present(package); } } 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) { gchar *markup; gchar *summary,*name,*version; g_return_if_fail(GTK_IS_TREE_MODEL(model)); gtk_tree_model_get(model,iter,PLOVER_PACKAGE_STORE_SUMMARY_COLUMN,&summary, PLOVER_PACKAGE_STORE_NAME_COLUMN,&name, PLOVER_PACKAGE_STORE_VERSION_COLUMN,&version,-1); markup=g_markup_printf_escaped("%s\n%s %s",summary,name,version); g_free(summary); g_free(name); g_free(version); g_object_set(cell,"markup",markup,NULL); g_free(markup); } 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")); if (w) { view=GTK_TREE_VIEW(w); #if 0 column=gtk_tree_view_column_new_with_attributes("Icon", gtk_cell_renderer_pixbuf_new(),"pixbuf", PLOVER_PACKAGE_FILE_STORE_ICON_COLUMN,NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(w),column); #endif column=gtk_tree_view_column_new(); gtk_tree_view_column_set_title(column,"Summary"); renderer=gtk_cell_renderer_text_new(); gtk_tree_view_column_pack_start(column,renderer,FALSE); gtk_tree_view_column_set_cell_data_func(column,renderer, package_cell_data_func,NULL,NULL); gtk_tree_view_append_column(view,column); gtk_widget_show_all(w); gtk_tree_view_set_headers_visible(view,FALSE); w=GTK_WIDGET(gtk_builder_get_object(ui,"SearchEntry")); gtk_tree_view_set_search_entry(view,GTK_ENTRY(w)); selection=gtk_tree_view_get_selection(view); g_signal_connect(selection,"changed", G_CALLBACK(package_selection_changed),NULL); g_signal_connect(view,"row-activated",G_CALLBACK(package_activated), NULL); } else g_warning("Packages: no such widget in UI"); w=GTK_WIDGET(gtk_builder_get_object(ui,"Files")); if (w) { column=gtk_tree_view_column_new_with_attributes("Name", gtk_cell_renderer_text_new(),"text", PLOVER_PACKAGE_FILE_STORE_NAME_COLUMN,NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(w),column); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(w),FALSE); gtk_widget_show_all(w); } else g_warning("Files: no such widget in UI"); } 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); } PloverPackage *get_active_package(void) { return active; } G_MODULE_EXPORT void on_view_files_toggled(GtkCheckMenuItem *menuitem,gpointer data) { view_files=gtk_check_menu_item_get_active(menuitem); package_present(active); } G_MODULE_EXPORT void on_view_details_toggled(GtkCheckMenuItem *menuitem,gpointer data) { }