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 +}