app-manager/packagelist.c
changeset 9 8d3b1ddf789c
child 10 8b50be3e2998
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/app-manager/packagelist.c	Sat Feb 20 12:11:02 2010 +0000
     1.3 @@ -0,0 +1,240 @@
     1.4 +/*
     1.5 + * Copyright (C) 2010  J. Ali Harlow <ali@juiblex.co.uk>
     1.6 + *
     1.7 + * This program is free software; you can redistribute it and/or modify
     1.8 + * it under the terms of the GNU General Public License as published by
     1.9 + * the Free Software Foundation; either version 2 of the License, or
    1.10 + * (at your option) any later version.
    1.11 + *
    1.12 + * This program is distributed in the hope that it will be useful,
    1.13 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
    1.14 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    1.15 + * GNU General Public License for more details.
    1.16 + *
    1.17 + * You should have received a copy of the GNU General Public License along
    1.18 + * with this program; if not, write to the Free Software Foundation, Inc.,
    1.19 + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
    1.20 + */
    1.21 +
    1.22 +#include "config.h"
    1.23 +#include <stdlib.h>
    1.24 +#include <string.h>
    1.25 +#include <gtk/gtk.h>
    1.26 +#include <plover-gtk/package.h>
    1.27 +#include <plover-gtk/packageset.h>
    1.28 +#include <plover-gtk/packagestore.h>
    1.29 +#include <plover-gtk/packagefilestore.h>
    1.30 +#include "app-manager.h"
    1.31 +
    1.32 +GtkTreeView *view=NULL;
    1.33 +PloverPackage *active=NULL;
    1.34 +gboolean view_files=FALSE;
    1.35 +
    1.36 +void package_present(PloverPackage *package)
    1.37 +{
    1.38 +    gchar *s;
    1.39 +    const char *text,*t;
    1.40 +    GtkWidget *w;
    1.41 +    GtkTextBuffer *buf;
    1.42 +    buf=GTK_TEXT_BUFFER(gtk_builder_get_object(ui,"description"));
    1.43 +    if (package)
    1.44 +    {
    1.45 +	s=g_strdup(plover_package_get_description(package));
    1.46 +	g_strdelimit(s,"\t\n",' ');
    1.47 +    }
    1.48 +    else
    1.49 +	s=g_strdup("");
    1.50 +    gtk_text_buffer_set_text(buf,s,-1);
    1.51 +    g_free(s);
    1.52 +    w=GTK_WIDGET(gtk_builder_get_object(ui,"PackageDetails"));
    1.53 +    if (!package)
    1.54 +    {
    1.55 +	gtk_widget_hide(w);
    1.56 +	w=GTK_WIDGET(gtk_builder_get_object(ui,"FilesScrolledWindow"));
    1.57 +	gtk_widget_hide(w);
    1.58 +	w=GTK_WIDGET(gtk_builder_get_object(ui,"DescriptionScrolledWindow"));
    1.59 +	gtk_widget_show(w);
    1.60 +    }
    1.61 +    else
    1.62 +    {
    1.63 +	if (view_files)
    1.64 +	    gtk_widget_hide(w);
    1.65 +	else
    1.66 +	{
    1.67 +	    gtk_widget_show(w);
    1.68 +	    w=GTK_WIDGET(gtk_builder_get_object(ui,"HomepageBox"));
    1.69 +	    text=plover_package_get_URL(package);
    1.70 +	    if (!*text)
    1.71 +		gtk_widget_hide(w);
    1.72 +	    else
    1.73 +	    {
    1.74 +		gtk_widget_show(w);
    1.75 +		w=GTK_WIDGET(gtk_builder_get_object(ui,"Homepage"));
    1.76 +		gtk_link_button_set_uri(GTK_LINK_BUTTON(w),text);
    1.77 +		t=strstr(text,"://");
    1.78 +		if (t)
    1.79 +		    t+=3;
    1.80 +		if (t)
    1.81 +		    s=strndup(t,strcspn(t,"/"));
    1.82 +		else
    1.83 +		    s=strdup(text);
    1.84 +		gtk_button_set_label(GTK_BUTTON(w),s);
    1.85 +		g_free(s);
    1.86 +	    }
    1.87 +	    w=GTK_WIDGET(gtk_builder_get_object(ui,"Architecture"));
    1.88 +	    gtk_label_set_text(GTK_LABEL(w),plover_package_get_arch(package));
    1.89 +	    w=GTK_WIDGET(gtk_builder_get_object(ui,"License"));
    1.90 +	    gtk_label_set_text(GTK_LABEL(w),
    1.91 +	      plover_package_get_license(package));
    1.92 +	}
    1.93 +	w=GTK_WIDGET(gtk_builder_get_object(ui,"FilesScrolledWindow"));
    1.94 +	if (view_files)
    1.95 +	    gtk_widget_show(w);
    1.96 +	else
    1.97 +	    gtk_widget_hide(w);
    1.98 +	w=GTK_WIDGET(gtk_builder_get_object(ui,"DescriptionScrolledWindow"));
    1.99 +	if (view_files)
   1.100 +	{
   1.101 +	    gtk_widget_hide(w);
   1.102 +	    w=GTK_WIDGET(gtk_builder_get_object(ui,"Files"));
   1.103 +	    gtk_tree_view_set_model(GTK_TREE_VIEW(w),
   1.104 +	      GTK_TREE_MODEL(plover_package_get_file_store(package)));
   1.105 +	}
   1.106 +	else
   1.107 +	{
   1.108 +	    gtk_widget_show(w);
   1.109 +	    /* Without this, Gtk+ 2.18.6 just truncates long license tags */
   1.110 +	    w=GTK_WIDGET(gtk_builder_get_object(ui,"DetailsScrolledWindow"));
   1.111 +	    gtk_widget_queue_resize(w);
   1.112 +	}
   1.113 +    }
   1.114 +}
   1.115 +
   1.116 +void package_filelist_present(PloverPackage *package)
   1.117 +{
   1.118 +}
   1.119 +
   1.120 +static void package_selection_changed(GtkTreeSelection *selection)
   1.121 +{
   1.122 +    GtkTreeIter iter;
   1.123 +    GtkTreeView *view;
   1.124 +    GtkTreeModel *model;
   1.125 +    if (active)
   1.126 +	g_object_unref(active);
   1.127 +    if (gtk_tree_selection_get_selected(selection,NULL,&iter))
   1.128 +    {
   1.129 +	view=gtk_tree_selection_get_tree_view(selection);
   1.130 +	model=gtk_tree_view_get_model(view);
   1.131 +	gtk_tree_model_get(model,&iter,PLOVER_PACKAGE_STORE_OBJ_COLUMN,&active,
   1.132 +	  -1);
   1.133 +    }
   1.134 +    else
   1.135 +	active=NULL;
   1.136 +    package_present(active);
   1.137 +}
   1.138 +
   1.139 +static void package_activated(GtkTreeView *view,GtkTreePath *path,
   1.140 +  GtkTreeViewColumn *column,gpointer data)
   1.141 +{
   1.142 +    GtkTreeIter iter;
   1.143 +    GtkTreeModel *model=gtk_tree_view_get_model(view);
   1.144 +    PloverPackage *package;
   1.145 +    if (gtk_tree_model_get_iter(model,&iter,path))
   1.146 +    {
   1.147 +	gtk_tree_model_get(model,&iter,PLOVER_PACKAGE_STORE_OBJ_COLUMN,&package,
   1.148 +	  -1);
   1.149 +	package_filelist_present(package);
   1.150 +    }
   1.151 +}
   1.152 +
   1.153 +static void package_cell_data_func(GtkTreeViewColumn *column,
   1.154 +  GtkCellRenderer *cell,GtkTreeModel *model,GtkTreeIter *iter,gpointer data)
   1.155 +{
   1.156 +    gchar *markup;
   1.157 +    gchar *summary,*name,*version;
   1.158 +    gtk_tree_model_get(model,iter,PLOVER_PACKAGE_STORE_SUMMARY_COLUMN,&summary,
   1.159 +      PLOVER_PACKAGE_STORE_NAME_COLUMN,&name,
   1.160 +      PLOVER_PACKAGE_STORE_VERSION_COLUMN,&version,-1);
   1.161 +    markup=g_strdup_printf("<b>%s</b>\n%s %s",summary,name,version,NULL);
   1.162 +    g_free(summary);
   1.163 +    g_free(name);
   1.164 +    g_free(version);
   1.165 +    g_object_set(cell,"markup",markup,NULL);
   1.166 +    g_free(markup);
   1.167 +}
   1.168 +
   1.169 +void set_package_model(GtkTreeModel *model)
   1.170 +{
   1.171 +    GtkWidget *w;
   1.172 +    GtkTreeViewColumn *column;
   1.173 +    GtkCellRenderer *renderer;
   1.174 +    GtkTreeSelection *selection;
   1.175 +    if (!view)
   1.176 +    {
   1.177 +	w=GTK_WIDGET(gtk_builder_get_object(ui,"Packages"));
   1.178 +	if (w)
   1.179 +	{
   1.180 +	    view=GTK_TREE_VIEW(w);
   1.181 +#if 0
   1.182 +	    column=gtk_tree_view_column_new_with_attributes("Icon",
   1.183 +	      gtk_cell_renderer_pixbuf_new(),"pixbuf",
   1.184 +	      PLOVER_PACKAGE_FILE_STORE_ICON_COLUMN,NULL);
   1.185 +	    gtk_tree_view_append_column(GTK_TREE_VIEW(w),column);
   1.186 +#endif
   1.187 +	    column=gtk_tree_view_column_new();
   1.188 +	    gtk_tree_view_column_set_title(column,"Summary");
   1.189 +	    renderer=gtk_cell_renderer_text_new();
   1.190 +	    gtk_tree_view_column_pack_start(column,renderer,FALSE);
   1.191 +	    gtk_tree_view_column_set_cell_data_func(column,renderer,
   1.192 +	      package_cell_data_func,NULL,NULL);
   1.193 +	    gtk_tree_view_append_column(view,column);
   1.194 +	    gtk_widget_show_all(w);
   1.195 +	    gtk_tree_view_set_headers_visible(view,FALSE);
   1.196 +	    w=GTK_WIDGET(gtk_builder_get_object(ui,"SearchEntry"));
   1.197 +	    gtk_tree_view_set_search_entry(view,GTK_ENTRY(w));
   1.198 +	    selection=gtk_tree_view_get_selection(view);
   1.199 +	    g_signal_connect(selection,"changed",
   1.200 +	      G_CALLBACK(package_selection_changed),NULL);
   1.201 +	    g_signal_connect(view,"row-activated",G_CALLBACK(package_activated),
   1.202 +	      NULL);
   1.203 +	}
   1.204 +	else
   1.205 +	    g_warning("Packages: no such widget in UI");
   1.206 +	w=GTK_WIDGET(gtk_builder_get_object(ui,"Files"));
   1.207 +	if (w)
   1.208 +	{
   1.209 +	    column=gtk_tree_view_column_new_with_attributes("Name",
   1.210 +	      gtk_cell_renderer_text_new(),"text",
   1.211 +	      PLOVER_PACKAGE_FILE_STORE_NAME_COLUMN,NULL);
   1.212 +	    gtk_tree_view_append_column(GTK_TREE_VIEW(w),column);
   1.213 +	    gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(w),FALSE);
   1.214 +	    gtk_widget_show_all(w);
   1.215 +	}
   1.216 +	else
   1.217 +	    g_warning("Files: no such widget in UI");
   1.218 +    }
   1.219 +    if (view)
   1.220 +    {
   1.221 +	gtk_tree_view_set_model(view,model);
   1.222 +	gtk_tree_view_set_search_column(view,
   1.223 +	  PLOVER_PACKAGE_STORE_NAME_COLUMN);
   1.224 +    }
   1.225 +    package_present(NULL);
   1.226 +}
   1.227 +
   1.228 +PloverPackage *get_active_package(void)
   1.229 +{
   1.230 +    return active;
   1.231 +}
   1.232 +
   1.233 +G_MODULE_EXPORT void
   1.234 +  on_view_files_toggled(GtkCheckMenuItem *menuitem,gpointer data)
   1.235 +{
   1.236 +    view_files=gtk_check_menu_item_get_active(menuitem);
   1.237 +    package_present(active);
   1.238 +}
   1.239 +
   1.240 +G_MODULE_EXPORT void
   1.241 +  on_view_details_toggled(GtkCheckMenuItem *menuitem,gpointer data)
   1.242 +{
   1.243 +}