1
/* GIMP - The GNU Image Manipulation Program
2
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
4
* gimpcellrendererdashes.c
5
* Copyright (C) 2005 Sven Neumann <sven@gimp.org>
7
* This program is free software; you can redistribute it and/or modify
8
* it under the terms of the GNU General Public License as published by
9
* the Free Software Foundation; either version 2 of the License, or
10
* (at your option) any later version.
12
* This program is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
* GNU General Public License for more details.
17
* You should have received a copy of the GNU General Public License
18
* along with this program; if not, write to the Free Software
19
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
26
#include "widgets-types.h"
28
#include "core/gimpdashpattern.h"
30
#include "gimpcellrendererdashes.h"
33
#define DASHES_WIDTH 96
34
#define DASHES_HEIGHT 4
37
#define BLOCK_WIDTH (DASHES_WIDTH / (2 * N_SEGMENTS))
47
static void gimp_cell_renderer_dashes_finalize (GObject *object);
48
static void gimp_cell_renderer_dashes_get_property (GObject *object,
52
static void gimp_cell_renderer_dashes_set_property (GObject *object,
56
static void gimp_cell_renderer_dashes_get_size (GtkCellRenderer *cell,
58
GdkRectangle *rectangle,
63
static void gimp_cell_renderer_dashes_render (GtkCellRenderer *cell,
66
GdkRectangle *background_area,
67
GdkRectangle *cell_area,
68
GdkRectangle *expose_area,
69
GtkCellRendererState flags);
72
G_DEFINE_TYPE (GimpCellRendererDashes, gimp_cell_renderer_dashes,
73
GTK_TYPE_CELL_RENDERER)
75
#define parent_class gimp_cell_renderer_dashes_parent_class
79
gimp_cell_renderer_dashes_class_init (GimpCellRendererDashesClass *klass)
81
GObjectClass *object_class = G_OBJECT_CLASS (klass);
82
GtkCellRendererClass *cell_class = GTK_CELL_RENDERER_CLASS (klass);
84
object_class->finalize = gimp_cell_renderer_dashes_finalize;
85
object_class->get_property = gimp_cell_renderer_dashes_get_property;
86
object_class->set_property = gimp_cell_renderer_dashes_set_property;
88
cell_class->get_size = gimp_cell_renderer_dashes_get_size;
89
cell_class->render = gimp_cell_renderer_dashes_render;
91
g_object_class_install_property (object_class, PROP_PATTERN,
92
g_param_spec_boxed ("pattern", NULL, NULL,
93
GIMP_TYPE_DASH_PATTERN,
94
GIMP_PARAM_WRITABLE));
98
gimp_cell_renderer_dashes_init (GimpCellRendererDashes *dashes)
100
dashes->segments = g_new0 (gboolean, N_SEGMENTS);
104
gimp_cell_renderer_dashes_finalize (GObject *object)
106
GimpCellRendererDashes *dashes = GIMP_CELL_RENDERER_DASHES (object);
108
g_free (dashes->segments);
110
G_OBJECT_CLASS (parent_class)->finalize (object);
114
gimp_cell_renderer_dashes_get_property (GObject *object,
119
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
123
gimp_cell_renderer_dashes_set_property (GObject *object,
128
GimpCellRendererDashes *dashes = GIMP_CELL_RENDERER_DASHES (object);
133
gimp_dash_pattern_fill_segments (g_value_get_boxed (value),
134
dashes->segments, N_SEGMENTS);
138
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
144
gimp_cell_renderer_dashes_get_size (GtkCellRenderer *cell,
146
GdkRectangle *cell_area,
158
align = ((gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL) ?
159
1.0 - cell->xalign : cell->xalign);
161
*x_offset = align * (cell_area->width - DASHES_WIDTH);
162
*x_offset = MAX (*x_offset, 0) + cell->xpad;
167
*y_offset = cell->yalign * (cell_area->height - DASHES_HEIGHT);
168
*y_offset = MAX (*y_offset, 0) + cell->ypad;
180
*width = DASHES_WIDTH + 2 * cell->xpad;
181
*height = DASHES_HEIGHT + 2 * cell->ypad;
185
gimp_cell_renderer_dashes_render (GtkCellRenderer *cell,
188
GdkRectangle *background_area,
189
GdkRectangle *cell_area,
190
GdkRectangle *expose_area,
191
GtkCellRendererState flags)
193
GimpCellRendererDashes *dashes = GIMP_CELL_RENDERER_DASHES (cell);
198
if (! cell->sensitive)
200
state = GTK_STATE_INSENSITIVE;
202
else if ((flags & GTK_CELL_RENDERER_SELECTED) == GTK_CELL_RENDERER_SELECTED)
204
if (GTK_WIDGET_HAS_FOCUS (widget))
205
state = GTK_STATE_SELECTED;
207
state = GTK_STATE_ACTIVE;
209
else if ((flags & GTK_CELL_RENDERER_PRELIT) == GTK_CELL_RENDERER_PRELIT &&
210
GTK_WIDGET_STATE (widget) == GTK_STATE_PRELIGHT)
212
state = GTK_STATE_PRELIGHT;
216
if (GTK_WIDGET_STATE (widget) == GTK_STATE_INSENSITIVE)
217
state = GTK_STATE_INSENSITIVE;
219
state = GTK_STATE_NORMAL;
222
y = cell_area->y + (cell_area->height - DASHES_HEIGHT) / 2;
223
width = cell_area->width - 2 * cell->xpad;
225
for (x = 0; x < width + BLOCK_WIDTH; x += BLOCK_WIDTH)
227
guint index = ((guint) x / BLOCK_WIDTH) % N_SEGMENTS;
229
if (dashes->segments[index])
233
rect.x = cell_area->x + cell->xpad + x;
235
rect.width = MIN (BLOCK_WIDTH, width - x);
236
rect.height = DASHES_HEIGHT;
238
gdk_rectangle_intersect (&rect, expose_area, &rect);
239
gdk_draw_rectangle (widget->window,
240
widget->style->text_gc[state], TRUE,
241
rect.x, rect.y, rect.width, rect.height);
247
gimp_cell_renderer_dashes_new (void)
249
return g_object_new (GIMP_TYPE_CELL_RENDERER_DASHES, NULL);