|
Packit |
1e8aac |
/*
|
|
Packit |
1e8aac |
* glade-signal-model.c
|
|
Packit |
1e8aac |
* Copyright (C) Johannes Schmid 2010 <jhs@gnome.org>
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* This library is free software; you can redistribute it and/or modify it
|
|
Packit |
1e8aac |
* under the terms of the GNU Lesser General Public License as
|
|
Packit |
1e8aac |
* published by the Free Software Foundation; either version 2.1 of
|
|
Packit |
1e8aac |
* the License, or (at your option) any later version.
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* This library is distributed in the hope that it will be useful, but
|
|
Packit |
1e8aac |
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
1e8aac |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
1e8aac |
* Lesser General Public License for more details.
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* You should have received a copy of the GNU Lesser General Public
|
|
Packit |
1e8aac |
* License along with this program; if not, write to the Free Software
|
|
Packit |
1e8aac |
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
#ifdef HAVE_CONFIG_H
|
|
Packit |
1e8aac |
#include <config.h>
|
|
Packit |
1e8aac |
#endif
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
#include "glade-signal-model.h"
|
|
Packit |
1e8aac |
#include "glade-project.h"
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
#include <glib/gi18n-lib.h>
|
|
Packit |
1e8aac |
#include <string.h>
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
#define DETAIL_DEFAULT _("<Type here>")
|
|
Packit |
1e8aac |
#define HANDLER_DEFAULT _("<Type here>")
|
|
Packit |
1e8aac |
#define USERDATA_DEFAULT _("<Click here>")
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
struct _GladeSignalModelPrivate
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeWidget *widget;
|
|
Packit |
1e8aac |
GList *widgets; /* names of the widgets that this widgets derives from and that have signals */
|
|
Packit |
1e8aac |
gint stamp;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GHashTable *dummy_signals;
|
|
Packit |
1e8aac |
GHashTable *signals; /* signals of the widget */
|
|
Packit |
1e8aac |
};
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
enum
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
PROP_0,
|
|
Packit |
1e8aac |
PROP_WIDGET,
|
|
Packit |
1e8aac |
PROP_SIGNALS
|
|
Packit |
1e8aac |
};
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void gtk_tree_model_iface_init (GtkTreeModelIface *iface);
|
|
Packit |
1e8aac |
static void gtk_tree_drag_source_iface_init (GtkTreeDragSourceIface *iface);
|
|
Packit |
1e8aac |
static void on_glade_signal_model_added (GladeWidget *widget, const GladeSignal *signal,
|
|
Packit |
1e8aac |
GladeSignalModel *model);
|
|
Packit |
1e8aac |
static void on_glade_signal_model_removed (GladeWidget *widget, const GladeSignal *signal,
|
|
Packit |
1e8aac |
GladeSignalModel *model);
|
|
Packit |
1e8aac |
static void on_glade_signal_model_changed (GladeWidget *widget, const GladeSignal *signal,
|
|
Packit |
1e8aac |
GladeSignalModel *model);
|
|
Packit |
1e8aac |
static void on_glade_widget_support_changed (GladeWidget *widget, GladeSignalModel *model);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
G_DEFINE_TYPE_WITH_CODE (GladeSignalModel, glade_signal_model, G_TYPE_OBJECT,
|
|
Packit |
1e8aac |
G_ADD_PRIVATE (GladeSignalModel)
|
|
Packit |
1e8aac |
G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_MODEL,
|
|
Packit |
1e8aac |
gtk_tree_model_iface_init);
|
|
Packit |
1e8aac |
G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_DRAG_SOURCE,
|
|
Packit |
1e8aac |
gtk_tree_drag_source_iface_init))
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_signal_model_init (GladeSignalModel *object)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
object->priv = glade_signal_model_get_instance_private (object);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
object->priv->dummy_signals =
|
|
Packit |
1e8aac |
g_hash_table_new_full (g_str_hash, g_str_equal, NULL, (GDestroyNotify) g_object_unref);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_signal_model_create_widget_list (GladeSignalModel *sig_model)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
const GList *list;
|
|
Packit |
1e8aac |
GladeWidget *widget = sig_model->priv->widget;
|
|
Packit |
1e8aac |
GladeWidgetAdaptor *adaptor = glade_widget_get_adaptor (widget);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
for (list = glade_widget_adaptor_get_signals (adaptor);
|
|
Packit |
1e8aac |
list != NULL; list = g_list_next (list))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeSignalClass *signal = (GladeSignalClass *) list->data;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (!g_list_find_custom (sig_model->priv->widgets,
|
|
Packit |
1e8aac |
(gpointer) glade_signal_class_get_type (signal), (GCompareFunc) strcmp))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
sig_model->priv->widgets =
|
|
Packit |
1e8aac |
g_list_prepend (sig_model->priv->widgets, (gpointer) glade_signal_class_get_type (signal));
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
sig_model->priv->widgets = g_list_reverse (sig_model->priv->widgets);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_signal_model_finalize (GObject *object)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeSignalModel *sig_model = GLADE_SIGNAL_MODEL (object);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_list_free (sig_model->priv->widgets);
|
|
Packit |
1e8aac |
g_hash_table_destroy (sig_model->priv->dummy_signals);
|
|
Packit |
1e8aac |
G_OBJECT_CLASS (glade_signal_model_parent_class)->finalize (object);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_signal_model_set_property (GObject *object,
|
|
Packit |
1e8aac |
guint prop_id,
|
|
Packit |
1e8aac |
const GValue *value,
|
|
Packit |
1e8aac |
GParamSpec *pspec)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeSignalModel *sig_model;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_if_fail (GLADE_IS_SIGNAL_MODEL (object));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
sig_model = GLADE_SIGNAL_MODEL (object);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
switch (prop_id)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
case PROP_WIDGET:
|
|
Packit |
1e8aac |
sig_model->priv->widget = g_value_get_object (value);
|
|
Packit |
1e8aac |
glade_signal_model_create_widget_list (sig_model);
|
|
Packit |
1e8aac |
g_signal_connect (sig_model->priv->widget, "add-signal-handler",
|
|
Packit |
1e8aac |
G_CALLBACK (on_glade_signal_model_added), sig_model);
|
|
Packit |
1e8aac |
g_signal_connect (sig_model->priv->widget, "remove-signal-handler",
|
|
Packit |
1e8aac |
G_CALLBACK (on_glade_signal_model_removed), sig_model);
|
|
Packit |
1e8aac |
g_signal_connect (sig_model->priv->widget, "change-signal-handler",
|
|
Packit |
1e8aac |
G_CALLBACK (on_glade_signal_model_changed), sig_model);
|
|
Packit |
1e8aac |
g_signal_connect (sig_model->priv->widget, "support-changed",
|
|
Packit |
1e8aac |
G_CALLBACK (on_glade_widget_support_changed), sig_model);
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
case PROP_SIGNALS:
|
|
Packit |
1e8aac |
sig_model->priv->signals = g_value_get_pointer (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_signal_model_get_property (GObject *object,
|
|
Packit |
1e8aac |
guint prop_id,
|
|
Packit |
1e8aac |
GValue *value,
|
|
Packit |
1e8aac |
GParamSpec *pspec)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeSignalModel *sig_model;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_if_fail (GLADE_IS_SIGNAL_MODEL (object));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
sig_model = GLADE_SIGNAL_MODEL (object);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
switch (prop_id)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
case PROP_WIDGET:
|
|
Packit |
1e8aac |
g_value_set_object (value, sig_model->priv->widget);
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
case PROP_SIGNALS:
|
|
Packit |
1e8aac |
g_value_set_pointer (value, sig_model->priv->signals);
|
|
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_signal_model_class_init (GladeSignalModelClass *klass)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
object_class->finalize = glade_signal_model_finalize;
|
|
Packit |
1e8aac |
object_class->set_property = glade_signal_model_set_property;
|
|
Packit |
1e8aac |
object_class->get_property = glade_signal_model_get_property;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_object_class_install_property (object_class,
|
|
Packit |
1e8aac |
PROP_WIDGET,
|
|
Packit |
1e8aac |
g_param_spec_object ("widget",
|
|
Packit |
1e8aac |
"A GladeWidget",
|
|
Packit |
1e8aac |
"The GladeWidget used to query the signals",
|
|
Packit |
1e8aac |
GLADE_TYPE_WIDGET,
|
|
Packit |
1e8aac |
G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE));
|
|
Packit |
1e8aac |
g_object_class_install_property (object_class,
|
|
Packit |
1e8aac |
PROP_SIGNALS,
|
|
Packit |
1e8aac |
g_param_spec_pointer ("signals",
|
|
Packit |
1e8aac |
"A GHashTable containing the widget signals",
|
|
Packit |
1e8aac |
"Use to query signals",
|
|
Packit |
1e8aac |
G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE));
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/*
|
|
Packit |
1e8aac |
* glade_signal_model_new:
|
|
Packit |
1e8aac |
* @widget: The GladeWidget the signals belong to
|
|
Packit |
1e8aac |
* @signals: The signals of the #GladeWidget
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Creates a new GladeSignalModel object to show and edit the
|
|
Packit |
1e8aac |
* signals of a widgets in a GtkTreeView
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GtkTreeModel *
|
|
Packit |
1e8aac |
glade_signal_model_new (GladeWidget *widget, GHashTable *signals)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GObject *object = g_object_new (GLADE_TYPE_SIGNAL_MODEL,
|
|
Packit |
1e8aac |
"widget", widget,
|
|
Packit |
1e8aac |
"signals", signals, NULL);
|
|
Packit |
1e8aac |
return GTK_TREE_MODEL (object);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static GtkTreeModelFlags
|
|
Packit |
1e8aac |
glade_signal_model_get_flags (GtkTreeModel *model)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
return 0;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gint
|
|
Packit |
1e8aac |
glade_signal_model_get_n_columns (GtkTreeModel *model)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
return GLADE_SIGNAL_N_COLUMNS;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static GType
|
|
Packit |
1e8aac |
glade_signal_model_get_column_type (GtkTreeModel *model, gint column)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
switch (column)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
case GLADE_SIGNAL_COLUMN_NAME:
|
|
Packit |
1e8aac |
return G_TYPE_STRING;
|
|
Packit |
1e8aac |
case GLADE_SIGNAL_COLUMN_SHOW_NAME:
|
|
Packit |
1e8aac |
return G_TYPE_BOOLEAN;
|
|
Packit |
1e8aac |
case GLADE_SIGNAL_COLUMN_HANDLER:
|
|
Packit |
1e8aac |
return G_TYPE_STRING;
|
|
Packit |
1e8aac |
case GLADE_SIGNAL_COLUMN_OBJECT:
|
|
Packit |
1e8aac |
return G_TYPE_STRING;
|
|
Packit |
1e8aac |
case GLADE_SIGNAL_COLUMN_SWAP:
|
|
Packit |
1e8aac |
return G_TYPE_BOOLEAN;
|
|
Packit |
1e8aac |
case GLADE_SIGNAL_COLUMN_AFTER:
|
|
Packit |
1e8aac |
return G_TYPE_BOOLEAN;
|
|
Packit |
1e8aac |
case GLADE_SIGNAL_COLUMN_TOOLTIP:
|
|
Packit |
1e8aac |
return G_TYPE_STRING;
|
|
Packit |
1e8aac |
case GLADE_SIGNAL_COLUMN_SIGNAL:
|
|
Packit |
1e8aac |
return G_TYPE_OBJECT;
|
|
Packit |
1e8aac |
case GLADE_SIGNAL_COLUMN_DETAIL:
|
|
Packit |
1e8aac |
return G_TYPE_STRING;
|
|
Packit |
1e8aac |
default:
|
|
Packit |
1e8aac |
g_assert_not_reached();
|
|
Packit |
1e8aac |
return G_TYPE_NONE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
enum
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
ITER_WIDGET = 0,
|
|
Packit |
1e8aac |
ITER_SIGNAL = 1,
|
|
Packit |
1e8aac |
};
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static inline gboolean
|
|
Packit |
1e8aac |
glade_signal_model_is_dummy_handler (GladeSignalModel *model,
|
|
Packit |
1e8aac |
GladeSignal *signal)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
return glade_signal_get_handler (signal) == NULL;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static GladeSignal *
|
|
Packit |
1e8aac |
glade_signal_model_get_dummy_handler (GladeSignalModel *model,
|
|
Packit |
1e8aac |
const GladeSignalClass *sig_class)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeSignal *signal;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
signal = g_hash_table_lookup (model->priv->dummy_signals,
|
|
Packit |
1e8aac |
glade_signal_class_get_name (sig_class));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (!signal)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
signal = glade_signal_new (sig_class,
|
|
Packit |
1e8aac |
NULL,
|
|
Packit |
1e8aac |
NULL,
|
|
Packit |
1e8aac |
FALSE,
|
|
Packit |
1e8aac |
FALSE);
|
|
Packit |
1e8aac |
g_hash_table_insert (model->priv->dummy_signals,
|
|
Packit |
1e8aac |
(gpointer) glade_signal_class_get_name (sig_class),
|
|
Packit |
1e8aac |
signal);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_project_verify_signal (model->priv->widget, signal);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
return signal;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_signal_model_create_widget_iter (GladeSignalModel *sig_model,
|
|
Packit |
1e8aac |
const gchar *widget,
|
|
Packit |
1e8aac |
GtkTreeIter *iter)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
iter->stamp = sig_model->priv->stamp;
|
|
Packit |
1e8aac |
iter->user_data = (gpointer) widget;
|
|
Packit |
1e8aac |
iter->user_data2 = NULL;
|
|
Packit |
1e8aac |
iter->user_data3 = NULL;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_signal_model_create_signal_iter (GladeSignalModel *sig_model,
|
|
Packit |
1e8aac |
const gchar *widget,
|
|
Packit |
1e8aac |
const GladeSignal *signal,
|
|
Packit |
1e8aac |
GtkTreeIter *iter)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
glade_signal_model_create_widget_iter (sig_model, widget, iter);
|
|
Packit |
1e8aac |
iter->user_data2 = GLADE_SIGNAL (signal);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static GList *
|
|
Packit |
1e8aac |
glade_signal_model_create_signal_list (GladeSignalModel *sig_model,
|
|
Packit |
1e8aac |
const gchar *widget_type)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GList *widget_signals = NULL;
|
|
Packit |
1e8aac |
const GList *signals;
|
|
Packit |
1e8aac |
GladeWidget *widget = sig_model->priv->widget;
|
|
Packit |
1e8aac |
GladeWidgetAdaptor *adaptor = glade_widget_get_adaptor (widget);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
for (signals = glade_widget_adaptor_get_signals (adaptor);
|
|
Packit |
1e8aac |
signals != NULL;
|
|
Packit |
1e8aac |
signals = g_list_next (signals))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeSignalClass *sig_class = signals->data;
|
|
Packit |
1e8aac |
if (g_str_equal (glade_signal_class_get_type (sig_class), widget_type))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
widget_signals = g_list_append (widget_signals, sig_class);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
return widget_signals;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
on_glade_signal_model_added (GladeWidget *widget,
|
|
Packit |
1e8aac |
const GladeSignal *signal,
|
|
Packit |
1e8aac |
GladeSignalModel* model)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkTreeIter iter;
|
|
Packit |
1e8aac |
GtkTreePath *path;
|
|
Packit |
1e8aac |
const GladeSignalClass *sig_class = glade_signal_get_class (signal);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_signal_model_create_signal_iter (model,
|
|
Packit |
1e8aac |
glade_signal_class_get_type (sig_class),
|
|
Packit |
1e8aac |
signal,
|
|
Packit |
1e8aac |
&iter);
|
|
Packit |
1e8aac |
path = gtk_tree_model_get_path (GTK_TREE_MODEL (model), &iter);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_tree_model_row_inserted (GTK_TREE_MODEL (model), path, &iter);
|
|
Packit |
1e8aac |
gtk_tree_path_free (path);
|
|
Packit |
1e8aac |
model->priv->stamp++;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
on_glade_signal_model_removed (GladeWidget *widget,
|
|
Packit |
1e8aac |
const GladeSignal *signal,
|
|
Packit |
1e8aac |
GladeSignalModel *model)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkTreeIter iter;
|
|
Packit |
1e8aac |
GtkTreePath *path;
|
|
Packit |
1e8aac |
const GladeSignalClass *sig_class = glade_signal_get_class (signal);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_signal_model_create_signal_iter (model,
|
|
Packit |
1e8aac |
glade_signal_class_get_type (sig_class),
|
|
Packit |
1e8aac |
signal,
|
|
Packit |
1e8aac |
&iter);
|
|
Packit |
1e8aac |
path = gtk_tree_model_get_path (GTK_TREE_MODEL (model), &iter);
|
|
Packit |
1e8aac |
gtk_tree_model_row_deleted (GTK_TREE_MODEL (model), path);
|
|
Packit |
1e8aac |
gtk_tree_path_free (path);
|
|
Packit |
1e8aac |
model->priv->stamp++;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
on_glade_signal_model_changed (GladeWidget *widget,
|
|
Packit |
1e8aac |
const GladeSignal *signal,
|
|
Packit |
1e8aac |
GladeSignalModel *model)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkTreeIter iter;
|
|
Packit |
1e8aac |
GtkTreePath *path;
|
|
Packit |
1e8aac |
const GladeSignalClass *sig_class = glade_signal_get_class (signal);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_signal_model_create_signal_iter (model,
|
|
Packit |
1e8aac |
glade_signal_class_get_type (sig_class),
|
|
Packit |
1e8aac |
signal,
|
|
Packit |
1e8aac |
&iter);
|
|
Packit |
1e8aac |
path = gtk_tree_model_get_path (GTK_TREE_MODEL (model), &iter);
|
|
Packit |
1e8aac |
gtk_tree_model_row_changed (GTK_TREE_MODEL (model), path, &iter);
|
|
Packit |
1e8aac |
gtk_tree_path_free (path);
|
|
Packit |
1e8aac |
model->priv->stamp++;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
verify_dummies (const gchar *signal_name,
|
|
Packit |
1e8aac |
GladeSignal *signal,
|
|
Packit |
1e8aac |
GladeSignalModel *model)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
glade_project_verify_signal (model->priv->widget, signal);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
on_glade_signal_model_changed (model->priv->widget, signal, model);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
emit_changed (const gchar *signal_name,
|
|
Packit |
1e8aac |
GPtrArray *signals,
|
|
Packit |
1e8aac |
GladeSignalModel *model)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gint i;
|
|
Packit |
1e8aac |
GladeSignal *signal;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
for (i = 0; i < signals->len; i++)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
signal = (GladeSignal *)signals->pdata[i];
|
|
Packit |
1e8aac |
on_glade_signal_model_changed (model->priv->widget, signal, model);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
on_glade_widget_support_changed (GladeWidget *widget, GladeSignalModel *model)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
/* Update support warning on dummy signals */
|
|
Packit |
1e8aac |
g_hash_table_foreach (model->priv->dummy_signals, (GHFunc)verify_dummies, model);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* row changed on every row */
|
|
Packit |
1e8aac |
g_hash_table_foreach (model->priv->signals, (GHFunc)emit_changed, model);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
glade_signal_model_get_iter (GtkTreeModel *model,
|
|
Packit |
1e8aac |
GtkTreeIter *iter,
|
|
Packit |
1e8aac |
GtkTreePath *path)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gint *indices;
|
|
Packit |
1e8aac |
gint depth;
|
|
Packit |
1e8aac |
GladeSignalModel *sig_model;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_val_if_fail (path != NULL, FALSE);
|
|
Packit |
1e8aac |
g_return_val_if_fail (iter != NULL, FALSE);
|
|
Packit |
1e8aac |
g_return_val_if_fail (GLADE_IS_SIGNAL_MODEL(model), FALSE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
indices = gtk_tree_path_get_indices(path);
|
|
Packit |
1e8aac |
depth = gtk_tree_path_get_depth (path);
|
|
Packit |
1e8aac |
sig_model = GLADE_SIGNAL_MODEL (model);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
switch (depth)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
case 1:
|
|
Packit |
1e8aac |
/* Widget */
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
glade_signal_model_create_widget_iter (sig_model,
|
|
Packit |
1e8aac |
g_list_nth_data (sig_model->priv->widgets,
|
|
Packit |
1e8aac |
indices[ITER_WIDGET]),
|
|
Packit |
1e8aac |
iter);
|
|
Packit |
1e8aac |
return TRUE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
case 2:
|
|
Packit |
1e8aac |
/* Signal */
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gboolean retval;
|
|
Packit |
1e8aac |
GtkTreePath *path =
|
|
Packit |
1e8aac |
gtk_tree_path_new_from_indices (indices[ITER_WIDGET], -1);
|
|
Packit |
1e8aac |
GtkTreeIter widget_iter;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_tree_model_get_iter (model, &widget_iter, path);
|
|
Packit |
1e8aac |
retval = gtk_tree_model_iter_nth_child (model,
|
|
Packit |
1e8aac |
iter,
|
|
Packit |
1e8aac |
&widget_iter,
|
|
Packit |
1e8aac |
indices[ITER_SIGNAL]);
|
|
Packit |
1e8aac |
gtk_tree_path_free (path);
|
|
Packit |
1e8aac |
return retval;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
return FALSE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static GtkTreePath*
|
|
Packit |
1e8aac |
glade_signal_model_get_path (GtkTreeModel *model, GtkTreeIter *iter)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
const gchar *widget;
|
|
Packit |
1e8aac |
GladeSignal *handler;
|
|
Packit |
1e8aac |
GladeSignalModel *sig_model;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_val_if_fail (iter != NULL, NULL);
|
|
Packit |
1e8aac |
g_return_val_if_fail (GLADE_IS_SIGNAL_MODEL(model), NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
widget = iter->user_data;
|
|
Packit |
1e8aac |
handler = iter->user_data2;
|
|
Packit |
1e8aac |
sig_model = GLADE_SIGNAL_MODEL (model);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (handler)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
/* Signal */
|
|
Packit |
1e8aac |
const GladeSignalClass *sig_class = glade_signal_get_class (handler);
|
|
Packit |
1e8aac |
gint index0, index1 = 0;
|
|
Packit |
1e8aac |
GList *signal;
|
|
Packit |
1e8aac |
GList *signals = glade_signal_model_create_signal_list (sig_model,
|
|
Packit |
1e8aac |
widget);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
index0 = g_list_index (sig_model->priv->widgets,
|
|
Packit |
1e8aac |
widget);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
for (signal = signals; signal != NULL; signal = g_list_next (signal))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GPtrArray *handlers = g_hash_table_lookup (sig_model->priv->signals,
|
|
Packit |
1e8aac |
glade_signal_class_get_name (signal->data));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (signal->data != sig_class)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
if (handlers)
|
|
Packit |
1e8aac |
index1 += handlers->len;
|
|
Packit |
1e8aac |
index1++; /* dummy_handler */
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
if (handlers)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
guint handler_index;
|
|
Packit |
1e8aac |
if (g_ptr_array_find (handlers, handler, &handler_index))
|
|
Packit |
1e8aac |
index1 += handler_index;
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
index1 += handlers->len;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
return gtk_tree_path_new_from_indices (index0, index1, -1);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else if (widget)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
/* Widget */
|
|
Packit |
1e8aac |
return gtk_tree_path_new_from_indices (g_list_index (sig_model->priv->widgets,
|
|
Packit |
1e8aac |
widget), -1);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
g_assert_not_reached();
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_signal_model_get_value (GtkTreeModel *model,
|
|
Packit |
1e8aac |
GtkTreeIter *iter,
|
|
Packit |
1e8aac |
gint column,
|
|
Packit |
1e8aac |
GValue *value)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
const gchar *widget;
|
|
Packit |
1e8aac |
GladeSignal *signal;
|
|
Packit |
1e8aac |
GladeSignalModel *sig_model;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_if_fail (iter != NULL);
|
|
Packit |
1e8aac |
g_return_if_fail (GLADE_IS_SIGNAL_MODEL(model));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
widget = iter->user_data;
|
|
Packit |
1e8aac |
signal = iter->user_data2;
|
|
Packit |
1e8aac |
sig_model = GLADE_SIGNAL_MODEL (model);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
value = g_value_init (value,
|
|
Packit |
1e8aac |
glade_signal_model_get_column_type (model, column));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
switch (column)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
case GLADE_SIGNAL_COLUMN_NAME:
|
|
Packit |
1e8aac |
if (signal)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_value_set_static_string (value, glade_signal_get_name (signal));
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
g_value_set_static_string (value, widget);
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
case GLADE_SIGNAL_COLUMN_SHOW_NAME:
|
|
Packit |
1e8aac |
if (signal)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GPtrArray *handlers = g_hash_table_lookup (sig_model->priv->signals,
|
|
Packit |
1e8aac |
glade_signal_get_name (signal));
|
|
Packit |
1e8aac |
guint index;
|
|
Packit |
1e8aac |
if (!handlers || !handlers->len || (g_ptr_array_find (handlers, signal, &index) && index == 0))
|
|
Packit |
1e8aac |
g_value_set_boolean (value, TRUE);
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
g_value_set_boolean (value, FALSE);
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else if (widget)
|
|
Packit |
1e8aac |
g_value_set_boolean (value, TRUE);
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
case GLADE_SIGNAL_COLUMN_HANDLER:
|
|
Packit |
1e8aac |
if (signal)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
const gchar *handler = glade_signal_get_handler (signal);
|
|
Packit |
1e8aac |
g_value_set_static_string (value, handler ? handler : HANDLER_DEFAULT);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
g_value_set_static_string (value, "");
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
case GLADE_SIGNAL_COLUMN_OBJECT:
|
|
Packit |
1e8aac |
if (signal)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
const gchar *userdata = glade_signal_get_userdata (signal);
|
|
Packit |
1e8aac |
if (userdata && strlen (userdata))
|
|
Packit |
1e8aac |
g_value_set_static_string (value, userdata);
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
g_value_set_static_string (value, USERDATA_DEFAULT);
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
g_value_set_static_string (value, "");
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
case GLADE_SIGNAL_COLUMN_SWAP:
|
|
Packit |
1e8aac |
if (signal)
|
|
Packit |
1e8aac |
g_value_set_boolean (value, glade_signal_get_swapped (signal));
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
g_value_set_boolean (value, FALSE);
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
case GLADE_SIGNAL_COLUMN_AFTER:
|
|
Packit |
1e8aac |
if (signal)
|
|
Packit |
1e8aac |
g_value_set_boolean (value, glade_signal_get_after (signal));
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
g_value_set_boolean (value, FALSE);
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
case GLADE_SIGNAL_COLUMN_TOOLTIP:
|
|
Packit |
1e8aac |
if (signal)
|
|
Packit |
1e8aac |
g_value_set_string (value, glade_signal_get_support_warning (signal));
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
g_value_set_static_string (value, NULL);
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
case GLADE_SIGNAL_COLUMN_SIGNAL:
|
|
Packit |
1e8aac |
g_value_set_object (value, signal);
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
case GLADE_SIGNAL_COLUMN_DETAIL:
|
|
Packit |
1e8aac |
if (signal)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
const gchar *detail = glade_signal_get_detail (signal);
|
|
Packit |
1e8aac |
g_value_set_static_string (value, detail ? detail : DETAIL_DEFAULT);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
g_value_set_static_string (value, "");
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
default:
|
|
Packit |
1e8aac |
g_assert_not_reached();
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
glade_signal_model_iter_next_signal (GladeSignalModel *sig_model,
|
|
Packit |
1e8aac |
const gchar *widget,
|
|
Packit |
1e8aac |
GtkTreeIter *iter,
|
|
Packit |
1e8aac |
GList *signal)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
if (signal->next)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
signal = signal->next;
|
|
Packit |
1e8aac |
GladeSignal *next_handler;
|
|
Packit |
1e8aac |
GPtrArray *next_handlers =
|
|
Packit |
1e8aac |
g_hash_table_lookup (sig_model->priv->signals,
|
|
Packit |
1e8aac |
glade_signal_class_get_name (signal->data));
|
|
Packit |
1e8aac |
if (next_handlers && next_handlers->len)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
next_handler = g_ptr_array_index (next_handlers, 0);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
next_handler =
|
|
Packit |
1e8aac |
glade_signal_model_get_dummy_handler (sig_model,
|
|
Packit |
1e8aac |
signal->data);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
glade_signal_model_create_signal_iter (sig_model, widget,
|
|
Packit |
1e8aac |
next_handler,
|
|
Packit |
1e8aac |
iter);
|
|
Packit |
1e8aac |
g_list_free (signal);
|
|
Packit |
1e8aac |
return TRUE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_list_free (signal);
|
|
Packit |
1e8aac |
return FALSE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
glade_signal_model_iter_next (GtkTreeModel *model, GtkTreeIter *iter)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
const gchar *widget;
|
|
Packit |
1e8aac |
GladeSignal *handler;
|
|
Packit |
1e8aac |
GtkTreeIter parent;
|
|
Packit |
1e8aac |
GladeSignalModel *sig_model;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_val_if_fail (iter != NULL, FALSE);
|
|
Packit |
1e8aac |
g_return_val_if_fail (GLADE_IS_SIGNAL_MODEL(model), FALSE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
widget = iter->user_data;
|
|
Packit |
1e8aac |
handler = iter->user_data2;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
sig_model = GLADE_SIGNAL_MODEL (model);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_tree_model_iter_parent (model, &parent, iter);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (handler)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
const GladeSignalClass *sig_class = glade_signal_get_class (handler);
|
|
Packit |
1e8aac |
GList *signals =
|
|
Packit |
1e8aac |
glade_signal_model_create_signal_list (sig_model,
|
|
Packit |
1e8aac |
widget);
|
|
Packit |
1e8aac |
GList* signal = g_list_find (signals, sig_class);
|
|
Packit |
1e8aac |
GPtrArray* handlers = g_hash_table_lookup (sig_model->priv->signals,
|
|
Packit |
1e8aac |
glade_signal_class_get_name (sig_class));
|
|
Packit |
1e8aac |
if (glade_signal_model_is_dummy_handler (sig_model, handler))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
return glade_signal_model_iter_next_signal (sig_model, widget, iter, signal);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else if (handlers)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
guint new_index = 0;
|
|
Packit |
1e8aac |
if (g_ptr_array_find (handlers, handler, &new_index))
|
|
Packit |
1e8aac |
new_index++;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (new_index < handlers->len)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
glade_signal_model_create_signal_iter (sig_model, widget,
|
|
Packit |
1e8aac |
g_ptr_array_index (handlers, new_index),
|
|
Packit |
1e8aac |
iter);
|
|
Packit |
1e8aac |
g_list_free (signals);
|
|
Packit |
1e8aac |
return TRUE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else if (new_index == handlers->len)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
glade_signal_model_create_signal_iter (sig_model, widget,
|
|
Packit |
1e8aac |
glade_signal_model_get_dummy_handler (sig_model,
|
|
Packit |
1e8aac |
sig_class),
|
|
Packit |
1e8aac |
iter);
|
|
Packit |
1e8aac |
g_list_free (signals);
|
|
Packit |
1e8aac |
return TRUE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
return glade_signal_model_iter_next_signal (sig_model, widget, iter, signal);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_list_free (signals);
|
|
Packit |
1e8aac |
return FALSE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else if (widget)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gint new_index = g_list_index (sig_model->priv->widgets, widget) + 1;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return gtk_tree_model_iter_nth_child (model, iter, NULL, new_index);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
iter->user_data = NULL;
|
|
Packit |
1e8aac |
iter->user_data2 = NULL;
|
|
Packit |
1e8aac |
iter->user_data3 = NULL;
|
|
Packit |
1e8aac |
iter->stamp = 0;
|
|
Packit |
1e8aac |
return FALSE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gint
|
|
Packit |
1e8aac |
glade_signal_model_iter_n_children (GtkTreeModel *model, GtkTreeIter *iter)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeSignal *handler;
|
|
Packit |
1e8aac |
GladeSignalModel *sig_model;
|
|
Packit |
1e8aac |
const gchar *widget;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_val_if_fail (GLADE_IS_SIGNAL_MODEL(model), 0);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* FIXME: return the number of toplevels, if it makes sense in this context */
|
|
Packit |
1e8aac |
if (iter == NULL) return 0;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
handler = iter->user_data2;
|
|
Packit |
1e8aac |
sig_model = GLADE_SIGNAL_MODEL (model);
|
|
Packit |
1e8aac |
widget = iter->user_data;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (handler)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
return 0;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else if (widget)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GList *signals = glade_signal_model_create_signal_list (sig_model,
|
|
Packit |
1e8aac |
widget);
|
|
Packit |
1e8aac |
GList *signal;
|
|
Packit |
1e8aac |
gint retval = 0;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
for (signal = signals; signal != NULL; signal = g_list_next (signal))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GPtrArray* handlers = g_hash_table_lookup (sig_model->priv->signals,
|
|
Packit |
1e8aac |
glade_signal_class_get_name (signal->data));
|
|
Packit |
1e8aac |
if (handlers)
|
|
Packit |
1e8aac |
retval += handlers->len;
|
|
Packit |
1e8aac |
retval++;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
g_list_free (signals);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return retval;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
g_assert_not_reached ();
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
glade_signal_model_iter_has_child (GtkTreeModel *model, GtkTreeIter *iter)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_return_val_if_fail (iter != NULL, FALSE);
|
|
Packit |
1e8aac |
g_return_val_if_fail (GLADE_IS_SIGNAL_MODEL(model), FALSE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return (glade_signal_model_iter_n_children (model, iter) != 0);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
glade_signal_model_iter_nth_child (GtkTreeModel *model,
|
|
Packit |
1e8aac |
GtkTreeIter *iter,
|
|
Packit |
1e8aac |
GtkTreeIter *parent,
|
|
Packit |
1e8aac |
gint n)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeSignal *handler;
|
|
Packit |
1e8aac |
GladeSignalModel *sig_model;
|
|
Packit |
1e8aac |
const gchar *widget;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_val_if_fail (iter != NULL, 0);
|
|
Packit |
1e8aac |
g_return_val_if_fail (GLADE_IS_SIGNAL_MODEL(model), 0);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
handler = parent ? parent->user_data2 : NULL;
|
|
Packit |
1e8aac |
sig_model = GLADE_SIGNAL_MODEL (model);
|
|
Packit |
1e8aac |
widget = parent ? parent->user_data : NULL;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (handler)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
return FALSE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else if (widget)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GList *signals = glade_signal_model_create_signal_list (sig_model,
|
|
Packit |
1e8aac |
widget);
|
|
Packit |
1e8aac |
GList *signal;
|
|
Packit |
1e8aac |
for (signal = signals; signal != NULL; signal = g_list_next (signal))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GPtrArray *handlers = g_hash_table_lookup (sig_model->priv->signals,
|
|
Packit |
1e8aac |
glade_signal_class_get_name (signal->data));
|
|
Packit |
1e8aac |
if (handlers)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
if (n >= handlers->len)
|
|
Packit |
1e8aac |
n -= handlers->len;
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
glade_signal_model_create_signal_iter (sig_model,
|
|
Packit |
1e8aac |
widget,
|
|
Packit |
1e8aac |
g_ptr_array_index (handlers, n),
|
|
Packit |
1e8aac |
iter);
|
|
Packit |
1e8aac |
g_list_free (signals);
|
|
Packit |
1e8aac |
return TRUE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
if (n == 0)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeSignal *handler =
|
|
Packit |
1e8aac |
glade_signal_model_get_dummy_handler (sig_model,
|
|
Packit |
1e8aac |
signal->data);
|
|
Packit |
1e8aac |
glade_signal_model_create_signal_iter (sig_model,
|
|
Packit |
1e8aac |
widget,
|
|
Packit |
1e8aac |
handler,
|
|
Packit |
1e8aac |
iter);
|
|
Packit |
1e8aac |
g_list_free (signals);
|
|
Packit |
1e8aac |
return TRUE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
n--;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
return FALSE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
if (g_list_length (sig_model->priv->widgets) > n)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
glade_signal_model_create_widget_iter (sig_model,
|
|
Packit |
1e8aac |
g_list_nth_data (sig_model->priv->widgets, n),
|
|
Packit |
1e8aac |
iter);
|
|
Packit |
1e8aac |
return TRUE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
return FALSE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
glade_signal_model_iter_children (GtkTreeModel *model,
|
|
Packit |
1e8aac |
GtkTreeIter *iter,
|
|
Packit |
1e8aac |
GtkTreeIter *parent)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
return glade_signal_model_iter_nth_child (model, iter, parent, 0);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
glade_signal_model_iter_parent (GtkTreeModel *model,
|
|
Packit |
1e8aac |
GtkTreeIter *iter,
|
|
Packit |
1e8aac |
GtkTreeIter *child)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeSignalModel *sig_model;
|
|
Packit |
1e8aac |
GladeSignal *handler;
|
|
Packit |
1e8aac |
const gchar *widget;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_val_if_fail (iter != NULL, FALSE);
|
|
Packit |
1e8aac |
g_return_val_if_fail (child != NULL, FALSE);
|
|
Packit |
1e8aac |
g_return_val_if_fail (GLADE_IS_SIGNAL_MODEL(model), FALSE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
sig_model = GLADE_SIGNAL_MODEL (model);
|
|
Packit |
1e8aac |
handler = child->user_data2;
|
|
Packit |
1e8aac |
widget = child->user_data;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (handler)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
glade_signal_model_create_widget_iter (sig_model, widget, iter);
|
|
Packit |
1e8aac |
return TRUE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
return FALSE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
gtk_tree_model_iface_init (GtkTreeModelIface *iface)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
iface->get_flags = glade_signal_model_get_flags;
|
|
Packit |
1e8aac |
iface->get_column_type = glade_signal_model_get_column_type;
|
|
Packit |
1e8aac |
iface->get_n_columns = glade_signal_model_get_n_columns;
|
|
Packit |
1e8aac |
iface->get_iter = glade_signal_model_get_iter;
|
|
Packit |
1e8aac |
iface->get_path = glade_signal_model_get_path;
|
|
Packit |
1e8aac |
iface->get_value = glade_signal_model_get_value;
|
|
Packit |
1e8aac |
iface->iter_next = glade_signal_model_iter_next;
|
|
Packit |
1e8aac |
iface->iter_children = glade_signal_model_iter_children;
|
|
Packit |
1e8aac |
iface->iter_has_child = glade_signal_model_iter_has_child;
|
|
Packit |
1e8aac |
iface->iter_n_children = glade_signal_model_iter_n_children;
|
|
Packit |
1e8aac |
iface->iter_nth_child = glade_signal_model_iter_nth_child;
|
|
Packit |
1e8aac |
iface->iter_parent = glade_signal_model_iter_parent;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
glade_signal_model_row_draggable (GtkTreeDragSource *model, GtkTreePath *path)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkTreeIter iter;
|
|
Packit |
1e8aac |
GladeSignal *signal;
|
|
Packit |
1e8aac |
gboolean retval;
|
|
Packit |
1e8aac |
gtk_tree_model_get_iter (GTK_TREE_MODEL (model), &iter, path);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_tree_model_get (GTK_TREE_MODEL (model), &iter,
|
|
Packit |
1e8aac |
GLADE_SIGNAL_COLUMN_SIGNAL, &signal,
|
|
Packit |
1e8aac |
-1);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
retval = signal && !glade_signal_model_is_dummy_handler (GLADE_SIGNAL_MODEL (model),
|
|
Packit |
1e8aac |
signal);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_object_unref (signal);
|
|
Packit |
1e8aac |
return retval;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
glade_signal_model_drag_data_get (GtkTreeDragSource *model,
|
|
Packit |
1e8aac |
GtkTreePath *path,
|
|
Packit |
1e8aac |
GtkSelectionData *data)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkTreeIter iter;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (gtk_tree_model_get_iter (GTK_TREE_MODEL (model), &iter, path))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeSignal *signal;
|
|
Packit |
1e8aac |
const gchar *widget = iter.user_data;
|
|
Packit |
1e8aac |
gchar *dnd_text;
|
|
Packit |
1e8aac |
const gchar *user_data;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_tree_model_get (GTK_TREE_MODEL (model), &iter,
|
|
Packit |
1e8aac |
GLADE_SIGNAL_COLUMN_SIGNAL, &signal, -1);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
user_data = glade_signal_get_userdata (signal);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
dnd_text = g_strdup_printf ("%s:%s:%s:%s:%d:%d", widget,
|
|
Packit |
1e8aac |
glade_signal_get_name (signal),
|
|
Packit |
1e8aac |
glade_signal_get_handler (signal),
|
|
Packit |
1e8aac |
user_data && strlen (user_data) ? user_data : "(none)",
|
|
Packit |
1e8aac |
glade_signal_get_swapped (signal),
|
|
Packit |
1e8aac |
glade_signal_get_after (signal));
|
|
Packit |
1e8aac |
gtk_selection_data_set (data,
|
|
Packit |
1e8aac |
gdk_atom_intern_static_string ("application/x-glade-signal"),
|
|
Packit |
1e8aac |
8,
|
|
Packit |
1e8aac |
(guchar*) dnd_text,
|
|
Packit |
1e8aac |
strlen (dnd_text));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_free (dnd_text);
|
|
Packit |
1e8aac |
return TRUE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
return FALSE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
glade_signal_model_drag_data_delete (GtkTreeDragSource *model,
|
|
Packit |
1e8aac |
GtkTreePath *path)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
/* We don't move rows... */
|
|
Packit |
1e8aac |
return FALSE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
gtk_tree_drag_source_iface_init (GtkTreeDragSourceIface *iface)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
iface->row_draggable = glade_signal_model_row_draggable;
|
|
Packit |
1e8aac |
iface->drag_data_get = glade_signal_model_drag_data_get;
|
|
Packit |
1e8aac |
iface->drag_data_delete = glade_signal_model_drag_data_delete;
|
|
Packit |
1e8aac |
}
|