gnome-control-center/shell/cc-shell-category-view.c
Giovanni Campagna 2f1ae7e26f shell: don't prelight icons in the icon view
The follow-state property used to have no effect, because we used pixbufs
directly. It started to work when we switched to GIcons, but it looks
bad because the prelighted icons are too contrasted, so revert to the
previous behaviour.

https://bugzilla.gnome.org/show_bug.cgi?id=694219
2013-02-22 14:39:41 +01:00

220 lines
6.5 KiB
C

/*
* Copyright (c) 2010 Intel, Inc.
*
* The Control Center 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 of the License, or (at your
* option) any later version.
*
* The Control Center 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 the Control Center; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
* Author: Thomas Wood <thos@gnome.org>
*/
#include "cc-shell-category-view.h"
#include "cc-shell-item-view.h"
#include "cc-shell.h"
#include "cc-shell-model.h"
G_DEFINE_TYPE (CcShellCategoryView, cc_shell_category_view, GTK_TYPE_FRAME)
#define SHELL_CATEGORY_VIEW_PRIVATE(o) \
(G_TYPE_INSTANCE_GET_PRIVATE ((o), CC_TYPE_SHELL_CATEGORY_VIEW, CcShellCategoryViewPrivate))
enum
{
PROP_NAME = 1,
PROP_MODEL
};
struct _CcShellCategoryViewPrivate
{
gchar *name;
GtkTreeModel *model;
GtkWidget *iconview;
};
static void
cc_shell_category_view_get_property (GObject *object,
guint property_id,
GValue *value,
GParamSpec *pspec)
{
CcShellCategoryViewPrivate *priv = CC_SHELL_CATEGORY_VIEW (object)->priv;
switch (property_id)
{
case PROP_NAME:
g_value_set_string (value, priv->name);
break;
case PROP_MODEL:
g_value_set_object (value, priv->model);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
}
}
static void
cc_shell_category_view_set_property (GObject *object,
guint property_id,
const GValue *value,
GParamSpec *pspec)
{
CcShellCategoryViewPrivate *priv = CC_SHELL_CATEGORY_VIEW (object)->priv;
switch (property_id)
{
case PROP_NAME:
priv->name = g_value_dup_string (value);
break;
case PROP_MODEL:
priv->model = g_value_dup_object (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
}
}
static void
cc_shell_category_view_dispose (GObject *object)
{
CcShellCategoryViewPrivate *priv = CC_SHELL_CATEGORY_VIEW (object)->priv;
if (priv->model)
{
g_object_unref (priv->model);
priv->model = NULL;
}
G_OBJECT_CLASS (cc_shell_category_view_parent_class)->dispose (object);
}
static void
cc_shell_category_view_finalize (GObject *object)
{
CcShellCategoryViewPrivate *priv = CC_SHELL_CATEGORY_VIEW (object)->priv;
if (priv->name)
{
g_free (priv->name);
priv->name = NULL;
}
G_OBJECT_CLASS (cc_shell_category_view_parent_class)->finalize (object);
}
static void
cc_shell_category_view_constructed (GObject *object)
{
CcShellCategoryViewPrivate *priv = CC_SHELL_CATEGORY_VIEW (object)->priv;
GtkWidget *iconview, *vbox;
GtkCellRenderer *renderer;
iconview = cc_shell_item_view_new ();
gtk_icon_view_set_model (GTK_ICON_VIEW (iconview), priv->model);
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
renderer = gtk_cell_renderer_pixbuf_new ();
g_object_set (renderer,
"stock-size", GTK_ICON_SIZE_DIALOG,
NULL);
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (iconview),
renderer, FALSE);
gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (iconview), renderer,
"gicon", COL_GICON);
gtk_icon_view_set_text_column (GTK_ICON_VIEW (iconview), COL_NAME);
gtk_icon_view_set_item_width (GTK_ICON_VIEW (iconview), 100);
cc_shell_item_view_update_cells (CC_SHELL_ITEM_VIEW (iconview));
/* create the header if required */
if (priv->name)
{
GtkWidget *label;
PangoAttrList *attrs;
label = gtk_label_new (priv->name);
attrs = pango_attr_list_new ();
pango_attr_list_insert (attrs, pango_attr_weight_new (PANGO_WEIGHT_BOLD));
gtk_label_set_attributes (GTK_LABEL (label), attrs);
pango_attr_list_unref (attrs);
gtk_frame_set_label_widget (GTK_FRAME (object), label);
gtk_widget_show (label);
}
/* add the iconview to the vbox */
gtk_box_pack_start (GTK_BOX (vbox), iconview, FALSE, TRUE, 0);
/* add the main vbox to the view */
gtk_container_add (GTK_CONTAINER (object), vbox);
gtk_widget_show_all (vbox);
priv->iconview = iconview;
}
static void
cc_shell_category_view_class_init (CcShellCategoryViewClass *klass)
{
GParamSpec *pspec;
GObjectClass *object_class = G_OBJECT_CLASS (klass);
g_type_class_add_private (klass, sizeof (CcShellCategoryViewPrivate));
object_class->get_property = cc_shell_category_view_get_property;
object_class->set_property = cc_shell_category_view_set_property;
object_class->dispose = cc_shell_category_view_dispose;
object_class->finalize = cc_shell_category_view_finalize;
object_class->constructed = cc_shell_category_view_constructed;
pspec = g_param_spec_string ("name",
"Name",
"Name of the category",
NULL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY
| G_PARAM_STATIC_STRINGS);
g_object_class_install_property (object_class, PROP_NAME, pspec);
pspec = g_param_spec_object ("model",
"Model",
"Model of the category",
GTK_TYPE_TREE_MODEL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY
| G_PARAM_STATIC_STRINGS);
g_object_class_install_property (object_class, PROP_MODEL, pspec);
}
static void
cc_shell_category_view_init (CcShellCategoryView *self)
{
self->priv = SHELL_CATEGORY_VIEW_PRIVATE (self);
gtk_frame_set_shadow_type (GTK_FRAME (self), GTK_SHADOW_NONE);
}
GtkWidget *
cc_shell_category_view_new (const gchar *name,
GtkTreeModel *model)
{
return g_object_new (CC_TYPE_SHELL_CATEGORY_VIEW,
"name", name,
"model", model, NULL);
}
CcShellItemView*
cc_shell_category_view_get_item_view (CcShellCategoryView *self)
{
return (CcShellItemView*) self->priv->iconview;
}