diff options
Diffstat (limited to 'libslab/nameplate-tile.c')
-rw-r--r-- | libslab/nameplate-tile.c | 290 |
1 files changed, 290 insertions, 0 deletions
diff --git a/libslab/nameplate-tile.c b/libslab/nameplate-tile.c new file mode 100644 index 00000000..f3f45165 --- /dev/null +++ b/libslab/nameplate-tile.c @@ -0,0 +1,290 @@ +/* + * This file is part of libtile. + * + * Copyright (c) 2006 Novell, Inc. + * + * Libtile is free software; you can redistribute it and/or modify it under the + * terms of the GNU Lesser General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * Libtile 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 Lesser General Public License for + * more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with libslab; if not, write to the Free Software Foundation, Inc., 51 + * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "nameplate-tile.h" + +static void nameplate_tile_class_init (NameplateTileClass *); +static void nameplate_tile_init (NameplateTile *); +static void nameplate_tile_finalize (GObject *); +static void nameplate_tile_get_property (GObject *, guint, GValue *, GParamSpec *); +static void nameplate_tile_set_property (GObject *, guint, const GValue *, GParamSpec *); +static GObject *nameplate_tile_constructor (GType, guint, GObjectConstructParam *); + +static void nameplate_tile_drag_begin (GtkWidget *, GdkDragContext *); + +static void nameplate_tile_setup (NameplateTile *); + +typedef struct +{ + GtkContainer *image_ctnr; + GtkContainer *header_ctnr; + GtkContainer *subheader_ctnr; +} NameplateTilePrivate; + +#define NAMEPLATE_TILE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NAMEPLATE_TILE_TYPE, NameplateTilePrivate)) + +enum +{ + PROP_0, + PROP_NAMEPLATE_IMAGE, + PROP_NAMEPLATE_HEADER, + PROP_NAMEPLATE_SUBHEADER, +}; + +G_DEFINE_TYPE (NameplateTile, nameplate_tile, TILE_TYPE) + +GtkWidget *nameplate_tile_new (const gchar * uri, GtkWidget * image, GtkWidget * header, + GtkWidget * subheader) +{ + return GTK_WIDGET ( + g_object_new (NAMEPLATE_TILE_TYPE, + "tile-uri", uri, + "nameplate-image", image, + "nameplate-header", header, + "nameplate-subheader", subheader, + NULL)); +} + +static void +nameplate_tile_class_init (NameplateTileClass * this_class) +{ + GObjectClass *g_obj_class = G_OBJECT_CLASS (this_class); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (this_class); + + g_obj_class->constructor = nameplate_tile_constructor; + g_obj_class->get_property = nameplate_tile_get_property; + g_obj_class->set_property = nameplate_tile_set_property; + g_obj_class->finalize = nameplate_tile_finalize; + + widget_class->drag_begin = nameplate_tile_drag_begin; + + g_type_class_add_private (this_class, sizeof (NameplateTilePrivate)); + + g_object_class_install_property (g_obj_class, PROP_NAMEPLATE_IMAGE, + g_param_spec_object ("nameplate-image", "nameplate-image", "nameplate image", + GTK_TYPE_WIDGET, G_PARAM_READWRITE)); + + g_object_class_install_property (g_obj_class, PROP_NAMEPLATE_HEADER, + g_param_spec_object ("nameplate-header", "nameplate-header", "nameplate header", + GTK_TYPE_WIDGET, G_PARAM_READWRITE)); + + g_object_class_install_property (g_obj_class, PROP_NAMEPLATE_SUBHEADER, + g_param_spec_object ("nameplate-subheader", "nameplate-subheader", + "nameplate subheader", GTK_TYPE_WIDGET, G_PARAM_READWRITE)); +} + +static void +nameplate_tile_init (NameplateTile * this) +{ +} + +static GObject * +nameplate_tile_constructor (GType type, guint n_param, GObjectConstructParam * param) +{ + GObject *g_obj = + (*G_OBJECT_CLASS (nameplate_tile_parent_class)->constructor) (type, n_param, param); + + nameplate_tile_setup (NAMEPLATE_TILE (g_obj)); + + return g_obj; +} + +static void +nameplate_tile_finalize (GObject * g_object) +{ + NameplateTile *np_tile; + NameplateTilePrivate *priv; + + np_tile = NAMEPLATE_TILE (g_object); + priv = NAMEPLATE_TILE_GET_PRIVATE (np_tile); + + (*G_OBJECT_CLASS (nameplate_tile_parent_class)->finalize) (g_object); +} + +static void +nameplate_tile_get_property (GObject * g_object, guint prop_id, GValue * value, + GParamSpec * param_spec) +{ + NameplateTile *np_tile = NAMEPLATE_TILE (g_object); + + switch (prop_id) + { + case PROP_NAMEPLATE_IMAGE: + g_value_set_object (value, np_tile->image); + break; + + case PROP_NAMEPLATE_HEADER: + g_value_set_object (value, np_tile->header); + break; + + case PROP_NAMEPLATE_SUBHEADER: + g_value_set_object (value, np_tile->subheader); + break; + default: + break; + } +} + +static void +nameplate_tile_set_property (GObject * g_object, guint prop_id, const GValue * value, + GParamSpec * param_spec) +{ + NameplateTile *this = NAMEPLATE_TILE (g_object); + NameplateTilePrivate *priv = NAMEPLATE_TILE_GET_PRIVATE (this); + + GObject *widget_obj = NULL; + + switch (prop_id) { + case PROP_NAMEPLATE_IMAGE: + case PROP_NAMEPLATE_HEADER: + case PROP_NAMEPLATE_SUBHEADER: + widget_obj = g_value_get_object (value); + break; + default: + break; + } + + switch (prop_id) + { + case PROP_NAMEPLATE_IMAGE: + if (GTK_IS_WIDGET (widget_obj)) + { + if (GTK_IS_WIDGET (this->image)) + gtk_widget_destroy (this->image); + + this->image = GTK_WIDGET (widget_obj); + + gtk_container_add (priv->image_ctnr, this->image); + + gtk_widget_show_all (this->image); + } + else if (GTK_IS_WIDGET (this->image)) + gtk_widget_destroy (this->image); + + break; + + case PROP_NAMEPLATE_HEADER: + if (GTK_IS_WIDGET (widget_obj)) + { + if (GTK_IS_WIDGET (this->header)) + gtk_widget_destroy (this->header); + + this->header = GTK_WIDGET (widget_obj); + + gtk_container_add (priv->header_ctnr, this->header); + + gtk_widget_show_all (this->header); + } + else if (GTK_IS_WIDGET (this->header)) + gtk_widget_destroy (this->header); + + break; + + case PROP_NAMEPLATE_SUBHEADER: + if (GTK_IS_WIDGET (widget_obj)) + { + if (GTK_IS_WIDGET (this->subheader)) + gtk_widget_destroy (this->subheader); + + this->subheader = GTK_WIDGET (widget_obj); + + gtk_container_add (priv->subheader_ctnr, this->subheader); + + gtk_widget_show_all (this->subheader); + } + else if (GTK_IS_WIDGET (this->subheader)) + gtk_widget_destroy (this->subheader); + + break; + + default: + break; + } +} + +static void +nameplate_tile_setup (NameplateTile *this) +{ + NameplateTilePrivate *priv = NAMEPLATE_TILE_GET_PRIVATE (this); + + GtkWidget *hbox; + GtkWidget *alignment; + GtkWidget *vbox; + + priv->image_ctnr = GTK_CONTAINER (gtk_alignment_new (0.5, 0.5, 1.0, 1.0)); + priv->header_ctnr = GTK_CONTAINER (gtk_alignment_new (0.0, 0.5, 1.0, 1.0)); + priv->subheader_ctnr = GTK_CONTAINER (gtk_alignment_new (0.0, 0.5, 1.0, 1.0)); + + hbox = gtk_hbox_new (FALSE, 6); + vbox = gtk_vbox_new (FALSE, 0); + + alignment = gtk_alignment_new (0.0, 0.5, 1.0, 0.0); + + gtk_container_add (GTK_CONTAINER (this), hbox); + gtk_box_pack_start (GTK_BOX (hbox), GTK_WIDGET (priv->image_ctnr), FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (hbox), alignment, TRUE, TRUE, 0); + + gtk_container_add (GTK_CONTAINER (alignment), vbox); + gtk_box_pack_start (GTK_BOX (vbox), GTK_WIDGET (priv->header_ctnr), FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (vbox), GTK_WIDGET (priv->subheader_ctnr), FALSE, FALSE, 0); + + if (GTK_IS_WIDGET (this->image)) + gtk_container_add (priv->image_ctnr, this->image); + + if (GTK_IS_WIDGET (this->header)) + gtk_container_add (priv->header_ctnr, this->header); + + if (GTK_IS_WIDGET (this->subheader)) + gtk_container_add (priv->subheader_ctnr, this->subheader); + + gtk_button_set_focus_on_click (GTK_BUTTON (this), FALSE); +} + +static void +nameplate_tile_drag_begin (GtkWidget * widget, GdkDragContext * context) +{ + NameplateTile *this = NAMEPLATE_TILE (widget); + GtkImage *image; + + (*GTK_WIDGET_CLASS (nameplate_tile_parent_class)->drag_begin) (widget, context); + + if (!this->image || !GTK_IS_IMAGE (this->image)) + return; + + image = GTK_IMAGE (this->image); + + switch (image->storage_type) + { + case GTK_IMAGE_PIXBUF: + if (image->data.pixbuf.pixbuf) + gtk_drag_set_icon_pixbuf (context, image->data.pixbuf.pixbuf, 0, 0); + + break; + + case GTK_IMAGE_ICON_NAME: + if (image->data.name.pixbuf) + gtk_drag_set_icon_pixbuf (context, image->data.name.pixbuf, 0, 0); + + break; + + default: + break; + } +} |