mirror of
https://github.com/brl/mutter.git
synced 2024-12-23 11:32:04 +00:00
Implement ::raise(), ::lower() and ::sort_depth_order() in ClutterBox
Provide the implementations of the newly added ClutterContainer virtual functions inside ClutterBox.
This commit is contained in:
parent
ad184c0fe3
commit
143005bd79
@ -160,6 +160,145 @@ clutter_box_find_child_by_id (ClutterContainer *container,
|
||||
return actor;
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_box_raise (ClutterContainer *container,
|
||||
ClutterActor *actor,
|
||||
ClutterActor *sibling)
|
||||
{
|
||||
ClutterBox *box = CLUTTER_BOX (container);
|
||||
ClutterBoxChild *child = NULL, *sibling_child = NULL;
|
||||
GList *l;
|
||||
gint pos;
|
||||
|
||||
for (l = box->children; l; l = l->next)
|
||||
{
|
||||
child = l->data;
|
||||
|
||||
if (child->actor == actor)
|
||||
break;
|
||||
}
|
||||
|
||||
box->children = g_list_remove (box->children, child);
|
||||
|
||||
if (!sibling)
|
||||
{
|
||||
GList *last_item;
|
||||
|
||||
/* raise to top */
|
||||
last_item = g_list_last (box->children);
|
||||
if (last_item)
|
||||
sibling_child = last_item->data;
|
||||
|
||||
box->children = g_list_append (box->children, child);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (pos = 1, l = box->children; l; l = l->next, pos += 1)
|
||||
{
|
||||
sibling_child = l->data;
|
||||
|
||||
if (sibling_child->actor == sibling)
|
||||
break;
|
||||
}
|
||||
|
||||
box->children = g_list_insert (box->children, child, pos);
|
||||
}
|
||||
|
||||
if (sibling_child)
|
||||
{
|
||||
ClutterActor *a = child->actor;
|
||||
ClutterActor *b = sibling_child->actor;
|
||||
|
||||
if (clutter_actor_get_depth (a) != clutter_actor_get_depth (b))
|
||||
clutter_actor_set_depth (a, clutter_actor_get_depth (b));
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_box_lower (ClutterContainer *container,
|
||||
ClutterActor *actor,
|
||||
ClutterActor *sibling)
|
||||
{
|
||||
ClutterBox *box = CLUTTER_BOX (container);
|
||||
ClutterBoxChild *child = NULL, *sibling_child = NULL;
|
||||
GList *l;
|
||||
gint pos;
|
||||
|
||||
for (l = box->children; l; l = l->next)
|
||||
{
|
||||
child = l->data;
|
||||
|
||||
if (child->actor == actor)
|
||||
break;
|
||||
}
|
||||
|
||||
box->children = g_list_remove (box->children, child);
|
||||
|
||||
if (!sibling)
|
||||
{
|
||||
GList *first_item;
|
||||
|
||||
/* lower to bottom */
|
||||
first_item = g_list_first (box->children);
|
||||
if (first_item)
|
||||
sibling_child = first_item->data;
|
||||
|
||||
box->children = g_list_prepend (box->children, child);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (pos = 1, l = box->children; l; l = l->next, pos += 1)
|
||||
{
|
||||
sibling_child = l->data;
|
||||
|
||||
if (sibling_child->actor == sibling)
|
||||
break;
|
||||
}
|
||||
|
||||
box->children = g_list_insert (box->children, child, pos);
|
||||
}
|
||||
|
||||
if (sibling_child)
|
||||
{
|
||||
ClutterActor *a = child->actor;
|
||||
ClutterActor *b = sibling_child->actor;
|
||||
|
||||
if (clutter_actor_get_depth (a) != clutter_actor_get_depth (b))
|
||||
clutter_actor_set_depth (a, clutter_actor_get_depth (b));
|
||||
}
|
||||
}
|
||||
|
||||
static gint
|
||||
sort_z_order (gconstpointer a,
|
||||
gconstpointer b)
|
||||
{
|
||||
ClutterBoxChild *child_a = (ClutterBoxChild *) a;
|
||||
ClutterBoxChild *child_b = (ClutterBoxChild *) b;
|
||||
gint depth_a, depth_b;
|
||||
|
||||
depth_a = clutter_actor_get_depth (child_a->actor);
|
||||
depth_b = clutter_actor_get_depth (child_b->actor);
|
||||
|
||||
if (depth_a == depth_b)
|
||||
return 0;
|
||||
|
||||
if (depth_a > depth_b)
|
||||
return 1;
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_box_sort_depth_order (ClutterContainer *container)
|
||||
{
|
||||
ClutterBox *box = CLUTTER_BOX (container);
|
||||
|
||||
box->children = g_list_sort (box->children, sort_z_order);
|
||||
|
||||
if (CLUTTER_ACTOR_IS_VISIBLE (CLUTTER_ACTOR (box)))
|
||||
clutter_actor_queue_redraw (CLUTTER_ACTOR (box));
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_container_iface_init (ClutterContainerIface *iface)
|
||||
{
|
||||
@ -167,6 +306,9 @@ clutter_container_iface_init (ClutterContainerIface *iface)
|
||||
iface->remove = clutter_box_remove;
|
||||
iface->foreach = clutter_box_foreach;
|
||||
iface->find_child_by_id = clutter_box_find_child_by_id;
|
||||
iface->raise = clutter_box_raise;
|
||||
iface->lower = clutter_box_lower;
|
||||
iface->sort_depth_order = clutter_box_sort_depth_order;
|
||||
}
|
||||
|
||||
static void
|
||||
|
Loading…
Reference in New Issue
Block a user