[libchamplain] Make markers movable
- From: Jiří Techet <jiritechet src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libchamplain] Make markers movable
- Date: Wed, 9 Feb 2011 08:37:54 +0000 (UTC)
commit 1df3c7cdb8873552e0200a56ac8142c503bb56d4
Author: JiÅ?Ã Techet <techet gmail com>
Date: Sun Jan 23 16:42:56 2011 +0100
Make markers movable
champlain/champlain-base-marker.c | 91 +++++
mx/Makefile.am | 2 -
mx/mx-draggable.c | 706 -------------------------------------
mx/mx-draggable.h | 132 -------
4 files changed, 91 insertions(+), 840 deletions(-)
---
diff --git a/champlain/champlain-base-marker.c b/champlain/champlain-base-marker.c
index 6251998..79be9f4 100644
--- a/champlain/champlain-base-marker.c
+++ b/champlain/champlain-base-marker.c
@@ -75,6 +75,8 @@ struct _ChamplainBaseMarkerPrivate
gdouble lon;
gdouble lat;
gboolean highlighted;
+
+ ChamplainFloatPoint click_coord;
};
static void
@@ -207,6 +209,90 @@ champlain_base_marker_class_init (ChamplainBaseMarkerClass *marker_class)
}
+static gboolean
+motion_event_cb (ClutterActor *stage,
+ ClutterMotionEvent *event,
+ ChamplainBaseMarker *marker)
+{
+ ChamplainBaseMarkerPrivate *priv = marker->priv;
+ ChamplainFloatPoint coord;
+
+ if (event->type != CLUTTER_MOTION)
+ return FALSE;
+
+ if (clutter_actor_transform_stage_point (CLUTTER_ACTOR (marker),
+ event->x,
+ event->y,
+ &coord.x, &coord.y))
+ {
+ gfloat dx = coord.x - priv->click_coord.x;
+ gfloat dy = coord.y - priv->click_coord.y;
+
+ clutter_actor_move_by (CLUTTER_ACTOR (marker), dx, dy);
+ }
+
+ return TRUE;
+}
+
+
+static gboolean
+button_release_event_cb (ClutterActor *stage,
+ ClutterButtonEvent *event,
+ ChamplainBaseMarker *marker)
+{
+ if ((event->type != CLUTTER_BUTTON_RELEASE) ||
+ (event->button != 1))
+ return FALSE;
+
+ g_signal_handlers_disconnect_by_func (stage,
+ motion_event_cb,
+ marker);
+ g_signal_handlers_disconnect_by_func (stage,
+ button_release_event_cb,
+ marker);
+
+ clutter_set_motion_events_enabled (TRUE);
+
+ return TRUE;
+}
+
+
+static gboolean
+button_press_event_cb (ClutterActor *actor,
+ ClutterEvent *event,
+ ChamplainBaseMarker *marker)
+{
+ ChamplainBaseMarkerPrivate *priv = marker->priv;
+ ClutterButtonEvent *bevent = (ClutterButtonEvent *)event;
+ ClutterActor *stage = clutter_actor_get_stage (actor);
+
+ if ((event->type == CLUTTER_BUTTON_PRESS) &&
+ (bevent->button == 1) &&
+ stage)
+ {
+ if (clutter_actor_transform_stage_point (actor, bevent->x, bevent->y,
+ &priv->click_coord.x, &priv->click_coord.y))
+ {
+ g_signal_connect (stage,
+ "captured-event",
+ G_CALLBACK (motion_event_cb),
+ marker);
+ g_signal_connect (stage,
+ "captured-event",
+ G_CALLBACK (button_release_event_cb),
+ marker);
+
+ clutter_set_motion_events_enabled (FALSE);
+
+ /* Swallow the press event */
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+
static void
champlain_base_marker_init (ChamplainBaseMarker *marker)
{
@@ -217,6 +303,11 @@ champlain_base_marker_init (ChamplainBaseMarker *marker)
priv->lat = 0;
priv->lon = 0;
priv->highlighted = FALSE;
+
+ g_signal_connect (marker,
+ "button-press-event",
+ G_CALLBACK (button_press_event_cb),
+ marker);
}
diff --git a/mx/Makefile.am b/mx/Makefile.am
index 1e02d40..14dd948 100644
--- a/mx/Makefile.am
+++ b/mx/Makefile.am
@@ -5,7 +5,6 @@ EXTRA_DIST =
mx_headers_public = \
- $(srcdir)/mx-draggable.h \
$(srcdir)/mx-viewport.h \
$(srcdir)/mx-kinetic-scroll-view.h \
$(srcdir)/mx-types.h \
@@ -15,7 +14,6 @@ mx_headers_public = \
$(srcdir)/mx-private.h
mx_sources = \
- $(srcdir)/mx-draggable.c \
$(srcdir)/mx-viewport.c \
$(srcdir)/mx-kinetic-scroll-view.c \
$(srcdir)/mx-adjustment.c \
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]