Blame plugins/gtk+/glade-widget-editor.c

Packit 1e8aac
/*
Packit 1e8aac
 * Copyright (C) 2008 Tristan Van Berkom.
Packit 1e8aac
 *
Packit 1e8aac
 * This library is free software; you can redistribute it and/or modify it
Packit 1e8aac
 * under the terms of the GNU Lesser General Public License as
Packit 1e8aac
 * published by the Free Software Foundation; either version 2.1 of
Packit 1e8aac
 * the License, or (at your option) any later version.
Packit 1e8aac
 *
Packit 1e8aac
 * This library is distributed in the hope that it will be useful, but
Packit 1e8aac
 * WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 1e8aac
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 1e8aac
 * Lesser General Public License for more details.
Packit 1e8aac
 *
Packit 1e8aac
 * You should have received a copy of the GNU Lesser General Public 
Packit 1e8aac
 * License along with this program; if not, write to the Free Software
Packit 1e8aac
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Packit 1e8aac
 *
Packit 1e8aac
 * Authors:
Packit 1e8aac
 *   Tristan Van Berkom <tvb@gnome.org>
Packit 1e8aac
 */
Packit 1e8aac
Packit 1e8aac
#include <config.h>
Packit 1e8aac
#include <gladeui/glade.h>
Packit 1e8aac
#include <glib/gi18n-lib.h>
Packit 1e8aac
#include <gdk/gdkkeysyms.h>
Packit 1e8aac
Packit 1e8aac
#include "glade-widget-editor.h"
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
static void glade_widget_editor_finalize (GObject * object);
Packit 1e8aac
Packit 1e8aac
static void glade_widget_editor_editable_init (GladeEditableIface * iface);
Packit 1e8aac
Packit 1e8aac
static void markup_toggled (GtkWidget * widget, GladeWidgetEditor * widget_editor);
Packit 1e8aac
static void custom_tooltip_toggled (GtkWidget * widget, GladeWidgetEditor * widget_editor);
Packit 1e8aac
Packit 1e8aac
struct _GladeWidgetEditorPrivate
Packit 1e8aac
{
Packit 1e8aac
  GtkWidget *custom_tooltip_check;
Packit 1e8aac
  GtkWidget *tooltip_markup_check;
Packit 1e8aac
  GtkWidget *tooltip_label_notebook;
Packit 1e8aac
  GtkWidget *tooltip_editor_notebook;
Packit 1e8aac
Packit 1e8aac
  /* GtkContainer common properties */
Packit 1e8aac
  GtkWidget *resize_mode_label;
Packit 1e8aac
  GtkWidget *resize_mode_editor;
Packit 1e8aac
  GtkWidget *border_width_label;
Packit 1e8aac
  GtkWidget *border_width_editor;
Packit 1e8aac
};
Packit 1e8aac
Packit 1e8aac
static GladeEditableIface *parent_editable_iface;
Packit 1e8aac
Packit 1e8aac
#define TOOLTIP_TEXT_PAGE   0
Packit 1e8aac
#define TOOLTIP_MARKUP_PAGE 1
Packit 1e8aac
Packit 1e8aac
G_DEFINE_TYPE_WITH_CODE (GladeWidgetEditor, glade_widget_editor, GLADE_TYPE_EDITOR_SKELETON,
Packit 1e8aac
                         G_ADD_PRIVATE (GladeWidgetEditor)
Packit 1e8aac
                         G_IMPLEMENT_INTERFACE (GLADE_TYPE_EDITABLE,
Packit 1e8aac
                                                glade_widget_editor_editable_init));
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_widget_editor_class_init (GladeWidgetEditorClass * klass)
Packit 1e8aac
{
Packit 1e8aac
  GObjectClass *object_class = G_OBJECT_CLASS (klass);
Packit 1e8aac
  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
Packit 1e8aac
Packit 1e8aac
  object_class->finalize = glade_widget_editor_finalize;
Packit 1e8aac
Packit 1e8aac
  gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/gladegtk/glade-widget-editor.ui");
Packit 1e8aac
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeWidgetEditor, custom_tooltip_check);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeWidgetEditor, tooltip_markup_check);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeWidgetEditor, tooltip_label_notebook);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeWidgetEditor, tooltip_editor_notebook);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeWidgetEditor, resize_mode_label);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeWidgetEditor, resize_mode_editor);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeWidgetEditor, border_width_label);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeWidgetEditor, border_width_editor);
Packit 1e8aac
Packit 1e8aac
  gtk_widget_class_bind_template_callback (widget_class, markup_toggled);
Packit 1e8aac
  gtk_widget_class_bind_template_callback (widget_class, custom_tooltip_toggled);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_widget_editor_init (GladeWidgetEditor * self)
Packit 1e8aac
{
Packit 1e8aac
  self->priv = glade_widget_editor_get_instance_private (self);
Packit 1e8aac
Packit 1e8aac
  gtk_widget_init_template (GTK_WIDGET (self));
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_widget_editor_load (GladeEditable * editable, GladeWidget * gwidget)
Packit 1e8aac
{
Packit 1e8aac
  GladeWidgetEditor        *widget_editor = GLADE_WIDGET_EDITOR (editable);
Packit 1e8aac
  GladeWidgetEditorPrivate *priv = widget_editor->priv;
Packit 1e8aac
Packit 1e8aac
  /* Chain up to default implementation */
Packit 1e8aac
  parent_editable_iface->load (editable, gwidget);
Packit 1e8aac
Packit 1e8aac
  if (gwidget)
Packit 1e8aac
    {
Packit 1e8aac
      GtkWidget *widget = (GtkWidget *)glade_widget_get_object (gwidget);
Packit 1e8aac
      gboolean is_container = GTK_IS_CONTAINER (widget);
Packit 1e8aac
      gboolean tooltip_markup = FALSE;
Packit 1e8aac
      gboolean custom_tooltip = FALSE;
Packit 1e8aac
Packit 1e8aac
      glade_widget_property_get (gwidget, "glade-tooltip-markup", &tooltip_markup);
Packit 1e8aac
      glade_widget_property_get (gwidget, "has-tooltip", &custom_tooltip);
Packit 1e8aac
Packit 1e8aac
      gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->tooltip_markup_check), tooltip_markup);
Packit 1e8aac
      gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->tooltip_label_notebook),
Packit 1e8aac
				     tooltip_markup ? TOOLTIP_MARKUP_PAGE : TOOLTIP_TEXT_PAGE);
Packit 1e8aac
      gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->tooltip_editor_notebook),
Packit 1e8aac
				     tooltip_markup ? TOOLTIP_MARKUP_PAGE : TOOLTIP_TEXT_PAGE);
Packit 1e8aac
Packit 1e8aac
      gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->custom_tooltip_check), custom_tooltip);
Packit 1e8aac
      gtk_widget_set_sensitive (priv->tooltip_markup_check, !custom_tooltip);
Packit 1e8aac
      gtk_widget_set_sensitive (priv->tooltip_label_notebook, !custom_tooltip);
Packit 1e8aac
      gtk_widget_set_sensitive (priv->tooltip_editor_notebook, !custom_tooltip);
Packit 1e8aac
Packit 1e8aac
      /* Set visibility of GtkContainer only properties */
Packit 1e8aac
      gtk_widget_set_visible (priv->resize_mode_label,   is_container);
Packit 1e8aac
      gtk_widget_set_visible (priv->resize_mode_editor,  is_container);
Packit 1e8aac
      gtk_widget_set_visible (priv->border_width_label,  is_container);
Packit 1e8aac
      gtk_widget_set_visible (priv->border_width_editor, is_container);
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_widget_editor_editable_init (GladeEditableIface * iface)
Packit 1e8aac
{
Packit 1e8aac
  parent_editable_iface = g_type_interface_peek_parent (iface);
Packit 1e8aac
Packit 1e8aac
  iface->load = glade_widget_editor_load;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_widget_editor_finalize (GObject * object)
Packit 1e8aac
{
Packit 1e8aac
  glade_editable_load (GLADE_EDITABLE (object), NULL);
Packit 1e8aac
Packit 1e8aac
  G_OBJECT_CLASS (glade_widget_editor_parent_class)->finalize (object);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
custom_tooltip_toggled (GtkWidget         *widget,
Packit 1e8aac
			GladeWidgetEditor *widget_editor)
Packit 1e8aac
{
Packit 1e8aac
  GladeProperty *property;
Packit 1e8aac
  GladeWidget *gwidget = glade_editable_loaded_widget (GLADE_EDITABLE (widget_editor));
Packit 1e8aac
  gboolean active;
Packit 1e8aac
Packit 1e8aac
  if (glade_editable_loading (GLADE_EDITABLE (widget_editor)) || !gwidget)
Packit 1e8aac
    return;
Packit 1e8aac
Packit 1e8aac
  active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
Packit 1e8aac
Packit 1e8aac
  glade_editable_block (GLADE_EDITABLE (widget_editor));
Packit 1e8aac
Packit 1e8aac
  if (active)
Packit 1e8aac
    {
Packit 1e8aac
      glade_command_push_group (_("Setting %s to use a custom tooltip"),
Packit 1e8aac
				glade_widget_get_name (gwidget));
Packit 1e8aac
Packit 1e8aac
      /* clear out some things... */
Packit 1e8aac
      property = glade_widget_get_property (gwidget, "tooltip-text");
Packit 1e8aac
      glade_command_set_property (property, NULL);
Packit 1e8aac
Packit 1e8aac
      property = glade_widget_get_property (gwidget, "tooltip-markup");
Packit 1e8aac
      glade_command_set_property (property, NULL);
Packit 1e8aac
Packit 1e8aac
      property = glade_widget_get_property (gwidget, "glade-tooltip-markup");
Packit 1e8aac
      glade_command_set_property (property, FALSE);
Packit 1e8aac
Packit 1e8aac
      property = glade_widget_get_property (gwidget, "has-tooltip");
Packit 1e8aac
      glade_command_set_property (property, TRUE);
Packit 1e8aac
Packit 1e8aac
      glade_command_pop_group ();
Packit 1e8aac
    }
Packit 1e8aac
  else
Packit 1e8aac
    {
Packit 1e8aac
      glade_command_push_group (_("Setting %s to use a custom tooltip"),
Packit 1e8aac
				glade_widget_get_name (gwidget));
Packit 1e8aac
Packit 1e8aac
      /* clear out some things... */
Packit 1e8aac
      property = glade_widget_get_property (gwidget, "tooltip-text");
Packit 1e8aac
      glade_command_set_property (property, NULL);
Packit 1e8aac
Packit 1e8aac
      property = glade_widget_get_property (gwidget, "tooltip-markup");
Packit 1e8aac
      glade_command_set_property (property, NULL);
Packit 1e8aac
Packit 1e8aac
      property = glade_widget_get_property (gwidget, "glade-tooltip-markup");
Packit 1e8aac
      glade_command_set_property (property, FALSE);
Packit 1e8aac
Packit 1e8aac
      property = glade_widget_get_property (gwidget, "has-tooltip");
Packit 1e8aac
      glade_command_set_property (property, FALSE);
Packit 1e8aac
Packit 1e8aac
      glade_command_pop_group ();
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  glade_editable_unblock (GLADE_EDITABLE (widget_editor));
Packit 1e8aac
Packit 1e8aac
  /* reload widgets and sensitivity and stuff... */
Packit 1e8aac
  glade_editable_load (GLADE_EDITABLE (widget_editor), gwidget);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
transfer_text_property (GladeWidget *gwidget,
Packit 1e8aac
			const gchar *from,
Packit 1e8aac
			const gchar *to)
Packit 1e8aac
{
Packit 1e8aac
  gchar *value = NULL;
Packit 1e8aac
  gchar *comment = NULL, *context = NULL;
Packit 1e8aac
  gboolean translatable = FALSE;
Packit 1e8aac
  GladeProperty *prop_from;
Packit 1e8aac
  GladeProperty *prop_to;
Packit 1e8aac
Packit 1e8aac
  prop_from = glade_widget_get_property (gwidget, from);
Packit 1e8aac
  prop_to   = glade_widget_get_property (gwidget, to);
Packit 1e8aac
  g_assert (prop_from);
Packit 1e8aac
  g_assert (prop_to);
Packit 1e8aac
Packit 1e8aac
  glade_property_get (prop_from, &value);
Packit 1e8aac
  comment      = (gchar *)glade_property_i18n_get_comment (prop_from);
Packit 1e8aac
  context      = (gchar *)glade_property_i18n_get_context (prop_from);
Packit 1e8aac
  translatable = glade_property_i18n_get_translatable (prop_from);
Packit 1e8aac
Packit 1e8aac
  /* Get our own copies */
Packit 1e8aac
  value   = g_strdup (value);
Packit 1e8aac
  context = g_strdup (context);
Packit 1e8aac
  comment = g_strdup (comment);
Packit 1e8aac
Packit 1e8aac
  /* Set target values */
Packit 1e8aac
  glade_command_set_property (prop_to, value);
Packit 1e8aac
  glade_command_set_i18n (prop_to, translatable, context, comment);
Packit 1e8aac
Packit 1e8aac
  /* Clear source values */
Packit 1e8aac
  glade_command_set_property (prop_from, NULL);
Packit 1e8aac
  glade_command_set_i18n (prop_from, TRUE, NULL, NULL);
Packit 1e8aac
Packit 1e8aac
  g_free (value);
Packit 1e8aac
  g_free (comment);
Packit 1e8aac
  g_free (context);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
markup_toggled (GtkWidget         *widget,
Packit 1e8aac
		GladeWidgetEditor *widget_editor)
Packit 1e8aac
{
Packit 1e8aac
  GladeProperty *property;
Packit 1e8aac
  GladeWidget *gwidget = glade_editable_loaded_widget (GLADE_EDITABLE (widget_editor));
Packit 1e8aac
  gboolean active;
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
  if (glade_editable_loading (GLADE_EDITABLE (widget_editor)) || !gwidget)
Packit 1e8aac
    return;
Packit 1e8aac
Packit 1e8aac
  active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
Packit 1e8aac
Packit 1e8aac
  glade_editable_block (GLADE_EDITABLE (widget_editor));
Packit 1e8aac
Packit 1e8aac
  if (active)
Packit 1e8aac
    {
Packit 1e8aac
      glade_command_push_group (_("Setting %s to use tooltip markup"),
Packit 1e8aac
				glade_widget_get_name (gwidget));
Packit 1e8aac
Packit 1e8aac
      transfer_text_property (gwidget, "tooltip-text", "tooltip-markup");
Packit 1e8aac
Packit 1e8aac
      property = glade_widget_get_property (gwidget, "glade-tooltip-markup");
Packit 1e8aac
      glade_command_set_property (property, TRUE);
Packit 1e8aac
Packit 1e8aac
      glade_command_pop_group ();
Packit 1e8aac
    }
Packit 1e8aac
  else
Packit 1e8aac
    {
Packit 1e8aac
      glade_command_push_group (_("Setting %s to not use tooltip markup"),
Packit 1e8aac
				glade_widget_get_name (gwidget));
Packit 1e8aac
Packit 1e8aac
      transfer_text_property (gwidget, "tooltip-markup", "tooltip-text");
Packit 1e8aac
Packit 1e8aac
      property = glade_widget_get_property (gwidget, "glade-tooltip-markup");
Packit 1e8aac
      glade_command_set_property (property, FALSE);
Packit 1e8aac
Packit 1e8aac
      glade_command_pop_group ();
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  glade_editable_unblock (GLADE_EDITABLE (widget_editor));
Packit 1e8aac
Packit 1e8aac
  /* reload widgets and sensitivity and stuff... */
Packit 1e8aac
  glade_editable_load (GLADE_EDITABLE (widget_editor), gwidget);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
GtkWidget *
Packit 1e8aac
glade_widget_editor_new (void)
Packit 1e8aac
{
Packit 1e8aac
  return g_object_new (GLADE_TYPE_WIDGET_EDITOR, NULL);
Packit 1e8aac
}