3 * Copyright (C) 2003-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 "ui-property-bar.h"
25 #include <glib/gi18n.h>
26 #include <gtk/gtkbuilder.h>
27 #include <gtk/gtkspinbutton.h>
28 #include <gtk/gtktoolbar.h>
29 #include <gtk/gtktoggletoolbutton.h>
33 #include "font-combo.h"
34 #include "color-combo-button.h"
35 #include "stock-pixmaps/stockpixbufs.h"
42 /*===========================================================================*/
43 /* Private macros and constants. */
44 /*===========================================================================*/
47 /*===========================================================================*/
48 /* Private data types */
49 /*===========================================================================*/
51 struct _glUIPropertyBarPrivate {
60 GtkWidget *font_family_eventbox;
61 GtkWidget *font_family_combo;
62 GtkWidget *font_size_spin;
63 GtkWidget *font_bold_toggle;
64 GtkWidget *font_italic_toggle;
66 /* Text alignemnt radios */
67 GtkWidget *text_align_left_radio;
68 GtkWidget *text_align_center_radio;
69 GtkWidget *text_align_right_radio;
72 GtkWidget *text_color_eventbox;
73 GtkWidget *text_color_button;
74 GtkWidget *fill_color_eventbox;
75 GtkWidget *fill_color_button;
76 GtkWidget *line_color_eventbox;
77 GtkWidget *line_color_button;
80 GtkWidget *line_width_spin;
82 /* Prevent recursion */
83 gboolean stop_signals;
87 /*===========================================================================*/
89 /*===========================================================================*/
92 /*===========================================================================*/
93 /* Local function prototypes */
94 /*===========================================================================*/
96 static void gl_ui_property_bar_finalize (GObject *object);
98 static void gl_ui_property_bar_construct (glUIPropertyBar *this);
100 static void selection_changed_cb (glUIPropertyBar *this);
102 static void font_family_changed_cb (GtkComboBox *combo,
103 glUIPropertyBar *this);
105 static void font_size_changed_cb (GtkSpinButton *spin,
106 glUIPropertyBar *this);
108 static void text_color_changed_cb (glColorComboButton *cc,
111 glUIPropertyBar *this);
113 static void fill_color_changed_cb (glColorComboButton *cc,
116 glUIPropertyBar *this);
118 static void line_color_changed_cb (glColorComboButton *cc,
121 glUIPropertyBar *this);
123 static void line_width_changed_cb (GtkSpinButton *spin,
124 glUIPropertyBar *this);
126 static void font_bold_toggled_cb (GtkToggleToolButton *toggle,
127 glUIPropertyBar *this);
129 static void font_italic_toggled_cb (GtkToggleToolButton *toggle,
130 glUIPropertyBar *this);
132 static void text_align_toggled_cb (GtkToggleToolButton *toggle,
133 glUIPropertyBar *this);
135 static void set_doc_items_sensitive (glUIPropertyBar *this,
138 static void set_text_items_sensitive (glUIPropertyBar *this,
141 static void set_fill_items_sensitive (glUIPropertyBar *this,
144 static void set_line_color_items_sensitive (glUIPropertyBar *this,
147 static void set_line_width_items_sensitive (glUIPropertyBar *this,
151 /****************************************************************************/
152 /* Boilerplate Object stuff. */
153 /****************************************************************************/
154 G_DEFINE_TYPE (glUIPropertyBar, gl_ui_property_bar, GTK_TYPE_HBOX);
158 gl_ui_property_bar_class_init (glUIPropertyBarClass *class)
160 GObjectClass *object_class = G_OBJECT_CLASS (class);
162 gl_debug (DEBUG_PROPERTY_BAR, "START");
164 gl_ui_property_bar_parent_class = g_type_class_peek_parent (class);
166 object_class->finalize = gl_ui_property_bar_finalize;
168 gl_debug (DEBUG_PROPERTY_BAR, "END");
173 gl_ui_property_bar_init (glUIPropertyBar *this)
175 gl_debug (DEBUG_PROPERTY_BAR, "START");
177 this->priv = g_new0 (glUIPropertyBarPrivate, 1);
179 gl_debug (DEBUG_PROPERTY_BAR, "END");
184 gl_ui_property_bar_finalize (GObject *object)
186 glUIPropertyBar *this = GL_UI_PROPERTY_BAR (object);
188 gl_debug (DEBUG_PROPERTY_BAR, "START");
190 g_return_if_fail (object != NULL);
191 g_return_if_fail (GL_IS_UI_PROPERTY_BAR (object));
193 if (this->priv->view)
195 g_object_unref (G_OBJECT(this->priv->view));
197 if (this->priv->builder)
199 g_object_unref (G_OBJECT(this->priv->builder));
203 G_OBJECT_CLASS (gl_ui_property_bar_parent_class)->finalize (object);
205 gl_debug (DEBUG_PROPERTY_BAR, "END");
209 /****************************************************************************/
210 /* Create a NEW property_bar. */
211 /****************************************************************************/
213 gl_ui_property_bar_new (void)
215 glUIPropertyBar *this;
217 gl_debug (DEBUG_PROPERTY_BAR, "START");
219 this = g_object_new (GL_TYPE_UI_PROPERTY_BAR, NULL);
221 gl_ui_property_bar_construct (this);
223 gl_debug (DEBUG_PROPERTY_BAR, "END");
225 return GTK_WIDGET (this);
229 /******************************************************************************/
230 /* Initialize property toolbar. */
231 /******************************************************************************/
233 gl_ui_property_bar_construct (glUIPropertyBar *this)
236 static gchar *object_ids[] = { "property_toolbar",
237 "adjustment1", "adjustment2",
239 GError *error = NULL;
240 GList *family_names = NULL;
242 GdkPixbuf *pixbuf = NULL;
244 gl_debug (DEBUG_PROPERTY_BAR, "START");
246 this->priv->stop_signals = TRUE;
248 builder = gtk_builder_new ();
249 gtk_builder_add_objects_from_file (builder,
250 GLABELS_BUILDER_DIR "property-bar.builder",
254 g_critical ("%s\n\ngLabels may not be installed correctly!", error->message);
255 g_error_free (error);
259 gl_util_get_builder_widgets (builder,
260 "property_toolbar", &this->priv->tool_bar,
261 "font_family_eventbox", &this->priv->font_family_eventbox,
262 "font_size_spin", &this->priv->font_size_spin,
263 "font_bold_toggle", &this->priv->font_bold_toggle,
264 "font_italic_toggle", &this->priv->font_italic_toggle,
265 "text_align_left_radio", &this->priv->text_align_left_radio,
266 "text_align_center_radio", &this->priv->text_align_center_radio,
267 "text_align_right_radio", &this->priv->text_align_right_radio,
268 "text_color_eventbox", &this->priv->text_color_eventbox,
269 "fill_color_eventbox", &this->priv->fill_color_eventbox,
270 "line_color_eventbox", &this->priv->line_color_eventbox,
271 "line_width_spin", &this->priv->line_width_spin,
274 gtk_container_add (GTK_CONTAINER (this), this->priv->tool_bar);
276 this->priv->font_family_combo = gl_font_combo_new (gl_prefs->default_font_family);
277 gtk_container_add (GTK_CONTAINER (this->priv->font_family_eventbox),
278 this->priv->font_family_combo);
280 pixbuf = gdk_pixbuf_new_from_inline (-1, stock_text_24, FALSE, NULL);
281 this->priv->text_color_button =
282 gl_color_combo_button_new (pixbuf,
284 GL_COLOR_TEXT_DEFAULT,
285 gl_prefs->default_text_color);
286 gl_color_combo_button_set_relief (GL_COLOR_COMBO_BUTTON(this->priv->text_color_button),
288 g_object_unref (G_OBJECT (pixbuf));
289 gtk_container_add (GTK_CONTAINER (this->priv->text_color_eventbox),
290 this->priv->text_color_button);
292 pixbuf = gdk_pixbuf_new_from_inline (-1, stock_bucket_fill_24, FALSE, NULL);
293 this->priv->fill_color_button =
294 gl_color_combo_button_new (pixbuf,
297 gl_prefs->default_fill_color);
298 gl_color_combo_button_set_relief (GL_COLOR_COMBO_BUTTON(this->priv->fill_color_button),
300 g_object_unref (G_OBJECT (pixbuf));
301 gtk_container_add (GTK_CONTAINER (this->priv->fill_color_eventbox),
302 this->priv->fill_color_button);
304 pixbuf = gdk_pixbuf_new_from_inline (-1, stock_pencil_24, FALSE, NULL);
305 this->priv->line_color_button =
306 gl_color_combo_button_new (pixbuf,
309 gl_prefs->default_line_color);
310 gl_color_combo_button_set_relief (GL_COLOR_COMBO_BUTTON(this->priv->line_color_button),
312 g_object_unref (G_OBJECT (pixbuf));
313 gtk_container_add (GTK_CONTAINER (this->priv->line_color_eventbox),
314 this->priv->line_color_button);
316 /* Save reference to gui tree so we don't lose tooltips */
317 this->priv->builder = builder;
319 set_doc_items_sensitive (this, FALSE);
321 /* Font family entry widget */
322 g_signal_connect (G_OBJECT (this->priv->font_family_combo),
323 "changed", G_CALLBACK (font_family_changed_cb), this);
325 /* Font size entry widget */
326 gtk_spin_button_set_value (GTK_SPIN_BUTTON(this->priv->font_size_spin),
327 gl_prefs->default_font_size);
329 g_signal_connect (G_OBJECT (this->priv->font_size_spin),
330 "changed", G_CALLBACK (font_size_changed_cb), this);
333 /* Bold and Italic toggles */
334 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (this->priv->font_bold_toggle),
335 (gl_prefs->default_font_weight == PANGO_WEIGHT_BOLD));
336 g_signal_connect (G_OBJECT (this->priv->font_bold_toggle),
337 "toggled", G_CALLBACK (font_bold_toggled_cb), this);
338 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (this->priv->font_italic_toggle),
339 gl_prefs->default_font_italic_flag);
340 g_signal_connect (G_OBJECT (this->priv->font_italic_toggle),
341 "toggled", G_CALLBACK (font_italic_toggled_cb), this);
344 /* Text alignment radio group */
345 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (this->priv->text_align_left_radio),
346 (gl_prefs->default_text_alignment == PANGO_ALIGN_LEFT));
347 g_signal_connect (G_OBJECT (this->priv->text_align_left_radio),
348 "toggled", G_CALLBACK (text_align_toggled_cb), this);
349 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (this->priv->text_align_center_radio),
350 (gl_prefs->default_text_alignment == PANGO_ALIGN_CENTER));
351 g_signal_connect (G_OBJECT (this->priv->text_align_center_radio),
352 "toggled", G_CALLBACK (text_align_toggled_cb), this);
353 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (this->priv->text_align_right_radio),
354 (gl_prefs->default_text_alignment == PANGO_ALIGN_RIGHT));
355 g_signal_connect (G_OBJECT (this->priv->text_align_right_radio),
356 "toggled", G_CALLBACK (text_align_toggled_cb), this);
358 /* Text color widget */
359 gl_color_combo_button_set_color (GL_COLOR_COMBO_BUTTON (this->priv->text_color_button),
360 gl_prefs->default_text_color);
361 g_signal_connect (G_OBJECT (this->priv->text_color_button),
363 G_CALLBACK (text_color_changed_cb), this);
365 /* Fill color widget */
366 gl_color_combo_button_set_color (GL_COLOR_COMBO_BUTTON (this->priv->fill_color_button),
367 gl_prefs->default_fill_color);
368 g_signal_connect (G_OBJECT (this->priv->fill_color_button),
370 G_CALLBACK (fill_color_changed_cb), this);
372 /* Line color widget */
373 gl_color_combo_button_set_color (GL_COLOR_COMBO_BUTTON (this->priv->line_color_button),
374 gl_prefs->default_line_color);
375 g_signal_connect (G_OBJECT (this->priv->line_color_button),
377 G_CALLBACK (line_color_changed_cb), this);
379 /* Line width entry widget */
380 g_signal_connect (G_OBJECT (this->priv->line_width_spin),
382 G_CALLBACK (line_width_changed_cb), this);
384 this->priv->stop_signals = FALSE;
386 gl_debug (DEBUG_PROPERTY_BAR, "END");
390 /****************************************************************************/
391 /* Fill widgets with default values. */
392 /****************************************************************************/
394 reset_to_default_properties (glView *view,
395 glUIPropertyBar *this)
398 gchar *good_font_family;
400 /* Make sure we have a valid font. if not provide a good default. */
401 family_names = gl_font_util_get_all_families ();
402 if (g_list_find_custom (family_names,
403 view->default_font_family,
404 (GCompareFunc)g_utf8_collate))
406 good_font_family = g_strdup (view->default_font_family);
410 if (family_names != NULL)
412 good_font_family = g_strdup (family_names->data); /* 1st entry */
416 good_font_family = NULL;
419 gl_font_combo_set_family (GL_FONT_COMBO (this->priv->font_family_combo),
421 g_free (good_font_family);
423 gtk_spin_button_set_value (GTK_SPIN_BUTTON(this->priv->font_size_spin),
424 view->default_font_size);
426 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (this->priv->font_bold_toggle),
427 (view->default_font_weight == PANGO_WEIGHT_BOLD));
428 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (this->priv->font_italic_toggle),
429 view->default_font_italic_flag);
431 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (this->priv->text_align_left_radio),
432 (view->default_text_alignment == PANGO_ALIGN_LEFT));
433 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (this->priv->text_align_center_radio),
434 (view->default_text_alignment == PANGO_ALIGN_CENTER));
435 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (this->priv->text_align_right_radio),
436 (view->default_text_alignment == PANGO_ALIGN_RIGHT));
438 gl_color_combo_button_set_color (GL_COLOR_COMBO_BUTTON(this->priv->text_color_button),
439 view->default_text_color);
441 gl_color_combo_button_set_color (GL_COLOR_COMBO_BUTTON(this->priv->fill_color_button),
442 view->default_fill_color);
444 gl_color_combo_button_set_color (GL_COLOR_COMBO_BUTTON(this->priv->line_color_button),
445 view->default_line_color);
447 gtk_spin_button_set_value (GTK_SPIN_BUTTON(this->priv->line_width_spin),
448 view->default_line_width);
452 /****************************************************************************/
453 /* Set view associated with property_bar. */
454 /****************************************************************************/
456 gl_ui_property_bar_set_view (glUIPropertyBar *this,
461 gl_debug (DEBUG_PROPERTY_BAR, "START");
463 g_return_if_fail (view && GL_IS_VIEW (view));
465 g_return_if_fail (label && GL_IS_LABEL (label));
467 set_doc_items_sensitive (this, TRUE);
469 this->priv->view = GL_VIEW (g_object_ref (G_OBJECT (view)));
471 reset_to_default_properties (view, this);
473 g_signal_connect_swapped (G_OBJECT(view), "selection_changed",
474 G_CALLBACK(selection_changed_cb), this);
476 g_signal_connect_swapped (G_OBJECT(view->label), "changed",
477 G_CALLBACK(selection_changed_cb), this);
479 gl_debug (DEBUG_PROPERTY_BAR, "END");
483 /*---------------------------------------------------------------------------*/
484 /* PRIVATE. View "selection state changed" callback. */
485 /*---------------------------------------------------------------------------*/
487 update_text_properties (glView *view,
488 glUIPropertyBar *this)
490 gboolean can_text, is_first_object;
491 gboolean is_same_font_family, is_same_font_size;
492 gboolean is_same_text_color, is_same_is_italic;
493 gboolean is_same_is_bold, is_same_align;
495 glLabelObject *object;
496 gchar *selection_font_family, *font_family;
497 gdouble selection_font_size, font_size;
498 guint selection_text_color, text_color;
499 glColorNode *text_color_node;
500 gboolean selection_is_italic, is_italic;
501 gboolean selection_is_bold, is_bold;
502 PangoAlignment selection_align, align;
504 can_text = gl_view_can_selection_text (view);
505 set_text_items_sensitive (this, can_text);
515 is_same_font_family = TRUE;
516 selection_font_family = NULL;
517 selection_font_size = -1;
518 selection_align = PANGO_ALIGN_LEFT;
519 selection_is_italic = TRUE;
520 selection_is_bold = TRUE;
521 selection_text_color = 0;
523 is_first_object = TRUE;
525 for (p = view->selected_object_list; p != NULL; p = p->next)
528 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
529 if (!gl_label_object_can_text (object))
532 font_family = gl_label_object_get_font_family (object);
533 if (font_family != NULL)
535 if (selection_font_family == NULL)
537 selection_font_family = g_strdup (font_family);
541 if (strcmp (font_family, selection_font_family) != 0)
543 is_same_font_family = FALSE;
546 g_free (font_family);
549 font_size = gl_label_object_get_font_size (object);
551 text_color_node = gl_label_object_get_text_color (object);
552 if (text_color_node->field_flag)
554 /* If a merge field is set we use the default color for merged color*/
555 text_color = GL_COLOR_MERGE_DEFAULT;
560 text_color = text_color_node->color;
562 gl_color_node_free (&text_color_node);
564 is_italic = gl_label_object_get_font_italic_flag (object);
565 is_bold = gl_label_object_get_font_weight (object) == PANGO_WEIGHT_BOLD;
566 align = gl_label_object_get_text_alignment (object);
570 selection_font_size = font_size;
571 selection_text_color = text_color;
572 selection_is_italic = is_italic;
573 selection_is_bold = is_bold;
574 selection_align = align;
578 if (font_size != selection_font_size)
579 is_same_font_size = FALSE;
580 if (text_color != selection_text_color)
581 is_same_text_color = FALSE;
582 if (is_italic != selection_is_italic)
583 is_same_is_italic = FALSE;
584 if (is_bold != selection_is_bold)
585 is_same_is_bold = FALSE;
586 if (align != selection_align)
587 is_same_align = FALSE;
589 is_first_object = FALSE;
592 if (is_same_font_family && (selection_font_family != NULL))
593 gl_debug (DEBUG_PROPERTY_BAR, "same font family = %s",
594 selection_font_family);
595 gl_font_combo_set_family (GL_FONT_COMBO (this->priv->font_family_combo),
596 is_same_font_family?selection_font_family:"");
597 g_free (selection_font_family);
599 if (is_same_font_size)
601 gl_debug (DEBUG_PROPERTY_BAR, "same font size = %g",
602 selection_font_size);
603 gtk_spin_button_set_value (GTK_SPIN_BUTTON (this->priv->font_size_spin),
604 selection_font_size);
608 gtk_entry_set_text (GTK_ENTRY (this->priv->font_size_spin), "");
611 if (is_same_text_color)
613 gl_debug (DEBUG_PROPERTY_BAR, "same text color = %08x", selection_text_color);
614 gl_color_combo_button_set_color (GL_COLOR_COMBO_BUTTON (this->priv->text_color_button),
615 selection_text_color);
618 if (is_same_is_italic)
620 gl_debug (DEBUG_PROPERTY_BAR, "same italic flag = %d",
621 selection_is_italic);
623 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (this->priv->font_italic_toggle),
624 selection_is_italic && is_same_is_italic);
628 gl_debug (DEBUG_PROPERTY_BAR, "same bold flag = %d",
631 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (this->priv->font_bold_toggle),
632 selection_is_bold && is_same_is_bold);
635 gl_debug (DEBUG_PROPERTY_BAR, "same align");
636 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (this->priv->text_align_left_radio),
637 (selection_align == PANGO_ALIGN_LEFT) &&
639 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (this->priv->text_align_center_radio),
640 (selection_align == PANGO_ALIGN_CENTER) &&
642 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (this->priv->text_align_right_radio),
643 (selection_align == PANGO_ALIGN_RIGHT) &&
649 update_fill_color (glView *view,
650 glUIPropertyBar *this)
652 gboolean can, is_first_object;
653 gboolean is_same_fill_color;
655 glLabelObject *object;
656 guint selection_fill_color, fill_color;
657 glColorNode *fill_color_node;
659 can = gl_view_can_selection_fill (view);
660 set_fill_items_sensitive (this, can);
665 is_same_fill_color = TRUE;
666 is_first_object = TRUE;
667 selection_fill_color = 0;
669 for (p = view->selected_object_list; p != NULL; p = p->next)
672 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
673 if (!gl_label_object_can_fill (object))
676 fill_color_node = gl_label_object_get_fill_color (object);
677 if (fill_color_node->field_flag)
679 /* If a merge field is set we use the default color for merged color*/
680 fill_color = GL_COLOR_FILL_MERGE_DEFAULT;
685 fill_color = fill_color_node->color;
687 gl_color_node_free (&fill_color_node);
691 selection_fill_color = fill_color;
695 if (fill_color != selection_fill_color)
697 is_same_fill_color = FALSE;
700 is_first_object = FALSE;
703 if (is_same_fill_color)
705 gl_debug (DEBUG_PROPERTY_BAR, "same fill color = %08x", selection_fill_color);
706 gl_color_combo_button_set_color (GL_COLOR_COMBO_BUTTON (this->priv->fill_color_button),
707 selection_fill_color);
713 update_line_color (glView *view,
714 glUIPropertyBar *this)
716 gboolean can, is_first_object;
717 gboolean is_same_line_color;
719 glLabelObject *object;
720 guint selection_line_color, line_color;
721 glColorNode *line_color_node;
723 can = gl_view_can_selection_line_color (view);
724 set_line_color_items_sensitive (this, can);
729 is_same_line_color = TRUE;
730 is_first_object = TRUE;
731 selection_line_color = 0;
733 for (p = view->selected_object_list; p != NULL; p = p->next)
736 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
737 if (!gl_label_object_can_line_color (object))
740 line_color_node = gl_label_object_get_line_color (object);
741 if (line_color_node->field_flag)
743 /* If a merge field is set we use the default color for merged color*/
744 line_color = GL_COLOR_MERGE_DEFAULT;
749 line_color = line_color_node->color;
751 gl_color_node_free (&line_color_node);
755 selection_line_color = line_color;
759 if (line_color != selection_line_color)
761 is_same_line_color = FALSE;
764 is_first_object = FALSE;
767 if (is_same_line_color)
769 gl_debug (DEBUG_PROPERTY_BAR, "same line color = %08x", selection_line_color);
770 gl_color_combo_button_set_color (GL_COLOR_COMBO_BUTTON (this->priv->line_color_button),
771 selection_line_color);
777 update_line_width (glView *view,
778 glUIPropertyBar *this)
780 gboolean can, is_first_object;
781 gboolean is_same_line_width;
783 glLabelObject *object;
784 gdouble selection_line_width, line_width;
786 can = gl_view_can_selection_line_width (view);
787 set_line_width_items_sensitive (this, can);
792 is_same_line_width = TRUE;
793 is_first_object = TRUE;
794 selection_line_width = 0;
796 for (p = view->selected_object_list; p != NULL; p = p->next)
799 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
800 if (!gl_label_object_can_line_width (object))
803 line_width = gl_label_object_get_line_width (object);
807 selection_line_width = line_width;
811 if (line_width != selection_line_width)
813 is_same_line_width = FALSE;
816 is_first_object = FALSE;
819 if (is_same_line_width)
821 gl_debug (DEBUG_PROPERTY_BAR, "same line width = %g", selection_line_width);
822 gtk_spin_button_set_value (GTK_SPIN_BUTTON (this->priv->line_width_spin),
823 selection_line_width);
827 gtk_entry_set_text (GTK_ENTRY (this->priv->line_width_spin), "");
833 selection_changed_cb (glUIPropertyBar *this)
835 glView *view = this->priv->view;
837 g_return_if_fail (view && GL_IS_VIEW (view));
838 g_return_if_fail (this && GL_IS_UI_PROPERTY_BAR (this));
840 if (this->priv->stop_signals) return;
841 this->priv->stop_signals = TRUE;
843 gl_debug (DEBUG_PROPERTY_BAR, "START");
845 if (gl_view_is_selection_empty (view))
847 /* No selection: make all controls active. */
848 reset_to_default_properties (view, this);
849 set_doc_items_sensitive (this, TRUE);
853 update_text_properties (view, this);
854 update_fill_color (view, this);
855 update_line_color (view, this);
856 update_line_width (view, this);
859 gl_debug (DEBUG_PROPERTY_BAR, "END");
861 this->priv->stop_signals = FALSE;
865 /*--------------------------------------------------------------------------*/
866 /* PRIVATE. Font family entry changed. */
867 /*--------------------------------------------------------------------------*/
869 font_family_changed_cb (GtkComboBox *combo,
870 glUIPropertyBar *this)
874 if (this->priv->stop_signals) return;
875 this->priv->stop_signals = TRUE;
877 gl_debug (DEBUG_PROPERTY_BAR, "START");
879 font_family = gl_font_combo_get_family (GL_FONT_COMBO (combo));
880 if ( strlen(font_family) )
882 gl_view_set_selection_font_family (this->priv->view,
884 gl_view_set_default_font_family (this->priv->view,
887 g_free (font_family);
889 gl_debug (DEBUG_PROPERTY_BAR, "END");
891 this->priv->stop_signals = FALSE;
895 /*--------------------------------------------------------------------------*/
896 /* PRIVATE. Font size spin button changed. */
897 /*--------------------------------------------------------------------------*/
899 font_size_changed_cb (GtkSpinButton *spin,
900 glUIPropertyBar *this)
904 if (this->priv->stop_signals) return;
905 this->priv->stop_signals = TRUE;
907 gl_debug (DEBUG_PROPERTY_BAR, "START");
909 font_size = gtk_spin_button_get_value (spin);
911 gl_view_set_selection_font_size (this->priv->view,
913 gl_view_set_default_font_size (this->priv->view,
916 gl_debug (DEBUG_PROPERTY_BAR, "END");
918 this->priv->stop_signals = FALSE;
922 /*--------------------------------------------------------------------------*/
923 /* PRIVATE. Text color combo changed. */
924 /*--------------------------------------------------------------------------*/
926 text_color_changed_cb (glColorComboButton *cc,
929 glUIPropertyBar *this)
931 glColorNode *text_color_node;
933 g_return_if_fail (this && GL_IS_UI_PROPERTY_BAR (this));
935 if (this->priv->stop_signals) return;
936 this->priv->stop_signals = TRUE;
938 gl_debug (DEBUG_PROPERTY_BAR, "START");
940 text_color_node = gl_color_node_new_default ();
941 text_color_node->color = color;
943 gl_debug (DEBUG_PROPERTY_BAR, "Color=%08x, Is_default=%d",
948 text_color_node->color = gl_prefs->default_text_color;
949 gl_view_set_selection_text_color (this->priv->view,
951 gl_view_set_default_text_color (this->priv->view,
952 gl_prefs->default_text_color);
956 gl_view_set_selection_text_color (this->priv->view,
958 gl_view_set_default_text_color (this->priv->view,
959 text_color_node->color);
962 gl_color_node_free (&text_color_node);
964 gl_debug (DEBUG_PROPERTY_BAR, "END");
966 this->priv->stop_signals = FALSE;
970 /*--------------------------------------------------------------------------*/
971 /* PRIVATE. Fill color combo changed. */
972 /*--------------------------------------------------------------------------*/
974 fill_color_changed_cb (glColorComboButton *cc,
977 glUIPropertyBar *this)
979 glColorNode *fill_color_node;
981 g_return_if_fail (this && GL_IS_UI_PROPERTY_BAR (this));
983 if (this->priv->stop_signals) return;
984 this->priv->stop_signals = TRUE;
986 gl_debug (DEBUG_PROPERTY_BAR, "START");
988 fill_color_node = gl_color_node_new_default ();
990 fill_color_node->color = color;
992 gl_debug (DEBUG_PROPERTY_BAR, "Color=%08x, Is_default=%d",
998 fill_color_node->color = GL_COLOR_NONE;
999 gl_view_set_selection_fill_color (this->priv->view,
1001 gl_view_set_default_fill_color (this->priv->view,
1002 fill_color_node->color);
1006 gl_view_set_selection_fill_color (this->priv->view,
1008 gl_view_set_default_fill_color (this->priv->view,
1009 fill_color_node->color);
1011 gl_color_node_free (&fill_color_node);
1013 gl_debug (DEBUG_PROPERTY_BAR, "END");
1015 this->priv->stop_signals = FALSE;
1019 /*--------------------------------------------------------------------------*/
1020 /* PRIVATE. Line color combo changed. */
1021 /*--------------------------------------------------------------------------*/
1023 line_color_changed_cb (glColorComboButton *cc,
1025 gboolean is_default,
1026 glUIPropertyBar *this)
1028 glColorNode *line_color_node;
1030 g_return_if_fail (this && GL_IS_UI_PROPERTY_BAR (this));
1032 if (this->priv->stop_signals) return;
1033 this->priv->stop_signals = TRUE;
1035 gl_debug (DEBUG_PROPERTY_BAR, "START");
1037 line_color_node = gl_color_node_new_default ();
1038 line_color_node->color = color;
1040 gl_debug (DEBUG_PROPERTY_BAR, "Color=%08x, Is_default=%d",
1045 line_color_node->color = GL_COLOR_NONE;
1046 gl_view_set_selection_line_color (this->priv->view,
1048 gl_view_set_default_line_color (this->priv->view,
1049 line_color_node->color);
1053 gl_view_set_selection_line_color (this->priv->view,
1055 gl_view_set_default_line_color (this->priv->view,
1056 line_color_node->color);
1058 gl_color_node_free (&line_color_node);
1060 gl_debug (DEBUG_PROPERTY_BAR, "END");
1062 this->priv->stop_signals = FALSE;
1066 /*--------------------------------------------------------------------------*/
1067 /* PRIVATE. Line width spin button changed. */
1068 /*--------------------------------------------------------------------------*/
1070 line_width_changed_cb (GtkSpinButton *spin,
1071 glUIPropertyBar *this)
1075 if (this->priv->stop_signals) return;
1076 this->priv->stop_signals = TRUE;
1078 gl_debug (DEBUG_PROPERTY_BAR, "START");
1080 if (this->priv->view)
1082 line_width = gtk_spin_button_get_value (spin);
1084 gl_view_set_selection_line_width (this->priv->view,
1086 gl_view_set_default_line_width (this->priv->view,
1090 gl_debug (DEBUG_PROPERTY_BAR, "END");
1092 this->priv->stop_signals = FALSE;
1096 /*---------------------------------------------------------------------------*/
1097 /* PRIVATE. Font bold toggled callback. */
1098 /*---------------------------------------------------------------------------*/
1100 font_bold_toggled_cb (GtkToggleToolButton *toggle,
1101 glUIPropertyBar *this)
1107 if (this->priv->stop_signals) return;
1108 this->priv->stop_signals = TRUE;
1110 gl_debug (DEBUG_PROPERTY_BAR, "START");
1112 state = gtk_toggle_tool_button_get_active (toggle);
1114 weight = state ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL;
1116 gl_view_set_selection_font_weight (this->priv->view, weight);
1117 gl_view_set_default_font_weight (this->priv->view, weight);
1119 gl_debug (DEBUG_PROPERTY_BAR, "END");
1121 this->priv->stop_signals = FALSE;
1125 /*---------------------------------------------------------------------------*/
1126 /* PRIVATE. Font italic toggled callback. */
1127 /*---------------------------------------------------------------------------*/
1129 font_italic_toggled_cb (GtkToggleToolButton *toggle,
1130 glUIPropertyBar *this)
1134 if (this->priv->stop_signals) return;
1135 this->priv->stop_signals = TRUE;
1137 gl_debug (DEBUG_PROPERTY_BAR, "START");
1139 state = gtk_toggle_tool_button_get_active (toggle);
1141 gl_view_set_selection_font_italic_flag (this->priv->view, state);
1142 gl_view_set_default_font_italic_flag (this->priv->view, state);
1144 gl_debug (DEBUG_PROPERTY_BAR, "END");
1146 this->priv->stop_signals = FALSE;
1150 /*---------------------------------------------------------------------------*/
1151 /* PRIVATE. Text align toggled callback. */
1152 /*---------------------------------------------------------------------------*/
1154 text_align_toggled_cb (GtkToggleToolButton *toggle,
1155 glUIPropertyBar *this)
1157 if (this->priv->stop_signals) return;
1158 this->priv->stop_signals = TRUE;
1160 gl_debug (DEBUG_PROPERTY_BAR, "START");
1162 if (gtk_toggle_tool_button_get_active (GTK_TOGGLE_TOOL_BUTTON (this->priv->text_align_left_radio)))
1164 gl_view_set_selection_text_alignment (this->priv->view,
1166 gl_view_set_default_text_alignment (this->priv->view,
1170 if (gtk_toggle_tool_button_get_active (GTK_TOGGLE_TOOL_BUTTON (this->priv->text_align_center_radio)))
1172 gl_view_set_selection_text_alignment (this->priv->view,
1173 PANGO_ALIGN_CENTER);
1174 gl_view_set_default_text_alignment (this->priv->view,
1175 PANGO_ALIGN_CENTER);
1178 if (gtk_toggle_tool_button_get_active (GTK_TOGGLE_TOOL_BUTTON (this->priv->text_align_right_radio)))
1180 gl_view_set_selection_text_alignment (this->priv->view,
1182 gl_view_set_default_text_alignment (this->priv->view,
1186 gl_debug (DEBUG_PROPERTY_BAR, "END");
1188 this->priv->stop_signals = FALSE;
1192 /*---------------------------------------------------------------------------*/
1193 /* PRIVATE. Set sensitivity of doc controls. */
1194 /*---------------------------------------------------------------------------*/
1196 set_doc_items_sensitive (glUIPropertyBar *this,
1199 gtk_widget_set_sensitive (this->priv->font_family_combo, state);
1200 gtk_widget_set_sensitive (this->priv->font_size_spin, state);
1201 gtk_widget_set_sensitive (this->priv->font_bold_toggle, state);
1202 gtk_widget_set_sensitive (this->priv->font_italic_toggle, state);
1203 gtk_widget_set_sensitive (this->priv->text_align_left_radio, state);
1204 gtk_widget_set_sensitive (this->priv->text_align_center_radio, state);
1205 gtk_widget_set_sensitive (this->priv->text_align_right_radio, state);
1206 gtk_widget_set_sensitive (this->priv->text_color_button, state);
1207 gtk_widget_set_sensitive (this->priv->fill_color_button, state);
1208 gtk_widget_set_sensitive (this->priv->line_color_button, state);
1209 gtk_widget_set_sensitive (this->priv->line_width_spin, state);
1213 /*---------------------------------------------------------------------------*/
1214 /* PRIVATE. Set sensitivity of text related controls. */
1215 /*---------------------------------------------------------------------------*/
1217 set_text_items_sensitive (glUIPropertyBar *this,
1220 gtk_widget_set_sensitive (this->priv->font_family_combo, state);
1221 gtk_widget_set_sensitive (this->priv->font_size_spin, state);
1222 gtk_widget_set_sensitive (this->priv->font_bold_toggle, state);
1223 gtk_widget_set_sensitive (this->priv->font_italic_toggle, state);
1224 gtk_widget_set_sensitive (this->priv->text_align_left_radio, state);
1225 gtk_widget_set_sensitive (this->priv->text_align_center_radio, state);
1226 gtk_widget_set_sensitive (this->priv->text_align_right_radio, state);
1227 gtk_widget_set_sensitive (this->priv->text_color_button, state);
1231 /*---------------------------------------------------------------------------*/
1232 /* PRIVATE. Set sensitivity of fill related controls. */
1233 /*---------------------------------------------------------------------------*/
1235 set_fill_items_sensitive (glUIPropertyBar *this,
1238 gtk_widget_set_sensitive (this->priv->fill_color_button, state);
1242 /*---------------------------------------------------------------------------*/
1243 /* PRIVATE. Set sensitivity of line color related controls. */
1244 /*---------------------------------------------------------------------------*/
1246 set_line_color_items_sensitive (glUIPropertyBar *this,
1249 gtk_widget_set_sensitive (this->priv->line_color_button, state);
1253 /*---------------------------------------------------------------------------*/
1254 /* PRIVATE. Set sensitivity of line width related controls. */
1255 /*---------------------------------------------------------------------------*/
1257 set_line_width_items_sensitive (glUIPropertyBar *this,
1260 gtk_widget_set_sensitive (this->priv->line_width_spin, state);
1266 * Local Variables: -- emacs
1268 * c-basic-offset: 8 -- emacs
1269 * tab-width: 8 -- emacs
1270 * indent-tabs-mode: nil -- emacs