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>
29 #include "builder-util.h"
30 #include "font-combo.h"
31 #include "color-combo-button.h"
32 #include "stock-pixmaps/stockpixbufs.h"
39 /*===========================================================================*/
40 /* Private macros and constants. */
41 /*===========================================================================*/
44 /*===========================================================================*/
45 /* Private data types */
46 /*===========================================================================*/
48 struct _glUIPropertyBarPrivate {
57 GtkWidget *font_family_eventbox;
58 GtkWidget *font_family_combo;
59 GtkWidget *font_size_spin;
60 GtkWidget *font_bold_toggle;
61 GtkWidget *font_italic_toggle;
63 /* Text alignemnt radios */
64 GtkWidget *text_align_left_radio;
65 GtkWidget *text_align_center_radio;
66 GtkWidget *text_align_right_radio;
69 GtkWidget *text_color_eventbox;
70 GtkWidget *text_color_button;
71 GtkWidget *fill_color_eventbox;
72 GtkWidget *fill_color_button;
73 GtkWidget *line_color_eventbox;
74 GtkWidget *line_color_button;
77 GtkWidget *line_width_spin;
79 /* Prevent recursion */
80 gboolean stop_signals;
84 /*===========================================================================*/
86 /*===========================================================================*/
89 /*===========================================================================*/
90 /* Local function prototypes */
91 /*===========================================================================*/
93 static void gl_ui_property_bar_finalize (GObject *object);
95 static void gl_ui_property_bar_construct (glUIPropertyBar *this);
97 static void selection_changed_cb (glUIPropertyBar *this);
99 static void font_family_changed_cb (GtkComboBox *combo,
100 glUIPropertyBar *this);
102 static void font_size_changed_cb (GtkSpinButton *spin,
103 glUIPropertyBar *this);
105 static void text_color_changed_cb (glColorComboButton *cc,
108 glUIPropertyBar *this);
110 static void fill_color_changed_cb (glColorComboButton *cc,
113 glUIPropertyBar *this);
115 static void line_color_changed_cb (glColorComboButton *cc,
118 glUIPropertyBar *this);
120 static void line_width_changed_cb (GtkSpinButton *spin,
121 glUIPropertyBar *this);
123 static void font_bold_toggled_cb (GtkToggleToolButton *toggle,
124 glUIPropertyBar *this);
126 static void font_italic_toggled_cb (GtkToggleToolButton *toggle,
127 glUIPropertyBar *this);
129 static void text_align_toggled_cb (GtkToggleToolButton *toggle,
130 glUIPropertyBar *this);
132 static void set_doc_items_sensitive (glUIPropertyBar *this,
135 static void set_text_items_sensitive (glUIPropertyBar *this,
138 static void set_fill_items_sensitive (glUIPropertyBar *this,
141 static void set_line_color_items_sensitive (glUIPropertyBar *this,
144 static void set_line_width_items_sensitive (glUIPropertyBar *this,
148 /****************************************************************************/
149 /* Boilerplate Object stuff. */
150 /****************************************************************************/
151 G_DEFINE_TYPE (glUIPropertyBar, gl_ui_property_bar, GTK_TYPE_HBOX);
155 gl_ui_property_bar_class_init (glUIPropertyBarClass *class)
157 GObjectClass *object_class = G_OBJECT_CLASS (class);
159 gl_debug (DEBUG_PROPERTY_BAR, "START");
161 gl_ui_property_bar_parent_class = g_type_class_peek_parent (class);
163 object_class->finalize = gl_ui_property_bar_finalize;
165 gl_debug (DEBUG_PROPERTY_BAR, "END");
170 gl_ui_property_bar_init (glUIPropertyBar *this)
172 gl_debug (DEBUG_PROPERTY_BAR, "START");
174 this->priv = g_new0 (glUIPropertyBarPrivate, 1);
176 gl_debug (DEBUG_PROPERTY_BAR, "END");
181 gl_ui_property_bar_finalize (GObject *object)
183 glUIPropertyBar *this = GL_UI_PROPERTY_BAR (object);
185 gl_debug (DEBUG_PROPERTY_BAR, "START");
187 g_return_if_fail (object != NULL);
188 g_return_if_fail (GL_IS_UI_PROPERTY_BAR (object));
190 if (this->priv->view)
192 g_object_unref (G_OBJECT(this->priv->view));
194 if (this->priv->builder)
196 g_object_unref (G_OBJECT(this->priv->builder));
200 G_OBJECT_CLASS (gl_ui_property_bar_parent_class)->finalize (object);
202 gl_debug (DEBUG_PROPERTY_BAR, "END");
206 /****************************************************************************/
207 /* Create a NEW property_bar. */
208 /****************************************************************************/
210 gl_ui_property_bar_new (void)
212 glUIPropertyBar *this;
214 gl_debug (DEBUG_PROPERTY_BAR, "START");
216 this = g_object_new (GL_TYPE_UI_PROPERTY_BAR, NULL);
218 gl_ui_property_bar_construct (this);
220 gl_debug (DEBUG_PROPERTY_BAR, "END");
222 return GTK_WIDGET (this);
226 /******************************************************************************/
227 /* Initialize property toolbar. */
228 /******************************************************************************/
230 gl_ui_property_bar_construct (glUIPropertyBar *this)
233 static gchar *object_ids[] = { "property_toolbar",
234 "adjustment1", "adjustment2",
236 GError *error = NULL;
237 GdkPixbuf *pixbuf = NULL;
239 gl_debug (DEBUG_PROPERTY_BAR, "START");
241 this->priv->stop_signals = TRUE;
243 builder = gtk_builder_new ();
244 gtk_builder_add_objects_from_file (builder,
245 GLABELS_BUILDER_DIR "property-bar.builder",
249 g_critical ("%s\n\ngLabels may not be installed correctly!", error->message);
250 g_error_free (error);
254 gl_builder_util_get_widgets (builder,
255 "property_toolbar", &this->priv->tool_bar,
256 "font_family_eventbox", &this->priv->font_family_eventbox,
257 "font_size_spin", &this->priv->font_size_spin,
258 "font_bold_toggle", &this->priv->font_bold_toggle,
259 "font_italic_toggle", &this->priv->font_italic_toggle,
260 "text_align_left_radio", &this->priv->text_align_left_radio,
261 "text_align_center_radio", &this->priv->text_align_center_radio,
262 "text_align_right_radio", &this->priv->text_align_right_radio,
263 "text_color_eventbox", &this->priv->text_color_eventbox,
264 "fill_color_eventbox", &this->priv->fill_color_eventbox,
265 "line_color_eventbox", &this->priv->line_color_eventbox,
266 "line_width_spin", &this->priv->line_width_spin,
269 gtk_container_add (GTK_CONTAINER (this), this->priv->tool_bar);
271 this->priv->font_family_combo =
272 gl_font_combo_new (gl_prefs_model_get_default_font_family (gl_prefs));
273 gtk_container_add (GTK_CONTAINER (this->priv->font_family_eventbox),
274 this->priv->font_family_combo);
276 pixbuf = gdk_pixbuf_new_from_inline (-1, stock_text_24, FALSE, NULL);
277 this->priv->text_color_button =
278 gl_color_combo_button_new (pixbuf,
280 GL_COLOR_TEXT_DEFAULT,
281 gl_prefs_model_get_default_text_color (gl_prefs));
282 gl_color_combo_button_set_relief (GL_COLOR_COMBO_BUTTON(this->priv->text_color_button),
284 g_object_unref (G_OBJECT (pixbuf));
285 gtk_container_add (GTK_CONTAINER (this->priv->text_color_eventbox),
286 this->priv->text_color_button);
288 pixbuf = gdk_pixbuf_new_from_inline (-1, stock_bucket_fill_24, FALSE, NULL);
289 this->priv->fill_color_button =
290 gl_color_combo_button_new (pixbuf,
293 gl_prefs_model_get_default_fill_color (gl_prefs));
294 gl_color_combo_button_set_relief (GL_COLOR_COMBO_BUTTON(this->priv->fill_color_button),
296 g_object_unref (G_OBJECT (pixbuf));
297 gtk_container_add (GTK_CONTAINER (this->priv->fill_color_eventbox),
298 this->priv->fill_color_button);
300 pixbuf = gdk_pixbuf_new_from_inline (-1, stock_pencil_24, FALSE, NULL);
301 this->priv->line_color_button =
302 gl_color_combo_button_new (pixbuf,
305 gl_prefs_model_get_default_line_color (gl_prefs));
306 gl_color_combo_button_set_relief (GL_COLOR_COMBO_BUTTON(this->priv->line_color_button),
308 g_object_unref (G_OBJECT (pixbuf));
309 gtk_container_add (GTK_CONTAINER (this->priv->line_color_eventbox),
310 this->priv->line_color_button);
312 /* Save reference to gui tree so we don't lose tooltips */
313 this->priv->builder = builder;
315 set_doc_items_sensitive (this, FALSE);
317 /* Font family entry widget */
318 g_signal_connect (G_OBJECT (this->priv->font_family_combo),
319 "changed", G_CALLBACK (font_family_changed_cb), this);
321 /* Font size entry widget */
322 gtk_spin_button_set_value (GTK_SPIN_BUTTON(this->priv->font_size_spin),
323 gl_prefs_model_get_default_font_size (gl_prefs));
325 g_signal_connect (G_OBJECT (this->priv->font_size_spin),
326 "changed", G_CALLBACK (font_size_changed_cb), this);
329 /* Bold and Italic toggles */
330 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (this->priv->font_bold_toggle),
331 (gl_prefs_model_get_default_font_weight (gl_prefs) == PANGO_WEIGHT_BOLD));
332 g_signal_connect (G_OBJECT (this->priv->font_bold_toggle),
333 "toggled", G_CALLBACK (font_bold_toggled_cb), this);
334 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (this->priv->font_italic_toggle),
335 gl_prefs_model_get_default_font_italic_flag (gl_prefs));
336 g_signal_connect (G_OBJECT (this->priv->font_italic_toggle),
337 "toggled", G_CALLBACK (font_italic_toggled_cb), this);
340 /* Text alignment radio group */
341 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (this->priv->text_align_left_radio),
342 (gl_prefs_model_get_default_text_alignment (gl_prefs) == PANGO_ALIGN_LEFT));
343 g_signal_connect (G_OBJECT (this->priv->text_align_left_radio),
344 "toggled", G_CALLBACK (text_align_toggled_cb), this);
345 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (this->priv->text_align_center_radio),
346 (gl_prefs_model_get_default_text_alignment (gl_prefs) == PANGO_ALIGN_CENTER));
347 g_signal_connect (G_OBJECT (this->priv->text_align_center_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_right_radio),
350 (gl_prefs_model_get_default_text_alignment (gl_prefs) == PANGO_ALIGN_RIGHT));
351 g_signal_connect (G_OBJECT (this->priv->text_align_right_radio),
352 "toggled", G_CALLBACK (text_align_toggled_cb), this);
354 /* Text color widget */
355 gl_color_combo_button_set_color (GL_COLOR_COMBO_BUTTON (this->priv->text_color_button),
356 gl_prefs_model_get_default_text_color (gl_prefs));
357 g_signal_connect (G_OBJECT (this->priv->text_color_button),
359 G_CALLBACK (text_color_changed_cb), this);
361 /* Fill color widget */
362 gl_color_combo_button_set_color (GL_COLOR_COMBO_BUTTON (this->priv->fill_color_button),
363 gl_prefs_model_get_default_fill_color (gl_prefs));
364 g_signal_connect (G_OBJECT (this->priv->fill_color_button),
366 G_CALLBACK (fill_color_changed_cb), this);
368 /* Line color widget */
369 gl_color_combo_button_set_color (GL_COLOR_COMBO_BUTTON (this->priv->line_color_button),
370 gl_prefs_model_get_default_line_color (gl_prefs));
371 g_signal_connect (G_OBJECT (this->priv->line_color_button),
373 G_CALLBACK (line_color_changed_cb), this);
375 /* Line width entry widget */
376 g_signal_connect (G_OBJECT (this->priv->line_width_spin),
378 G_CALLBACK (line_width_changed_cb), this);
380 this->priv->stop_signals = FALSE;
382 gl_debug (DEBUG_PROPERTY_BAR, "END");
386 /****************************************************************************/
387 /* Fill widgets with default values. */
388 /****************************************************************************/
390 reset_to_default_properties (glView *view,
391 glUIPropertyBar *this)
394 gl_font_combo_set_family (GL_FONT_COMBO (this->priv->font_family_combo),
395 view->default_font_family);
397 gtk_spin_button_set_value (GTK_SPIN_BUTTON(this->priv->font_size_spin),
398 view->default_font_size);
400 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (this->priv->font_bold_toggle),
401 (view->default_font_weight == PANGO_WEIGHT_BOLD));
402 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (this->priv->font_italic_toggle),
403 view->default_font_italic_flag);
405 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (this->priv->text_align_left_radio),
406 (view->default_text_alignment == PANGO_ALIGN_LEFT));
407 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (this->priv->text_align_center_radio),
408 (view->default_text_alignment == PANGO_ALIGN_CENTER));
409 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (this->priv->text_align_right_radio),
410 (view->default_text_alignment == PANGO_ALIGN_RIGHT));
412 gl_color_combo_button_set_color (GL_COLOR_COMBO_BUTTON(this->priv->text_color_button),
413 view->default_text_color);
415 gl_color_combo_button_set_color (GL_COLOR_COMBO_BUTTON(this->priv->fill_color_button),
416 view->default_fill_color);
418 gl_color_combo_button_set_color (GL_COLOR_COMBO_BUTTON(this->priv->line_color_button),
419 view->default_line_color);
421 gtk_spin_button_set_value (GTK_SPIN_BUTTON(this->priv->line_width_spin),
422 view->default_line_width);
426 /****************************************************************************/
427 /* Set view associated with property_bar. */
428 /****************************************************************************/
430 gl_ui_property_bar_set_view (glUIPropertyBar *this,
435 gl_debug (DEBUG_PROPERTY_BAR, "START");
437 g_return_if_fail (view && GL_IS_VIEW (view));
439 g_return_if_fail (label && GL_IS_LABEL (label));
441 set_doc_items_sensitive (this, TRUE);
443 this->priv->view = GL_VIEW (g_object_ref (G_OBJECT (view)));
445 reset_to_default_properties (view, this);
447 g_signal_connect_swapped (G_OBJECT(view), "selection_changed",
448 G_CALLBACK(selection_changed_cb), this);
450 g_signal_connect_swapped (G_OBJECT(view->label), "changed",
451 G_CALLBACK(selection_changed_cb), this);
453 gl_debug (DEBUG_PROPERTY_BAR, "END");
457 /*---------------------------------------------------------------------------*/
458 /* PRIVATE. View "selection state changed" callback. */
459 /*---------------------------------------------------------------------------*/
461 update_text_properties (glView *view,
462 glUIPropertyBar *this)
464 gboolean can_text, is_first_object;
465 gboolean is_same_font_family, is_same_font_size;
466 gboolean is_same_text_color, is_same_is_italic;
467 gboolean is_same_is_bold, is_same_align;
469 glLabelObject *object;
470 gchar *selection_font_family, *font_family;
471 gdouble selection_font_size, font_size;
472 guint selection_text_color, text_color;
473 glColorNode *text_color_node;
474 gboolean selection_is_italic, is_italic;
475 gboolean selection_is_bold, is_bold;
476 PangoAlignment selection_align, align;
478 can_text = gl_view_can_selection_text (view);
479 set_text_items_sensitive (this, can_text);
489 is_same_font_family = TRUE;
490 selection_font_family = NULL;
491 selection_font_size = -1;
492 selection_align = PANGO_ALIGN_LEFT;
493 selection_is_italic = TRUE;
494 selection_is_bold = TRUE;
495 selection_text_color = 0;
497 is_first_object = TRUE;
499 for (p = view->selected_object_list; p != NULL; p = p->next)
502 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
503 if (!gl_label_object_can_text (object))
506 font_family = gl_label_object_get_font_family (object);
507 if (font_family != NULL)
509 if (selection_font_family == NULL)
511 selection_font_family = g_strdup (font_family);
515 if (strcmp (font_family, selection_font_family) != 0)
517 is_same_font_family = FALSE;
520 g_free (font_family);
523 font_size = gl_label_object_get_font_size (object);
525 text_color_node = gl_label_object_get_text_color (object);
526 if (text_color_node->field_flag)
528 /* If a merge field is set we use the default color for merged color*/
529 text_color = GL_COLOR_MERGE_DEFAULT;
534 text_color = text_color_node->color;
536 gl_color_node_free (&text_color_node);
538 is_italic = gl_label_object_get_font_italic_flag (object);
539 is_bold = gl_label_object_get_font_weight (object) == PANGO_WEIGHT_BOLD;
540 align = gl_label_object_get_text_alignment (object);
544 selection_font_size = font_size;
545 selection_text_color = text_color;
546 selection_is_italic = is_italic;
547 selection_is_bold = is_bold;
548 selection_align = align;
552 if (font_size != selection_font_size)
553 is_same_font_size = FALSE;
554 if (text_color != selection_text_color)
555 is_same_text_color = FALSE;
556 if (is_italic != selection_is_italic)
557 is_same_is_italic = FALSE;
558 if (is_bold != selection_is_bold)
559 is_same_is_bold = FALSE;
560 if (align != selection_align)
561 is_same_align = FALSE;
563 is_first_object = FALSE;
566 if (is_same_font_family && (selection_font_family != NULL))
567 gl_debug (DEBUG_PROPERTY_BAR, "same font family = %s",
568 selection_font_family);
569 gl_font_combo_set_family (GL_FONT_COMBO (this->priv->font_family_combo),
570 is_same_font_family?selection_font_family:"");
571 g_free (selection_font_family);
573 if (is_same_font_size)
575 gl_debug (DEBUG_PROPERTY_BAR, "same font size = %g",
576 selection_font_size);
577 gtk_spin_button_set_value (GTK_SPIN_BUTTON (this->priv->font_size_spin),
578 selection_font_size);
582 gtk_entry_set_text (GTK_ENTRY (this->priv->font_size_spin), "");
585 if (is_same_text_color)
587 gl_debug (DEBUG_PROPERTY_BAR, "same text color = %08x", selection_text_color);
588 gl_color_combo_button_set_color (GL_COLOR_COMBO_BUTTON (this->priv->text_color_button),
589 selection_text_color);
592 if (is_same_is_italic)
594 gl_debug (DEBUG_PROPERTY_BAR, "same italic flag = %d",
595 selection_is_italic);
597 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (this->priv->font_italic_toggle),
598 selection_is_italic && is_same_is_italic);
602 gl_debug (DEBUG_PROPERTY_BAR, "same bold flag = %d",
605 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (this->priv->font_bold_toggle),
606 selection_is_bold && is_same_is_bold);
609 gl_debug (DEBUG_PROPERTY_BAR, "same align");
610 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (this->priv->text_align_left_radio),
611 (selection_align == PANGO_ALIGN_LEFT) &&
613 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (this->priv->text_align_center_radio),
614 (selection_align == PANGO_ALIGN_CENTER) &&
616 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (this->priv->text_align_right_radio),
617 (selection_align == PANGO_ALIGN_RIGHT) &&
623 update_fill_color (glView *view,
624 glUIPropertyBar *this)
626 gboolean can, is_first_object;
627 gboolean is_same_fill_color;
629 glLabelObject *object;
630 guint selection_fill_color, fill_color;
631 glColorNode *fill_color_node;
633 can = gl_view_can_selection_fill (view);
634 set_fill_items_sensitive (this, can);
639 is_same_fill_color = TRUE;
640 is_first_object = TRUE;
641 selection_fill_color = 0;
643 for (p = view->selected_object_list; p != NULL; p = p->next)
646 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
647 if (!gl_label_object_can_fill (object))
650 fill_color_node = gl_label_object_get_fill_color (object);
651 if (fill_color_node->field_flag)
653 /* If a merge field is set we use the default color for merged color*/
654 fill_color = GL_COLOR_FILL_MERGE_DEFAULT;
659 fill_color = fill_color_node->color;
661 gl_color_node_free (&fill_color_node);
665 selection_fill_color = fill_color;
669 if (fill_color != selection_fill_color)
671 is_same_fill_color = FALSE;
674 is_first_object = FALSE;
677 if (is_same_fill_color)
679 gl_debug (DEBUG_PROPERTY_BAR, "same fill color = %08x", selection_fill_color);
680 gl_color_combo_button_set_color (GL_COLOR_COMBO_BUTTON (this->priv->fill_color_button),
681 selection_fill_color);
687 update_line_color (glView *view,
688 glUIPropertyBar *this)
690 gboolean can, is_first_object;
691 gboolean is_same_line_color;
693 glLabelObject *object;
694 guint selection_line_color, line_color;
695 glColorNode *line_color_node;
697 can = gl_view_can_selection_line_color (view);
698 set_line_color_items_sensitive (this, can);
703 is_same_line_color = TRUE;
704 is_first_object = TRUE;
705 selection_line_color = 0;
707 for (p = view->selected_object_list; p != NULL; p = p->next)
710 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
711 if (!gl_label_object_can_line_color (object))
714 line_color_node = gl_label_object_get_line_color (object);
715 if (line_color_node->field_flag)
717 /* If a merge field is set we use the default color for merged color*/
718 line_color = GL_COLOR_MERGE_DEFAULT;
723 line_color = line_color_node->color;
725 gl_color_node_free (&line_color_node);
729 selection_line_color = line_color;
733 if (line_color != selection_line_color)
735 is_same_line_color = FALSE;
738 is_first_object = FALSE;
741 if (is_same_line_color)
743 gl_debug (DEBUG_PROPERTY_BAR, "same line color = %08x", selection_line_color);
744 gl_color_combo_button_set_color (GL_COLOR_COMBO_BUTTON (this->priv->line_color_button),
745 selection_line_color);
751 update_line_width (glView *view,
752 glUIPropertyBar *this)
754 gboolean can, is_first_object;
755 gboolean is_same_line_width;
757 glLabelObject *object;
758 gdouble selection_line_width, line_width;
760 can = gl_view_can_selection_line_width (view);
761 set_line_width_items_sensitive (this, can);
766 is_same_line_width = TRUE;
767 is_first_object = TRUE;
768 selection_line_width = 0;
770 for (p = view->selected_object_list; p != NULL; p = p->next)
773 object = gl_view_object_get_object(GL_VIEW_OBJECT (p->data));
774 if (!gl_label_object_can_line_width (object))
777 line_width = gl_label_object_get_line_width (object);
781 selection_line_width = line_width;
785 if (line_width != selection_line_width)
787 is_same_line_width = FALSE;
790 is_first_object = FALSE;
793 if (is_same_line_width)
795 gl_debug (DEBUG_PROPERTY_BAR, "same line width = %g", selection_line_width);
796 gtk_spin_button_set_value (GTK_SPIN_BUTTON (this->priv->line_width_spin),
797 selection_line_width);
801 gtk_entry_set_text (GTK_ENTRY (this->priv->line_width_spin), "");
807 selection_changed_cb (glUIPropertyBar *this)
809 glView *view = this->priv->view;
811 g_return_if_fail (view && GL_IS_VIEW (view));
812 g_return_if_fail (this && GL_IS_UI_PROPERTY_BAR (this));
814 if (this->priv->stop_signals) return;
815 this->priv->stop_signals = TRUE;
817 gl_debug (DEBUG_PROPERTY_BAR, "START");
819 if (gl_view_is_selection_empty (view))
821 /* No selection: make all controls active. */
822 reset_to_default_properties (view, this);
823 set_doc_items_sensitive (this, TRUE);
827 update_text_properties (view, this);
828 update_fill_color (view, this);
829 update_line_color (view, this);
830 update_line_width (view, this);
833 gl_debug (DEBUG_PROPERTY_BAR, "END");
835 this->priv->stop_signals = FALSE;
839 /*--------------------------------------------------------------------------*/
840 /* PRIVATE. Font family entry changed. */
841 /*--------------------------------------------------------------------------*/
843 font_family_changed_cb (GtkComboBox *combo,
844 glUIPropertyBar *this)
848 if (this->priv->stop_signals) return;
849 this->priv->stop_signals = TRUE;
851 gl_debug (DEBUG_PROPERTY_BAR, "START");
853 font_family = gl_font_combo_get_family (GL_FONT_COMBO (combo));
854 if ( strlen(font_family) )
856 gl_view_set_selection_font_family (this->priv->view,
858 gl_view_set_default_font_family (this->priv->view,
861 g_free (font_family);
863 gl_debug (DEBUG_PROPERTY_BAR, "END");
865 this->priv->stop_signals = FALSE;
869 /*--------------------------------------------------------------------------*/
870 /* PRIVATE. Font size spin button changed. */
871 /*--------------------------------------------------------------------------*/
873 font_size_changed_cb (GtkSpinButton *spin,
874 glUIPropertyBar *this)
878 if (this->priv->stop_signals) return;
879 this->priv->stop_signals = TRUE;
881 gl_debug (DEBUG_PROPERTY_BAR, "START");
883 font_size = gtk_spin_button_get_value (spin);
885 gl_view_set_selection_font_size (this->priv->view,
887 gl_view_set_default_font_size (this->priv->view,
890 gl_debug (DEBUG_PROPERTY_BAR, "END");
892 this->priv->stop_signals = FALSE;
896 /*--------------------------------------------------------------------------*/
897 /* PRIVATE. Text color combo changed. */
898 /*--------------------------------------------------------------------------*/
900 text_color_changed_cb (glColorComboButton *cc,
903 glUIPropertyBar *this)
905 glColorNode *text_color_node;
907 g_return_if_fail (this && GL_IS_UI_PROPERTY_BAR (this));
909 if (this->priv->stop_signals) return;
910 this->priv->stop_signals = TRUE;
912 gl_debug (DEBUG_PROPERTY_BAR, "START");
914 text_color_node = gl_color_node_new_default ();
915 text_color_node->color = color;
917 gl_debug (DEBUG_PROPERTY_BAR, "Color=%08x, Is_default=%d",
922 text_color_node->color = gl_prefs_model_get_default_text_color (gl_prefs);
923 gl_view_set_selection_text_color (this->priv->view,
925 gl_view_set_default_text_color (this->priv->view,
926 text_color_node->color);
930 gl_view_set_selection_text_color (this->priv->view,
932 gl_view_set_default_text_color (this->priv->view,
933 text_color_node->color);
936 gl_color_node_free (&text_color_node);
938 gl_debug (DEBUG_PROPERTY_BAR, "END");
940 this->priv->stop_signals = FALSE;
944 /*--------------------------------------------------------------------------*/
945 /* PRIVATE. Fill color combo changed. */
946 /*--------------------------------------------------------------------------*/
948 fill_color_changed_cb (glColorComboButton *cc,
951 glUIPropertyBar *this)
953 glColorNode *fill_color_node;
955 g_return_if_fail (this && GL_IS_UI_PROPERTY_BAR (this));
957 if (this->priv->stop_signals) return;
958 this->priv->stop_signals = TRUE;
960 gl_debug (DEBUG_PROPERTY_BAR, "START");
962 fill_color_node = gl_color_node_new_default ();
964 fill_color_node->color = color;
966 gl_debug (DEBUG_PROPERTY_BAR, "Color=%08x, Is_default=%d",
972 fill_color_node->color = GL_COLOR_NONE;
973 gl_view_set_selection_fill_color (this->priv->view,
975 gl_view_set_default_fill_color (this->priv->view,
976 fill_color_node->color);
980 gl_view_set_selection_fill_color (this->priv->view,
982 gl_view_set_default_fill_color (this->priv->view,
983 fill_color_node->color);
985 gl_color_node_free (&fill_color_node);
987 gl_debug (DEBUG_PROPERTY_BAR, "END");
989 this->priv->stop_signals = FALSE;
993 /*--------------------------------------------------------------------------*/
994 /* PRIVATE. Line color combo changed. */
995 /*--------------------------------------------------------------------------*/
997 line_color_changed_cb (glColorComboButton *cc,
1000 glUIPropertyBar *this)
1002 glColorNode *line_color_node;
1004 g_return_if_fail (this && GL_IS_UI_PROPERTY_BAR (this));
1006 if (this->priv->stop_signals) return;
1007 this->priv->stop_signals = TRUE;
1009 gl_debug (DEBUG_PROPERTY_BAR, "START");
1011 line_color_node = gl_color_node_new_default ();
1012 line_color_node->color = color;
1014 gl_debug (DEBUG_PROPERTY_BAR, "Color=%08x, Is_default=%d",
1019 line_color_node->color = GL_COLOR_NONE;
1020 gl_view_set_selection_line_color (this->priv->view,
1022 gl_view_set_default_line_color (this->priv->view,
1023 line_color_node->color);
1027 gl_view_set_selection_line_color (this->priv->view,
1029 gl_view_set_default_line_color (this->priv->view,
1030 line_color_node->color);
1032 gl_color_node_free (&line_color_node);
1034 gl_debug (DEBUG_PROPERTY_BAR, "END");
1036 this->priv->stop_signals = FALSE;
1040 /*--------------------------------------------------------------------------*/
1041 /* PRIVATE. Line width spin button changed. */
1042 /*--------------------------------------------------------------------------*/
1044 line_width_changed_cb (GtkSpinButton *spin,
1045 glUIPropertyBar *this)
1049 if (this->priv->stop_signals) return;
1050 this->priv->stop_signals = TRUE;
1052 gl_debug (DEBUG_PROPERTY_BAR, "START");
1054 if (this->priv->view)
1056 line_width = gtk_spin_button_get_value (spin);
1058 gl_view_set_selection_line_width (this->priv->view,
1060 gl_view_set_default_line_width (this->priv->view,
1064 gl_debug (DEBUG_PROPERTY_BAR, "END");
1066 this->priv->stop_signals = FALSE;
1070 /*---------------------------------------------------------------------------*/
1071 /* PRIVATE. Font bold toggled callback. */
1072 /*---------------------------------------------------------------------------*/
1074 font_bold_toggled_cb (GtkToggleToolButton *toggle,
1075 glUIPropertyBar *this)
1081 if (this->priv->stop_signals) return;
1082 this->priv->stop_signals = TRUE;
1084 gl_debug (DEBUG_PROPERTY_BAR, "START");
1086 state = gtk_toggle_tool_button_get_active (toggle);
1088 weight = state ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL;
1090 gl_view_set_selection_font_weight (this->priv->view, weight);
1091 gl_view_set_default_font_weight (this->priv->view, weight);
1093 gl_debug (DEBUG_PROPERTY_BAR, "END");
1095 this->priv->stop_signals = FALSE;
1099 /*---------------------------------------------------------------------------*/
1100 /* PRIVATE. Font italic toggled callback. */
1101 /*---------------------------------------------------------------------------*/
1103 font_italic_toggled_cb (GtkToggleToolButton *toggle,
1104 glUIPropertyBar *this)
1108 if (this->priv->stop_signals) return;
1109 this->priv->stop_signals = TRUE;
1111 gl_debug (DEBUG_PROPERTY_BAR, "START");
1113 state = gtk_toggle_tool_button_get_active (toggle);
1115 gl_view_set_selection_font_italic_flag (this->priv->view, state);
1116 gl_view_set_default_font_italic_flag (this->priv->view, state);
1118 gl_debug (DEBUG_PROPERTY_BAR, "END");
1120 this->priv->stop_signals = FALSE;
1124 /*---------------------------------------------------------------------------*/
1125 /* PRIVATE. Text align toggled callback. */
1126 /*---------------------------------------------------------------------------*/
1128 text_align_toggled_cb (GtkToggleToolButton *toggle,
1129 glUIPropertyBar *this)
1131 if (this->priv->stop_signals) return;
1132 this->priv->stop_signals = TRUE;
1134 gl_debug (DEBUG_PROPERTY_BAR, "START");
1136 if (gtk_toggle_tool_button_get_active (GTK_TOGGLE_TOOL_BUTTON (this->priv->text_align_left_radio)))
1138 gl_view_set_selection_text_alignment (this->priv->view,
1140 gl_view_set_default_text_alignment (this->priv->view,
1144 if (gtk_toggle_tool_button_get_active (GTK_TOGGLE_TOOL_BUTTON (this->priv->text_align_center_radio)))
1146 gl_view_set_selection_text_alignment (this->priv->view,
1147 PANGO_ALIGN_CENTER);
1148 gl_view_set_default_text_alignment (this->priv->view,
1149 PANGO_ALIGN_CENTER);
1152 if (gtk_toggle_tool_button_get_active (GTK_TOGGLE_TOOL_BUTTON (this->priv->text_align_right_radio)))
1154 gl_view_set_selection_text_alignment (this->priv->view,
1156 gl_view_set_default_text_alignment (this->priv->view,
1160 gl_debug (DEBUG_PROPERTY_BAR, "END");
1162 this->priv->stop_signals = FALSE;
1166 /*---------------------------------------------------------------------------*/
1167 /* PRIVATE. Set sensitivity of doc controls. */
1168 /*---------------------------------------------------------------------------*/
1170 set_doc_items_sensitive (glUIPropertyBar *this,
1173 gtk_widget_set_sensitive (this->priv->font_family_combo, state);
1174 gtk_widget_set_sensitive (this->priv->font_size_spin, state);
1175 gtk_widget_set_sensitive (this->priv->font_bold_toggle, state);
1176 gtk_widget_set_sensitive (this->priv->font_italic_toggle, state);
1177 gtk_widget_set_sensitive (this->priv->text_align_left_radio, state);
1178 gtk_widget_set_sensitive (this->priv->text_align_center_radio, state);
1179 gtk_widget_set_sensitive (this->priv->text_align_right_radio, state);
1180 gtk_widget_set_sensitive (this->priv->text_color_button, state);
1181 gtk_widget_set_sensitive (this->priv->fill_color_button, state);
1182 gtk_widget_set_sensitive (this->priv->line_color_button, state);
1183 gtk_widget_set_sensitive (this->priv->line_width_spin, state);
1187 /*---------------------------------------------------------------------------*/
1188 /* PRIVATE. Set sensitivity of text related controls. */
1189 /*---------------------------------------------------------------------------*/
1191 set_text_items_sensitive (glUIPropertyBar *this,
1194 gtk_widget_set_sensitive (this->priv->font_family_combo, state);
1195 gtk_widget_set_sensitive (this->priv->font_size_spin, state);
1196 gtk_widget_set_sensitive (this->priv->font_bold_toggle, state);
1197 gtk_widget_set_sensitive (this->priv->font_italic_toggle, state);
1198 gtk_widget_set_sensitive (this->priv->text_align_left_radio, state);
1199 gtk_widget_set_sensitive (this->priv->text_align_center_radio, state);
1200 gtk_widget_set_sensitive (this->priv->text_align_right_radio, state);
1201 gtk_widget_set_sensitive (this->priv->text_color_button, state);
1205 /*---------------------------------------------------------------------------*/
1206 /* PRIVATE. Set sensitivity of fill related controls. */
1207 /*---------------------------------------------------------------------------*/
1209 set_fill_items_sensitive (glUIPropertyBar *this,
1212 gtk_widget_set_sensitive (this->priv->fill_color_button, state);
1216 /*---------------------------------------------------------------------------*/
1217 /* PRIVATE. Set sensitivity of line color related controls. */
1218 /*---------------------------------------------------------------------------*/
1220 set_line_color_items_sensitive (glUIPropertyBar *this,
1223 gtk_widget_set_sensitive (this->priv->line_color_button, state);
1227 /*---------------------------------------------------------------------------*/
1228 /* PRIVATE. Set sensitivity of line width related controls. */
1229 /*---------------------------------------------------------------------------*/
1231 set_line_width_items_sensitive (glUIPropertyBar *this,
1234 gtk_widget_set_sensitive (this->priv->line_width_spin, state);
1240 * Local Variables: -- emacs
1242 * c-basic-offset: 8 -- emacs
1243 * tab-width: 8 -- emacs
1244 * indent-tabs-mode: nil -- emacs