From b25ee6c596280fed211d8c2550c61865c91f9816 Mon Sep 17 00:00:00 2001 From: Nikias Bassen Date: Wed, 16 Dec 2009 15:49:56 +0100 Subject: Added dock icon alignment function and dock icon motion detection --- src/sbmanager.c | 65 +++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 52 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/src/sbmanager.c b/src/sbmanager.c index 2402af3..adf5e62 100644 --- a/src/sbmanager.c +++ b/src/sbmanager.c @@ -52,6 +52,8 @@ typedef struct { gboolean is_dock_item; } SBItem; +const ClutterActorBox dock_area = {0.0, 390.0, 320.0, 480.0}; + ClutterActor *stage = NULL; ClutterActor *thedock = NULL; ClutterActor *clock_label = NULL; @@ -345,6 +347,36 @@ static gboolean item_button_release (ClutterActor *actor, ClutterButtonEvent *ev return TRUE; } +static void dock_align_icons() +{ + if (!thedock) return; + gint count = clutter_group_get_n_children(CLUTTER_GROUP(thedock)); + if (count == 0) { + return; + } + gfloat spacing = 16.0; + gfloat ypos = 8.0; + gfloat xpos = 0.0; + gint i = 0; + if (count > 4) { + spacing = 3.0; + } + for (i = 0; i < count; i++) { + ClutterActor *icon = clutter_group_get_nth_child(CLUTTER_GROUP(thedock), i); + if (!icon) { + continue; + } + clutter_actor_set_position(icon, xpos, ypos); + xpos += 60; + if (i < count-1) { + xpos += spacing; + } + } + // center the whole dock + clutter_actor_set_width(thedock, xpos); + clutter_actor_set_position(thedock, (320 - xpos)/2, 390.0); +} + static void redraw_icons(SBManagerApp *app) { guint i; @@ -353,15 +385,8 @@ static void redraw_icons(SBManagerApp *app) if (dockitems) { /* draw items into the dock area */ - gfloat start = 16.0; - gfloat step = 16.0; - if (g_list_length(dockitems) > 4) { - // this is for 5 item dock - step = 3.0; - start = 4.0; - } - ypos = 8.0; - xpos = start; + xpos = 0.0; + ypos = 0.0; printf("%s: drawing dock icons\n", __func__); for (i = 0; i < g_list_length(dockitems); i++) { SBItem *item = (SBItem*)g_list_nth_data(dockitems, i); @@ -381,8 +406,7 @@ static void redraw_icons(SBManagerApp *app) clutter_actor_show(actor); clutter_container_add_actor(CLUTTER_CONTAINER(grp), actor); clutter_container_add_actor(CLUTTER_CONTAINER(thedock), grp); - xpos += (60.0 + step); - clutter_actor_set_position(thedock, (320 - xpos)/2, 390.0); + dock_align_icons(); } } } @@ -440,10 +464,25 @@ static gboolean stage_motion (ClutterActor *actor, ClutterMotionEvent *event, gp start_x = event->x; start_y = event->y; + gfloat center_x = 0.0; + gfloat center_y = 0.0; + clutter_actor_get_scale_center(selected, ¢er_x, ¢er_y); + center_x += clutter_actor_get_x(selected); + center_y += clutter_actor_get_y(selected); + + if (selected_item->is_dock_item) { - printf("an icon from the dock is moving\n"); + if (center_y < 0) { + printf("icon from dock moving outside the dock!\n"); + } else { + printf("icon from dock moving inside the dock!\n"); + } } else { - printf("a regular icon is moving\n"); + if (clutter_actor_box_contains(&dock_area, center_x, center_y)) { + printf("regular icon is moving inside the dock!\n"); + } else { + printf("regular icon is moving!\n"); + } } return TRUE; -- cgit v1.1-32-gdbae