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