3 * Copyright (C) 2001-2009 Jim Evins <evins@snaught.com>.
5 * This file is part of gLabels.
7 * gLabels 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 3 of the License, or
10 * (at your option) any later version.
12 * gLabels 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 gLabels. If not, see <http://www.gnu.org/licenses/>.
23 #include "view-ellipse.h"
25 #include <glib/gi18n.h>
29 #include "cairo-ellipse-path.h"
31 #include "object-editor.h"
34 #include "pixmaps/cursor_ellipse.xbm"
35 #include "pixmaps/cursor_ellipse_mask.xbm"
40 /*========================================================*/
41 /* Private macros and constants. */
42 /*========================================================*/
45 /*========================================================*/
47 /*========================================================*/
49 struct _glViewEllipsePrivate {
53 /*========================================================*/
54 /* Private globals. */
55 /*========================================================*/
58 /*========================================================*/
59 /* Private function prototypes. */
60 /*========================================================*/
62 static void gl_view_ellipse_finalize (GObject *object);
64 static GtkWidget *construct_properties_editor (glViewObject *view_object);
66 static void update_object_from_editor_cb (glObjectEditor *editor,
67 glLabelObject *object);
69 static void update_editor_from_object_cb (glLabelObject *object,
70 glObjectEditor *editor);
72 static void update_editor_from_move_cb (glLabelObject *object,
75 glObjectEditor *editor);
77 static gboolean object_at (glViewObject *view_object,
83 /*****************************************************************************/
84 /* Boilerplate object stuff. */
85 /*****************************************************************************/
86 G_DEFINE_TYPE (glViewEllipse, gl_view_ellipse, GL_TYPE_VIEW_OBJECT);
90 gl_view_ellipse_class_init (glViewEllipseClass *class)
92 GObjectClass *object_class = G_OBJECT_CLASS (class);
93 glViewObjectClass *view_object_class = GL_VIEW_OBJECT_CLASS (class);
95 gl_debug (DEBUG_VIEW, "START");
97 gl_view_ellipse_parent_class = g_type_class_peek_parent (class);
99 object_class->finalize = gl_view_ellipse_finalize;
101 view_object_class->construct_editor = construct_properties_editor;
102 view_object_class->object_at = object_at;
104 gl_debug (DEBUG_VIEW, "END");
109 gl_view_ellipse_init (glViewEllipse *view_ellipse)
111 gl_debug (DEBUG_VIEW, "START");
113 view_ellipse->priv = g_new0 (glViewEllipsePrivate, 1);
115 gl_debug (DEBUG_VIEW, "END");
120 gl_view_ellipse_finalize (GObject *object)
122 glViewEllipse *view_ellipse = GL_VIEW_ELLIPSE (object);
124 gl_debug (DEBUG_VIEW, "START");
126 g_return_if_fail (object && GL_IS_VIEW_ELLIPSE (object));
128 g_free (view_ellipse->priv);
130 G_OBJECT_CLASS (gl_view_ellipse_parent_class)->finalize (object);
132 gl_debug (DEBUG_VIEW, "END");
136 /*****************************************************************************/
137 /* NEW ellipse object view. */
138 /*****************************************************************************/
140 gl_view_ellipse_new (glLabelEllipse *object,
143 glViewEllipse *view_ellipse;
145 gl_debug (DEBUG_VIEW, "START");
147 g_return_val_if_fail (object && GL_IS_LABEL_ELLIPSE (object), NULL);
148 g_return_val_if_fail (view && GL_IS_VIEW (view), NULL);
150 view_ellipse = g_object_new (gl_view_ellipse_get_type(), NULL);
152 gl_view_object_set_object (GL_VIEW_OBJECT(view_ellipse),
153 GL_LABEL_OBJECT(object),
154 GL_VIEW_OBJECT_HANDLES_BOX);
155 gl_view_object_set_view (GL_VIEW_OBJECT(view_ellipse), view);
157 gl_debug (DEBUG_VIEW, "END");
159 return GL_VIEW_OBJECT (view_ellipse);
163 /*****************************************************************************/
164 /* Create a properties dialog for a ellipse object. */
165 /*****************************************************************************/
167 construct_properties_editor (glViewObject *view_object)
170 glViewEllipse *view_ellipse = (glViewEllipse *)view_object;
171 glLabelObject *object;
173 gl_debug (DEBUG_VIEW, "START");
175 object = gl_view_object_get_object (GL_VIEW_OBJECT(view_ellipse));
178 editor = gl_object_editor_new (GL_STOCK_ELLIPSE, _("Ellipse object properties"),
180 GL_OBJECT_EDITOR_SHADOW_PAGE,
181 GL_OBJECT_EDITOR_POSITION_PAGE,
182 GL_OBJECT_EDITOR_SIZE_PAGE,
183 GL_OBJECT_EDITOR_FILL_PAGE,
184 GL_OBJECT_EDITOR_LINE_PAGE,
188 update_editor_from_object_cb (object, GL_OBJECT_EDITOR(editor));
189 update_editor_from_move_cb (object, 0, 0, GL_OBJECT_EDITOR(editor));
191 /* Connect signals. */
192 g_signal_connect (G_OBJECT (editor), "changed",
193 G_CALLBACK(update_object_from_editor_cb), object);
194 g_signal_connect (G_OBJECT (object), "changed",
195 G_CALLBACK (update_editor_from_object_cb), editor);
196 g_signal_connect (G_OBJECT (object), "moved",
197 G_CALLBACK (update_editor_from_move_cb), editor);
199 gl_debug (DEBUG_VIEW, "END");
205 /*---------------------------------------------------------------------------*/
206 /* PRIVATE. editor "changed" callback. */
207 /*---------------------------------------------------------------------------*/
209 update_object_from_editor_cb (glObjectEditor *editor,
210 glLabelObject *object)
213 glColorNode *line_color_node;
215 glColorNode *fill_color_node;
216 gboolean shadow_state;
217 gdouble shadow_x, shadow_y;
218 glColorNode *shadow_color_node;
219 gdouble shadow_opacity;
222 gl_debug (DEBUG_VIEW, "START");
224 g_signal_handlers_block_by_func (G_OBJECT(object),
225 update_editor_from_object_cb,
227 g_signal_handlers_block_by_func (G_OBJECT(object),
228 update_editor_from_move_cb,
231 gl_object_editor_get_position (editor, &x, &y);
232 gl_label_object_set_position (object, x, y);
234 gl_object_editor_get_size (editor, &w, &h);
235 gl_label_object_set_size (object, w, h);
237 fill_color_node = gl_object_editor_get_fill_color (editor);
238 gl_label_object_set_fill_color (object, fill_color_node);
239 gl_color_node_free (&fill_color_node);
241 line_color_node = gl_object_editor_get_line_color (editor);
242 gl_label_object_set_line_color (object, line_color_node);
243 gl_color_node_free (&line_color_node);
245 line_width = gl_object_editor_get_line_width (editor);
246 gl_label_object_set_line_width (object, line_width);
248 shadow_state = gl_object_editor_get_shadow_state (editor);
249 gl_label_object_set_shadow_state (object, shadow_state);
251 gl_object_editor_get_shadow_offset (editor, &shadow_x, &shadow_y);
252 gl_label_object_set_shadow_offset (object, shadow_x, shadow_y);
254 shadow_color_node = gl_object_editor_get_shadow_color (editor);
255 gl_label_object_set_shadow_color (object, shadow_color_node);
256 gl_color_node_free (&shadow_color_node);
258 shadow_opacity = gl_object_editor_get_shadow_opacity (editor);
259 gl_label_object_set_shadow_opacity (object, shadow_opacity);
261 g_signal_handlers_unblock_by_func (G_OBJECT(object),
262 update_editor_from_object_cb,
264 g_signal_handlers_unblock_by_func (G_OBJECT(object),
265 update_editor_from_move_cb,
268 gl_debug (DEBUG_VIEW, "END");
272 /*---------------------------------------------------------------------------*/
273 /* PRIVATE. label object "changed" callback. */
274 /*---------------------------------------------------------------------------*/
276 update_editor_from_object_cb (glLabelObject *object,
277 glObjectEditor *editor)
280 glColorNode *line_color_node;
282 glColorNode *fill_color_node;
283 gboolean shadow_state;
284 gdouble shadow_x, shadow_y;
285 glColorNode *shadow_color_node;
286 gdouble shadow_opacity;
289 gl_debug (DEBUG_VIEW, "START");
291 gl_label_object_get_size (object, &w, &h);
292 gl_object_editor_set_size (editor, w, h);
293 merge = gl_label_get_merge (GL_LABEL(object->parent));
295 fill_color_node = gl_label_object_get_fill_color (GL_LABEL_OBJECT(object));
296 gl_object_editor_set_fill_color (editor, (merge != NULL), fill_color_node);
297 gl_color_node_free (&fill_color_node);
299 line_color_node = gl_label_object_get_line_color (GL_LABEL_OBJECT(object));
300 gl_object_editor_set_line_color (editor, (merge != NULL), line_color_node);
301 gl_color_node_free (&line_color_node);
303 line_width = gl_label_object_get_line_width (GL_LABEL_OBJECT(object));
304 gl_object_editor_set_line_width (editor, line_width);
306 shadow_state = gl_label_object_get_shadow_state (object);
307 gl_object_editor_set_shadow_state (editor, shadow_state);
309 gl_label_object_get_shadow_offset (object, &shadow_x, &shadow_y);
310 gl_object_editor_set_shadow_offset (editor, shadow_x, shadow_y);
312 shadow_color_node = gl_label_object_get_shadow_color (object);
313 gl_object_editor_set_shadow_color (editor, (merge != NULL), shadow_color_node);
314 gl_color_node_free (&shadow_color_node);
316 shadow_opacity = gl_label_object_get_shadow_opacity (object);
317 gl_object_editor_set_shadow_opacity (editor, shadow_opacity);
319 gl_debug (DEBUG_VIEW, "END");
323 /*---------------------------------------------------------------------------*/
324 /* PRIVATE. label object "moved" callback. */
325 /*---------------------------------------------------------------------------*/
327 update_editor_from_move_cb (glLabelObject *object,
330 glObjectEditor *editor)
334 gl_debug (DEBUG_VIEW, "START");
336 gl_label_object_get_position (object, &x, &y);
337 gl_object_editor_set_position (editor, x, y);
339 gl_debug (DEBUG_VIEW, "END");
343 /*****************************************************************************/
344 /* Is object at (x,y)? */
345 /*****************************************************************************/
347 object_at (glViewObject *view_object,
352 glLabelObject *object;
356 object = gl_view_object_get_object (view_object);
358 gl_label_object_get_size (object, &w, &h);
360 gl_cairo_ellipse_path (cr, w/2, h/2);
362 if (cairo_in_fill (cr, x, y))
367 line_width = gl_label_object_get_line_width (object);
368 cairo_set_line_width (cr, line_width);
369 if (cairo_in_stroke (cr, x, y))
378 /*****************************************************************************/
379 /* Return apropos cursor for create object mode. */
380 /*****************************************************************************/
382 gl_view_ellipse_get_create_cursor (void)
384 GdkCursor *cursor = NULL;
385 GdkPixmap *pixmap_data, *pixmap_mask;
386 GdkColor fg = { 0, 0, 0, 0 };
387 GdkColor bg = { 0, 65535, 65535, 65535 };
389 gl_debug (DEBUG_VIEW, "START");
391 pixmap_data = gdk_bitmap_create_from_data (NULL,
392 (gchar *)cursor_ellipse_bits,
393 cursor_ellipse_width,
394 cursor_ellipse_height);
395 pixmap_mask = gdk_bitmap_create_from_data (NULL,
396 (gchar *)cursor_ellipse_mask_bits,
397 cursor_ellipse_mask_width,
398 cursor_ellipse_mask_height);
399 cursor = gdk_cursor_new_from_pixmap (pixmap_data, pixmap_mask, &fg,
400 &bg, cursor_ellipse_x_hot,
401 cursor_ellipse_y_hot);
403 gl_debug (DEBUG_VIEW, "END");
409 /*****************************************************************************/
410 /* Object creation handler: button press event. */
411 /*****************************************************************************/
413 gl_view_ellipse_create_button_press_event (glView *view,
418 glColorNode *fill_color_node;
419 glColorNode *line_color_node;
421 gl_view_unselect_all (view);
423 fill_color_node = gl_color_node_new_default ();
424 line_color_node = gl_color_node_new_default ();
426 object = gl_label_ellipse_new (view->label);
427 gl_label_object_set_position (GL_LABEL_OBJECT(object), x, y);
428 gl_label_object_set_size (GL_LABEL_OBJECT(object), 0.0, 0.0);
429 line_color_node->color = gl_color_set_opacity (gl_view_get_default_line_color(view), 0.5);
430 fill_color_node->color = gl_color_set_opacity (gl_view_get_default_fill_color(view), 0.5);
431 gl_label_object_set_line_width (GL_LABEL_OBJECT(object),
432 gl_view_get_default_line_width(view));
433 gl_label_object_set_line_color (GL_LABEL_OBJECT(object),
435 gl_label_object_set_fill_color (GL_LABEL_OBJECT(object),
438 gl_color_node_free (&fill_color_node);
439 gl_color_node_free (&line_color_node);
441 view->create_object = GL_LABEL_OBJECT (object);
447 /*****************************************************************************/
448 /* Object creation handler: motion event. */
449 /*****************************************************************************/
451 gl_view_ellipse_create_motion_event (glView *view,
457 gl_label_object_set_position (GL_LABEL_OBJECT(view->create_object),
458 MIN (x, view->create_x0), MIN (y, view->create_y0));
459 w = MAX (x, view->create_x0) - MIN (x, view->create_x0);
460 h = MAX (y, view->create_y0) - MIN (y, view->create_y0);
461 gl_label_object_set_size (GL_LABEL_OBJECT(view->create_object), w, h);
465 /*****************************************************************************/
466 /* Object creation handler: button relesase event. */
467 /*****************************************************************************/
469 gl_view_ellipse_create_button_release_event (glView *view,
473 glColorNode *fill_color_node;
474 glColorNode *line_color_node;
477 fill_color_node = gl_color_node_new_default ();
478 line_color_node = gl_color_node_new_default ();
480 if ((view->create_x0 == x) && (view->create_y0 == y)) {
481 x = view->create_x0 + 36.0;
482 y = view->create_y0 + 36.0;
484 gl_label_object_set_position (GL_LABEL_OBJECT(view->create_object),
485 MIN (x, view->create_x0), MIN (y, view->create_y0));
486 w = MAX (x, view->create_x0) - MIN (x, view->create_x0);
487 h = MAX (y, view->create_y0) - MIN (y, view->create_y0);
488 gl_label_object_set_size (GL_LABEL_OBJECT(view->create_object), w, h);
489 line_color_node->color = gl_view_get_default_line_color(view);
490 gl_label_object_set_line_color (GL_LABEL_OBJECT(view->create_object), line_color_node);
491 fill_color_node->color = gl_view_get_default_fill_color(view);
492 gl_label_object_set_fill_color (GL_LABEL_OBJECT(view->create_object), fill_color_node);
493 gl_color_node_free (&fill_color_node);
494 gl_color_node_free (&line_color_node);
500 * Local Variables: -- emacs
502 * c-basic-offset: 8 -- emacs
503 * tab-width: 8 -- emacs
504 * indent-tabs-mode: nil -- emacs