/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/*
* Copyright (C) 2001 Havoc Pennington
* Copyright (C) 2002 Red Hat, Inc.
* Copyright (C) 2005 Elijah Newren
*
* 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 of the
* License, 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, see .
*/
#include
#include "select-image.h"
#define BORDER_WIDTH 2
#define PADDING 3
struct _MetaSelectImagePrivate
{
gboolean selected;
};
G_DEFINE_TYPE_WITH_PRIVATE (MetaSelectImage, meta_select_image, GTK_TYPE_IMAGE);
static gboolean
meta_select_image_draw (GtkWidget *widget,
cairo_t *cr)
{
MetaSelectImage *image;
image = META_SELECT_IMAGE (widget);
if (image->priv->selected)
{
GtkRequisition requisition;
GtkStyleContext *context;
GdkRGBA color;
int x, y, w, h;
gtk_widget_get_preferred_size (widget, &requisition, 0);
x = BORDER_WIDTH;
y = BORDER_WIDTH;
w = requisition.width - BORDER_WIDTH * 2;
h = requisition.height - BORDER_WIDTH * 2;
context = gtk_widget_get_style_context (widget);
gtk_style_context_set_state (context, gtk_widget_get_state_flags (widget));
gtk_style_context_lookup_color (context, "color", &color);
cairo_set_line_width (cr, 2.0);
cairo_set_source_rgb (cr, color.red, color.green, color.blue);
cairo_rectangle (cr, x, y, w, h);
cairo_stroke (cr);
cairo_set_line_width (cr, 1.0);
}
return GTK_WIDGET_CLASS (meta_select_image_parent_class)->draw (widget, cr);
}
static void
meta_select_image_get_preferred_width (GtkWidget *widget,
gint *minimum_width,
gint *natural_width)
{
GTK_WIDGET_CLASS (meta_select_image_parent_class)->get_preferred_width (widget,
minimum_width,
natural_width);
*minimum_width += (BORDER_WIDTH + PADDING) * 2;
*natural_width += (BORDER_WIDTH + PADDING) * 2;
}
static void
meta_select_image_get_preferred_height (GtkWidget *widget,
gint *minimum_height,
gint *natural_height)
{
GTK_WIDGET_CLASS (meta_select_image_parent_class)->get_preferred_height (widget,
minimum_height,
natural_height);
*minimum_height += (BORDER_WIDTH + PADDING) * 2;
*natural_height += (BORDER_WIDTH + PADDING) * 2;
}
static void
meta_select_image_init (MetaSelectImage *image)
{
image->priv = meta_select_image_get_instance_private (image);
}
static void
meta_select_image_class_init (MetaSelectImageClass *class)
{
GtkWidgetClass *widget_class;
widget_class = GTK_WIDGET_CLASS (class);
widget_class->draw = meta_select_image_draw;
widget_class->get_preferred_width = meta_select_image_get_preferred_width;
widget_class->get_preferred_height = meta_select_image_get_preferred_height;
}
GtkWidget *
meta_select_image_new (GdkPixbuf *pixbuf)
{
GtkWidget *widget;
widget = g_object_new (META_TYPE_SELECT_IMAGE, NULL);
gtk_image_set_from_pixbuf (GTK_IMAGE (widget), pixbuf);
return widget;
}
void
meta_select_image_select (MetaSelectImage *image)
{
image->priv->selected = TRUE;
gtk_widget_queue_draw (GTK_WIDGET (image));
}
void
meta_select_image_unselect (MetaSelectImage *image)
{
image->priv->selected = FALSE;
gtk_widget_queue_draw (GTK_WIDGET (image));
}