app-manager/packagelist.c
author J. Ali Harlow <ali@juiblex.co.uk>
Thu Nov 10 11:19:34 2011 +0000 (2011-11-10)
changeset 15 06caf639d95e
parent 9 8d3b1ddf789c
child 24 2b9f54d14cc2
permissions -rw-r--r--
Release 0.4
     1 /*
     2  * Copyright (C) 2010  J. Ali Harlow <ali@juiblex.co.uk>
     3  *
     4  * This program is free software; you can redistribute it and/or modify
     5  * it under the terms of the GNU General Public License as published by
     6  * the Free Software Foundation; either version 2 of the License, or
     7  * (at your option) any later version.
     8  *
     9  * This program is distributed in the hope that it will be useful,
    10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    12  * GNU General Public License for more details.
    13  *
    14  * You should have received a copy of the GNU General Public License along
    15  * with this program; if not, write to the Free Software Foundation, Inc.,
    16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
    17  */
    18 
    19 #include "config.h"
    20 #include <stdlib.h>
    21 #include <string.h>
    22 #include <gtk/gtk.h>
    23 #include <plover-gtk/package.h>
    24 #include <plover-gtk/packageset.h>
    25 #include <plover-gtk/packagestore.h>
    26 #include <plover-gtk/packagefilestore.h>
    27 #include "app-manager.h"
    28 
    29 GtkTreeView *view=NULL;
    30 PloverPackage *active=NULL;
    31 gboolean view_files=FALSE;
    32 
    33 void package_present(PloverPackage *package)
    34 {
    35     gchar *s;
    36     const char *text,*t;
    37     GtkWidget *w;
    38     GtkTextBuffer *buf;
    39     buf=GTK_TEXT_BUFFER(gtk_builder_get_object(ui,"description"));
    40     if (package)
    41     {
    42 	s=g_strdup(plover_package_get_description(package));
    43 	g_strdelimit(s,"\t\n",' ');
    44     }
    45     else
    46 	s=g_strdup("");
    47     gtk_text_buffer_set_text(buf,s,-1);
    48     g_free(s);
    49     w=GTK_WIDGET(gtk_builder_get_object(ui,"PackageDetails"));
    50     if (!package)
    51     {
    52 	gtk_widget_hide(w);
    53 	w=GTK_WIDGET(gtk_builder_get_object(ui,"FilesScrolledWindow"));
    54 	gtk_widget_hide(w);
    55 	w=GTK_WIDGET(gtk_builder_get_object(ui,"DescriptionScrolledWindow"));
    56 	gtk_widget_show(w);
    57     }
    58     else
    59     {
    60 	if (view_files)
    61 	    gtk_widget_hide(w);
    62 	else
    63 	{
    64 	    gtk_widget_show(w);
    65 	    w=GTK_WIDGET(gtk_builder_get_object(ui,"HomepageBox"));
    66 	    text=plover_package_get_URL(package);
    67 	    if (!*text)
    68 		gtk_widget_hide(w);
    69 	    else
    70 	    {
    71 		gtk_widget_show(w);
    72 		w=GTK_WIDGET(gtk_builder_get_object(ui,"Homepage"));
    73 		gtk_link_button_set_uri(GTK_LINK_BUTTON(w),text);
    74 		t=strstr(text,"://");
    75 		if (t)
    76 		    t+=3;
    77 		if (t)
    78 		    s=g_strndup(t,strcspn(t,"/"));
    79 		else
    80 		    s=g_strdup(text);
    81 		gtk_button_set_label(GTK_BUTTON(w),s);
    82 		g_free(s);
    83 	    }
    84 	    w=GTK_WIDGET(gtk_builder_get_object(ui,"Architecture"));
    85 	    gtk_label_set_text(GTK_LABEL(w),plover_package_get_arch(package));
    86 	    w=GTK_WIDGET(gtk_builder_get_object(ui,"License"));
    87 	    gtk_label_set_text(GTK_LABEL(w),
    88 	      plover_package_get_license(package));
    89 	}
    90 	w=GTK_WIDGET(gtk_builder_get_object(ui,"FilesScrolledWindow"));
    91 	if (view_files)
    92 	    gtk_widget_show(w);
    93 	else
    94 	    gtk_widget_hide(w);
    95 	w=GTK_WIDGET(gtk_builder_get_object(ui,"DescriptionScrolledWindow"));
    96 	if (view_files)
    97 	{
    98 	    gtk_widget_hide(w);
    99 	    w=GTK_WIDGET(gtk_builder_get_object(ui,"Files"));
   100 	    gtk_tree_view_set_model(GTK_TREE_VIEW(w),
   101 	      GTK_TREE_MODEL(plover_package_get_file_store(package)));
   102 	}
   103 	else
   104 	{
   105 	    gtk_widget_show(w);
   106 	    /* Without this, Gtk+ 2.18.6 just truncates long license tags */
   107 	    w=GTK_WIDGET(gtk_builder_get_object(ui,"DetailsScrolledWindow"));
   108 	    gtk_widget_queue_resize(w);
   109 	}
   110     }
   111 }
   112 
   113 void package_filelist_present(PloverPackage *package)
   114 {
   115 }
   116 
   117 static void package_selection_changed(GtkTreeSelection *selection)
   118 {
   119     GtkTreeIter iter;
   120     GtkTreeView *view;
   121     GtkTreeModel *model;
   122     if (active)
   123 	g_object_unref(active);
   124     if (gtk_tree_selection_get_selected(selection,NULL,&iter))
   125     {
   126 	view=gtk_tree_selection_get_tree_view(selection);
   127 	model=gtk_tree_view_get_model(view);
   128 	gtk_tree_model_get(model,&iter,PLOVER_PACKAGE_STORE_OBJ_COLUMN,&active,
   129 	  -1);
   130     }
   131     else
   132 	active=NULL;
   133     package_present(active);
   134 }
   135 
   136 static void package_activated(GtkTreeView *view,GtkTreePath *path,
   137   GtkTreeViewColumn *column,gpointer data)
   138 {
   139     GtkTreeIter iter;
   140     GtkTreeModel *model=gtk_tree_view_get_model(view);
   141     PloverPackage *package;
   142     if (gtk_tree_model_get_iter(model,&iter,path))
   143     {
   144 	gtk_tree_model_get(model,&iter,PLOVER_PACKAGE_STORE_OBJ_COLUMN,&package,
   145 	  -1);
   146 	package_filelist_present(package);
   147     }
   148 }
   149 
   150 static void package_cell_data_func(GtkTreeViewColumn *column,
   151   GtkCellRenderer *cell,GtkTreeModel *model,GtkTreeIter *iter,gpointer data)
   152 {
   153     gchar *markup;
   154     gchar *summary,*name,*version;
   155     g_return_if_fail(GTK_IS_TREE_MODEL(model));
   156     gtk_tree_model_get(model,iter,PLOVER_PACKAGE_STORE_SUMMARY_COLUMN,&summary,
   157       PLOVER_PACKAGE_STORE_NAME_COLUMN,&name,
   158       PLOVER_PACKAGE_STORE_VERSION_COLUMN,&version,-1);
   159     markup=g_markup_printf_escaped("<b>%s</b>\n%s %s",summary,name,version);
   160     g_free(summary);
   161     g_free(name);
   162     g_free(version);
   163     g_object_set(cell,"markup",markup,NULL);
   164     g_free(markup);
   165 }
   166 
   167 void set_package_model(GtkTreeModel *model)
   168 {
   169     GtkWidget *w;
   170     GtkTreeViewColumn *column;
   171     GtkCellRenderer *renderer;
   172     GtkTreeSelection *selection;
   173     if (!view)
   174     {
   175 	w=GTK_WIDGET(gtk_builder_get_object(ui,"Packages"));
   176 	if (w)
   177 	{
   178 	    view=GTK_TREE_VIEW(w);
   179 #if 0
   180 	    column=gtk_tree_view_column_new_with_attributes("Icon",
   181 	      gtk_cell_renderer_pixbuf_new(),"pixbuf",
   182 	      PLOVER_PACKAGE_FILE_STORE_ICON_COLUMN,NULL);
   183 	    gtk_tree_view_append_column(GTK_TREE_VIEW(w),column);
   184 #endif
   185 	    column=gtk_tree_view_column_new();
   186 	    gtk_tree_view_column_set_title(column,"Summary");
   187 	    renderer=gtk_cell_renderer_text_new();
   188 	    gtk_tree_view_column_pack_start(column,renderer,FALSE);
   189 	    gtk_tree_view_column_set_cell_data_func(column,renderer,
   190 	      package_cell_data_func,NULL,NULL);
   191 	    gtk_tree_view_append_column(view,column);
   192 	    gtk_widget_show_all(w);
   193 	    gtk_tree_view_set_headers_visible(view,FALSE);
   194 	    w=GTK_WIDGET(gtk_builder_get_object(ui,"SearchEntry"));
   195 	    gtk_tree_view_set_search_entry(view,GTK_ENTRY(w));
   196 	    selection=gtk_tree_view_get_selection(view);
   197 	    g_signal_connect(selection,"changed",
   198 	      G_CALLBACK(package_selection_changed),NULL);
   199 	    g_signal_connect(view,"row-activated",G_CALLBACK(package_activated),
   200 	      NULL);
   201 	}
   202 	else
   203 	    g_warning("Packages: no such widget in UI");
   204 	w=GTK_WIDGET(gtk_builder_get_object(ui,"Files"));
   205 	if (w)
   206 	{
   207 	    column=gtk_tree_view_column_new_with_attributes("Name",
   208 	      gtk_cell_renderer_text_new(),"text",
   209 	      PLOVER_PACKAGE_FILE_STORE_NAME_COLUMN,NULL);
   210 	    gtk_tree_view_append_column(GTK_TREE_VIEW(w),column);
   211 	    gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(w),FALSE);
   212 	    gtk_widget_show_all(w);
   213 	}
   214 	else
   215 	    g_warning("Files: no such widget in UI");
   216     }
   217     if (view)
   218     {
   219 	gtk_tree_view_set_model(view,model);
   220 	gtk_tree_view_set_search_column(view,
   221 	  PLOVER_PACKAGE_STORE_NAME_COLUMN);
   222     }
   223     package_present(NULL);
   224 }
   225 
   226 PloverPackage *get_active_package(void)
   227 {
   228     return active;
   229 }
   230 
   231 G_MODULE_EXPORT void
   232   on_view_files_toggled(GtkCheckMenuItem *menuitem,gpointer data)
   233 {
   234     view_files=gtk_check_menu_item_get_active(menuitem);
   235     package_present(active);
   236 }
   237 
   238 G_MODULE_EXPORT void
   239   on_view_details_toggled(GtkCheckMenuItem *menuitem,gpointer data)
   240 {
   241 }