diff -r 000000000000 -r 8d3b1ddf789c app-manager/packagelist.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/app-manager/packagelist.c Sat Feb 20 12:11:02 2010 +0000 @@ -0,0 +1,240 @@ +/* + * 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 "app-manager.h" + +GtkTreeView *view=NULL; +PloverPackage *active=NULL; +gboolean view_files=FALSE; + +void package_present(PloverPackage *package) +{ + gchar *s; + const char *text,*t; + GtkWidget *w; + GtkTextBuffer *buf; + 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 + s=g_strdup(""); + 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=strndup(t,strcspn(t,"/")); + else + s=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")); + gtk_tree_view_set_model(GTK_TREE_VIEW(w), + GTK_TREE_MODEL(plover_package_get_file_store(package))); + } + 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_cell_data_func(GtkTreeViewColumn *column, + GtkCellRenderer *cell,GtkTreeModel *model,GtkTreeIter *iter,gpointer data) +{ + gchar *markup; + gchar *summary,*name,*version; + 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_strdup_printf("%s\n%s %s",summary,name,version,NULL); + 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; + GtkTreeViewColumn *column; + GtkCellRenderer *renderer; + GtkTreeSelection *selection; + 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) + { + gtk_tree_view_set_model(view,model); + gtk_tree_view_set_search_column(view, + PLOVER_PACKAGE_STORE_NAME_COLUMN); + } + 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) +{ +}