app-manager/app-manager.c
author J. Ali Harlow <ali@juiblex.co.uk>
Sat Feb 20 12:11:02 2010 +0000 (2010-02-20)
changeset 9 8d3b1ddf789c
child 10 8b50be3e2998
permissions -rw-r--r--
First cut at an applications manager
     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 <glib.h>
    23 #include <gio/gio.h>
    24 #include <gtk/gtk.h>
    25 #include <plover-gtk/packageset.h>
    26 #include "app-manager.h"
    27 #include "localmedia.h"
    28 
    29 #define LOGO_NAME	"plover-applications"
    30 
    31 GtkBuilder *ui;
    32 GtkTreeModel *installed,*applications,*location,*local_media;
    33 
    34 int main(int argc,char **argv)
    35 {
    36     GError *err=0;
    37     GtkWidget *w;
    38     gchar *s,*contents;
    39     gsize len;
    40     PloverPackageSet *set;
    41     GOptionEntry options[]={
    42 	{NULL}
    43     };
    44     if (!gtk_init_with_args(&argc,&argv,NULL,options,NULL,&err))
    45     {
    46 	g_printerr("%s",err->message);
    47 	exit(0);
    48     }
    49     gtk_window_set_default_icon_name(LOGO_NAME);
    50     ui=gtk_builder_new();
    51     if (!g_file_get_contents("app-manager.ui",&contents,&len,&err) &&
    52       g_error_matches(err,G_FILE_ERROR,G_FILE_ERROR_NOENT))
    53     {
    54 	g_clear_error(&err);
    55 	s=g_build_filename(PLOVER_DATADIR,"app-manager.ui",NULL);
    56 	(void)g_file_get_contents(s,&contents,&len,&err);
    57 	g_free(s);
    58     }
    59     if (!err)
    60     {
    61 	(void)gtk_builder_add_from_string(ui,contents,len,&err);
    62 	g_free(contents);
    63     }
    64     if (err)
    65     {
    66 	g_error("%s",err->message);
    67 	exit(0);
    68     }
    69     gtk_builder_connect_signals(ui,NULL);
    70     installed=GTK_TREE_MODEL(plover_package_store_new());
    71     set=plover_package_set_new_from_installed("",NULL);
    72     if (set)
    73 	plover_package_store_add_set(PLOVER_PACKAGE_STORE(installed),set);
    74     applications=plover_applications_model_new(installed);
    75     set_package_model(applications);
    76     gtk_main();
    77     g_object_unref(ui);
    78     exit(0);
    79 }
    80 
    81 G_MODULE_EXPORT void
    82   on_applications_toggled(GtkToggleToolButton *button,gpointer data)
    83 {
    84     if (gtk_toggle_tool_button_get_active(button))
    85     {
    86 	if (!applications)
    87 	    applications=plover_applications_model_new(installed);
    88 	set_package_model(applications);
    89     }
    90 }
    91 
    92 G_MODULE_EXPORT void
    93   on_all_packages_toggled(GtkToggleToolButton *button,gpointer data)
    94 {
    95     if (gtk_toggle_tool_button_get_active(button))
    96 	set_package_model(installed);
    97 }
    98 
    99 G_MODULE_EXPORT void
   100   on_local_media_toggled(GtkToggleToolButton *button,gpointer data)
   101 {
   102     if (gtk_toggle_tool_button_get_active(button))
   103     {
   104 	if (!local_media)
   105 	    local_media=plover_local_media_store_new();
   106 	set_package_model(local_media);
   107     }
   108 }
   109 
   110 G_MODULE_EXPORT void
   111   on_location_toggled(GtkToggleToolButton *button,gpointer data)
   112 {
   113     if (gtk_toggle_tool_button_get_active(button))
   114 	set_package_model(location);
   115 }
   116 
   117 G_MODULE_EXPORT void on_open_location(GtkWidget *widget)
   118 {
   119     GtkWidget *w=GTK_WIDGET(gtk_builder_get_object(ui,"MainWindow"));
   120     GtkWidget *dialog;
   121     gchar *path,*name;
   122     PloverPackageSet *set;
   123     GSList *sets;
   124     GError *err=NULL;
   125     dialog=gtk_file_chooser_dialog_new("Open Location",GTK_WINDOW(w),
   126       GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,GTK_STOCK_CANCEL,
   127       GTK_RESPONSE_CANCEL,GTK_STOCK_OPEN,GTK_RESPONSE_ACCEPT,NULL);
   128 #if GTK_CHECK_VERSION(2,18,0)
   129     gtk_file_chooser_set_create_folders(GTK_FILE_CHOOSER(dialog),FALSE);
   130 #endif
   131     if (gtk_dialog_run(GTK_DIALOG(dialog))==GTK_RESPONSE_ACCEPT)
   132     {
   133 	path=gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
   134 	set=plover_package_set_new_from_repository(path,&err);
   135 	if (set)
   136 	{
   137 	    if (!location)
   138 		location=GTK_TREE_MODEL(plover_package_store_new());
   139 	    while((sets=
   140 	      plover_package_store_get_sets(PLOVER_PACKAGE_STORE(location))))
   141 		plover_package_store_remove_set(PLOVER_PACKAGE_STORE(location),
   142 		  PLOVER_PACKAGE_SET(sets->data));
   143 	    plover_package_store_add_set(PLOVER_PACKAGE_STORE(location),set);
   144 	    g_object_unref(set);
   145 	    w=GTK_WIDGET(gtk_builder_get_object(ui,"LocationButton"));
   146 	    name=g_filename_display_basename(path);
   147 	    gtk_tool_button_set_label(GTK_TOOL_BUTTON(w),name);
   148 	    g_free(name);
   149 	    gtk_widget_show(w);
   150 	    gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(w),TRUE);
   151 	}
   152 	else
   153 	{
   154 	    gtk_widget_destroy(dialog);
   155 	    dialog=gtk_message_dialog_new(GTK_WINDOW(w),
   156 	      GTK_DIALOG_DESTROY_WITH_PARENT,GTK_MESSAGE_ERROR,
   157 	      GTK_BUTTONS_CLOSE,"Error loading repository '%s'",path);
   158 	    gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),
   159 	      "%s",err->message);
   160 	    gtk_dialog_run(GTK_DIALOG(dialog));
   161 	    g_error_free(err);
   162 	}
   163 	g_free(path);
   164     }
   165     gtk_widget_destroy(dialog);
   166 }
   167 
   168 G_MODULE_EXPORT void on_scan_local_media(GtkWidget *widget)
   169 {
   170     if (!local_media)
   171 	local_media=plover_local_media_store_new();
   172     plover_local_media_store_scan(PLOVER_LOCAL_MEDIA_STORE(local_media));
   173 }
   174 
   175 G_MODULE_EXPORT void on_help_about(GtkWidget *widget)
   176 {
   177     GtkWidget *w=GTK_WIDGET(gtk_builder_get_object(ui,"MainWindow"));
   178     gtk_show_about_dialog(GTK_WINDOW(w),"name",PACKAGE_NAME,
   179       "version",PACKAGE_VERSION,"comments","Application Manager",
   180       "copyright","Copyright © 2010 J. Ali Harlow","logo-icon-name",LOGO_NAME,
   181       NULL);
   182 }
   183 
   184 G_MODULE_EXPORT void on_find_clicked(GtkButton *button)
   185 {
   186     gchar *text;
   187     GtkWidget *w=GTK_WIDGET(gtk_builder_get_object(ui,"SearchEntry"));
   188     text=g_strdup(gtk_entry_get_text(GTK_ENTRY(w)));
   189     gtk_entry_set_text(GTK_ENTRY(w),"");
   190     gtk_entry_set_text(GTK_ENTRY(w),text);
   191     g_free(text);
   192 }