summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCedric BAIL <cedric@osg.samsung.com>2015-04-03 16:37:58 +0200
committerCedric BAIL <cedric@osg.samsung.com>2015-04-03 16:37:58 +0200
commit0eeb19d688b68f10c2b4379e6b7c868b6ba33870 (patch)
tree7653d3b3d5f24435183c728094dda284166b074f
parent1821aef0c6be069176eaea4d84fd91d82fdb84de (diff)
downloadefl-0eeb19d688b68f10c2b4379e6b7c868b6ba33870.tar.gz
evas: implement stack below and above get for Efl.VG object.
-rw-r--r--src/lib/evas/canvas/evas_vg_node.c109
1 files changed, 103 insertions, 6 deletions
diff --git a/src/lib/evas/canvas/evas_vg_node.c b/src/lib/evas/canvas/evas_vg_node.c
index 93be7670c5..2b274e54ce 100644
--- a/src/lib/evas/canvas/evas_vg_node.c
+++ b/src/lib/evas/canvas/evas_vg_node.c
@@ -2,6 +2,7 @@
#include "evas_private.h"
#include "evas_vg_private.h"
+#include "efl_vg_root_node.eo.h"
#include <string.h>
#include <math.h>
@@ -407,18 +408,114 @@ _efl_vg_base_efl_gfx_stack_lower(Eo *obj, Efl_VG_Base_Data *pd EINA_UNUSED)
eo_error_set(obj);
}
+static Eo *
+_efl_vg_base_root_parent_get(Eo *obj)
+{
+ Eo *parent;
+
+ if (eo_isa(obj, EFL_VG_ROOT_NODE_CLASS))
+ return obj;
+
+ eo_do(obj, parent = eo_parent_get());
+
+ if (!parent) return NULL;
+ return _efl_vg_base_root_parent_get(parent);
+}
+
+static void
+_efl_vg_base_walk_down_at(Eo *root, Eina_Array *a, Eina_Rectangle *r)
+{
+ Eina_Rectangle bound;
+
+ eo_do(root, efl_vg_bound_get(&bound));
+ if (!eina_rectangles_intersect(&bound, r)) return ;
+
+ eina_array_push(a, root);
+
+ if (eo_isa(root, EFL_VG_CONTAINER_CLASS))
+ {
+ Efl_VG_Container_Data *cd;
+ Eina_List *l;
+ Eo *child;
+
+ cd = eo_data_scope_get(root, EFL_VG_CONTAINER_CLASS);
+ EINA_LIST_FOREACH(cd->children, l, child)
+ _efl_vg_base_walk_down_at(child, a, r);
+ }
+}
+
+static void
+_efl_vg_base_object_at(Eo *obj, Eina_Array *a, Eina_Rectangle *r)
+{
+ Eo *root;
+
+ root = _efl_vg_base_root_parent_get(obj);
+ if (!root) return ;
+
+ _efl_vg_base_walk_down_at(root, a, r);
+}
+
static Efl_Gfx_Stack *
-_efl_vg_base_efl_gfx_stack_below_get(Eo *obj EINA_UNUSED, Efl_VG_Base_Data *pd EINA_UNUSED)
+_efl_vg_base_efl_gfx_stack_below_get(Eo *obj, Efl_VG_Base_Data *pd EINA_UNUSED)
{
- // Actually a VG base node won't have any children so nothing stacked below it.
- return NULL;
+ Eina_Rectangle r;
+ Eina_Array a;
+ Eo *current;
+ Eo *below = NULL;
+ Eina_Array_Iterator iterator;
+ unsigned int i;
+
+ eo_do(obj, efl_vg_bound_get(&r));
+
+ eina_array_step_set(&a, sizeof (Eina_Array), 8);
+
+ _efl_vg_base_object_at(obj, &a, &r);
+
+ EINA_ARRAY_ITER_NEXT(&a, i, current, iterator)
+ if (current == obj)
+ break;
+
+ if (current == obj)
+ {
+ i++;
+ if (i < eina_array_count(&a))
+ below = eina_array_data_get(&a, i);
+ }
+
+ eina_array_flush(&a);
+
+ return below;
}
static Efl_Gfx_Stack *
-_efl_vg_base_efl_gfx_stack_above_get(Eo *obj, Efl_VG_Base_Data *pd)
+_efl_vg_base_efl_gfx_stack_above_get(Eo *obj, Efl_VG_Base_Data *pd EINA_UNUSED)
{
- // FIXME bound get every child of my parent and go up until vg root
- return NULL;
+ Eina_Rectangle r;
+ Eina_Array a;
+ Eo *current;
+ Eo *above = NULL;
+ Eina_Array_Iterator iterator;
+ unsigned int i;
+
+ eo_do(obj, efl_vg_bound_get(&r));
+
+ eina_array_step_set(&a, sizeof (Eina_Array), 8);
+
+ _efl_vg_base_object_at(obj, &a, &r);
+
+ EINA_ARRAY_ITER_NEXT(&a, i, current, iterator)
+ if (current == obj)
+ break;
+
+ if (current == obj)
+ {
+ if (i > 0)
+ above = eina_array_data_get(&a, i - 1);
+ }
+
+ eina_array_flush(&a);
+
+ return above;
}
static Eina_Bool