/* * Copyright (C) 2008 Tristan Van Berkom. * * This library is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * * Authors: * Tristan Van Berkom */ #include #include #include #include #include "glade-label-editor.h" /* GtkWidgetClass */ static void glade_label_editor_grab_focus (GtkWidget *widget); /* GladeEditableIface */ static void glade_label_editor_load (GladeEditable *editable, GladeWidget *widget); static void glade_label_editor_editable_init (GladeEditableIface *iface); /* Callbacks */ static void attributes_toggled (GtkWidget *widget, GladeLabelEditor *label_editor); static void markup_toggled (GtkWidget *widget, GladeLabelEditor *label_editor); static void pattern_toggled (GtkWidget *widget, GladeLabelEditor *label_editor); static void wrap_free_toggled (GtkWidget *widget, GladeLabelEditor *label_editor); static void single_toggled (GtkWidget *widget, GladeLabelEditor *label_editor); static void wrap_mode_toggled (GtkWidget *widget, GladeLabelEditor *label_editor); struct _GladeLabelEditorPrivate { GtkWidget *embed; GtkWidget *attributes_radio; /* Set pango attributes manually (attributes eprop embedded) */ GtkWidget *markup_radio; /* Parse the label as a pango markup string (no showing eprop) */ GtkWidget *pattern_radio; /* Use a pattern string to underline portions of the text * (pattern eprop embedded) */ /* These control whether to use single-line-mode, wrap & wrap-mode or niether */ GtkWidget *wrap_free_label; /* Set boldness on this label for a fake property */ GtkWidget *wrap_free_radio; GtkWidget *single_radio; GtkWidget *wrap_mode_radio; }; static GladeEditableIface *parent_editable_iface; G_DEFINE_TYPE_WITH_CODE (GladeLabelEditor, glade_label_editor, GLADE_TYPE_EDITOR_SKELETON, G_ADD_PRIVATE (GladeLabelEditor) G_IMPLEMENT_INTERFACE (GLADE_TYPE_EDITABLE, glade_label_editor_editable_init)); static void glade_label_editor_class_init (GladeLabelEditorClass * klass) { GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); widget_class->grab_focus = glade_label_editor_grab_focus; gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/gladegtk/glade-label-editor.ui"); gtk_widget_class_bind_template_child_private (widget_class, GladeLabelEditor, embed); gtk_widget_class_bind_template_child_private (widget_class, GladeLabelEditor, attributes_radio); gtk_widget_class_bind_template_child_private (widget_class, GladeLabelEditor, markup_radio); gtk_widget_class_bind_template_child_private (widget_class, GladeLabelEditor, pattern_radio); gtk_widget_class_bind_template_child_private (widget_class, GladeLabelEditor, wrap_free_label); gtk_widget_class_bind_template_child_private (widget_class, GladeLabelEditor, wrap_free_radio); gtk_widget_class_bind_template_child_private (widget_class, GladeLabelEditor, single_radio); gtk_widget_class_bind_template_child_private (widget_class, GladeLabelEditor, wrap_mode_radio); gtk_widget_class_bind_template_callback (widget_class, attributes_toggled); gtk_widget_class_bind_template_callback (widget_class, markup_toggled); gtk_widget_class_bind_template_callback (widget_class, pattern_toggled); gtk_widget_class_bind_template_callback (widget_class, wrap_free_toggled); gtk_widget_class_bind_template_callback (widget_class, single_toggled); gtk_widget_class_bind_template_callback (widget_class, wrap_mode_toggled); } static void glade_label_editor_init (GladeLabelEditor * self) { self->priv = glade_label_editor_get_instance_private (self); gtk_widget_init_template (GTK_WIDGET (self)); } static void glade_label_editor_load (GladeEditable * editable, GladeWidget * widget) { GladeLabelEditor *label_editor = GLADE_LABEL_EDITOR (editable); GladeLabelEditorPrivate *priv = label_editor->priv; /* Chain up to default implementation */ parent_editable_iface->load (editable, widget); if (widget) { GladeLabelContentMode content_mode; GladeLabelWrapMode wrap_mode; static PangoAttrList *italic_attr_list = NULL; gboolean use_max_width; if (!italic_attr_list) { PangoAttribute *attr; italic_attr_list = pango_attr_list_new (); attr = pango_attr_style_new (PANGO_STYLE_ITALIC); pango_attr_list_insert (italic_attr_list, attr); } glade_widget_property_get (widget, "label-content-mode", &content_mode); glade_widget_property_get (widget, "label-wrap-mode", &wrap_mode); glade_widget_property_get (widget, "use-max-width", &use_max_width); switch (content_mode) { case GLADE_LABEL_MODE_ATTRIBUTES: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->attributes_radio), TRUE); break; case GLADE_LABEL_MODE_MARKUP: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->markup_radio), TRUE); break; case GLADE_LABEL_MODE_PATTERN: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->pattern_radio), TRUE); break; default: break; } if (wrap_mode == GLADE_LABEL_WRAP_FREE) gtk_label_set_attributes (GTK_LABEL (priv->wrap_free_label), italic_attr_list); else gtk_label_set_attributes (GTK_LABEL (priv->wrap_free_label), NULL); switch (wrap_mode) { case GLADE_LABEL_WRAP_FREE: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->wrap_free_radio), TRUE); break; case GLADE_LABEL_SINGLE_LINE: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->single_radio), TRUE); break; case GLADE_LABEL_WRAP_MODE: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->wrap_mode_radio), TRUE); break; default: break; } } } static void glade_label_editor_editable_init (GladeEditableIface * iface) { parent_editable_iface = g_type_interface_peek_parent (iface); iface->load = glade_label_editor_load; } static void glade_label_editor_grab_focus (GtkWidget * widget) { GladeLabelEditor *label_editor = GLADE_LABEL_EDITOR (widget); GladeLabelEditorPrivate *priv = label_editor->priv; gtk_widget_grab_focus (priv->embed); } /********************************************************************** label-content-mode radios **********************************************************************/ static void attributes_toggled (GtkWidget * widget, GladeLabelEditor * label_editor) { GladeLabelEditorPrivate *priv = label_editor->priv; GladeProperty *property; GladeWidget *gwidget = glade_editable_loaded_widget (GLADE_EDITABLE (label_editor)); if (glade_editable_loading (GLADE_EDITABLE (label_editor)) || !gwidget) return; if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->attributes_radio))) return; glade_editable_block (GLADE_EDITABLE (label_editor)); glade_command_push_group (_("Setting %s to use an attribute list"), glade_widget_get_name (gwidget)); property = glade_widget_get_property (gwidget, "use-markup"); glade_command_set_property (property, FALSE); property = glade_widget_get_property (gwidget, "pattern"); glade_command_set_property (property, NULL); property = glade_widget_get_property (gwidget, "label-content-mode"); glade_command_set_property (property, GLADE_LABEL_MODE_ATTRIBUTES); glade_command_pop_group (); glade_editable_unblock (GLADE_EDITABLE (label_editor)); /* reload buttons and sensitivity and stuff... */ glade_editable_load (GLADE_EDITABLE (label_editor), gwidget); } static void markup_toggled (GtkWidget * widget, GladeLabelEditor * label_editor) { GladeLabelEditorPrivate *priv = label_editor->priv; GladeProperty *property; GladeWidget *gwidget = glade_editable_loaded_widget (GLADE_EDITABLE (label_editor)); if (glade_editable_loading (GLADE_EDITABLE (label_editor)) || !gwidget) return; if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->markup_radio))) return; glade_editable_block (GLADE_EDITABLE (label_editor)); glade_command_push_group (_("Setting %s to use a Pango markup string"), glade_widget_get_name (gwidget)); property = glade_widget_get_property (gwidget, "pattern"); glade_command_set_property (property, NULL); property = glade_widget_get_property (gwidget, "glade-attributes"); glade_command_set_property (property, NULL); property = glade_widget_get_property (gwidget, "use-markup"); glade_command_set_property (property, TRUE); property = glade_widget_get_property (gwidget, "label-content-mode"); glade_command_set_property (property, GLADE_LABEL_MODE_MARKUP); glade_command_pop_group (); glade_editable_unblock (GLADE_EDITABLE (label_editor)); /* reload buttons and sensitivity and stuff... */ glade_editable_load (GLADE_EDITABLE (label_editor), gwidget); } static void pattern_toggled (GtkWidget * widget, GladeLabelEditor * label_editor) { GladeLabelEditorPrivate *priv = label_editor->priv; GladeProperty *property; GladeWidget *gwidget = glade_editable_loaded_widget (GLADE_EDITABLE (label_editor)); if (glade_editable_loading (GLADE_EDITABLE (label_editor)) || !gwidget) return; if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->pattern_radio))) return; glade_editable_block (GLADE_EDITABLE (label_editor)); glade_command_push_group (_("Setting %s to use a pattern string"), glade_widget_get_name (gwidget)); property = glade_widget_get_property (gwidget, "glade-attributes"); glade_command_set_property (property, NULL); property = glade_widget_get_property (gwidget, "use-markup"); glade_command_set_property (property, FALSE); property = glade_widget_get_property (gwidget, "label-content-mode"); glade_command_set_property (property, GLADE_LABEL_MODE_PATTERN); glade_command_pop_group (); glade_editable_unblock (GLADE_EDITABLE (label_editor)); /* reload buttons and sensitivity and stuff... */ glade_editable_load (GLADE_EDITABLE (label_editor), gwidget); } /********************************************************************** label-wrap-mode radios **********************************************************************/ static void wrap_free_toggled (GtkWidget * widget, GladeLabelEditor * label_editor) { GladeLabelEditorPrivate *priv = label_editor->priv; GladeProperty *property; GladeWidget *gwidget = glade_editable_loaded_widget (GLADE_EDITABLE (label_editor)); if (glade_editable_loading (GLADE_EDITABLE (label_editor)) || !gwidget) return; if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->wrap_free_radio))) return; glade_editable_block (GLADE_EDITABLE (label_editor)); glade_command_push_group (_("Setting %s to use normal line wrapping"), glade_widget_get_name (gwidget)); property = glade_widget_get_property (gwidget, "single-line-mode"); glade_command_set_property (property, FALSE); property = glade_widget_get_property (gwidget, "wrap-mode"); glade_command_set_property (property, PANGO_WRAP_WORD); property = glade_widget_get_property (gwidget, "wrap"); glade_command_set_property (property, FALSE); property = glade_widget_get_property (gwidget, "label-wrap-mode"); glade_command_set_property (property, GLADE_LABEL_WRAP_FREE); glade_command_pop_group (); glade_editable_unblock (GLADE_EDITABLE (label_editor)); /* reload buttons and sensitivity and stuff... */ glade_editable_load (GLADE_EDITABLE (label_editor), gwidget); } static void single_toggled (GtkWidget * widget, GladeLabelEditor * label_editor) { GladeLabelEditorPrivate *priv = label_editor->priv; GladeProperty *property; GladeWidget *gwidget = glade_editable_loaded_widget (GLADE_EDITABLE (label_editor)); if (glade_editable_loading (GLADE_EDITABLE (label_editor)) || !gwidget) return; if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->single_radio))) return; glade_editable_block (GLADE_EDITABLE (label_editor)); glade_command_push_group (_("Setting %s to use a single line"), glade_widget_get_name (gwidget)); property = glade_widget_get_property (gwidget, "wrap-mode"); glade_command_set_property (property, PANGO_WRAP_WORD); property = glade_widget_get_property (gwidget, "wrap"); glade_command_set_property (property, FALSE); property = glade_widget_get_property (gwidget, "single-line-mode"); glade_command_set_property (property, TRUE); property = glade_widget_get_property (gwidget, "label-wrap-mode"); glade_command_set_property (property, GLADE_LABEL_SINGLE_LINE); glade_command_pop_group (); glade_editable_unblock (GLADE_EDITABLE (label_editor)); /* reload buttons and sensitivity and stuff... */ glade_editable_load (GLADE_EDITABLE (label_editor), gwidget); } static void wrap_mode_toggled (GtkWidget * widget, GladeLabelEditor * label_editor) { GladeLabelEditorPrivate *priv = label_editor->priv; GladeProperty *property; GladeWidget *gwidget = glade_editable_loaded_widget (GLADE_EDITABLE (label_editor)); if (glade_editable_loading (GLADE_EDITABLE (label_editor)) || !gwidget) return; if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->wrap_mode_radio))) return; glade_editable_block (GLADE_EDITABLE (label_editor)); glade_command_push_group (_("Setting %s to use specific Pango word wrapping"), glade_widget_get_name (gwidget)); property = glade_widget_get_property (gwidget, "single-line-mode"); glade_command_set_property (property, FALSE); property = glade_widget_get_property (gwidget, "wrap"); glade_command_set_property (property, TRUE); property = glade_widget_get_property (gwidget, "label-wrap-mode"); glade_command_set_property (property, GLADE_LABEL_WRAP_MODE); glade_command_pop_group (); glade_editable_unblock (GLADE_EDITABLE (label_editor)); /* reload buttons and sensitivity and stuff... */ glade_editable_load (GLADE_EDITABLE (label_editor), gwidget); } GtkWidget * glade_label_editor_new (void) { return g_object_new (GLADE_TYPE_LABEL_EDITOR, NULL); }