|
Packit |
1e8aac |
/*
|
|
Packit |
1e8aac |
* Copyright (C) 2001 Ximian, Inc.
|
|
Packit |
1e8aac |
* Copyright (C) 2006 The GNOME Foundation.
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* This program is free software; you can redistribute it and/or modify
|
|
Packit |
1e8aac |
* it under the terms of the GNU General Public License as
|
|
Packit |
1e8aac |
* published by the Free Software Foundation; either version 2 of the
|
|
Packit |
1e8aac |
* License, or (at your option) any later version.
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* This program is distributed in the hope that it will be useful,
|
|
Packit |
1e8aac |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
1e8aac |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit |
1e8aac |
* GNU General Public License for more details.
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* You should have received a copy of the GNU General Public License
|
|
Packit |
1e8aac |
* 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 |
* Chema Celorio <chema@celorio.com>
|
|
Packit |
1e8aac |
* Tristan Van Berkom <tvb@gnome.org>
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
#ifdef HAVE_CONFIG_H
|
|
Packit |
1e8aac |
#include <config.h>
|
|
Packit |
1e8aac |
#endif
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* SECTION:glade-property
|
|
Packit |
1e8aac |
* @Title: GladeProperty
|
|
Packit |
1e8aac |
* @Short_Description: An interface to properties on the #GladeWidget.
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Every object property of every #GladeWidget in every #GladeProject has
|
|
Packit |
1e8aac |
* a #GladeProperty to interface with, #GladeProperty provides a means
|
|
Packit |
1e8aac |
* to handle properties in the runtime environment.
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* A #GladeProperty can be seen as an instance of a #GladePropertyClass,
|
|
Packit |
1e8aac |
* the #GladePropertyClass describes how a #GladeProperty will function.
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
#include <stdio.h>
|
|
Packit |
1e8aac |
#include <stdlib.h> /* for atoi and atof */
|
|
Packit |
1e8aac |
#include <string.h>
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
#include <glib/gi18n-lib.h>
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
#include "glade.h"
|
|
Packit |
1e8aac |
#include "glade-widget.h"
|
|
Packit |
1e8aac |
#include "glade-property.h"
|
|
Packit |
1e8aac |
#include "glade-property-class.h"
|
|
Packit |
1e8aac |
#include "glade-project.h"
|
|
Packit |
1e8aac |
#include "glade-widget-adaptor.h"
|
|
Packit |
1e8aac |
#include "glade-debug.h"
|
|
Packit |
1e8aac |
#include "glade-app.h"
|
|
Packit |
1e8aac |
#include "glade-editor.h"
|
|
Packit |
1e8aac |
#include "glade-marshallers.h"
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
struct _GladePropertyPrivate {
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GladePropertyClass *klass; /* A pointer to the GladeProperty that this
|
|
Packit |
1e8aac |
* setting specifies
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
GladeWidget *widget; /* A pointer to the GladeWidget that this
|
|
Packit |
1e8aac |
* GladeProperty is modifying
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GladePropertyState state; /* Current property state, used by editing widgets.
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GValue *value; /* The value of the property
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gchar *insensitive_tooltip; /* Tooltip to display when in insensitive state
|
|
Packit |
1e8aac |
* (used to explain why the property is
|
|
Packit |
1e8aac |
* insensitive)
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gchar *support_warning; /* Tooltip to display when the property
|
|
Packit |
1e8aac |
* has format problems
|
|
Packit |
1e8aac |
* (used to explain why the property is
|
|
Packit |
1e8aac |
* insensitive)
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
guint support_disabled : 1; /* Whether this property is disabled due
|
|
Packit |
1e8aac |
* to format conflicts
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
guint sensitive : 1; /* Whether this property is sensitive (if the
|
|
Packit |
1e8aac |
* property is "optional" this takes precedence).
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
guint enabled : 1; /* Enabled is a flag that is used for GladeProperties
|
|
Packit |
1e8aac |
* that have the optional flag set to let us know
|
|
Packit |
1e8aac |
* if this widget has this setting enabled or
|
|
Packit |
1e8aac |
* not. (Like default size, it can be specified or
|
|
Packit |
1e8aac |
* unspecified). This flag also sets the state
|
|
Packit |
1e8aac |
* of the property->input state for the loaded
|
|
Packit |
1e8aac |
* widget.
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
guint save_always : 1; /* Used to make a special case exception and always
|
|
Packit |
1e8aac |
* save this property regardless of what the default
|
|
Packit |
1e8aac |
* value is (used for some special cases like properties
|
|
Packit |
1e8aac |
* that are assigned initial values in composite widgets
|
|
Packit |
1e8aac |
* or derived widget code).
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Used only for translatable strings. */
|
|
Packit |
1e8aac |
guint i18n_translatable : 1;
|
|
Packit |
1e8aac |
gchar *i18n_context;
|
|
Packit |
1e8aac |
gchar *i18n_comment;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gint syncing; /* Avoid recursion while synchronizing object with value */
|
|
Packit |
1e8aac |
gint sync_tolerance;
|
|
Packit |
1e8aac |
};
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
enum
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
VALUE_CHANGED,
|
|
Packit |
1e8aac |
TOOLTIP_CHANGED,
|
|
Packit |
1e8aac |
LAST_SIGNAL
|
|
Packit |
1e8aac |
};
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
enum
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
PROP_0,
|
|
Packit |
1e8aac |
PROP_CLASS,
|
|
Packit |
1e8aac |
PROP_ENABLED,
|
|
Packit |
1e8aac |
PROP_SENSITIVE,
|
|
Packit |
1e8aac |
PROP_I18N_TRANSLATABLE,
|
|
Packit |
1e8aac |
PROP_I18N_CONTEXT,
|
|
Packit |
1e8aac |
PROP_I18N_COMMENT,
|
|
Packit |
1e8aac |
PROP_STATE,
|
|
Packit |
1e8aac |
N_PROPERTIES
|
|
Packit |
1e8aac |
};
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static GParamSpec *properties[N_PROPERTIES];
|
|
Packit |
1e8aac |
static guint glade_property_signals[LAST_SIGNAL] = { 0 };
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static GObjectClass *glade_property_parent_class = NULL;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/*******************************************************************************
|
|
Packit |
1e8aac |
GladeProperty class methods
|
|
Packit |
1e8aac |
*******************************************************************************/
|
|
Packit |
1e8aac |
static GladeProperty *
|
|
Packit |
1e8aac |
glade_property_dup_impl (GladeProperty *template_prop, GladeWidget *widget)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeProperty *property;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
property = g_object_new (GLADE_TYPE_PROPERTY,
|
|
Packit |
1e8aac |
"class", template_prop->priv->klass,
|
|
Packit |
1e8aac |
"i18n-translatable", template_prop->priv->i18n_translatable,
|
|
Packit |
1e8aac |
"i18n-context", template_prop->priv->i18n_context,
|
|
Packit |
1e8aac |
"i18n-comment", template_prop->priv->i18n_comment,
|
|
Packit |
1e8aac |
NULL);
|
|
Packit |
1e8aac |
property->priv->widget = widget;
|
|
Packit |
1e8aac |
property->priv->value = g_new0 (GValue, 1);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_value_init (property->priv->value, template_prop->priv->value->g_type);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Cannot duplicate parentless_widget property */
|
|
Packit |
1e8aac |
if (glade_property_class_parentless_widget (template_prop->priv->klass))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
if (!G_IS_PARAM_SPEC_OBJECT (glade_property_class_get_pspec (template_prop->priv->klass)))
|
|
Packit |
1e8aac |
g_warning ("Parentless widget property should be of object type");
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_value_set_object (property->priv->value, NULL);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
g_value_copy (template_prop->priv->value, property->priv->value);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
property->priv->enabled = template_prop->priv->enabled;
|
|
Packit |
1e8aac |
property->priv->state = template_prop->priv->state;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_property_set_sensitive (property, template_prop->priv->sensitive,
|
|
Packit |
1e8aac |
template_prop->priv->insensitive_tooltip);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return property;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
glade_property_equals_value_impl (GladeProperty *property,
|
|
Packit |
1e8aac |
const GValue *value)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
return !glade_property_class_compare (property->priv->klass, property->priv->value,
|
|
Packit |
1e8aac |
value);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_property_update_prop_refs (GladeProperty *property,
|
|
Packit |
1e8aac |
const GValue *old_value,
|
|
Packit |
1e8aac |
const GValue *new_value)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeWidget *gold, *gnew;
|
|
Packit |
1e8aac |
GObject *old_object, *new_object;
|
|
Packit |
1e8aac |
GList *old_list, *new_list, *list, *removed, *added;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (GLADE_IS_PARAM_SPEC_OBJECTS (glade_property_class_get_pspec (property->priv->klass)))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
/* Make our own copies incase we're walking an
|
|
Packit |
1e8aac |
* unstable list
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
old_list = g_value_dup_boxed (old_value);
|
|
Packit |
1e8aac |
new_list = g_value_dup_boxed (new_value);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Diff up the GList */
|
|
Packit |
1e8aac |
removed = glade_util_removed_from_list (old_list, new_list);
|
|
Packit |
1e8aac |
added = glade_util_added_in_list (old_list, new_list);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Adjust the appropriate prop refs */
|
|
Packit |
1e8aac |
for (list = removed; list; list = list->next)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
old_object = list->data;
|
|
Packit |
1e8aac |
gold = glade_widget_get_from_gobject (old_object);
|
|
Packit |
1e8aac |
if (gold != NULL)
|
|
Packit |
1e8aac |
glade_widget_remove_prop_ref (gold, property);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
for (list = added; list; list = list->next)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
new_object = list->data;
|
|
Packit |
1e8aac |
gnew = glade_widget_get_from_gobject (new_object);
|
|
Packit |
1e8aac |
if (gnew != NULL)
|
|
Packit |
1e8aac |
glade_widget_add_prop_ref (gnew, property);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_list_free (removed);
|
|
Packit |
1e8aac |
g_list_free (added);
|
|
Packit |
1e8aac |
g_list_free (old_list);
|
|
Packit |
1e8aac |
g_list_free (new_list);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
if ((old_object = g_value_get_object (old_value)) != NULL)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gold = glade_widget_get_from_gobject (old_object);
|
|
Packit |
1e8aac |
g_return_if_fail (gold != NULL);
|
|
Packit |
1e8aac |
glade_widget_remove_prop_ref (gold, property);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if ((new_object = g_value_get_object (new_value)) != NULL)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gnew = glade_widget_get_from_gobject (new_object);
|
|
Packit |
1e8aac |
g_return_if_fail (gnew != NULL);
|
|
Packit |
1e8aac |
glade_widget_add_prop_ref (gnew, property);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
glade_property_verify (GladeProperty *property, const GValue *value)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gboolean ret = FALSE;
|
|
Packit |
1e8aac |
GladeWidget *parent;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
parent = glade_widget_get_parent (property->priv->widget);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (glade_property_class_get_is_packing (property->priv->klass) && parent)
|
|
Packit |
1e8aac |
ret =
|
|
Packit |
1e8aac |
glade_widget_adaptor_child_verify_property (glade_widget_get_adaptor (parent),
|
|
Packit |
1e8aac |
glade_widget_get_object (parent),
|
|
Packit |
1e8aac |
glade_widget_get_object (property->priv->widget),
|
|
Packit |
1e8aac |
glade_property_class_id (property->priv->klass),
|
|
Packit |
1e8aac |
value);
|
|
Packit |
1e8aac |
else if (!glade_property_class_get_is_packing (property->priv->klass))
|
|
Packit |
1e8aac |
ret = glade_widget_adaptor_verify_property (glade_widget_get_adaptor (property->priv->widget),
|
|
Packit |
1e8aac |
glade_widget_get_object (property->priv->widget),
|
|
Packit |
1e8aac |
glade_property_class_id (property->priv->klass), value);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return ret;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_property_fix_state (GladeProperty *property)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
property->priv->state = GLADE_STATE_NORMAL;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Properties are 'changed' state if they are not default, or if
|
|
Packit |
1e8aac |
* they are optional and enabled, optional enabled properties
|
|
Packit |
1e8aac |
* are saved regardless of default value
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
if (glade_property_class_optional (property->priv->klass))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
if (glade_property_get_enabled (property))
|
|
Packit |
1e8aac |
property->priv->state |= GLADE_STATE_CHANGED;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else if (!glade_property_original_default (property))
|
|
Packit |
1e8aac |
property->priv->state |= GLADE_STATE_CHANGED;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (property->priv->support_warning)
|
|
Packit |
1e8aac |
property->priv->state |= GLADE_STATE_UNSUPPORTED;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (property->priv->support_disabled)
|
|
Packit |
1e8aac |
property->priv->state |= GLADE_STATE_SUPPORT_DISABLED;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_object_notify_by_pspec (G_OBJECT (property), properties[PROP_STATE]);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
glade_property_set_value_impl (GladeProperty *property, const GValue *value)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeProject *project = property->priv->widget ?
|
|
Packit |
1e8aac |
glade_widget_get_project (property->priv->widget) : NULL;
|
|
Packit |
1e8aac |
gboolean changed = FALSE;
|
|
Packit |
1e8aac |
GValue old_value = { 0, };
|
|
Packit |
1e8aac |
gboolean warn_before, warn_after;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
#ifdef GLADE_ENABLE_DEBUG
|
|
Packit |
1e8aac |
if (glade_get_debug_flags () & GLADE_DEBUG_PROPERTIES)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_print ("PROPERTY: Setting %s property %s on %s ",
|
|
Packit |
1e8aac |
glade_property_class_get_is_packing (property->priv->klass) ? "packing" : "normal",
|
|
Packit |
1e8aac |
glade_property_class_id (property->priv->klass),
|
|
Packit |
1e8aac |
property->priv->widget ? glade_widget_get_name (property->priv->widget) : "unknown");
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gchar *str1 =
|
|
Packit |
1e8aac |
glade_widget_adaptor_string_from_value (glade_property_class_get_adaptor (property->priv->klass),
|
|
Packit |
1e8aac |
property->priv->klass, property->priv->value);
|
|
Packit |
1e8aac |
gchar *str2 =
|
|
Packit |
1e8aac |
glade_widget_adaptor_string_from_value (glade_property_class_get_adaptor (property->priv->klass),
|
|
Packit |
1e8aac |
property->priv->klass, value);
|
|
Packit |
1e8aac |
g_print ("from %s to %s\n", str1, str2);
|
|
Packit |
1e8aac |
g_free (str1);
|
|
Packit |
1e8aac |
g_free (str2);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
#endif /* GLADE_ENABLE_DEBUG */
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (!g_value_type_compatible (G_VALUE_TYPE (property->priv->value), G_VALUE_TYPE (value)))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_warning ("Trying to assign an incompatible value to property %s\n",
|
|
Packit |
1e8aac |
glade_property_class_id (property->priv->klass));
|
|
Packit |
1e8aac |
return FALSE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Check if the backend doesnt give us permission to
|
|
Packit |
1e8aac |
* set this value.
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
if (glade_property_superuser () == FALSE && property->priv->widget &&
|
|
Packit |
1e8aac |
project && glade_project_is_loading (project) == FALSE &&
|
|
Packit |
1e8aac |
glade_property_verify (property, value) == FALSE)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
return FALSE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* save "changed" state.
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
changed = !glade_property_equals_value (property, value);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Add/Remove references from widget ref stacks here
|
|
Packit |
1e8aac |
* (before assigning the value)
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
if (property->priv->widget && changed &&
|
|
Packit |
1e8aac |
glade_property_class_is_object (property->priv->klass))
|
|
Packit |
1e8aac |
glade_property_update_prop_refs (property, property->priv->value, value);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Check pre-changed warning state */
|
|
Packit |
1e8aac |
warn_before = glade_property_warn_usage (property);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Make a copy of the old value */
|
|
Packit |
1e8aac |
g_value_init (&old_value, G_VALUE_TYPE (property->priv->value));
|
|
Packit |
1e8aac |
g_value_copy (property->priv->value, &old_value);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Assign property first so that; if the object need be
|
|
Packit |
1e8aac |
* rebuilt, it will reflect the new value
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
g_value_reset (property->priv->value);
|
|
Packit |
1e8aac |
g_value_copy (value, property->priv->value);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GLADE_PROPERTY_GET_KLASS (property)->sync (property);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_property_fix_state (property);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (changed && property->priv->widget)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_signal_emit (G_OBJECT (property),
|
|
Packit |
1e8aac |
glade_property_signals[VALUE_CHANGED],
|
|
Packit |
1e8aac |
0, &old_value, property->priv->value);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_project_verify_property (property);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Check post change warning state */
|
|
Packit |
1e8aac |
warn_after = glade_property_warn_usage (property);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Update owning widget's warning state if need be */
|
|
Packit |
1e8aac |
if (property->priv->widget != NULL && warn_before != warn_after)
|
|
Packit |
1e8aac |
glade_widget_verify (property->priv->widget);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Special case parentless widget properties */
|
|
Packit |
1e8aac |
if (glade_property_class_parentless_widget (property->priv->klass))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeWidget *gobj;
|
|
Packit |
1e8aac |
GObject *obj;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if ((obj = g_value_get_object (&old_value)) &&
|
|
Packit |
1e8aac |
(gobj = glade_widget_get_from_gobject (obj)))
|
|
Packit |
1e8aac |
glade_widget_show (gobj);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if ((obj = g_value_get_object (value)) &&
|
|
Packit |
1e8aac |
(gobj = glade_widget_get_from_gobject (obj)))
|
|
Packit |
1e8aac |
glade_widget_hide (gobj);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_value_unset (&old_value);
|
|
Packit |
1e8aac |
return TRUE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_property_get_value_impl (GladeProperty *property, GValue *value)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GParamSpec *pspec;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
pspec = glade_property_class_get_pspec (property->priv->klass);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_value_init (value, pspec->value_type);
|
|
Packit |
1e8aac |
g_value_copy (property->priv->value, value);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_property_sync_impl (GladeProperty *property)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladePropertyPrivate *priv = property->priv;
|
|
Packit |
1e8aac |
GladePropertyClass *klass = priv->klass;
|
|
Packit |
1e8aac |
const GValue *value;
|
|
Packit |
1e8aac |
const gchar *id;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Heh, here are the many reasons not to
|
|
Packit |
1e8aac |
* sync a property ;-)
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
if (/* the class can be NULL during object,
|
|
Packit |
1e8aac |
* construction this is just a temporary state */
|
|
Packit |
1e8aac |
klass == NULL ||
|
|
Packit |
1e8aac |
/* explicit "never sync" flag */
|
|
Packit |
1e8aac |
glade_property_class_get_ignore (klass) ||
|
|
Packit |
1e8aac |
/* recursion guards */
|
|
Packit |
1e8aac |
priv->syncing >= priv->sync_tolerance ||
|
|
Packit |
1e8aac |
/* No widget owns this property yet */
|
|
Packit |
1e8aac |
priv->widget == NULL)
|
|
Packit |
1e8aac |
return;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
id = glade_property_class_id (klass);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Only the properties from widget->properties should affect the runtime widget.
|
|
Packit |
1e8aac |
* (other properties may be used for convenience in the plugin).
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
if ((glade_property_class_get_is_packing (klass) &&
|
|
Packit |
1e8aac |
!glade_widget_get_pack_property (priv->widget, id))
|
|
Packit |
1e8aac |
|| !glade_widget_get_property (priv->widget, id))
|
|
Packit |
1e8aac |
return;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
priv->syncing++;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* optional properties that are disabled get the default runtime value */
|
|
Packit |
1e8aac |
value = (priv->enabled) ? priv->value : glade_property_class_get_default (klass);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* In the case of construct_only, the widget instance must be rebuilt
|
|
Packit |
1e8aac |
* to apply the property
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
if (glade_property_class_get_construct_only (klass) && priv->syncing == 1)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
/* Virtual properties can be construct only, in which
|
|
Packit |
1e8aac |
* case they are allowed to trigger a rebuild, and in
|
|
Packit |
1e8aac |
* the process are allowed to get "synced" after the
|
|
Packit |
1e8aac |
* instance is rebuilt.
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
if (glade_property_class_get_virtual (klass))
|
|
Packit |
1e8aac |
priv->sync_tolerance++;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_widget_rebuild (priv->widget);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (glade_property_class_get_virtual (klass))
|
|
Packit |
1e8aac |
priv->sync_tolerance--;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else if (glade_property_class_get_is_packing (klass))
|
|
Packit |
1e8aac |
glade_widget_child_set_property (glade_widget_get_parent (priv->widget),
|
|
Packit |
1e8aac |
priv->widget, id, value);
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
glade_widget_object_set_property (priv->widget, id, value);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
priv->syncing--;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_property_load_impl (GladeProperty *property)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GObject *object;
|
|
Packit |
1e8aac |
GObjectClass *oclass;
|
|
Packit |
1e8aac |
GParamSpec *pspec;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
pspec = glade_property_class_get_pspec (property->priv->klass);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (property->priv->widget == NULL ||
|
|
Packit |
1e8aac |
glade_property_class_get_virtual (property->priv->klass) ||
|
|
Packit |
1e8aac |
glade_property_class_get_is_packing (property->priv->klass) ||
|
|
Packit |
1e8aac |
glade_property_class_get_ignore (property->priv->klass) ||
|
|
Packit |
1e8aac |
!(pspec->flags & G_PARAM_READABLE) || G_IS_PARAM_SPEC_OBJECT (pspec))
|
|
Packit |
1e8aac |
return;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
object = glade_widget_get_object (property->priv->widget);
|
|
Packit |
1e8aac |
oclass = G_OBJECT_GET_CLASS (object);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (g_object_class_find_property (oclass, glade_property_class_id (property->priv->klass)))
|
|
Packit |
1e8aac |
glade_widget_object_get_property (property->priv->widget,
|
|
Packit |
1e8aac |
glade_property_class_id (property->priv->klass),
|
|
Packit |
1e8aac |
property->priv->value);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/*******************************************************************************
|
|
Packit |
1e8aac |
GObjectClass & Object Construction
|
|
Packit |
1e8aac |
*******************************************************************************/
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_property_set_real_property (GObject *object,
|
|
Packit |
1e8aac |
guint prop_id,
|
|
Packit |
1e8aac |
const GValue *value,
|
|
Packit |
1e8aac |
GParamSpec *pspec)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeProperty *property = GLADE_PROPERTY (object);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
switch (prop_id)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
case PROP_CLASS:
|
|
Packit |
1e8aac |
property->priv->klass = g_value_get_pointer (value);
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
case PROP_ENABLED:
|
|
Packit |
1e8aac |
glade_property_set_enabled (property, g_value_get_boolean (value));
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
case PROP_SENSITIVE:
|
|
Packit |
1e8aac |
property->priv->sensitive = g_value_get_boolean (value);
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
case PROP_I18N_TRANSLATABLE:
|
|
Packit |
1e8aac |
glade_property_i18n_set_translatable (property,
|
|
Packit |
1e8aac |
g_value_get_boolean (value));
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
case PROP_I18N_CONTEXT:
|
|
Packit |
1e8aac |
glade_property_i18n_set_context (property, g_value_get_string (value));
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
case PROP_I18N_COMMENT:
|
|
Packit |
1e8aac |
glade_property_i18n_set_comment (property, g_value_get_string (value));
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
default:
|
|
Packit |
1e8aac |
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_property_get_real_property (GObject *object,
|
|
Packit |
1e8aac |
guint prop_id,
|
|
Packit |
1e8aac |
GValue *value,
|
|
Packit |
1e8aac |
GParamSpec *pspec)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeProperty *property = GLADE_PROPERTY (object);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
switch (prop_id)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
case PROP_CLASS:
|
|
Packit |
1e8aac |
g_value_set_pointer (value, property->priv->klass);
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
case PROP_ENABLED:
|
|
Packit |
1e8aac |
g_value_set_boolean (value, glade_property_get_enabled (property));
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
case PROP_SENSITIVE:
|
|
Packit |
1e8aac |
g_value_set_boolean (value, glade_property_get_sensitive (property));
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
case PROP_I18N_TRANSLATABLE:
|
|
Packit |
1e8aac |
g_value_set_boolean (value,
|
|
Packit |
1e8aac |
glade_property_i18n_get_translatable (property));
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
case PROP_I18N_CONTEXT:
|
|
Packit |
1e8aac |
g_value_set_string (value, glade_property_i18n_get_context (property));
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
case PROP_I18N_COMMENT:
|
|
Packit |
1e8aac |
g_value_set_string (value, glade_property_i18n_get_comment (property));
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
case PROP_STATE:
|
|
Packit |
1e8aac |
g_value_set_int (value, property->priv->state);
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
default:
|
|
Packit |
1e8aac |
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_property_finalize (GObject *object)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeProperty *property = GLADE_PROPERTY (object);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (property->priv->value)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_value_unset (property->priv->value);
|
|
Packit |
1e8aac |
g_free (property->priv->value);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
if (property->priv->i18n_comment)
|
|
Packit |
1e8aac |
g_free (property->priv->i18n_comment);
|
|
Packit |
1e8aac |
if (property->priv->i18n_context)
|
|
Packit |
1e8aac |
g_free (property->priv->i18n_context);
|
|
Packit |
1e8aac |
if (property->priv->support_warning)
|
|
Packit |
1e8aac |
g_free (property->priv->support_warning);
|
|
Packit |
1e8aac |
if (property->priv->insensitive_tooltip)
|
|
Packit |
1e8aac |
g_free (property->priv->insensitive_tooltip);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
G_OBJECT_CLASS (glade_property_parent_class)->finalize (object);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_property_init (GladeProperty *property)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
property->priv = G_TYPE_INSTANCE_GET_PRIVATE (property,
|
|
Packit |
1e8aac |
GLADE_TYPE_PROPERTY,
|
|
Packit |
1e8aac |
GladePropertyPrivate);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
property->priv->enabled = TRUE;
|
|
Packit |
1e8aac |
property->priv->sensitive = TRUE;
|
|
Packit |
1e8aac |
property->priv->i18n_translatable = TRUE;
|
|
Packit |
1e8aac |
property->priv->i18n_comment = NULL;
|
|
Packit |
1e8aac |
property->priv->sync_tolerance = 1;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_property_klass_init (GladePropertyKlass * prop_class)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GObjectClass *object_class;
|
|
Packit |
1e8aac |
g_return_if_fail (prop_class != NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_property_parent_class = g_type_class_peek_parent (prop_class);
|
|
Packit |
1e8aac |
object_class = G_OBJECT_CLASS (prop_class);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* GObjectClass */
|
|
Packit |
1e8aac |
object_class->set_property = glade_property_set_real_property;
|
|
Packit |
1e8aac |
object_class->get_property = glade_property_get_real_property;
|
|
Packit |
1e8aac |
object_class->finalize = glade_property_finalize;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Class methods */
|
|
Packit |
1e8aac |
prop_class->dup = glade_property_dup_impl;
|
|
Packit |
1e8aac |
prop_class->equals_value = glade_property_equals_value_impl;
|
|
Packit |
1e8aac |
prop_class->set_value = glade_property_set_value_impl;
|
|
Packit |
1e8aac |
prop_class->get_value = glade_property_get_value_impl;
|
|
Packit |
1e8aac |
prop_class->sync = glade_property_sync_impl;
|
|
Packit |
1e8aac |
prop_class->load = glade_property_load_impl;
|
|
Packit |
1e8aac |
prop_class->value_changed = NULL;
|
|
Packit |
1e8aac |
prop_class->tooltip_changed = NULL;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Properties */
|
|
Packit |
1e8aac |
properties[PROP_CLASS] =
|
|
Packit |
1e8aac |
g_param_spec_pointer ("class",
|
|
Packit |
1e8aac |
_("Class"),
|
|
Packit |
1e8aac |
_("The GladePropertyClass for this property"),
|
|
Packit |
1e8aac |
G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
properties[PROP_ENABLED] =
|
|
Packit |
1e8aac |
g_param_spec_boolean ("enabled",
|
|
Packit |
1e8aac |
_("Enabled"),
|
|
Packit |
1e8aac |
_("If the property is optional, this is its enabled state"),
|
|
Packit |
1e8aac |
TRUE, G_PARAM_READWRITE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
properties[PROP_SENSITIVE] =
|
|
Packit |
1e8aac |
g_param_spec_boolean ("sensitive",
|
|
Packit |
1e8aac |
_("Sensitive"),
|
|
Packit |
1e8aac |
_("This gives backends control to set property sensitivity"),
|
|
Packit |
1e8aac |
TRUE, G_PARAM_READWRITE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
properties[PROP_I18N_CONTEXT] =
|
|
Packit |
1e8aac |
g_param_spec_string ("i18n-context",
|
|
Packit |
1e8aac |
_("Context"),
|
|
Packit |
1e8aac |
_("Context for translation"),
|
|
Packit |
1e8aac |
NULL,
|
|
Packit |
1e8aac |
G_PARAM_READWRITE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
properties[PROP_I18N_COMMENT] =
|
|
Packit |
1e8aac |
g_param_spec_string ("i18n-comment",
|
|
Packit |
1e8aac |
_("Comment"),
|
|
Packit |
1e8aac |
_("Comment for translators"),
|
|
Packit |
1e8aac |
NULL,
|
|
Packit |
1e8aac |
G_PARAM_READWRITE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
properties[PROP_I18N_TRANSLATABLE] =
|
|
Packit |
1e8aac |
g_param_spec_boolean ("i18n-translatable",
|
|
Packit |
1e8aac |
_("Translatable"),
|
|
Packit |
1e8aac |
_("Whether this property is translatable"),
|
|
Packit |
1e8aac |
TRUE,
|
|
Packit |
1e8aac |
G_PARAM_READWRITE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
properties[PROP_STATE] =
|
|
Packit |
1e8aac |
g_param_spec_int ("state",
|
|
Packit |
1e8aac |
_("Visual State"),
|
|
Packit |
1e8aac |
_("Priority information for the property editor to act on"),
|
|
Packit |
1e8aac |
GLADE_STATE_NORMAL,
|
|
Packit |
1e8aac |
G_MAXINT,
|
|
Packit |
1e8aac |
GLADE_STATE_NORMAL,
|
|
Packit |
1e8aac |
G_PARAM_READABLE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Install all properties */
|
|
Packit |
1e8aac |
g_object_class_install_properties (object_class, N_PROPERTIES, properties);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Signal */
|
|
Packit |
1e8aac |
glade_property_signals[VALUE_CHANGED] =
|
|
Packit |
1e8aac |
g_signal_new ("value-changed",
|
|
Packit |
1e8aac |
G_TYPE_FROM_CLASS (object_class),
|
|
Packit |
1e8aac |
G_SIGNAL_RUN_LAST,
|
|
Packit |
1e8aac |
G_STRUCT_OFFSET (GladePropertyKlass,
|
|
Packit |
1e8aac |
value_changed),
|
|
Packit |
1e8aac |
NULL, NULL,
|
|
Packit |
1e8aac |
_glade_marshal_VOID__POINTER_POINTER,
|
|
Packit |
1e8aac |
G_TYPE_NONE, 2, G_TYPE_POINTER, G_TYPE_POINTER);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_property_signals[TOOLTIP_CHANGED] =
|
|
Packit |
1e8aac |
g_signal_new ("tooltip-changed",
|
|
Packit |
1e8aac |
G_TYPE_FROM_CLASS (object_class),
|
|
Packit |
1e8aac |
G_SIGNAL_RUN_LAST,
|
|
Packit |
1e8aac |
G_STRUCT_OFFSET (GladePropertyKlass,
|
|
Packit |
1e8aac |
tooltip_changed),
|
|
Packit |
1e8aac |
NULL, NULL,
|
|
Packit |
1e8aac |
_glade_marshal_VOID__STRING_STRING_STRING,
|
|
Packit |
1e8aac |
G_TYPE_NONE, 3, G_TYPE_STRING, G_TYPE_STRING,
|
|
Packit |
1e8aac |
G_TYPE_STRING);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_type_class_add_private (prop_class, sizeof (GladePropertyPrivate));
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GType
|
|
Packit |
1e8aac |
glade_property_get_type (void)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
static GType property_type = 0;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (!property_type)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
static const GTypeInfo property_info = {
|
|
Packit |
1e8aac |
sizeof (GladePropertyKlass), /* Klass is our class */
|
|
Packit |
1e8aac |
(GBaseInitFunc) NULL,
|
|
Packit |
1e8aac |
(GBaseFinalizeFunc) NULL,
|
|
Packit |
1e8aac |
(GClassInitFunc) glade_property_klass_init,
|
|
Packit |
1e8aac |
(GClassFinalizeFunc) NULL,
|
|
Packit |
1e8aac |
NULL, /* class_data */
|
|
Packit |
1e8aac |
sizeof (GladeProperty),
|
|
Packit |
1e8aac |
0, /* n_preallocs */
|
|
Packit |
1e8aac |
(GInstanceInitFunc) glade_property_init,
|
|
Packit |
1e8aac |
};
|
|
Packit |
1e8aac |
property_type =
|
|
Packit |
1e8aac |
g_type_register_static (G_TYPE_OBJECT,
|
|
Packit |
1e8aac |
"GladeProperty", &property_info, 0);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
return property_type;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/*******************************************************************************
|
|
Packit |
1e8aac |
API
|
|
Packit |
1e8aac |
*******************************************************************************/
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* glade_property_new:
|
|
Packit |
1e8aac |
* @klass: A #GladePropertyClass defining this property
|
|
Packit |
1e8aac |
* @widget: The #GladeWidget this property is created for
|
|
Packit |
1e8aac |
* @value: The initial #GValue of the property or %NULL
|
|
Packit |
1e8aac |
* (the #GladeProperty will assume ownership of @value)
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Creates a #GladeProperty of type @klass for @widget with @value; if
|
|
Packit |
1e8aac |
* @value is %NULL, then the introspected default value for that property
|
|
Packit |
1e8aac |
* will be used.
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Returns: The newly created #GladeProperty
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
GladeProperty *
|
|
Packit |
1e8aac |
glade_property_new (GladePropertyClass *klass,
|
|
Packit |
1e8aac |
GladeWidget *widget,
|
|
Packit |
1e8aac |
GValue *value)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeProperty *property;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_val_if_fail (GLADE_IS_PROPERTY_CLASS (klass), NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
property = (GladeProperty *) g_object_new (GLADE_TYPE_PROPERTY, NULL);
|
|
Packit |
1e8aac |
property->priv->klass = klass;
|
|
Packit |
1e8aac |
property->priv->widget = widget;
|
|
Packit |
1e8aac |
property->priv->value = value;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (glade_property_class_optional (klass))
|
|
Packit |
1e8aac |
property->priv->enabled = glade_property_class_optional_default (klass);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (property->priv->value == NULL)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
const GValue *orig_def =
|
|
Packit |
1e8aac |
glade_property_class_get_original_default (klass);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
property->priv->value = g_new0 (GValue, 1);
|
|
Packit |
1e8aac |
g_value_init (property->priv->value, orig_def->g_type);
|
|
Packit |
1e8aac |
g_value_copy (orig_def, property->priv->value);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return property;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* glade_property_dup:
|
|
Packit |
1e8aac |
* @template_prop: A #GladeProperty
|
|
Packit |
1e8aac |
* @widget: A #GladeWidget
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Returns: A newly duplicated property based on the new widget
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
GladeProperty *
|
|
Packit |
1e8aac |
glade_property_dup (GladeProperty *template_prop, GladeWidget *widget)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_return_val_if_fail (GLADE_IS_PROPERTY (template_prop), NULL);
|
|
Packit |
1e8aac |
return GLADE_PROPERTY_GET_KLASS (template_prop)->dup (template_prop, widget);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_property_reset_common (GladeProperty *property, gboolean original)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
const GValue *value;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_if_fail (GLADE_IS_PROPERTY (property));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (original)
|
|
Packit |
1e8aac |
value = glade_property_class_get_original_default (property->priv->klass);
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
value = glade_property_class_get_default (property->priv->klass);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GLADE_PROPERTY_GET_KLASS (property)->set_value (property, value);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* glade_property_reset:
|
|
Packit |
1e8aac |
* @property: A #GladeProperty
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Resets this property to its default value
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_property_reset (GladeProperty *property)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
glade_property_reset_common (property, FALSE);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* glade_property_original_reset:
|
|
Packit |
1e8aac |
* @property: A #GladeProperty
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Resets this property to its original default value
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_property_original_reset (GladeProperty *property)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
glade_property_reset_common (property, TRUE);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
glade_property_default_common (GladeProperty *property, gboolean orig)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
const GValue *value;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_val_if_fail (GLADE_IS_PROPERTY (property), FALSE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (orig)
|
|
Packit |
1e8aac |
value = glade_property_class_get_original_default (property->priv->klass);
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
value = glade_property_class_get_default (property->priv->klass);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return GLADE_PROPERTY_GET_KLASS (property)->equals_value (property, value);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* glade_property_default:
|
|
Packit |
1e8aac |
* @property: A #GladeProperty
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Returns: Whether this property is at its default value
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
gboolean
|
|
Packit |
1e8aac |
glade_property_default (GladeProperty *property)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
return glade_property_default_common (property, FALSE);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* glade_property_original_default:
|
|
Packit |
1e8aac |
* @property: A #GladeProperty
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Returns: Whether this property is at its original default value
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
gboolean
|
|
Packit |
1e8aac |
glade_property_original_default (GladeProperty *property)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
return glade_property_default_common (property, TRUE);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* glade_property_equals_value:
|
|
Packit |
1e8aac |
* @property: a #GladeProperty
|
|
Packit |
1e8aac |
* @value: a #GValue
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Returns: Whether this property is equal to the value provided
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
gboolean
|
|
Packit |
1e8aac |
glade_property_equals_value (GladeProperty *property, const GValue *value)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_return_val_if_fail (GLADE_IS_PROPERTY (property), FALSE);
|
|
Packit |
1e8aac |
return GLADE_PROPERTY_GET_KLASS (property)->equals_value (property, value);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* glade_property_equals_va_list:
|
|
Packit |
1e8aac |
* @property: a #GladeProperty
|
|
Packit |
1e8aac |
* @vl: a va_list
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Returns: Whether this property is equal to the value provided
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
glade_property_equals_va_list (GladeProperty *property, va_list vl)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GValue *value;
|
|
Packit |
1e8aac |
gboolean ret;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_val_if_fail (GLADE_IS_PROPERTY (property), FALSE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
value = glade_property_class_make_gvalue_from_vl (property->priv->klass, vl);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
ret = GLADE_PROPERTY_GET_KLASS (property)->equals_value (property, value);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_value_unset (value);
|
|
Packit |
1e8aac |
g_free (value);
|
|
Packit |
1e8aac |
return ret;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* glade_property_equals:
|
|
Packit |
1e8aac |
* @property: a #GladeProperty
|
|
Packit |
1e8aac |
* @...: a provided property value
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Returns: Whether this property is equal to the value provided
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
gboolean
|
|
Packit |
1e8aac |
glade_property_equals (GladeProperty *property, ...)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
va_list vl;
|
|
Packit |
1e8aac |
gboolean ret;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_val_if_fail (GLADE_IS_PROPERTY (property), FALSE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
va_start (vl, property);
|
|
Packit |
1e8aac |
ret = glade_property_equals_va_list (property, vl);
|
|
Packit |
1e8aac |
va_end (vl);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return ret;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* glade_property_set_value:
|
|
Packit |
1e8aac |
* @property: a #GladeProperty
|
|
Packit |
1e8aac |
* @value: a #GValue
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Sets the property's value
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Returns: Whether the property was successfully set.
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
gboolean
|
|
Packit |
1e8aac |
glade_property_set_value (GladeProperty *property, const GValue *value)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_return_val_if_fail (GLADE_IS_PROPERTY (property), FALSE);
|
|
Packit |
1e8aac |
g_return_val_if_fail (value != NULL, FALSE);
|
|
Packit |
1e8aac |
return GLADE_PROPERTY_GET_KLASS (property)->set_value (property, value);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* glade_property_set_va_list:
|
|
Packit |
1e8aac |
* @property: a #GladeProperty
|
|
Packit |
1e8aac |
* @vl: a va_list with value to set
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Sets the property's value
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
gboolean
|
|
Packit |
1e8aac |
glade_property_set_va_list (GladeProperty *property, va_list vl)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GValue *value;
|
|
Packit |
1e8aac |
gboolean success;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_val_if_fail (GLADE_IS_PROPERTY (property), FALSE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
value = glade_property_class_make_gvalue_from_vl (property->priv->klass, vl);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
success = GLADE_PROPERTY_GET_KLASS (property)->set_value (property, value);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_value_unset (value);
|
|
Packit |
1e8aac |
g_free (value);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return success;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* glade_property_set:
|
|
Packit |
1e8aac |
* @property: a #GladeProperty
|
|
Packit |
1e8aac |
* @...: the value to set
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Sets the property's value (in a convenient way)
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
gboolean
|
|
Packit |
1e8aac |
glade_property_set (GladeProperty *property, ...)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
va_list vl;
|
|
Packit |
1e8aac |
gboolean success;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_val_if_fail (GLADE_IS_PROPERTY (property), FALSE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
va_start (vl, property);
|
|
Packit |
1e8aac |
success = glade_property_set_va_list (property, vl);
|
|
Packit |
1e8aac |
va_end (vl);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return success;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* glade_property_get_value:
|
|
Packit |
1e8aac |
* @property: a #GladeProperty
|
|
Packit |
1e8aac |
* @value: a #GValue
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Retrieve the property value
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_property_get_value (GladeProperty *property, GValue *value)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_return_if_fail (GLADE_IS_PROPERTY (property));
|
|
Packit |
1e8aac |
g_return_if_fail (value != NULL);
|
|
Packit |
1e8aac |
GLADE_PROPERTY_GET_KLASS (property)->get_value (property, value);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* glade_property_get_default:
|
|
Packit |
1e8aac |
* @property: a #GladeProperty
|
|
Packit |
1e8aac |
* @value: a #GValue
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Retrieve the default property value
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_property_get_default (GladeProperty *property, GValue *value)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GParamSpec *pspec;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_if_fail (GLADE_IS_PROPERTY (property));
|
|
Packit |
1e8aac |
g_return_if_fail (value != NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
pspec = glade_property_class_get_pspec (property->priv->klass);
|
|
Packit |
1e8aac |
g_value_init (value, pspec->value_type);
|
|
Packit |
1e8aac |
g_value_copy (glade_property_class_get_default (property->priv->klass), value);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* glade_property_get_va_list:
|
|
Packit |
1e8aac |
* @property: a #GladeProperty
|
|
Packit |
1e8aac |
* @vl: a va_list
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Retrieve the property value
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_property_get_va_list (GladeProperty *property, va_list vl)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_return_if_fail (GLADE_IS_PROPERTY (property));
|
|
Packit |
1e8aac |
glade_property_class_set_vl_from_gvalue (property->priv->klass, property->priv->value,
|
|
Packit |
1e8aac |
vl);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* glade_property_get:
|
|
Packit |
1e8aac |
* @property: a #GladeProperty
|
|
Packit |
1e8aac |
* @...: An address to store the value
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Retrieve the property value
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_property_get (GladeProperty *property, ...)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
va_list vl;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_if_fail (GLADE_IS_PROPERTY (property));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
va_start (vl, property);
|
|
Packit |
1e8aac |
glade_property_get_va_list (property, vl);
|
|
Packit |
1e8aac |
va_end (vl);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* glade_property_sync:
|
|
Packit |
1e8aac |
* @property: a #GladeProperty
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Synchronize the object with this property
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_property_sync (GladeProperty *property)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_return_if_fail (GLADE_IS_PROPERTY (property));
|
|
Packit |
1e8aac |
GLADE_PROPERTY_GET_KLASS (property)->sync (property);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* glade_property_load:
|
|
Packit |
1e8aac |
* @property: a #GladeProperty
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Loads the value of @property from the coresponding object instance
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_property_load (GladeProperty *property)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_return_if_fail (GLADE_IS_PROPERTY (property));
|
|
Packit |
1e8aac |
GLADE_PROPERTY_GET_KLASS (property)->load (property);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* glade_property_read:
|
|
Packit |
1e8aac |
* @property: a #GladeProperty or #NULL
|
|
Packit |
1e8aac |
* @project: the #GladeProject
|
|
Packit |
1e8aac |
* @node: the #GladeXmlNode to read, will either be a 'widget'
|
|
Packit |
1e8aac |
* node or a 'child' node for packing properties.
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Read the value and any attributes for @property from @node, assumes
|
|
Packit |
1e8aac |
* @property is being loaded for @project
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Note that object values will only be resolved after the project is
|
|
Packit |
1e8aac |
* completely loaded
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_property_read (GladeProperty *property,
|
|
Packit |
1e8aac |
GladeProject *project,
|
|
Packit |
1e8aac |
GladeXmlNode *prop)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GValue *gvalue = NULL;
|
|
Packit |
1e8aac |
gchar /* *id, *name, */ * value;
|
|
Packit |
1e8aac |
gint translatable = FALSE;
|
|
Packit |
1e8aac |
gchar *comment = NULL, *context = NULL;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_if_fail (GLADE_IS_PROPERTY (property));
|
|
Packit |
1e8aac |
g_return_if_fail (GLADE_IS_PROJECT (project));
|
|
Packit |
1e8aac |
g_return_if_fail (prop != NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (!glade_xml_node_verify (prop, GLADE_XML_TAG_PROPERTY))
|
|
Packit |
1e8aac |
return;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (!(value = glade_xml_get_content (prop)))
|
|
Packit |
1e8aac |
return;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* If an optional property is specified in the
|
|
Packit |
1e8aac |
* glade file, its enabled
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
property->priv->enabled = TRUE;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (glade_property_class_is_object (property->priv->klass))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
/* we must synchronize this directly after loading this project
|
|
Packit |
1e8aac |
* (i.e. lookup the actual objects after they've been parsed and
|
|
Packit |
1e8aac |
* are present).
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
g_object_set_data_full (G_OBJECT (property),
|
|
Packit |
1e8aac |
"glade-loaded-object", g_strdup (value), g_free);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gvalue =
|
|
Packit |
1e8aac |
glade_property_class_make_gvalue_from_string (property->priv->klass, value, project);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GLADE_PROPERTY_GET_KLASS (property)->set_value (property, gvalue);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_value_unset (gvalue);
|
|
Packit |
1e8aac |
g_free (gvalue);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
translatable =
|
|
Packit |
1e8aac |
glade_xml_get_property_boolean (prop, GLADE_TAG_TRANSLATABLE, FALSE);
|
|
Packit |
1e8aac |
comment = glade_xml_get_property_string (prop, GLADE_TAG_COMMENT);
|
|
Packit |
1e8aac |
context = glade_xml_get_property_string (prop, GLADE_TAG_CONTEXT);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_property_i18n_set_translatable (property, translatable);
|
|
Packit |
1e8aac |
glade_property_i18n_set_comment (property, comment);
|
|
Packit |
1e8aac |
glade_property_i18n_set_context (property, context);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_free (comment);
|
|
Packit |
1e8aac |
g_free (context);
|
|
Packit |
1e8aac |
g_free (value);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* glade_property_write:
|
|
Packit |
1e8aac |
* @property: a #GladeProperty
|
|
Packit |
1e8aac |
* @context: A #GladeXmlContext
|
|
Packit |
1e8aac |
* @node: A #GladeXmlNode
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Write @property to @node
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_property_write (GladeProperty *property,
|
|
Packit |
1e8aac |
GladeXmlContext *context,
|
|
Packit |
1e8aac |
GladeXmlNode *node)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeXmlNode *prop_node;
|
|
Packit |
1e8aac |
gchar *name, *value;
|
|
Packit |
1e8aac |
gboolean save_always;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_if_fail (GLADE_IS_PROPERTY (property));
|
|
Packit |
1e8aac |
g_return_if_fail (node != NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* This code should work the same for <packing>, <widget> and <template> */
|
|
Packit |
1e8aac |
if (!(glade_xml_node_verify_silent (node, GLADE_XML_TAG_PACKING) ||
|
|
Packit |
1e8aac |
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 |
/* There can be a couple of reasons to forcefully save a property */
|
|
Packit |
1e8aac |
save_always = (glade_property_class_save_always (property->priv->klass) || property->priv->save_always);
|
|
Packit |
1e8aac |
save_always = save_always || (glade_property_class_optional (property->priv->klass) && property->priv->enabled);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Skip properties that are default by original pspec default
|
|
Packit |
1e8aac |
* (excepting those that specified otherwise).
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
if (!save_always && glade_property_original_default (property))
|
|
Packit |
1e8aac |
return;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Escape our string and save with underscores */
|
|
Packit |
1e8aac |
name = g_strdup (glade_property_class_id (property->priv->klass));
|
|
Packit |
1e8aac |
glade_util_replace (name, '-', '_');
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* convert the value of this property to a string */
|
|
Packit |
1e8aac |
if (!(value = glade_widget_adaptor_string_from_value
|
|
Packit |
1e8aac |
(glade_property_class_get_adaptor (property->priv->klass), property->priv->klass,
|
|
Packit |
1e8aac |
property->priv->value)))
|
|
Packit |
1e8aac |
/* make sure we keep the empty string, also... upcomming
|
|
Packit |
1e8aac |
* funcs that may not like NULL.
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
value = g_strdup ("");
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Now dump the node values... */
|
|
Packit |
1e8aac |
prop_node = glade_xml_node_new (context, GLADE_XML_TAG_PROPERTY);
|
|
Packit |
1e8aac |
glade_xml_node_append_child (node, prop_node);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Name and value */
|
|
Packit |
1e8aac |
glade_xml_node_set_property_string (prop_node, GLADE_XML_TAG_NAME, name);
|
|
Packit |
1e8aac |
glade_xml_set_content (prop_node, value);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* i18n stuff */
|
|
Packit |
1e8aac |
if (glade_property_class_translatable (property->priv->klass))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
if (property->priv->i18n_translatable)
|
|
Packit |
1e8aac |
glade_xml_node_set_property_string (prop_node,
|
|
Packit |
1e8aac |
GLADE_TAG_TRANSLATABLE,
|
|
Packit |
1e8aac |
GLADE_XML_TAG_I18N_TRUE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (property->priv->i18n_context)
|
|
Packit |
1e8aac |
glade_xml_node_set_property_string (prop_node,
|
|
Packit |
1e8aac |
GLADE_TAG_CONTEXT,
|
|
Packit |
1e8aac |
property->priv->i18n_context);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (property->priv->i18n_comment)
|
|
Packit |
1e8aac |
glade_xml_node_set_property_string (prop_node,
|
|
Packit |
1e8aac |
GLADE_TAG_COMMENT,
|
|
Packit |
1e8aac |
property->priv->i18n_comment);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
g_free (name);
|
|
Packit |
1e8aac |
g_free (value);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* glade_property_add_object:
|
|
Packit |
1e8aac |
* @property: a #GladeProperty
|
|
Packit |
1e8aac |
* @object: The #GObject to add
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Adds @object to the object list in @property.
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Note: This function expects @property to be a #GladeParamSpecObjects
|
|
Packit |
1e8aac |
* or #GParamSpecObject type property.
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_property_add_object (GladeProperty *property, GObject *object)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GList *list = NULL, *new_list = NULL;
|
|
Packit |
1e8aac |
GParamSpec *pspec;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_if_fail (GLADE_IS_PROPERTY (property));
|
|
Packit |
1e8aac |
g_return_if_fail (G_IS_OBJECT (object));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
pspec = glade_property_class_get_pspec (property->priv->klass);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_if_fail (GLADE_IS_PARAM_SPEC_OBJECTS (pspec) ||
|
|
Packit |
1e8aac |
G_IS_PARAM_SPEC_OBJECT (pspec));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (GLADE_IS_PARAM_SPEC_OBJECTS (pspec))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
glade_property_get (property, &list);
|
|
Packit |
1e8aac |
new_list = g_list_copy (list);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
new_list = g_list_append (new_list, object);
|
|
Packit |
1e8aac |
glade_property_set (property, new_list);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* ownership of the list is not passed
|
|
Packit |
1e8aac |
* through glade_property_set()
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
g_list_free (new_list);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
glade_property_set (property, object);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* glade_property_remove_object:
|
|
Packit |
1e8aac |
* @property: a #GladeProperty
|
|
Packit |
1e8aac |
* @object: The #GObject to add
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Removes @object from the object list in @property.
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Note: This function expects @property to be a #GladeParamSpecObjects
|
|
Packit |
1e8aac |
* or #GParamSpecObject type property.
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_property_remove_object (GladeProperty *property, GObject *object)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GList *list = NULL, *new_list = NULL;
|
|
Packit |
1e8aac |
GParamSpec *pspec;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_if_fail (GLADE_IS_PROPERTY (property));
|
|
Packit |
1e8aac |
g_return_if_fail (G_IS_OBJECT (object));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
pspec = glade_property_class_get_pspec (property->priv->klass);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_if_fail (GLADE_IS_PARAM_SPEC_OBJECTS (pspec) ||
|
|
Packit |
1e8aac |
G_IS_PARAM_SPEC_OBJECT (pspec));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (GLADE_IS_PARAM_SPEC_OBJECTS (pspec))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
/* If object isnt in list; list should stay in tact.
|
|
Packit |
1e8aac |
* not bothering to check for now.
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
glade_property_get (property, &list);
|
|
Packit |
1e8aac |
new_list = g_list_copy (list);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
new_list = g_list_remove (new_list, object);
|
|
Packit |
1e8aac |
glade_property_set (property, new_list);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* ownership of the list is not passed
|
|
Packit |
1e8aac |
* through glade_property_set()
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
g_list_free (new_list);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
glade_property_set (property, NULL);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GladePropertyClass *
|
|
Packit |
1e8aac |
glade_property_get_class (GladeProperty *property)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_return_val_if_fail (GLADE_IS_PROPERTY (property), NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return property->priv->klass;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Parameters for translatable properties. */
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_property_i18n_set_comment (GladeProperty *property, const gchar *str)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_return_if_fail (GLADE_IS_PROPERTY (property));
|
|
Packit |
1e8aac |
if (property->priv->i18n_comment)
|
|
Packit |
1e8aac |
g_free (property->priv->i18n_comment);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
property->priv->i18n_comment = g_strdup (str);
|
|
Packit |
1e8aac |
g_object_notify_by_pspec (G_OBJECT (property), properties[PROP_I18N_COMMENT]);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
G_CONST_RETURN gchar *
|
|
Packit |
1e8aac |
glade_property_i18n_get_comment (GladeProperty * property)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_return_val_if_fail (GLADE_IS_PROPERTY (property), NULL);
|
|
Packit |
1e8aac |
return property->priv->i18n_comment;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_property_i18n_set_context (GladeProperty *property, const gchar *str)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_return_if_fail (GLADE_IS_PROPERTY (property));
|
|
Packit |
1e8aac |
if (property->priv->i18n_context)
|
|
Packit |
1e8aac |
g_free (property->priv->i18n_context);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
property->priv->i18n_context = g_strdup (str);
|
|
Packit |
1e8aac |
g_object_notify_by_pspec (G_OBJECT (property), properties[PROP_I18N_CONTEXT]);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
G_CONST_RETURN gchar *
|
|
Packit |
1e8aac |
glade_property_i18n_get_context (GladeProperty *property)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_return_val_if_fail (GLADE_IS_PROPERTY (property), NULL);
|
|
Packit |
1e8aac |
return property->priv->i18n_context;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_property_i18n_set_translatable (GladeProperty *property,
|
|
Packit |
1e8aac |
gboolean translatable)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_return_if_fail (GLADE_IS_PROPERTY (property));
|
|
Packit |
1e8aac |
property->priv->i18n_translatable = translatable;
|
|
Packit |
1e8aac |
g_object_notify_by_pspec (G_OBJECT (property), properties[PROP_I18N_TRANSLATABLE]);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gboolean
|
|
Packit |
1e8aac |
glade_property_i18n_get_translatable (GladeProperty *property)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_return_val_if_fail (GLADE_IS_PROPERTY (property), FALSE);
|
|
Packit |
1e8aac |
return property->priv->i18n_translatable;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_property_set_sensitive (GladeProperty *property,
|
|
Packit |
1e8aac |
gboolean sensitive,
|
|
Packit |
1e8aac |
const gchar *reason)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_return_if_fail (GLADE_IS_PROPERTY (property));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* reason is only why we're disableing it */
|
|
Packit |
1e8aac |
if (sensitive == FALSE)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
if (property->priv->insensitive_tooltip)
|
|
Packit |
1e8aac |
g_free (property->priv->insensitive_tooltip);
|
|
Packit |
1e8aac |
property->priv->insensitive_tooltip = g_strdup (reason);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (property->priv->sensitive != sensitive)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
property->priv->sensitive = sensitive;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Clear it */
|
|
Packit |
1e8aac |
if (sensitive)
|
|
Packit |
1e8aac |
property->priv->insensitive_tooltip =
|
|
Packit |
1e8aac |
(g_free (property->priv->insensitive_tooltip), NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_signal_emit (G_OBJECT (property),
|
|
Packit |
1e8aac |
glade_property_signals[TOOLTIP_CHANGED],
|
|
Packit |
1e8aac |
0,
|
|
Packit |
1e8aac |
glade_property_class_get_tooltip (property->priv->klass),
|
|
Packit |
1e8aac |
property->priv->insensitive_tooltip,
|
|
Packit |
1e8aac |
property->priv->support_warning);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
g_object_notify_by_pspec (G_OBJECT (property), properties[PROP_SENSITIVE]);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
G_CONST_RETURN gchar *
|
|
Packit |
1e8aac |
glade_propert_get_insensitive_tooltip (GladeProperty *property)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_return_val_if_fail (GLADE_IS_PROPERTY (property), NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return property->priv->insensitive_tooltip;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gboolean
|
|
Packit |
1e8aac |
glade_property_get_sensitive (GladeProperty *property)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_return_val_if_fail (GLADE_IS_PROPERTY (property), FALSE);
|
|
Packit |
1e8aac |
return property->priv->sensitive;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_property_set_support_warning (GladeProperty *property,
|
|
Packit |
1e8aac |
gboolean disable,
|
|
Packit |
1e8aac |
const gchar *reason)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gboolean warn_before, warn_after;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_if_fail (GLADE_IS_PROPERTY (property));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Check pre-changed warning state */
|
|
Packit |
1e8aac |
warn_before = glade_property_warn_usage (property);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (property->priv->support_warning)
|
|
Packit |
1e8aac |
g_free (property->priv->support_warning);
|
|
Packit |
1e8aac |
property->priv->support_warning = g_strdup (reason);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
property->priv->support_disabled = disable;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_signal_emit (G_OBJECT (property),
|
|
Packit |
1e8aac |
glade_property_signals[TOOLTIP_CHANGED],
|
|
Packit |
1e8aac |
0,
|
|
Packit |
1e8aac |
glade_property_class_get_tooltip (property->priv->klass),
|
|
Packit |
1e8aac |
property->priv->insensitive_tooltip,
|
|
Packit |
1e8aac |
property->priv->support_warning);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_property_fix_state (property);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Check post-changed warning state */
|
|
Packit |
1e8aac |
warn_after = glade_property_warn_usage (property);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Update owning widget's warning state if need be */
|
|
Packit |
1e8aac |
if (property->priv->widget != NULL && warn_before != warn_after)
|
|
Packit |
1e8aac |
glade_widget_verify (property->priv->widget);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
G_CONST_RETURN gchar *
|
|
Packit |
1e8aac |
glade_property_get_support_warning (GladeProperty *property)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_return_val_if_fail (GLADE_IS_PROPERTY (property), NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return property->priv->support_warning;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gboolean
|
|
Packit |
1e8aac |
glade_property_warn_usage (GladeProperty *property)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_return_val_if_fail (GLADE_IS_PROPERTY (property), FALSE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (!property->priv->support_warning)
|
|
Packit |
1e8aac |
return FALSE;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return ((property->priv->state & GLADE_STATE_CHANGED) != 0);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* glade_property_set_save_always:
|
|
Packit |
1e8aac |
* @property: A #GladeProperty
|
|
Packit |
1e8aac |
* @setting: the value to set
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Sets whether this property should be special cased
|
|
Packit |
1e8aac |
* to always be saved regardless of its default value.
|
|
Packit |
1e8aac |
* (used for some special cases like properties
|
|
Packit |
1e8aac |
* that are assigned initial values in composite widgets
|
|
Packit |
1e8aac |
* or derived widget code).
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_property_set_save_always (GladeProperty *property, gboolean setting)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_return_if_fail (GLADE_IS_PROPERTY (property));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
property->priv->save_always = setting;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* glade_property_get_save_always:
|
|
Packit |
1e8aac |
* @property: A #GladeProperty
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Returns: whether this property is special cased
|
|
Packit |
1e8aac |
* to always be saved regardless of its default value.
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
gboolean
|
|
Packit |
1e8aac |
glade_property_get_save_always (GladeProperty *property)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_return_val_if_fail (GLADE_IS_PROPERTY (property), FALSE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return property->priv->save_always;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_property_set_enabled (GladeProperty *property, gboolean enabled)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gboolean warn_before, warn_after;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_if_fail (GLADE_IS_PROPERTY (property));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Check pre-changed warning state */
|
|
Packit |
1e8aac |
warn_before = glade_property_warn_usage (property);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
property->priv->enabled = enabled;
|
|
Packit |
1e8aac |
glade_property_sync (property);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_property_fix_state (property);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Check post-changed warning state */
|
|
Packit |
1e8aac |
warn_after = glade_property_warn_usage (property);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Update owning widget's warning state if need be */
|
|
Packit |
1e8aac |
if (property->priv->widget != NULL && warn_before != warn_after)
|
|
Packit |
1e8aac |
glade_widget_verify (property->priv->widget);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_object_notify_by_pspec (G_OBJECT (property), properties[PROP_ENABLED]);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gboolean
|
|
Packit |
1e8aac |
glade_property_get_enabled (GladeProperty * property)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_return_val_if_fail (GLADE_IS_PROPERTY (property), FALSE);
|
|
Packit |
1e8aac |
return property->priv->enabled;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gchar *
|
|
Packit |
1e8aac |
glade_property_make_string (GladeProperty *property)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_return_val_if_fail (GLADE_IS_PROPERTY (property), NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return glade_property_class_make_string_from_gvalue (property->priv->klass,
|
|
Packit |
1e8aac |
property->priv->value);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_property_set_widget (GladeProperty *property,
|
|
Packit |
1e8aac |
GladeWidget *widget)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_return_if_fail (GLADE_IS_PROPERTY (property));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
property->priv->widget = widget;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GladeWidget *
|
|
Packit |
1e8aac |
glade_property_get_widget (GladeProperty *property)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_return_val_if_fail (GLADE_IS_PROPERTY (property), NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return property->priv->widget;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GValue *
|
|
Packit |
1e8aac |
glade_property_inline_value (GladeProperty *property)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_return_val_if_fail (GLADE_IS_PROPERTY (property), NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return property->priv->value;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GladePropertyState
|
|
Packit |
1e8aac |
glade_property_get_state (GladeProperty *property)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_return_val_if_fail (GLADE_IS_PROPERTY (property), 0);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return property->priv->state;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gint glade_property_su_stack = 0;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_property_push_superuser (void)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
glade_property_su_stack++;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_property_pop_superuser (void)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
if (--glade_property_su_stack < 0)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_critical ("Bug: property super user stack is corrupt.\n");
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gboolean
|
|
Packit |
1e8aac |
glade_property_superuser (void)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
return glade_property_su_stack > 0;
|
|
Packit |
1e8aac |
}
|