2 * Copyright (C) 2010 J. Ali Harlow <ali@juiblex.co.uk>
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.
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.
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.
23 #include <plover/plover.h>
24 #include <plover/package.h>
25 #include <plover/packageset.h>
26 #include <plover/yumrepository.h>
27 #include <plover-gtk/packagestore.h>
28 #include <plover-gtk/packagefilestore.h>
29 #include "app-manager.h"
31 GtkTreeView *view=NULL;
32 PloverPackage *active=NULL;
33 gboolean view_files=FALSE;
35 void package_present(PloverPackage *package)
37 gchar *s,*prefix,*prefix_path;
39 char *multiple_prefixes="multiple";
41 GSList *sets,*repositories,*lnk;
46 PloverPackageSet *set;
47 PloverPackageFileStore *store;
48 PloverRepository *repository;
49 buf=GTK_TEXT_BUFFER(gtk_builder_get_object(ui,"description"));
52 s=g_strdup(plover_package_get_description(package));
53 g_strdelimit(s,"\t\n",' ');
57 model=gtk_tree_view_get_model(view);
59 (GTK_IS_TREE_MODEL_FILTER(model) || GTK_IS_TREE_MODEL_SORT(model)))
61 if (GTK_IS_TREE_MODEL_FILTER(model))
63 gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(model));
65 model=gtk_tree_model_sort_get_model(GTK_TREE_MODEL_SORT(model));
69 if (model && PLOVER_IS_PACKAGE_STORE(model))
71 sets=plover_package_store_get_sets(PLOVER_PACKAGE_STORE(model));
72 for(lnk=sets;lnk;lnk=lnk->next)
75 repository=plover_package_set_get_repository(set);
76 if (repository && !g_slist_find(repositories,repository))
77 repositories=g_slist_prepend(repositories,repository);
78 t=plover_package_set_guess_prefix(set,tmp_err?NULL:&tmp_err);
83 else if (prefix!=multiple_prefixes && strcmp(prefix,t))
86 prefix=multiple_prefixes;
89 if (prefix==multiple_prefixes)
90 s=g_strdup("Multiple install prefixes");
91 else if (repositories)
93 if (prefix!=multiple_prefixes)
96 for(lnk=repositories;lnk;lnk=lnk->next)
99 if (PLOVER_IS_YUM_REPOSITORY(repository))
101 comps=plover_yum_repository_get_comps(
102 PLOVER_YUM_REPOSITORY(repository),NULL);
103 t=plover_comps_get_default_prefix(comps);
106 else if (prefix!=multiple_prefixes && strcmp(prefix,t))
109 prefix=multiple_prefixes;
113 if (prefix==multiple_prefixes)
114 s=g_strdup("Repositories intended to be installed to "
115 "multiple destinations");
118 prefix_path=razor_path_from_uri(prefix,NULL);
119 s=g_strdup_printf("Repository intended to be installed to: "
120 "%s",prefix_path?prefix_path:prefix);
124 s=g_strdup("Repository with no default "
125 "install destination");
129 prefix_path=razor_path_from_uri(prefix,NULL);
130 s=g_strdup_printf("Installed in: %s",
131 prefix_path?prefix_path:prefix);
135 s=g_strdup("No common installation destination found");
137 s=g_strdup("Empty package store");
138 if (prefix!=multiple_prefixes)
140 g_slist_free(repositories);
141 g_clear_error(&tmp_err);
144 s=g_strdup_printf("Unsupported package list container (%s)",
145 G_OBJECT_TYPE_NAME(model));
147 s=g_strdup("No Package list container");
149 gtk_text_buffer_set_text(buf,s,-1);
151 w=GTK_WIDGET(gtk_builder_get_object(ui,"PackageDetails"));
155 w=GTK_WIDGET(gtk_builder_get_object(ui,"FilesScrolledWindow"));
157 w=GTK_WIDGET(gtk_builder_get_object(ui,"DescriptionScrolledWindow"));
167 w=GTK_WIDGET(gtk_builder_get_object(ui,"HomepageBox"));
168 text=plover_package_get_URL(package);
174 w=GTK_WIDGET(gtk_builder_get_object(ui,"Homepage"));
175 gtk_link_button_set_uri(GTK_LINK_BUTTON(w),text);
176 t=strstr(text,"://");
180 s=g_strndup(t,strcspn(t,"/"));
183 gtk_button_set_label(GTK_BUTTON(w),s);
186 w=GTK_WIDGET(gtk_builder_get_object(ui,"Architecture"));
187 gtk_label_set_text(GTK_LABEL(w),plover_package_get_arch(package));
188 w=GTK_WIDGET(gtk_builder_get_object(ui,"License"));
189 gtk_label_set_text(GTK_LABEL(w),
190 plover_package_get_license(package));
192 w=GTK_WIDGET(gtk_builder_get_object(ui,"FilesScrolledWindow"));
197 w=GTK_WIDGET(gtk_builder_get_object(ui,"DescriptionScrolledWindow"));
201 w=GTK_WIDGET(gtk_builder_get_object(ui,"Files"));
202 store=plover_package_file_store_new_from_package(package);
203 gtk_tree_view_set_model(GTK_TREE_VIEW(w),GTK_TREE_MODEL(store));
204 g_object_unref(store);
209 /* Without this, Gtk+ 2.18.6 just truncates long license tags */
210 w=GTK_WIDGET(gtk_builder_get_object(ui,"DetailsScrolledWindow"));
211 gtk_widget_queue_resize(w);
216 void package_filelist_present(PloverPackage *package)
220 static void package_selection_changed(GtkTreeSelection *selection)
226 g_object_unref(active);
227 if (gtk_tree_selection_get_selected(selection,NULL,&iter))
229 view=gtk_tree_selection_get_tree_view(selection);
230 model=gtk_tree_view_get_model(view);
231 gtk_tree_model_get(model,&iter,PLOVER_PACKAGE_STORE_OBJ_COLUMN,&active,
236 package_present(active);
239 static void package_activated(GtkTreeView *view,GtkTreePath *path,
240 GtkTreeViewColumn *column,gpointer data)
243 GtkTreeModel *model=gtk_tree_view_get_model(view);
244 PloverPackage *package;
245 if (gtk_tree_model_get_iter(model,&iter,path))
247 gtk_tree_model_get(model,&iter,PLOVER_PACKAGE_STORE_OBJ_COLUMN,&package,
249 package_filelist_present(package);
253 static void package_inserted(GtkTreeModel *tree_model,GtkTreePath *path,
254 GtkTreeIter *iter,gpointer data)
257 s=gtk_tree_path_to_string(path);
258 g_message("package_inserted(%s): %sactive package",
262 package_present(NULL);
265 static void package_deleted(GtkTreeModel *tree_model,GtkTreePath *path,
269 * If the deleted package was the active one, then selection-changed
270 * will be emitted which will handle that case.
273 s=gtk_tree_path_to_string(path);
274 g_message("package_deleted(%s): %sactive package",s,active?"":"no ");
277 package_present(NULL);
280 static void package_cell_data_func(GtkTreeViewColumn *column,
281 GtkCellRenderer *cell,GtkTreeModel *model,GtkTreeIter *iter,gpointer data)
284 gchar *summary,*name,*version;
285 g_return_if_fail(GTK_IS_TREE_MODEL(model));
286 gtk_tree_model_get(model,iter,PLOVER_PACKAGE_STORE_SUMMARY_COLUMN,&summary,
287 PLOVER_PACKAGE_STORE_NAME_COLUMN,&name,
288 PLOVER_PACKAGE_STORE_VERSION_COLUMN,&version,-1);
289 markup=g_markup_printf_escaped("<b>%s</b>\n%s %s",summary,name,version);
293 g_object_set(cell,"markup",markup,NULL);
297 void set_package_model(GtkTreeModel *model)
300 GtkTreeModel *old_model;
301 GtkTreeViewColumn *column;
302 GtkCellRenderer *renderer;
303 GtkTreeSelection *selection;
306 old_model=gtk_tree_view_get_model(view);
309 g_signal_handlers_disconnect_by_func(old_model,
310 G_CALLBACK(package_inserted),NULL);
311 g_signal_handlers_disconnect_by_func(old_model,
312 G_CALLBACK(package_deleted),NULL);
317 w=GTK_WIDGET(gtk_builder_get_object(ui,"Packages"));
320 view=GTK_TREE_VIEW(w);
322 column=gtk_tree_view_column_new_with_attributes("Icon",
323 gtk_cell_renderer_pixbuf_new(),"pixbuf",
324 PLOVER_PACKAGE_FILE_STORE_ICON_COLUMN,NULL);
325 gtk_tree_view_append_column(GTK_TREE_VIEW(w),column);
327 column=gtk_tree_view_column_new();
328 gtk_tree_view_column_set_title(column,"Summary");
329 renderer=gtk_cell_renderer_text_new();
330 gtk_tree_view_column_pack_start(column,renderer,FALSE);
331 gtk_tree_view_column_set_cell_data_func(column,renderer,
332 package_cell_data_func,NULL,NULL);
333 gtk_tree_view_append_column(view,column);
334 gtk_widget_show_all(w);
335 gtk_tree_view_set_headers_visible(view,FALSE);
336 w=GTK_WIDGET(gtk_builder_get_object(ui,"SearchEntry"));
337 gtk_tree_view_set_search_entry(view,GTK_ENTRY(w));
338 selection=gtk_tree_view_get_selection(view);
339 g_signal_connect(selection,"changed",
340 G_CALLBACK(package_selection_changed),NULL);
341 g_signal_connect(view,"row-activated",G_CALLBACK(package_activated),
345 g_warning("Packages: no such widget in UI");
346 w=GTK_WIDGET(gtk_builder_get_object(ui,"Files"));
349 column=gtk_tree_view_column_new_with_attributes("Name",
350 gtk_cell_renderer_text_new(),"text",
351 PLOVER_PACKAGE_FILE_STORE_NAME_COLUMN,NULL);
352 gtk_tree_view_append_column(GTK_TREE_VIEW(w),column);
353 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(w),FALSE);
354 gtk_widget_show_all(w);
357 g_warning("Files: no such widget in UI");
361 g_warning("set_package_model: Calling gtk_tree_view_set_model()");
362 gtk_tree_view_set_model(view,model);
363 g_warning("set_package_model: gtk_tree_view_set_model() returns");
364 gtk_tree_view_set_search_column(view,
365 PLOVER_PACKAGE_STORE_NAME_COLUMN);
368 g_signal_connect(model,"row-inserted",G_CALLBACK(package_inserted),
370 g_signal_connect(model,"row-deleted",G_CALLBACK(package_deleted),
374 package_present(NULL);
377 PloverPackage *get_active_package(void)
383 on_view_files_toggled(GtkCheckMenuItem *menuitem,gpointer data)
385 view_files=gtk_check_menu_item_get_active(menuitem);
386 package_present(active);
390 on_view_details_toggled(GtkCheckMenuItem *menuitem,gpointer data)