/* * 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-widget-editor.h" static void glade_widget_editor_finalize (GObject * object); static void glade_widget_editor_editable_init (GladeEditableIface * iface); static void markup_toggled (GtkWidget * widget, GladeWidgetEditor * widget_editor); static void custom_tooltip_toggled (GtkWidget * widget, GladeWidgetEditor * widget_editor); struct _GladeWidgetEditorPrivate { GtkWidget *custom_tooltip_check; GtkWidget *tooltip_markup_check; GtkWidget *tooltip_label_notebook; GtkWidget *tooltip_editor_notebook; /* GtkContainer common properties */ GtkWidget *resize_mode_label; GtkWidget *resize_mode_editor; GtkWidget *border_width_label; GtkWidget *border_width_editor; }; static GladeEditableIface *parent_editable_iface; #define TOOLTIP_TEXT_PAGE 0 #define TOOLTIP_MARKUP_PAGE 1 G_DEFINE_TYPE_WITH_CODE (GladeWidgetEditor, glade_widget_editor, GLADE_TYPE_EDITOR_SKELETON, G_ADD_PRIVATE (GladeWidgetEditor) G_IMPLEMENT_INTERFACE (GLADE_TYPE_EDITABLE, glade_widget_editor_editable_init)); static void glade_widget_editor_class_init (GladeWidgetEditorClass * klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); object_class->finalize = glade_widget_editor_finalize; gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/gladegtk/glade-widget-editor.ui"); gtk_widget_class_bind_template_child_private (widget_class, GladeWidgetEditor, custom_tooltip_check); gtk_widget_class_bind_template_child_private (widget_class, GladeWidgetEditor, tooltip_markup_check); gtk_widget_class_bind_template_child_private (widget_class, GladeWidgetEditor, tooltip_label_notebook); gtk_widget_class_bind_template_child_private (widget_class, GladeWidgetEditor, tooltip_editor_notebook); gtk_widget_class_bind_template_child_private (widget_class, GladeWidgetEditor, resize_mode_label); gtk_widget_class_bind_template_child_private (widget_class, GladeWidgetEditor, resize_mode_editor); gtk_widget_class_bind_template_child_private (widget_class, GladeWidgetEditor, border_width_label); gtk_widget_class_bind_template_child_private (widget_class, GladeWidgetEditor, border_width_editor); gtk_widget_class_bind_template_callback (widget_class, markup_toggled); gtk_widget_class_bind_template_callback (widget_class, custom_tooltip_toggled); } static void glade_widget_editor_init (GladeWidgetEditor * self) { self->priv = glade_widget_editor_get_instance_private (self); gtk_widget_init_template (GTK_WIDGET (self)); } static void glade_widget_editor_load (GladeEditable * editable, GladeWidget * gwidget) { GladeWidgetEditor *widget_editor = GLADE_WIDGET_EDITOR (editable); GladeWidgetEditorPrivate *priv = widget_editor->priv; /* Chain up to default implementation */ parent_editable_iface->load (editable, gwidget); if (gwidget) { GtkWidget *widget = (GtkWidget *)glade_widget_get_object (gwidget); gboolean is_container = GTK_IS_CONTAINER (widget); gboolean tooltip_markup = FALSE; gboolean custom_tooltip = FALSE; glade_widget_property_get (gwidget, "glade-tooltip-markup", &tooltip_markup); glade_widget_property_get (gwidget, "has-tooltip", &custom_tooltip); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->tooltip_markup_check), tooltip_markup); gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->tooltip_label_notebook), tooltip_markup ? TOOLTIP_MARKUP_PAGE : TOOLTIP_TEXT_PAGE); gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->tooltip_editor_notebook), tooltip_markup ? TOOLTIP_MARKUP_PAGE : TOOLTIP_TEXT_PAGE); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->custom_tooltip_check), custom_tooltip); gtk_widget_set_sensitive (priv->tooltip_markup_check, !custom_tooltip); gtk_widget_set_sensitive (priv->tooltip_label_notebook, !custom_tooltip); gtk_widget_set_sensitive (priv->tooltip_editor_notebook, !custom_tooltip); /* Set visibility of GtkContainer only properties */ gtk_widget_set_visible (priv->resize_mode_label, is_container); gtk_widget_set_visible (priv->resize_mode_editor, is_container); gtk_widget_set_visible (priv->border_width_label, is_container); gtk_widget_set_visible (priv->border_width_editor, is_container); } } static void glade_widget_editor_editable_init (GladeEditableIface * iface) { parent_editable_iface = g_type_interface_peek_parent (iface); iface->load = glade_widget_editor_load; } static void glade_widget_editor_finalize (GObject * object) { glade_editable_load (GLADE_EDITABLE (object), NULL); G_OBJECT_CLASS (glade_widget_editor_parent_class)->finalize (object); } static void custom_tooltip_toggled (GtkWidget *widget, GladeWidgetEditor *widget_editor) { GladeProperty *property; GladeWidget *gwidget = glade_editable_loaded_widget (GLADE_EDITABLE (widget_editor)); gboolean active; if (glade_editable_loading (GLADE_EDITABLE (widget_editor)) || !gwidget) return; active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)); glade_editable_block (GLADE_EDITABLE (widget_editor)); if (active) { glade_command_push_group (_("Setting %s to use a custom tooltip"), glade_widget_get_name (gwidget)); /* clear out some things... */ property = glade_widget_get_property (gwidget, "tooltip-text"); glade_command_set_property (property, NULL); property = glade_widget_get_property (gwidget, "tooltip-markup"); glade_command_set_property (property, NULL); property = glade_widget_get_property (gwidget, "glade-tooltip-markup"); glade_command_set_property (property, FALSE); property = glade_widget_get_property (gwidget, "has-tooltip"); glade_command_set_property (property, TRUE); glade_command_pop_group (); } else { glade_command_push_group (_("Setting %s to use a custom tooltip"), glade_widget_get_name (gwidget)); /* clear out some things... */ property = glade_widget_get_property (gwidget, "tooltip-text"); glade_command_set_property (property, NULL); property = glade_widget_get_property (gwidget, "tooltip-markup"); glade_command_set_property (property, NULL); property = glade_widget_get_property (gwidget, "glade-tooltip-markup"); glade_command_set_property (property, FALSE); property = glade_widget_get_property (gwidget, "has-tooltip"); glade_command_set_property (property, FALSE); glade_command_pop_group (); } glade_editable_unblock (GLADE_EDITABLE (widget_editor)); /* reload widgets and sensitivity and stuff... */ glade_editable_load (GLADE_EDITABLE (widget_editor), gwidget); } static void transfer_text_property (GladeWidget *gwidget, const gchar *from, const gchar *to) { gchar *value = NULL; gchar *comment = NULL, *context = NULL; gboolean translatable = FALSE; GladeProperty *prop_from; GladeProperty *prop_to; prop_from = glade_widget_get_property (gwidget, from); prop_to = glade_widget_get_property (gwidget, to); g_assert (prop_from); g_assert (prop_to); glade_property_get (prop_from, &value); comment = (gchar *)glade_property_i18n_get_comment (prop_from); context = (gchar *)glade_property_i18n_get_context (prop_from); translatable = glade_property_i18n_get_translatable (prop_from); /* Get our own copies */ value = g_strdup (value); context = g_strdup (context); comment = g_strdup (comment); /* Set target values */ glade_command_set_property (prop_to, value); glade_command_set_i18n (prop_to, translatable, context, comment); /* Clear source values */ glade_command_set_property (prop_from, NULL); glade_command_set_i18n (prop_from, TRUE, NULL, NULL); g_free (value); g_free (comment); g_free (context); } static void markup_toggled (GtkWidget *widget, GladeWidgetEditor *widget_editor) { GladeProperty *property; GladeWidget *gwidget = glade_editable_loaded_widget (GLADE_EDITABLE (widget_editor)); gboolean active; if (glade_editable_loading (GLADE_EDITABLE (widget_editor)) || !gwidget) return; active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)); glade_editable_block (GLADE_EDITABLE (widget_editor)); if (active) { glade_command_push_group (_("Setting %s to use tooltip markup"), glade_widget_get_name (gwidget)); transfer_text_property (gwidget, "tooltip-text", "tooltip-markup"); property = glade_widget_get_property (gwidget, "glade-tooltip-markup"); glade_command_set_property (property, TRUE); glade_command_pop_group (); } else { glade_command_push_group (_("Setting %s to not use tooltip markup"), glade_widget_get_name (gwidget)); transfer_text_property (gwidget, "tooltip-markup", "tooltip-text"); property = glade_widget_get_property (gwidget, "glade-tooltip-markup"); glade_command_set_property (property, FALSE); glade_command_pop_group (); } glade_editable_unblock (GLADE_EDITABLE (widget_editor)); /* reload widgets and sensitivity and stuff... */ glade_editable_load (GLADE_EDITABLE (widget_editor), gwidget); } GtkWidget * glade_widget_editor_new (void) { return g_object_new (GLADE_TYPE_WIDGET_EDITOR, NULL); }