Commit 93195df1 authored by Juan Pablo Ugarte's avatar Juan Pablo Ugarte Committed by Tristan Van Berkom

2011-01-13 Juan Pablo Ugarte <juanpablougarte@gmail.com>

  * gladeui/glade-widget-adaptor.c: added GtkWidget::event signal clash override
    for every registered class to marshal events to the corresponding GladeDesignLayout

  * gladeui/glade-design-layout.[ch]:
    o added new function derived from glade_design_layout_widget_event(),
      glade_design_layout_do_event() to marshall events from the override class handler
    o removed placeholder from glade_design_layout_find_inside_container()

  * gladeui/glade-widget.[ch]: moved IS_GLADE_WIDGET_EVENT macro to header.
parent ebd9b9a5
......@@ -306,7 +306,6 @@ typedef struct
GtkWidget *toplevel;
gint x;
gint y;
GtkWidget *placeholder;
GladeWidget *gwidget;
} GladeFindInContainerData;
......@@ -321,25 +320,19 @@ glade_design_layout_find_inside_container (GtkWidget * widget,
if (data->gwidget || !gtk_widget_get_mapped (widget))
return;
// gtk_widget_translate_coordinates (data->toplevel, widget, data->x, data->y, &x, &y);
x = data->x;
y = data->y;
gtk_widget_translate_coordinates (data->toplevel, widget, data->x, data->y, &x, &y);
gtk_widget_get_allocation (widget, &allocation);
if (x >= 0 && x < allocation.width && y >= 0 && y < allocation.height)
{
if (GLADE_IS_PLACEHOLDER (widget))
data->placeholder = widget;
else
{
if (GTK_IS_CONTAINER (widget))
gtk_container_forall (GTK_CONTAINER (widget), (GtkCallback)
glade_design_layout_find_inside_container,
data);
if (GTK_IS_CONTAINER (widget))
gtk_container_forall (GTK_CONTAINER (widget), (GtkCallback)
glade_design_layout_find_inside_container,
data);
if (!data->gwidget)
data->gwidget = glade_widget_get_from_gobject (widget);
}
if (!data->gwidget)
data->gwidget = glade_widget_get_from_gobject (widget);
}
}
......@@ -537,7 +530,6 @@ glade_design_layout_size_allocate (GtkWidget * widget,
child_allocation.width = MAX (requisition.width, child_width);
child_allocation.height = MAX (requisition.height, child_height);
/* FIXME: here we make the offscreen bigger because otherwise it gets clipped, need to investigate further */
if (gtk_widget_get_realized (widget))
gdk_window_move_resize (priv->offscreen_window,
child_allocation.x,
......@@ -700,21 +692,21 @@ glade_design_layout_draw (GtkWidget * widget, cairo_t * cr)
/* Draw selection */
if (priv->project)
{
GList *widgets = glade_project_selection_get (priv->project);
GList *widgets = glade_project_selection_get (priv->project);
if (widgets)
if (widgets)
{
child = widgets->data;
gtk_widget_get_allocation (child, &child_allocation);
gdk_cairo_set_source_color (cr,
&gtk_widget_get_style (widget)->bg[GTK_STATE_SELECTED]);
cairo_rectangle (cr,
child_allocation.x + offset,
child_allocation.y + offset,
child_allocation.width,
child_allocation.height);
cairo_clip (cr);
cairo_paint_with_alpha (cr, .32);
gtk_widget_get_allocation (widgets->data, &child_allocation);
gdk_cairo_set_source_color (cr,
&gtk_widget_get_style (widget)->bg[GTK_STATE_SELECTED]);
cairo_rectangle (cr,
child_allocation.x + offset,
child_allocation.y + offset,
child_allocation.width,
child_allocation.height);
cairo_clip (cr);
cairo_paint_with_alpha (cr, .32);
}
}
}
......@@ -968,8 +960,42 @@ glade_design_layout_class_init (GladeDesignLayoutClass * klass)
g_type_class_add_private (object_class, sizeof (GladeDesignLayoutPrivate));
}
/* Public API */
GtkWidget *
glade_design_layout_new (void)
{
return g_object_new (GLADE_TYPE_DESIGN_LAYOUT, NULL);
}
/**
* glade_design_layout_do_event:
* @layout: A #GladeDesignLayout
* @event: the #GdkEvent
*
* This is called internally by a #GladeWidget recieving an event,
* it will marshall the event to the proper #GladeWidget according
* to its position in @layout.
*
* Returns: Whether or not the event was handled by the retrieved #GladeWidget
*/
gboolean
glade_design_layout_do_event (GladeDesignLayout * layout, GdkEvent * event)
{
GladeFindInContainerData data = { 0, };
GtkWidget *child;
if ((child = gtk_bin_get_child (GTK_BIN (layout))) == NULL)
return FALSE;
data.toplevel = GTK_WIDGET (layout);
gtk_widget_get_pointer (GTK_WIDGET (layout), &data.x, &data.y);
glade_design_layout_find_inside_container (child, &data);
/* Then we try a GladeWidget */
if (data.gwidget)
return glade_widget_event (data.gwidget, event);
return FALSE;
}
......@@ -63,6 +63,9 @@ GType glade_design_layout_get_type (void) G_GNUC_CONST;
GtkWidget *glade_design_layout_new (void);
gboolean glade_design_layout_do_event (GladeDesignLayout * layout,
GdkEvent * event);
G_END_DECLS
#endif /* __GLADE_DESIGN_LAYOUT_H__ */
......@@ -1668,6 +1668,33 @@ glade_widget_adaptor_list_adaptors (void)
return adaptors;
}
static gboolean
on_widget_event (GtkWidget *widget, GdkEvent *event)
{
gboolean retval;
/* We are only interested in button press and release events */
if (IS_GLADE_WIDGET_EVENT(event->type) && !GLADE_IS_PLACEHOLDER (widget))
{
GtkWidget *parent = widget;
do
{
if (GLADE_IS_DESIGN_LAYOUT (parent))
{
if (glade_design_layout_do_event (GLADE_DESIGN_LAYOUT (parent), event))
return TRUE;
break;
}
}
while ((parent = gtk_widget_get_parent (parent)));
}
/* Chain up */
g_signal_chain_from_overridden_handler (widget, event, &retval);
return retval;
}
/**
* glade_widget_adaptor_register:
* @adaptor: A #GladeWidgetAdaptor
......@@ -1693,6 +1720,10 @@ glade_widget_adaptor_register (GladeWidgetAdaptor * adaptor)
g_hash_table_insert (adaptor_hash,
g_memdup (&adaptor->priv->type, sizeof (GType)), adaptor);
if (g_type_is_a (adaptor->priv->type, GTK_TYPE_WIDGET))
g_signal_override_class_handler ("event", adaptor->priv->type,
G_CALLBACK (on_widget_event));
}
static GladePackingDefault *
......
......@@ -197,12 +197,6 @@ static guint glade_widget_signals[LAST_SIGNAL] = { 0 };
static GQuark glade_widget_name_quark = 0;
#define IS_GLADE_WIDGET_EVENT(event) \
((event) == GDK_BUTTON_PRESS || \
(event) == GDK_BUTTON_RELEASE || \
(event) == GDK_MOTION_NOTIFY)
G_DEFINE_TYPE (GladeWidget, glade_widget, G_TYPE_INITIALLY_UNOWNED)
/*******************************************************************************
GladeWidget class methods
......
......@@ -56,6 +56,11 @@ struct _GladeWidgetClass
void (* glade_reserved8) (void);
};
#define IS_GLADE_WIDGET_EVENT(event) \
((event) == GDK_BUTTON_PRESS || \
(event) == GDK_BUTTON_RELEASE || \
(event) == GDK_MOTION_NOTIFY)
/*******************************************************************************
General api
*******************************************************************************/
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment