|
Packit |
1e8aac |
/*
|
|
Packit |
1e8aac |
* Copyright (C) 2007 Juan Pablo Ugarte.
|
|
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 |
* Juan Pablo Ugarte <juanpablougarte@gmail.com>
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* SECTION:glade-widget-action
|
|
Packit |
1e8aac |
* @Title: GladeWidgetAction
|
|
Packit |
1e8aac |
* @Short_Description: Context menu and toolbar actions.
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Use #GladeWidgetAction to create custom routines to operate
|
|
Packit |
1e8aac |
* on widgets you add to glade, when running #GladeActionActivateFunc functions
|
|
Packit |
1e8aac |
* you should make sure to use #GladeCommand.
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
#include "glade-widget-action.h"
|
|
Packit |
1e8aac |
#include "config.h"
|
|
Packit |
1e8aac |
#include <glib/gi18n-lib.h>
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
enum
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
PROP_0,
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
PROP_CLASS,
|
|
Packit |
1e8aac |
PROP_SENSITIVE,
|
|
Packit |
1e8aac |
PROP_VISIBLE,
|
|
Packit |
1e8aac |
N_PROPERTIES
|
|
Packit |
1e8aac |
};
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
struct _GladeWidgetActionPrivate
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GWActionClass *klass; /* The action class */
|
|
Packit |
1e8aac |
GList *actions; /* List of actions */
|
|
Packit |
1e8aac |
guint sensitive : 1; /* If this action is sensitive or not */
|
|
Packit |
1e8aac |
guint visible : 1; /* If this action is visible or not */
|
|
Packit |
1e8aac |
};
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static GParamSpec *properties[N_PROPERTIES];
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
G_DEFINE_TYPE_WITH_PRIVATE (GladeWidgetAction, glade_widget_action, G_TYPE_OBJECT);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_widget_action_init (GladeWidgetAction *object)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
object->priv = glade_widget_action_get_instance_private (object);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
object->priv->sensitive = TRUE;
|
|
Packit |
1e8aac |
object->priv->visible = TRUE;
|
|
Packit |
1e8aac |
object->priv->actions = NULL;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_widget_action_finalize (GObject *object)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeWidgetAction *action = GLADE_WIDGET_ACTION (object);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (action->priv->actions)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_list_foreach (action->priv->actions, (GFunc) g_object_unref, NULL);
|
|
Packit |
1e8aac |
g_list_free (action->priv->actions);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
G_OBJECT_CLASS (glade_widget_action_parent_class)->finalize (object);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static GObject *
|
|
Packit |
1e8aac |
glade_widget_action_constructor (GType type,
|
|
Packit |
1e8aac |
guint n_construct_properties,
|
|
Packit |
1e8aac |
GObjectConstructParam *construct_properties)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeWidgetAction *action;
|
|
Packit |
1e8aac |
GObject *object;
|
|
Packit |
1e8aac |
GList *l;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
object = G_OBJECT_CLASS (glade_widget_action_parent_class)->constructor
|
|
Packit |
1e8aac |
(type, n_construct_properties, construct_properties);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
action = GLADE_WIDGET_ACTION (object);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (action->priv->klass == NULL)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_warning ("GladeWidgetAction constructed without class property");
|
|
Packit |
1e8aac |
return object;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
for (l = action->priv->klass->actions; l; l = g_list_next (l))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GWActionClass *action_class = l->data;
|
|
Packit |
1e8aac |
GObject *obj = g_object_new (GLADE_TYPE_WIDGET_ACTION,
|
|
Packit |
1e8aac |
"class", action_class,
|
|
Packit |
1e8aac |
NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
action->priv->actions = g_list_prepend (action->priv->actions,
|
|
Packit |
1e8aac |
GLADE_WIDGET_ACTION (obj));
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
action->priv->actions = g_list_reverse (action->priv->actions);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return object;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_widget_action_set_property (GObject *object,
|
|
Packit |
1e8aac |
guint prop_id,
|
|
Packit |
1e8aac |
const GValue *value,
|
|
Packit |
1e8aac |
GParamSpec *pspec)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeWidgetAction *action = GLADE_WIDGET_ACTION (object);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_if_fail (GLADE_IS_WIDGET_ACTION (object));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
switch (prop_id)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
case PROP_CLASS:
|
|
Packit |
1e8aac |
action->priv->klass = g_value_get_pointer (value);
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
case PROP_SENSITIVE:
|
|
Packit |
1e8aac |
glade_widget_action_set_sensitive (action, g_value_get_boolean (value));
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
case PROP_VISIBLE:
|
|
Packit |
1e8aac |
glade_widget_action_set_visible (action, g_value_get_boolean (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_widget_action_get_property (GObject *object,
|
|
Packit |
1e8aac |
guint prop_id,
|
|
Packit |
1e8aac |
GValue *value,
|
|
Packit |
1e8aac |
GParamSpec *pspec)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeWidgetAction *action = GLADE_WIDGET_ACTION (object);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_if_fail (GLADE_IS_WIDGET_ACTION (object));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
switch (prop_id)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
case PROP_CLASS:
|
|
Packit |
1e8aac |
g_value_set_pointer (value, action->priv->klass);
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
case PROP_SENSITIVE:
|
|
Packit |
1e8aac |
g_value_set_boolean (value, action->priv->sensitive);
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
case PROP_VISIBLE:
|
|
Packit |
1e8aac |
g_value_set_boolean (value, action->priv->visible);
|
|
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_widget_action_class_init (GladeWidgetActionClass *klass)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
object_class->constructor = glade_widget_action_constructor;
|
|
Packit |
1e8aac |
object_class->finalize = glade_widget_action_finalize;
|
|
Packit |
1e8aac |
object_class->set_property = glade_widget_action_set_property;
|
|
Packit |
1e8aac |
object_class->get_property = glade_widget_action_get_property;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
properties[PROP_CLASS] =
|
|
Packit |
1e8aac |
g_param_spec_pointer ("class",
|
|
Packit |
1e8aac |
_("class"),
|
|
Packit |
1e8aac |
_("GladeWidgetActionClass structure pointer"),
|
|
Packit |
1e8aac |
G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
properties[PROP_SENSITIVE] =
|
|
Packit |
1e8aac |
g_param_spec_boolean ("sensitive",
|
|
Packit |
1e8aac |
_("Sensitive"),
|
|
Packit |
1e8aac |
_("Whether this action is sensitive"),
|
|
Packit |
1e8aac |
TRUE,
|
|
Packit |
1e8aac |
G_PARAM_READWRITE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
properties[PROP_VISIBLE] =
|
|
Packit |
1e8aac |
g_param_spec_boolean ("visible",
|
|
Packit |
1e8aac |
_("Visible"),
|
|
Packit |
1e8aac |
_("Whether this action is visible"),
|
|
Packit |
1e8aac |
TRUE,
|
|
Packit |
1e8aac |
G_PARAM_READWRITE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Install all properties */
|
|
Packit |
1e8aac |
g_object_class_install_properties (object_class, N_PROPERTIES, properties);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* glade_widget_action_set_sensitive:
|
|
Packit |
1e8aac |
* @action: a #GladeWidgetAction
|
|
Packit |
1e8aac |
* @sensitive:
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Set whether or not this action is sensitive.
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_widget_action_set_sensitive (GladeWidgetAction *action,
|
|
Packit |
1e8aac |
gboolean sensitive)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_return_if_fail (GLADE_IS_WIDGET_ACTION (action));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
action->priv->sensitive = sensitive;
|
|
Packit |
1e8aac |
g_object_notify_by_pspec (G_OBJECT (action), properties[PROP_SENSITIVE]);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gboolean
|
|
Packit |
1e8aac |
glade_widget_action_get_sensitive (GladeWidgetAction *action)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_return_val_if_fail (GLADE_IS_WIDGET_ACTION (action), FALSE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return action->priv->sensitive;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_widget_action_set_visible (GladeWidgetAction *action,
|
|
Packit |
1e8aac |
gboolean visible)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_return_if_fail (GLADE_IS_WIDGET_ACTION (action));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
action->priv->visible = visible;
|
|
Packit |
1e8aac |
g_object_notify_by_pspec (G_OBJECT (action), properties[PROP_VISIBLE]);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gboolean
|
|
Packit |
1e8aac |
glade_widget_action_get_visible (GladeWidgetAction *action)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_return_val_if_fail (GLADE_IS_WIDGET_ACTION (action), FALSE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return action->priv->visible;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GList *
|
|
Packit |
1e8aac |
glade_widget_action_get_children (GladeWidgetAction *action)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_return_val_if_fail (GLADE_IS_WIDGET_ACTION (action), NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return action->priv->actions;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GWActionClass *
|
|
Packit |
1e8aac |
glade_widget_action_get_class (GladeWidgetAction *action)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_return_val_if_fail (GLADE_IS_WIDGET_ACTION (action), NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return action->priv->klass;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/***************************************************************
|
|
Packit |
1e8aac |
* GWActionClass *
|
|
Packit |
1e8aac |
***************************************************************/
|
|
Packit |
1e8aac |
static const gchar *
|
|
Packit |
1e8aac |
gwa_action_path_get_id (const gchar *action_path)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
const gchar *id;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if ((id = g_strrstr (action_path, "/")) && id[1] != '\0')
|
|
Packit |
1e8aac |
return &id[1];
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
return action_path;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* glade_widget_action_class_new:
|
|
Packit |
1e8aac |
* @path: the action path
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Returns: a newlly created #GWActionClass for @path.
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
GWActionClass *
|
|
Packit |
1e8aac |
glade_widget_action_class_new (const gchar *path)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GWActionClass *action;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
action = g_slice_new0 (GWActionClass);
|
|
Packit |
1e8aac |
action->path = g_strdup (path);
|
|
Packit |
1e8aac |
action->id = gwa_action_path_get_id (action->path);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return action;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* glade_widget_action_class_clone:
|
|
Packit |
1e8aac |
* @action: a GWActionClass
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Returns: a newlly allocated copy of @action.
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
GWActionClass *
|
|
Packit |
1e8aac |
glade_widget_action_class_clone (GWActionClass *action)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GWActionClass *copy;
|
|
Packit |
1e8aac |
GList *l;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_val_if_fail (action != NULL, NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
copy = glade_widget_action_class_new (action->path);
|
|
Packit |
1e8aac |
copy->label = g_strdup (action->label);
|
|
Packit |
1e8aac |
copy->stock = g_strdup (action->stock);
|
|
Packit |
1e8aac |
copy->important = action->important;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
for (l = action->actions; l; l = g_list_next (l))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GWActionClass *child = glade_widget_action_class_clone (l->data);
|
|
Packit |
1e8aac |
copy->actions = g_list_prepend (copy->actions, child);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
copy->actions = g_list_reverse (copy->actions);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return copy;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* glade_widegt_action_class_free:
|
|
Packit |
1e8aac |
* @action: a GWActionClass
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Frees a GWActionClass.
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_widget_action_class_free (GWActionClass *action)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
if (action->actions)
|
|
Packit |
1e8aac |
g_list_foreach (action->actions, (GFunc) glade_widget_action_class_free,
|
|
Packit |
1e8aac |
NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Dont free id since it points into path directly */
|
|
Packit |
1e8aac |
g_free (action->path);
|
|
Packit |
1e8aac |
g_free (action->label);
|
|
Packit |
1e8aac |
g_free (action->stock);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_slice_free (GWActionClass, action);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_widget_action_class_set_label (GWActionClass *action,
|
|
Packit |
1e8aac |
const gchar *label)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_free (action->label);
|
|
Packit |
1e8aac |
action->label = g_strdup (label);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_widget_action_class_set_stock (GWActionClass *action,
|
|
Packit |
1e8aac |
const gchar *stock)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_free (action->stock);
|
|
Packit |
1e8aac |
action->stock = g_strdup (stock);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_widget_action_class_set_important (GWActionClass *action,
|
|
Packit |
1e8aac |
gboolean important)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
action->important = important;
|
|
Packit |
1e8aac |
}
|