gnome-control-center/control-center/capplet-dir-view.c
Jody Goldberg 77529051ed Use GtkIconTheme rather than GnomeIconTheme, and return a Pixbuf directly.
2003-12-16  Jody Goldberg <jody@gnome.org>

	* capplet-dir.c (find_icon) : Use GtkIconTheme rather than
	  GnomeIconTheme, and return a Pixbuf directly.

	* capplet-dir-view-list.c (sidebar_populate) : Just use the icon
	  directly.
	(list_populate) : ditto.
	* capplet-dir-view.c (capplet_dir_view_load_dir) : ditto.

2003-12-15  Jody Goldberg <jody@gnome.org>

	* gnomecc.desktop.in : Use themed icon
	* capplet-dir.c (find_icon) : Support icon themes
	* capplet-dir-view-list.c (list_create) : make icons wider and less
	ugly.
2003-12-16 22:07:05 +00:00

560 lines
13 KiB
C

/* -*- mode: c; style: linux -*- */
/* capplet-dir-view.c
* Copyright (C) 2000, 2001 Ximian, Inc.
*
* Written by Bradford Hovinen <hovinen@ximian.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*/
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <gdk-pixbuf/gdk-pixbuf.h>
#include <libgnomeui/gnome-window-icon.h>
#include <glade/glade.h>
#include "capplet-dir-view.h"
extern CappletDirViewImpl capplet_dir_view_list;
#if 0
extern CappletDirViewImpl capplet_dir_view_tree;
#endif
CappletDirViewImpl *capplet_dir_view_impl[] = {
NULL,
&capplet_dir_view_list,
#if 0
&capplet_dir_view_tree,
#endif
};
static GObjectClass *parent_class;
enum {
PROP_0,
PROP_CAPPLET_DIR,
PROP_LAYOUT
};
static GList *window_list;
static gboolean authed;
static void capplet_dir_view_init (CappletDirView *capplet_dir_view,
CappletDirViewClass *class);
static void capplet_dir_view_class_init (CappletDirViewClass *class);
static void capplet_dir_view_set_prop (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec);
static void capplet_dir_view_get_prop (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec);
static void capplet_dir_view_finalize (GObject *object);
static void close_cb (BonoboUIComponent *uic,
gpointer data,
const char *cname);
static void help_menu_cb (BonoboUIComponent *uic,
gpointer data,
const char *cname);
static void about_menu_cb (BonoboUIComponent *uic,
gpointer data,
const char *cname);
GType
capplet_dir_view_get_type (void)
{
static GtkType capplet_dir_view_type = 0;
if (!capplet_dir_view_type) {
static const GTypeInfo capplet_dir_view_info = {
sizeof (CappletDirViewClass),
NULL, /* base_init */
NULL, /* base_finalize */
(GClassInitFunc) capplet_dir_view_class_init,
NULL, /* class_finalize */
NULL, /* class_data */
sizeof (CappletDirView),
0 /* n_preallocs */,
(GInstanceInitFunc) capplet_dir_view_init
};
capplet_dir_view_type =
g_type_register_static (G_TYPE_OBJECT,
"CappletDirView",
&capplet_dir_view_info,
0);
}
return capplet_dir_view_type;
}
static BonoboUIVerb capplet_dir_view_verbs[] = {
BONOBO_UI_VERB ("FileClose", close_cb),
BONOBO_UI_VERB ("HelpContent", help_menu_cb),
BONOBO_UI_VERB ("HelpAbout", about_menu_cb),
BONOBO_UI_VERB_END
};
static void
capplet_dir_view_init (CappletDirView *view, CappletDirViewClass *class)
{
BonoboUIContainer *ui_container;
BonoboUIComponent *ui_component;
window_list = g_list_prepend (window_list, view);
view->app = BONOBO_WINDOW (bonobo_window_new ("gnomecc", ""));
ui_container = bonobo_window_get_ui_container (view->app);
gtk_window_set_default_size (GTK_WINDOW (view->app), 620, 430);
gnome_window_icon_set_from_file (GTK_WINDOW (view->app),
PIXMAP_DIR "/control-center2.png");
ui_component = bonobo_ui_component_new ("gnomecc");
bonobo_ui_component_set_container (ui_component, bonobo_object_corba_objref (BONOBO_OBJECT (ui_container)), NULL);
bonobo_ui_util_set_ui (ui_component,
GNOMECC_DATA_DIR, "gnomecc-ui.xml", "gnomecc", NULL);
g_signal_connect_swapped (G_OBJECT (view->app), "destroy",
(GCallback) g_object_unref, view);
bonobo_ui_component_add_verb_list_with_data (ui_component, capplet_dir_view_verbs, view);
}
static void
capplet_dir_view_class_init (CappletDirViewClass *klass)
{
GObjectClass *object_class;
object_class = G_OBJECT_CLASS (klass);
object_class->finalize = capplet_dir_view_finalize;
object_class->set_property = capplet_dir_view_set_prop;
object_class->get_property = capplet_dir_view_get_prop;
g_object_class_install_property
(object_class, PROP_LAYOUT,
g_param_spec_int ("layout",
_("Layout"),
_("Layout to use for this view of the capplets"),
0, sizeof (capplet_dir_view_impl) / sizeof (CappletDirViewImpl *), 0,
G_PARAM_WRITABLE));
g_object_class_install_property
(object_class, PROP_CAPPLET_DIR,
g_param_spec_pointer ("capplet-dir",
_("Capplet directory object"),
_("Capplet directory that this view is viewing"),
G_PARAM_WRITABLE));
parent_class = G_OBJECT_CLASS (g_type_class_ref (G_TYPE_OBJECT));
}
static void
capplet_dir_view_set_prop (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
{
CappletDirView *view;
CappletDirViewLayout layout;
view = CAPPLET_DIR_VIEW (object);
switch (prop_id) {
case PROP_CAPPLET_DIR:
capplet_dir_view_load_dir (view, g_value_get_pointer (value));
break;
case PROP_LAYOUT:
#ifdef USE_HTML
layout = CLAMP (g_value_get_int (value), 0, LAYOUT_HTML);
#else
layout = CLAMP (g_value_get_int (value), 0, LAYOUT_ICON_LIST);
#endif
if (layout == view->layout)
break;
g_assert (!view->changing_layout);
view->changing_layout = TRUE;
if (view->impl && view->impl->clean)
view->impl->clean (view);
view->layout =layout;
view->impl = capplet_dir_view_impl[layout];
if (view->impl && view->impl->create) {
view->view = view->impl->create (view);
bonobo_window_set_contents (view->app, view->view);
if (view->capplet_dir && view->impl->populate)
view->impl->populate (view);
gtk_widget_show (view->view);
}
view->changing_layout = FALSE;
break;
default:
g_warning ("Bad argument set");
break;
}
}
static void
capplet_dir_view_get_prop (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
{
CappletDirView *view;
view = CAPPLET_DIR_VIEW (object);
switch (prop_id) {
case PROP_CAPPLET_DIR:
g_value_set_pointer (value, view->capplet_dir);
break;
case PROP_LAYOUT:
g_value_set_uint (value, view->layout);
break;
default:
g_warning ("Bad argument get");
break;
}
}
static void
capplet_dir_view_finalize (GObject *object)
{
CappletDirView *view;
g_return_if_fail (object != NULL);
g_return_if_fail (IS_CAPPLET_DIR_VIEW (object));
view = CAPPLET_DIR_VIEW (object);
view->capplet_dir->view = NULL;
window_list = g_list_remove (window_list, view);
if (g_list_length (window_list) == 0)
gtk_main_quit ();
G_OBJECT_CLASS (parent_class)->finalize (object);
}
void
capplet_dir_view_update_authenticated (CappletDirView *view, gpointer null)
{
}
CappletDirView *
capplet_dir_view_new (void)
{
GObject *view;
view = g_object_new (capplet_dir_view_get_type (),
"layout", LAYOUT_ICON_LIST,
NULL);
capplet_dir_view_update_authenticated
(CAPPLET_DIR_VIEW (view), NULL);
return CAPPLET_DIR_VIEW (view);
}
void
capplet_dir_views_set_authenticated (gboolean amiauthedornot)
{
authed = amiauthedornot;
g_list_foreach (window_list, (GFunc)capplet_dir_view_update_authenticated, NULL);
}
static void
close_cb (BonoboUIComponent *uic, gpointer data, const char *cname)
{
CappletDirView *view = CAPPLET_DIR_VIEW (data);
gtk_widget_destroy (GTK_WIDGET (CAPPLET_DIR_VIEW_W (view)));
}
static void
help_menu_cb (BonoboUIComponent *uic, gpointer data, const char *cname)
{
GError *error = NULL;
gnome_help_display_desktop (NULL,
"user-guide",
"wgoscustdesk.xml",
NULL, &error);
if (error) {
GtkWidget *dialog;
dialog = gtk_message_dialog_new (NULL,
GTK_DIALOG_MODAL,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_CLOSE,
("There was an error displaying help: \n%s"),
error->message);
g_signal_connect (G_OBJECT (dialog), "response",
G_CALLBACK (gtk_widget_destroy),
NULL);
gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
gtk_widget_show (dialog);
g_error_free (error);
}
}
static void
about_menu_cb (BonoboUIComponent *uic, gpointer data, const char *cname)
{
static GtkWidget *about = NULL;
static gchar *authors[] = {
"Jacob Berkman <jacob@ximian.com>",
"Jonathan Blandford <jrb@redhat.com>",
"Chema Celorio <chema@ximian.com>",
"Rachel Hestilow <hestilow@ximian.com>",
"Bradford Hovinen <hovinen@ximian.com>",
"Lauris Kaplinski <lauris@ximian.com>",
"Seth Nickell <snickell@stanford.edu>",
"Jakub Steiner <jimmac@ximian.com>",
NULL
};
static gchar *documenters[] = {
NULL
};
gchar *translator_credits = _("translator_credits");
if (about != NULL) {
gdk_window_show (about->window);
gdk_window_raise (about->window);
return;
}
about = gnome_about_new
(_("GNOME Control Center"), VERSION,
"Copyright (C) 2000, 2001 Ximian, Inc.\n"
"Copyright (C) 1999 Red Hat Software, Inc.",
_("Desktop properties manager."),
(const gchar **) authors,
(const gchar **) documenters,
strcmp (translator_credits, "translator_credits") != 0 ? translator_credits : NULL,
NULL);
g_signal_connect (G_OBJECT (about), "destroy",
(GCallback) gtk_widget_destroyed,
&about);
gtk_widget_show (about);
}
#if 0
static void
menu_cb (GtkWidget *w, CappletDirView *view, CappletDirViewLayout layout)
{
if (!GTK_CHECK_MENU_ITEM (w)->active || view->changing_layout)
return;
gtk_object_set (GTK_OBJECT (view), "layout", layout, NULL);
}
#endif
#ifdef USE_HTML
static void
html_menu_cb (GtkWidget *w, CappletDirView *view)
{
menu_cb (w, view, LAYOUT_HTML);
}
#endif
#if 0
static void
icon_menu_cb (GtkWidget *w, CappletDirView *view)
{
menu_cb (w, view, LAYOUT_ICON_LIST);
}
static void
tree_menu_cb (GtkWidget *w, CappletDirView *view)
{
menu_cb (w, view, LAYOUT_TREE);
}
static void
button_cb (GtkWidget *w, CappletDirView *view, CappletDirViewLayout layout)
{
if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)) || view->changing_layout)
return;
gtk_object_set (GTK_OBJECT (view), "layout", layout, NULL);
}
#endif
#ifdef USE_HTML
static void
html_toggle_cb (GtkWidget *w, CappletDirView *view)
{
button_cb (w, view, LAYOUT_HTML);
}
#endif
#if 0
static void
list_toggle_cb (GtkWidget *w, CappletDirView *view)
{
button_cb (w, view, LAYOUT_ICON_LIST);
}
static void
tree_toggle_cb (GtkWidget *w, CappletDirView *view)
{
button_cb (w, view, LAYOUT_TREE);
}
#if 0
static void
prefs_menu_cb (GtkWidget *widget, CappletDirView *view)
{
gnomecc_preferences_get_config_dialog (prefs);
}
#endif
static void
back_button_cb (GtkWidget *widget, CappletDirView *view)
{
if (CAPPLET_DIR_ENTRY (view->capplet_dir)->dir)
capplet_dir_view_load_dir
(view, CAPPLET_DIR_ENTRY (view->capplet_dir)->dir);
}
static void
rootm_button_cb (GtkWidget *w, CappletDirView *view)
{
gdk_beep ();
}
#endif
static void
option_menu_activate (GtkWidget *w, CappletDirEntry *entry)
{
CappletDirView *view;
view = g_object_get_data (G_OBJECT (w), "user_data");
if (!IS_CAPPLET_DIR_VIEW (view))
return;
capplet_dir_entry_activate (entry, view);
}
void
capplet_dir_view_load_dir (CappletDirView *view, CappletDir *dir)
{
GtkWidget *menu, *menuitem, *w, *hbox;
CappletDirEntry *entry;
int parents = 0;
gchar *title;
g_return_if_fail (view != NULL);
g_return_if_fail (IS_CAPPLET_DIR_VIEW (view));
view->capplet_dir = dir;
if (view->impl && view->impl->clear)
view->impl->clear (view);
if (!dir || view->layout == LAYOUT_NONE) return;
if (view->impl && view->impl->populate)
view->impl->populate (view);
title = g_strdup_printf (_("Gnome Control Center : %s"), dir->entry.label);
gtk_window_set_title (GTK_WINDOW (view->app), title);
g_free (title);
menu = gtk_menu_new ();
for (entry = CAPPLET_DIR_ENTRY (dir); entry; entry = CAPPLET_DIR_ENTRY (entry->dir), parents++) {
GdkPixbuf *pbs;
menuitem = gtk_menu_item_new ();
hbox = gtk_hbox_new (FALSE, GNOME_PAD_SMALL);
#if 0
w = gnome_pixmap_new_from_file_at_size (entry->icon, 16, 16);
#else
pbs = gdk_pixbuf_scale_simple (entry->icon, 16, 16, GDK_INTERP_HYPER);
w = gtk_image_new_from_pixbuf (pbs);
g_object_unref (pbs);
#endif
gtk_box_pack_start (GTK_BOX (hbox), w,
FALSE, FALSE, 0);
w = gtk_label_new (entry->label);
gtk_box_pack_start (GTK_BOX (hbox), w,
FALSE, FALSE, 0);
gtk_container_add (GTK_CONTAINER (menuitem), hbox);
if (entry != CAPPLET_DIR_ENTRY (dir)) {
g_object_set_data (G_OBJECT (menuitem), "user_data", view);
g_signal_connect (G_OBJECT (menuitem), "activate",
(GCallback) option_menu_activate,
entry);
}
gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), menuitem);
}
gtk_widget_show_all (menu);
}
void
capplet_dir_view_show (CappletDirView *view)
{
g_return_if_fail (view != NULL);
g_return_if_fail (IS_CAPPLET_DIR_VIEW (view));
gtk_widget_show (GTK_WIDGET (CAPPLET_DIR_VIEW_W (view)));
}
static CappletDirView *
get_capplet_dir_view (CappletDir *dir, CappletDirView *launcher)
{
if (launcher)
return launcher;
else
return CAPPLET_DIR_VIEW (capplet_dir_view_new ());
}
void
gnomecc_init (void)
{
capplet_dir_init (get_capplet_dir_view);
}