|
Packit Service |
bf98b9 |
#include <stdlib.h>
|
|
Packit Service |
bf98b9 |
#include <clutter/clutter.h>
|
|
Packit Service |
bf98b9 |
|
|
Packit Service |
bf98b9 |
static gboolean
|
|
Packit Service |
bf98b9 |
on_enter (ClutterActor *actor,
|
|
Packit Service |
bf98b9 |
ClutterEvent *event)
|
|
Packit Service |
bf98b9 |
{
|
|
Packit Service |
bf98b9 |
ClutterTransition *t;
|
|
Packit Service |
bf98b9 |
|
|
Packit Service |
bf98b9 |
t = clutter_actor_get_transition (actor, "curl");
|
|
Packit Service |
bf98b9 |
if (t == NULL)
|
|
Packit Service |
bf98b9 |
{
|
|
Packit Service |
bf98b9 |
t = clutter_property_transition_new ("@effects.curl.period");
|
|
Packit Service |
bf98b9 |
clutter_timeline_set_duration (CLUTTER_TIMELINE (t), 250);
|
|
Packit Service |
bf98b9 |
clutter_actor_add_transition (actor, "curl", t);
|
|
Packit Service |
bf98b9 |
g_object_unref (t);
|
|
Packit Service |
bf98b9 |
}
|
|
Packit Service |
bf98b9 |
|
|
Packit Service |
bf98b9 |
clutter_transition_set_from (t, G_TYPE_DOUBLE, 0.0);
|
|
Packit Service |
bf98b9 |
clutter_transition_set_to (t, G_TYPE_DOUBLE, 0.25);
|
|
Packit Service |
bf98b9 |
clutter_timeline_rewind (CLUTTER_TIMELINE (t));
|
|
Packit Service |
bf98b9 |
clutter_timeline_start (CLUTTER_TIMELINE (t));
|
|
Packit Service |
bf98b9 |
|
|
Packit Service |
bf98b9 |
return CLUTTER_EVENT_STOP;
|
|
Packit Service |
bf98b9 |
}
|
|
Packit Service |
bf98b9 |
|
|
Packit Service |
bf98b9 |
static gboolean
|
|
Packit Service |
bf98b9 |
on_leave (ClutterActor *actor,
|
|
Packit Service |
bf98b9 |
ClutterEvent *event)
|
|
Packit Service |
bf98b9 |
{
|
|
Packit Service |
bf98b9 |
ClutterTransition *t;
|
|
Packit Service |
bf98b9 |
|
|
Packit Service |
bf98b9 |
t = clutter_actor_get_transition (actor, "curl");
|
|
Packit Service |
bf98b9 |
if (t == NULL)
|
|
Packit Service |
bf98b9 |
{
|
|
Packit Service |
bf98b9 |
t = clutter_property_transition_new ("@effects.curl.period");
|
|
Packit Service |
bf98b9 |
clutter_timeline_set_duration (CLUTTER_TIMELINE (t), 250);
|
|
Packit Service |
bf98b9 |
clutter_actor_add_transition (actor, "curl", t);
|
|
Packit Service |
bf98b9 |
g_object_unref (t);
|
|
Packit Service |
bf98b9 |
}
|
|
Packit Service |
bf98b9 |
|
|
Packit Service |
bf98b9 |
clutter_transition_set_from (t, G_TYPE_DOUBLE, 0.25);
|
|
Packit Service |
bf98b9 |
clutter_transition_set_to (t, G_TYPE_DOUBLE, 0.0);
|
|
Packit Service |
bf98b9 |
clutter_timeline_rewind (CLUTTER_TIMELINE (t));
|
|
Packit Service |
bf98b9 |
clutter_timeline_start (CLUTTER_TIMELINE (t));
|
|
Packit Service |
bf98b9 |
|
|
Packit Service |
bf98b9 |
return CLUTTER_EVENT_STOP;
|
|
Packit Service |
bf98b9 |
}
|
|
Packit Service |
bf98b9 |
|
|
Packit Service |
bf98b9 |
static void
|
|
Packit Service |
bf98b9 |
on_drag_begin (ClutterDragAction *action,
|
|
Packit Service |
bf98b9 |
ClutterActor *actor,
|
|
Packit Service |
bf98b9 |
gfloat event_x,
|
|
Packit Service |
bf98b9 |
gfloat event_y,
|
|
Packit Service |
bf98b9 |
ClutterModifierType modifiers)
|
|
Packit Service |
bf98b9 |
{
|
|
Packit Service |
bf98b9 |
gboolean is_copy = (modifiers & CLUTTER_SHIFT_MASK) ? TRUE : FALSE;
|
|
Packit Service |
bf98b9 |
ClutterActor *drag_handle = NULL;
|
|
Packit Service |
bf98b9 |
ClutterTransition *t;
|
|
Packit Service |
bf98b9 |
|
|
Packit Service |
bf98b9 |
if (is_copy)
|
|
Packit Service |
bf98b9 |
{
|
|
Packit Service |
bf98b9 |
ClutterActor *stage = clutter_actor_get_stage (actor);
|
|
Packit Service |
bf98b9 |
|
|
Packit Service |
bf98b9 |
drag_handle = clutter_actor_new ();
|
|
Packit Service |
bf98b9 |
clutter_actor_set_size (drag_handle, 48, 48);
|
|
Packit Service |
bf98b9 |
|
|
Packit Service |
bf98b9 |
clutter_actor_set_background_color (drag_handle, CLUTTER_COLOR_DarkSkyBlue);
|
|
Packit Service |
bf98b9 |
|
|
Packit Service |
bf98b9 |
clutter_actor_add_child (stage, drag_handle);
|
|
Packit Service |
bf98b9 |
clutter_actor_set_position (drag_handle, event_x, event_y);
|
|
Packit Service |
bf98b9 |
}
|
|
Packit Service |
bf98b9 |
else
|
|
Packit Service |
bf98b9 |
drag_handle = actor;
|
|
Packit Service |
bf98b9 |
|
|
Packit Service |
bf98b9 |
clutter_drag_action_set_drag_handle (action, drag_handle);
|
|
Packit Service |
bf98b9 |
|
|
Packit Service |
bf98b9 |
/* fully desaturate the actor */
|
|
Packit Service |
bf98b9 |
t = clutter_actor_get_transition (actor, "disable");
|
|
Packit Service |
bf98b9 |
if (t == NULL)
|
|
Packit Service |
bf98b9 |
{
|
|
Packit Service |
bf98b9 |
t = clutter_property_transition_new ("@effects.disable.factor");
|
|
Packit Service |
bf98b9 |
clutter_timeline_set_duration (CLUTTER_TIMELINE (t), 250);
|
|
Packit Service |
bf98b9 |
clutter_actor_add_transition (actor, "disable", t);
|
|
Packit Service |
bf98b9 |
g_object_unref (t);
|
|
Packit Service |
bf98b9 |
}
|
|
Packit Service |
bf98b9 |
|
|
Packit Service |
bf98b9 |
clutter_transition_set_from (t, G_TYPE_DOUBLE, 0.0);
|
|
Packit Service |
bf98b9 |
clutter_transition_set_to (t, G_TYPE_DOUBLE, 1.0);
|
|
Packit Service |
bf98b9 |
clutter_timeline_rewind (CLUTTER_TIMELINE (t));
|
|
Packit Service |
bf98b9 |
clutter_timeline_start (CLUTTER_TIMELINE (t));
|
|
Packit Service |
bf98b9 |
}
|
|
Packit Service |
bf98b9 |
|
|
Packit Service |
bf98b9 |
static void
|
|
Packit Service |
bf98b9 |
on_drag_end (ClutterDragAction *action,
|
|
Packit Service |
bf98b9 |
ClutterActor *actor,
|
|
Packit Service |
bf98b9 |
gfloat event_x,
|
|
Packit Service |
bf98b9 |
gfloat event_y,
|
|
Packit Service |
bf98b9 |
ClutterModifierType modifiers)
|
|
Packit Service |
bf98b9 |
{
|
|
Packit Service |
bf98b9 |
ClutterActor *drag_handle;
|
|
Packit Service |
bf98b9 |
ClutterTransition *t;
|
|
Packit Service |
bf98b9 |
|
|
Packit Service |
bf98b9 |
drag_handle = clutter_drag_action_get_drag_handle (action);
|
|
Packit Service |
bf98b9 |
if (actor != drag_handle)
|
|
Packit Service |
bf98b9 |
{
|
|
Packit Service |
bf98b9 |
gfloat real_x, real_y;
|
|
Packit Service |
bf98b9 |
ClutterActor *parent;
|
|
Packit Service |
bf98b9 |
|
|
Packit Service |
bf98b9 |
/* if we are dragging a copy we can destroy the copy now
|
|
Packit Service |
bf98b9 |
* and animate the real actor to the drop coordinates,
|
|
Packit Service |
bf98b9 |
* transformed in the parent's coordinate space
|
|
Packit Service |
bf98b9 |
*/
|
|
Packit Service |
bf98b9 |
clutter_actor_save_easing_state (drag_handle);
|
|
Packit Service |
bf98b9 |
clutter_actor_set_easing_mode (drag_handle, CLUTTER_LINEAR);
|
|
Packit Service |
bf98b9 |
clutter_actor_set_opacity (drag_handle, 0);
|
|
Packit Service |
bf98b9 |
clutter_actor_restore_easing_state (drag_handle);
|
|
Packit Service |
bf98b9 |
g_signal_connect (drag_handle, "transitions-completed",
|
|
Packit Service |
bf98b9 |
G_CALLBACK (clutter_actor_destroy),
|
|
Packit Service |
bf98b9 |
NULL);
|
|
Packit Service |
bf98b9 |
|
|
Packit Service |
bf98b9 |
parent = clutter_actor_get_parent (actor);
|
|
Packit Service |
bf98b9 |
clutter_actor_transform_stage_point (parent, event_x, event_y,
|
|
Packit Service |
bf98b9 |
&real_x,
|
|
Packit Service |
bf98b9 |
&real_y);
|
|
Packit Service |
bf98b9 |
|
|
Packit Service |
bf98b9 |
clutter_actor_save_easing_state (actor);
|
|
Packit Service |
bf98b9 |
clutter_actor_set_easing_mode (actor, CLUTTER_EASE_OUT_CUBIC);
|
|
Packit Service |
bf98b9 |
clutter_actor_set_position (actor, real_x, real_y);
|
|
Packit Service |
bf98b9 |
clutter_actor_restore_easing_state (actor);
|
|
Packit Service |
bf98b9 |
}
|
|
Packit Service |
bf98b9 |
|
|
Packit Service |
bf98b9 |
t = clutter_actor_get_transition (actor, "disable");
|
|
Packit Service |
bf98b9 |
if (t == NULL)
|
|
Packit Service |
bf98b9 |
{
|
|
Packit Service |
bf98b9 |
t = clutter_property_transition_new ("@effects.disable.factor");
|
|
Packit Service |
bf98b9 |
clutter_timeline_set_duration (CLUTTER_TIMELINE (t), 250);
|
|
Packit Service |
bf98b9 |
clutter_actor_add_transition (actor, "disable", t);
|
|
Packit Service |
bf98b9 |
g_object_unref (t);
|
|
Packit Service |
bf98b9 |
}
|
|
Packit Service |
bf98b9 |
|
|
Packit Service |
bf98b9 |
clutter_transition_set_from (t, G_TYPE_DOUBLE, 1.0);
|
|
Packit Service |
bf98b9 |
clutter_transition_set_to (t, G_TYPE_DOUBLE, 0.0);
|
|
Packit Service |
bf98b9 |
clutter_timeline_rewind (CLUTTER_TIMELINE (t));
|
|
Packit Service |
bf98b9 |
clutter_timeline_start (CLUTTER_TIMELINE (t));
|
|
Packit Service |
bf98b9 |
}
|
|
Packit Service |
bf98b9 |
|
|
Packit Service |
bf98b9 |
static ClutterDragAxis
|
|
Packit Service |
bf98b9 |
get_drag_axis (const gchar *str)
|
|
Packit Service |
bf98b9 |
{
|
|
Packit Service |
bf98b9 |
if (str == NULL || *str == '\0')
|
|
Packit Service |
bf98b9 |
return CLUTTER_DRAG_AXIS_NONE;
|
|
Packit Service |
bf98b9 |
|
|
Packit Service |
bf98b9 |
if (*str == 'x' || *str == 'X')
|
|
Packit Service |
bf98b9 |
return CLUTTER_DRAG_X_AXIS;
|
|
Packit Service |
bf98b9 |
|
|
Packit Service |
bf98b9 |
if (*str == 'y' || *str == 'Y')
|
|
Packit Service |
bf98b9 |
return CLUTTER_DRAG_Y_AXIS;
|
|
Packit Service |
bf98b9 |
|
|
Packit Service |
bf98b9 |
g_warn_if_reached ();
|
|
Packit Service |
bf98b9 |
|
|
Packit Service |
bf98b9 |
return CLUTTER_DRAG_AXIS_NONE;
|
|
Packit Service |
bf98b9 |
}
|
|
Packit Service |
bf98b9 |
|
|
Packit Service |
bf98b9 |
static gchar *drag_axis = NULL;
|
|
Packit Service |
bf98b9 |
static gint x_drag_threshold = 0;
|
|
Packit Service |
bf98b9 |
static gint y_drag_threshold = 0;
|
|
Packit Service |
bf98b9 |
|
|
Packit Service |
bf98b9 |
static GOptionEntry entries[] = {
|
|
Packit Service |
bf98b9 |
{
|
|
Packit Service |
bf98b9 |
"x-threshold", 'x',
|
|
Packit Service |
bf98b9 |
0,
|
|
Packit Service |
bf98b9 |
G_OPTION_ARG_INT,
|
|
Packit Service |
bf98b9 |
&x_drag_threshold,
|
|
Packit Service |
bf98b9 |
"Set the horizontal drag threshold", "PIXELS"
|
|
Packit Service |
bf98b9 |
},
|
|
Packit Service |
bf98b9 |
{
|
|
Packit Service |
bf98b9 |
"y-threshold", 'y',
|
|
Packit Service |
bf98b9 |
0,
|
|
Packit Service |
bf98b9 |
G_OPTION_ARG_INT,
|
|
Packit Service |
bf98b9 |
&y_drag_threshold,
|
|
Packit Service |
bf98b9 |
"Set the vertical drag threshold", "PIXELS"
|
|
Packit Service |
bf98b9 |
},
|
|
Packit Service |
bf98b9 |
{
|
|
Packit Service |
bf98b9 |
"axis", 'a',
|
|
Packit Service |
bf98b9 |
0,
|
|
Packit Service |
bf98b9 |
G_OPTION_ARG_STRING,
|
|
Packit Service |
bf98b9 |
&drag_axis,
|
|
Packit Service |
bf98b9 |
"Set the drag axis", "AXIS"
|
|
Packit Service |
bf98b9 |
},
|
|
Packit Service |
bf98b9 |
|
|
Packit Service |
bf98b9 |
{ NULL }
|
|
Packit Service |
bf98b9 |
};
|
|
Packit Service |
bf98b9 |
|
|
Packit Service |
bf98b9 |
int
|
|
Packit Service |
bf98b9 |
main (int argc, char *argv[])
|
|
Packit Service |
bf98b9 |
{
|
|
Packit Service |
bf98b9 |
ClutterActor *stage, *handle;
|
|
Packit Service |
bf98b9 |
ClutterAction *action;
|
|
Packit Service |
bf98b9 |
GError *error;
|
|
Packit Service |
bf98b9 |
|
|
Packit Service |
bf98b9 |
error = NULL;
|
|
Packit Service |
bf98b9 |
if (clutter_init_with_args (&argc, &argv,
|
|
Packit Service |
bf98b9 |
"test-drag",
|
|
Packit Service |
bf98b9 |
entries,
|
|
Packit Service |
bf98b9 |
NULL,
|
|
Packit Service |
bf98b9 |
&error) != CLUTTER_INIT_SUCCESS)
|
|
Packit Service |
bf98b9 |
{
|
|
Packit Service |
bf98b9 |
g_print ("Unable to run drag-action: %s\n", error->message);
|
|
Packit Service |
bf98b9 |
g_error_free (error);
|
|
Packit Service |
bf98b9 |
|
|
Packit Service |
bf98b9 |
return EXIT_FAILURE;
|
|
Packit Service |
bf98b9 |
}
|
|
Packit Service |
bf98b9 |
|
|
Packit Service |
bf98b9 |
stage = clutter_stage_new ();
|
|
Packit Service |
bf98b9 |
clutter_stage_set_title (CLUTTER_STAGE (stage), "Drag Test");
|
|
Packit Service |
bf98b9 |
clutter_actor_set_size (stage, 800, 600);
|
|
Packit Service |
bf98b9 |
g_signal_connect (stage, "destroy", G_CALLBACK (clutter_main_quit), NULL);
|
|
Packit Service |
bf98b9 |
|
|
Packit Service |
bf98b9 |
handle = clutter_actor_new ();
|
|
Packit Service |
bf98b9 |
clutter_actor_set_background_color (handle, CLUTTER_COLOR_SkyBlue);
|
|
Packit Service |
bf98b9 |
clutter_actor_set_size (handle, 128, 128);
|
|
Packit Service |
bf98b9 |
clutter_actor_set_position (handle, (800 - 128) / 2, (600 - 128) / 2);
|
|
Packit Service |
bf98b9 |
clutter_actor_set_reactive (handle, TRUE);
|
|
Packit Service |
bf98b9 |
clutter_actor_add_child (stage, handle);
|
|
Packit Service |
bf98b9 |
g_signal_connect (handle, "enter-event", G_CALLBACK (on_enter), NULL);
|
|
Packit Service |
bf98b9 |
g_signal_connect (handle, "leave-event", G_CALLBACK (on_leave), NULL);
|
|
Packit Service |
bf98b9 |
|
|
Packit Service |
bf98b9 |
action = clutter_drag_action_new ();
|
|
Packit Service |
bf98b9 |
clutter_drag_action_set_drag_threshold (CLUTTER_DRAG_ACTION (action),
|
|
Packit Service |
bf98b9 |
x_drag_threshold,
|
|
Packit Service |
bf98b9 |
y_drag_threshold);
|
|
Packit Service |
bf98b9 |
clutter_drag_action_set_drag_axis (CLUTTER_DRAG_ACTION (action),
|
|
Packit Service |
bf98b9 |
get_drag_axis (drag_axis));
|
|
Packit Service |
bf98b9 |
|
|
Packit Service |
bf98b9 |
g_signal_connect (action, "drag-begin", G_CALLBACK (on_drag_begin), NULL);
|
|
Packit Service |
bf98b9 |
g_signal_connect (action, "drag-end", G_CALLBACK (on_drag_end), NULL);
|
|
Packit Service |
bf98b9 |
|
|
Packit Service |
bf98b9 |
clutter_actor_add_action (handle, action);
|
|
Packit Service |
bf98b9 |
|
|
Packit Service |
bf98b9 |
clutter_actor_add_effect_with_name (handle, "disable", clutter_desaturate_effect_new (0.0));
|
|
Packit Service |
bf98b9 |
clutter_actor_add_effect_with_name (handle, "curl", clutter_page_turn_effect_new (0.0, 45.0, 12.0));
|
|
Packit Service |
bf98b9 |
|
|
Packit Service |
bf98b9 |
clutter_actor_show (stage);
|
|
Packit Service |
bf98b9 |
|
|
Packit Service |
bf98b9 |
clutter_main ();
|
|
Packit Service |
bf98b9 |
|
|
Packit Service |
bf98b9 |
return EXIT_SUCCESS;
|
|
Packit Service |
bf98b9 |
}
|