Blame plugins/gtk+/glade-gtk-button.c

Packit 1e8aac
/*
Packit 1e8aac
 * glade-gtk-button.c - GladeWidgetAdaptor for GtkButton classes
Packit 1e8aac
 *
Packit 1e8aac
 * Copyright (C) 2013 Tristan Van Berkom
Packit 1e8aac
 *
Packit 1e8aac
 * Authors:
Packit 1e8aac
 *      Tristan Van Berkom <tristan.van.berkom@gmail.com>
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
Packit 1e8aac
#include <config.h>
Packit 1e8aac
#include <glib/gi18n-lib.h>
Packit 1e8aac
#include <gladeui/glade.h>
Packit 1e8aac
Packit 1e8aac
#include "glade-button-editor.h"
Packit 1e8aac
#include "glade-scale-button-editor.h"
Packit 1e8aac
#include "glade-font-button-editor.h"
Packit 1e8aac
#include "glade-eprop-enum-int.h"
Packit 1e8aac
#include "glade-gtk.h"
Packit 1e8aac
#include "glade-gtk-button.h"
Packit 1e8aac
Packit 1e8aac
/* ----------------------------- GtkFontButton ------------------------------ */
Packit 1e8aac
Packit 1e8aac
/* Use the font-buttons launch dialog to actually set the font-name
Packit 1e8aac
 * glade property through the glade-command api.
Packit 1e8aac
 */
Packit 1e8aac
static void
Packit 1e8aac
glade_gtk_font_button_refresh_font_name (GtkFontButton * button,
Packit 1e8aac
                                         GladeWidget * gbutton)
Packit 1e8aac
{
Packit 1e8aac
  GladeProperty *property;
Packit 1e8aac
Packit 1e8aac
  if ((property = glade_widget_get_property (gbutton, "font-name")) != NULL)
Packit 1e8aac
    glade_command_set_property (property,
Packit 1e8aac
                                gtk_font_button_get_font_name (button));
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
/* ----------------------------- GtkColorButton ------------------------------ */
Packit 1e8aac
static void
Packit 1e8aac
glade_gtk_color_button_refresh_color (GtkColorButton * button,
Packit 1e8aac
                                      GladeWidget * gbutton)
Packit 1e8aac
{
Packit 1e8aac
  GladeProperty *property;
Packit 1e8aac
  GdkRGBA rgba = { 0, };
Packit 1e8aac
Packit 1e8aac
  gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (button), &rgba);
Packit 1e8aac
Packit 1e8aac
  if ((property = glade_widget_get_property (gbutton, "color")) != NULL)
Packit 1e8aac
    {
Packit 1e8aac
      if (glade_property_get_enabled (property))
Packit 1e8aac
	{
Packit 1e8aac
	  GdkColor color = { 0, };
Packit 1e8aac
Packit 1e8aac
	  color.red   = (gint16) (rgba.red * 65535);
Packit 1e8aac
	  color.green = (gint16) (rgba.green * 65535);
Packit 1e8aac
	  color.blue  = (gint16) (rgba.blue * 65535);
Packit 1e8aac
Packit 1e8aac
	  glade_command_set_property (property, &color;;
Packit 1e8aac
	}
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  if ((property = glade_widget_get_property (gbutton, "rgba")) != NULL)
Packit 1e8aac
    {
Packit 1e8aac
      if (glade_property_get_enabled (property))
Packit 1e8aac
	glade_command_set_property (property, &rgba);
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
void
Packit 1e8aac
glade_gtk_color_button_set_property (GladeWidgetAdaptor * adaptor,
Packit 1e8aac
                                     GObject * object,
Packit 1e8aac
                                     const gchar * id, const GValue * value)
Packit 1e8aac
{
Packit 1e8aac
  GladeProperty *property;
Packit 1e8aac
  GladeWidget *gwidget = glade_widget_get_from_gobject (object);
Packit 1e8aac
Packit 1e8aac
  if (!strcmp (id, "color"))
Packit 1e8aac
    {
Packit 1e8aac
      if ((property = glade_widget_get_property (gwidget, "color")) != NULL &&
Packit 1e8aac
	  glade_property_get_enabled (property) && g_value_get_boxed (value))
Packit 1e8aac
	{
Packit 1e8aac
	  GdkColor *color = g_value_get_boxed (value);
Packit 1e8aac
	  GdkRGBA copy;
Packit 1e8aac
Packit 1e8aac
	  copy.red   = color->red   / 65535.0;
Packit 1e8aac
	  copy.green = color->green / 65535.0;
Packit 1e8aac
	  copy.blue  = color->blue  / 65535.0;
Packit 1e8aac
	  copy.alpha = 1.0;
Packit 1e8aac
Packit 1e8aac
	  gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (object), ©);
Packit 1e8aac
	}
Packit 1e8aac
    }
Packit 1e8aac
  else if (!strcmp (id, "rgba"))
Packit 1e8aac
    {
Packit 1e8aac
      if ((property = glade_widget_get_property (gwidget, "rgba")) != NULL &&
Packit 1e8aac
	  glade_property_get_enabled (property) && g_value_get_boxed (value))
Packit 1e8aac
	gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (object),
Packit 1e8aac
				    (GdkRGBA *) g_value_get_boxed (value));
Packit 1e8aac
    }
Packit 1e8aac
  else
Packit 1e8aac
    GWA_GET_CLASS (GTK_TYPE_BUTTON)->set_property (adaptor, object, id, value);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
/* ----------------------------- GtkButton ------------------------------ */
Packit 1e8aac
GladeEditable *
Packit 1e8aac
glade_gtk_button_create_editable (GladeWidgetAdaptor * adaptor,
Packit 1e8aac
                                  GladeEditorPageType type)
Packit 1e8aac
{
Packit 1e8aac
  if (type == GLADE_PAGE_GENERAL)
Packit 1e8aac
    {
Packit 1e8aac
      GType type = glade_widget_adaptor_get_object_type (adaptor);
Packit 1e8aac
Packit 1e8aac
      if (g_type_is_a (type, GTK_TYPE_FONT_BUTTON))
Packit 1e8aac
	return (GladeEditable *) glade_font_button_editor_new ();
Packit 1e8aac
      else if (g_type_is_a (type, GTK_TYPE_SCALE_BUTTON))
Packit 1e8aac
	return (GladeEditable *) glade_scale_button_editor_new ();
Packit 1e8aac
      else if (!g_type_is_a (type, GTK_TYPE_LOCK_BUTTON))
Packit 1e8aac
	return (GladeEditable *) glade_button_editor_new ();
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  return GWA_GET_CLASS (GTK_TYPE_CONTAINER)->create_editable (adaptor, type);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_gtk_button_update_stock (GladeWidget *widget)
Packit 1e8aac
{
Packit 1e8aac
  gboolean use_stock;
Packit 1e8aac
  gchar *label = NULL;
Packit 1e8aac
  
Packit 1e8aac
  /* Update the stock property */
Packit 1e8aac
  glade_widget_property_get (widget, "use-stock", &use_stock);
Packit 1e8aac
  if (use_stock)
Packit 1e8aac
    {
Packit 1e8aac
      glade_widget_property_get (widget, "label", &label);
Packit 1e8aac
      glade_widget_property_set (widget, "stock", label);
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
void
Packit 1e8aac
glade_gtk_button_post_create (GladeWidgetAdaptor * adaptor,
Packit 1e8aac
                              GObject * button, GladeCreateReason reason)
Packit 1e8aac
{
Packit 1e8aac
  GladeWidget *gbutton = glade_widget_get_from_gobject (button);
Packit 1e8aac
Packit 1e8aac
  g_return_if_fail (GTK_IS_BUTTON (button));
Packit 1e8aac
  g_return_if_fail (GLADE_IS_WIDGET (gbutton));
Packit 1e8aac
Packit 1e8aac
  if (GTK_IS_FONT_BUTTON (button))
Packit 1e8aac
    g_signal_connect
Packit 1e8aac
        (button, "font-set",
Packit 1e8aac
         G_CALLBACK (glade_gtk_font_button_refresh_font_name), gbutton);
Packit 1e8aac
  else if (GTK_IS_COLOR_BUTTON (button))
Packit 1e8aac
    g_signal_connect
Packit 1e8aac
        (button, "color-set",
Packit 1e8aac
         G_CALLBACK (glade_gtk_color_button_refresh_color), gbutton);
Packit 1e8aac
  else if (GTK_IS_LOCK_BUTTON (button))
Packit 1e8aac
    {
Packit 1e8aac
      /* Gtk <= 3.12 crash if you click on a LockButton without a permission set */
Packit 1e8aac
      gtk_lock_button_set_permission (GTK_LOCK_BUTTON (button),
Packit 1e8aac
                                      g_simple_permission_new (TRUE));
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  /* Disabled response-id until its in an action area */
Packit 1e8aac
  glade_widget_property_set_sensitive (gbutton, "response-id", FALSE,
Packit 1e8aac
                                       RESPID_INSENSITIVE_MSG);
Packit 1e8aac
Packit 1e8aac
  if (reason == GLADE_CREATE_USER)
Packit 1e8aac
    glade_gtk_button_update_stock (gbutton);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
static inline gboolean
Packit 1e8aac
glade_gtk_lock_button_is_own_property (GladeProperty *property)
Packit 1e8aac
{
Packit 1e8aac
  GladePropertyClass *klass = glade_property_get_class (property);
Packit 1e8aac
  GParamSpec *spec = glade_property_class_get_pspec (klass);
Packit 1e8aac
  return (spec->owner_type == GTK_TYPE_LOCK_BUTTON);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
void
Packit 1e8aac
glade_gtk_button_set_property (GladeWidgetAdaptor * adaptor,
Packit 1e8aac
                               GObject * object,
Packit 1e8aac
                               const gchar * id, const GValue * value)
Packit 1e8aac
{
Packit 1e8aac
  GladeWidget *widget = glade_widget_get_from_gobject (object);
Packit 1e8aac
  GladeProperty *property = glade_widget_get_property (widget, id);
Packit 1e8aac
    
Packit 1e8aac
  if (strcmp (id, "custom-child") == 0)
Packit 1e8aac
    {
Packit 1e8aac
      GtkWidget *child = gtk_bin_get_child (GTK_BIN (object));
Packit 1e8aac
      gboolean custom_child = g_value_get_boolean (value);
Packit 1e8aac
Packit 1e8aac
      /* Avoid removing a child if we already have a custom child */
Packit 1e8aac
      if (custom_child && (child && glade_widget_get_from_gobject (child)))
Packit 1e8aac
        return;
Packit 1e8aac
Packit 1e8aac
      if (custom_child)
Packit 1e8aac
        {
Packit 1e8aac
          if (child)
Packit 1e8aac
            gtk_container_remove (GTK_CONTAINER (object), child);
Packit 1e8aac
Packit 1e8aac
          gtk_container_add (GTK_CONTAINER (object), glade_placeholder_new ());
Packit 1e8aac
        }
Packit 1e8aac
      else if (child && GLADE_IS_PLACEHOLDER (child))
Packit 1e8aac
        gtk_container_remove (GTK_CONTAINER (object), child);
Packit 1e8aac
    }
Packit 1e8aac
  else if (strcmp (id, "stock") == 0)
Packit 1e8aac
    {
Packit 1e8aac
      gboolean use_stock = FALSE;
Packit 1e8aac
      glade_widget_property_get (widget, "use-stock", &use_stock);
Packit 1e8aac
Packit 1e8aac
      if (use_stock)
Packit 1e8aac
        gtk_button_set_label (GTK_BUTTON (object), g_value_get_string (value));
Packit 1e8aac
    }
Packit 1e8aac
  else if (strcmp (id, "use-stock") == 0)
Packit 1e8aac
    {
Packit 1e8aac
      /* I guess its my bug in GTK+, we need to resync the appearance property
Packit 1e8aac
       * on GtkButton when the GtkButton:use-stock property changes.
Packit 1e8aac
       */
Packit 1e8aac
      GWA_GET_CLASS (GTK_TYPE_CONTAINER)->set_property (adaptor, object,
Packit 1e8aac
                                                        id, value);
Packit 1e8aac
      glade_gtk_sync_use_appearance (widget);
Packit 1e8aac
    }
Packit 1e8aac
  else if (GPC_VERSION_CHECK (glade_property_get_class (property), gtk_major_version, gtk_minor_version + 1))
Packit 1e8aac
    GWA_GET_CLASS (GTK_TYPE_CONTAINER)->set_property (adaptor, object, id, value);
Packit 1e8aac
Packit 1e8aac
  /* GtkLockButton hides itself after setting a property so we need to make sure
Packit 1e8aac
   * we keep it visible.
Packit 1e8aac
   */
Packit 1e8aac
  if (GTK_IS_LOCK_BUTTON (object) && glade_gtk_lock_button_is_own_property (property))
Packit 1e8aac
    gtk_widget_set_visible (GTK_WIDGET (object), TRUE);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
void
Packit 1e8aac
glade_gtk_button_read_widget (GladeWidgetAdaptor * adaptor,
Packit 1e8aac
                              GladeWidget * widget, GladeXmlNode * node)
Packit 1e8aac
{
Packit 1e8aac
  GObject *object;
Packit 1e8aac
Packit 1e8aac
  if (!(glade_xml_node_verify_silent (node, GLADE_XML_TAG_WIDGET) ||
Packit 1e8aac
	glade_xml_node_verify_silent (node, GLADE_XML_TAG_TEMPLATE)))
Packit 1e8aac
    return;
Packit 1e8aac
Packit 1e8aac
  /* First chain up and read in all the normal properties.. */
Packit 1e8aac
  GWA_GET_CLASS (GTK_TYPE_CONTAINER)->read_widget (adaptor, widget, node);
Packit 1e8aac
Packit 1e8aac
  glade_gtk_button_update_stock (widget);
Packit 1e8aac
Packit 1e8aac
  /* Fold "font-name" property into the "font" propery */
Packit 1e8aac
  object = glade_widget_get_object (widget);
Packit 1e8aac
  if (GTK_IS_FONT_BUTTON (object))
Packit 1e8aac
    {
Packit 1e8aac
      gchar *font_prop_value = NULL;
Packit 1e8aac
Packit 1e8aac
      glade_widget_property_get (widget, "font-name", &font_prop_value);
Packit 1e8aac
Packit 1e8aac
      if (font_prop_value != NULL)
Packit 1e8aac
	{
Packit 1e8aac
	  glade_widget_property_set (widget, "font", font_prop_value);
Packit 1e8aac
	  glade_widget_property_set (widget, "font-name", NULL);
Packit 1e8aac
	}
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
void
Packit 1e8aac
glade_gtk_button_write_widget (GladeWidgetAdaptor * adaptor,
Packit 1e8aac
                               GladeWidget * widget,
Packit 1e8aac
                               GladeXmlContext * context, GladeXmlNode * node)
Packit 1e8aac
{
Packit 1e8aac
  GladeProperty *prop;
Packit 1e8aac
  gboolean use_stock;
Packit 1e8aac
  gchar *stock = NULL;
Packit 1e8aac
  GObject *object;
Packit 1e8aac
Packit 1e8aac
  if (!(glade_xml_node_verify_silent (node, GLADE_XML_TAG_WIDGET) ||
Packit 1e8aac
	glade_xml_node_verify_silent (node, GLADE_XML_TAG_TEMPLATE)))
Packit 1e8aac
    return;
Packit 1e8aac
Packit 1e8aac
  object = glade_widget_get_object (widget);
Packit 1e8aac
Packit 1e8aac
  /* Do not save GtkColorButton GtkFontButton GtkLockButton and GtkScaleButton 
Packit 1e8aac
   * label property
Packit 1e8aac
   */
Packit 1e8aac
  if (!(GTK_IS_COLOR_BUTTON (object) || GTK_IS_FONT_BUTTON (object) ||
Packit 1e8aac
        GTK_IS_LOCK_BUTTON (object)  || GTK_IS_SCALE_BUTTON (object)))
Packit 1e8aac
    {
Packit 1e8aac
      /* Make a copy of the GladeProperty, 
Packit 1e8aac
       * override its value and ensure non-translatable if use-stock is TRUE
Packit 1e8aac
       */
Packit 1e8aac
      prop = glade_widget_get_property (widget, "label");
Packit 1e8aac
      prop = glade_property_dup (prop, widget);
Packit 1e8aac
      glade_widget_property_get (widget, "use-stock", &use_stock);
Packit 1e8aac
      if (use_stock)
Packit 1e8aac
        {
Packit 1e8aac
          glade_widget_property_get (widget, "stock", &stock);
Packit 1e8aac
          glade_property_i18n_set_translatable (prop, FALSE);
Packit 1e8aac
          glade_property_set (prop, stock);
Packit 1e8aac
        }
Packit 1e8aac
      glade_property_write (prop, context, node);
Packit 1e8aac
      g_object_unref (G_OBJECT (prop));
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  /* Write out other normal properties and any other class derived custom properties after ... */
Packit 1e8aac
  GWA_GET_CLASS (GTK_TYPE_CONTAINER)->write_widget (adaptor, widget, context,
Packit 1e8aac
                                                    node);
Packit 1e8aac
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
GladeEditorProperty *
Packit 1e8aac
glade_gtk_button_create_eprop (GladeWidgetAdaptor * adaptor,
Packit 1e8aac
				       GladePropertyClass * klass, 
Packit 1e8aac
				       gboolean use_command)
Packit 1e8aac
{
Packit 1e8aac
  GladeEditorProperty *eprop;
Packit 1e8aac
Packit 1e8aac
  if (strcmp (glade_property_class_id(klass), "response-id")==0)
Packit 1e8aac
    {
Packit 1e8aac
      eprop = glade_eprop_enum_int_new (klass, GTK_TYPE_RESPONSE_TYPE, use_command);
Packit 1e8aac
    }
Packit 1e8aac
  else
Packit 1e8aac
    eprop = GWA_GET_CLASS
Packit 1e8aac
        (GTK_TYPE_WIDGET)->create_eprop (adaptor, klass, use_command);
Packit 1e8aac
Packit 1e8aac
  return eprop;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
/* Shared with other classes */
Packit 1e8aac
void 
Packit 1e8aac
glade_gtk_sync_use_appearance (GladeWidget *gwidget)
Packit 1e8aac
{
Packit 1e8aac
  GladeProperty *prop;
Packit 1e8aac
  gboolean       use_appearance;
Packit 1e8aac
Packit 1e8aac
  /* This is the kind of thing we avoid doing at project load time ;-) */
Packit 1e8aac
  if (glade_widget_superuser ())
Packit 1e8aac
    return;
Packit 1e8aac
Packit 1e8aac
  prop = glade_widget_get_property (gwidget, "use-action-appearance");
Packit 1e8aac
  use_appearance = FALSE;
Packit 1e8aac
  
Packit 1e8aac
  glade_property_get (prop, &use_appearance);
Packit 1e8aac
  if (use_appearance)
Packit 1e8aac
    {
Packit 1e8aac
      glade_property_set (prop, FALSE);
Packit 1e8aac
      glade_property_set (prop, TRUE);
Packit 1e8aac
    }
Packit 1e8aac
}