summaryrefslogtreecommitdiff
path: root/src/lib/elementary/efl_ui_active_view_view_manager_plain.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/elementary/efl_ui_active_view_view_manager_plain.c')
-rw-r--r--src/lib/elementary/efl_ui_active_view_view_manager_plain.c166
1 files changed, 166 insertions, 0 deletions
diff --git a/src/lib/elementary/efl_ui_active_view_view_manager_plain.c b/src/lib/elementary/efl_ui_active_view_view_manager_plain.c
new file mode 100644
index 0000000000..32c530d827
--- /dev/null
+++ b/src/lib/elementary/efl_ui_active_view_view_manager_plain.c
@@ -0,0 +1,166 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+
+#include <Efl_Ui.h>
+#include "elm_priv.h"
+#include "efl_ui_active_view_view_manager_plain.eo.h"
+
+typedef struct {
+ Efl_Ui_Active_View_Container * container;
+ Efl_Gfx_Entity *group;
+ Eina_Size2D page_size;
+ int current_content;
+ Eina_Bool animation;
+} Efl_Ui_Active_View_View_Manager_Plain_Data;
+
+#define MY_CLASS EFL_UI_ACTIVE_VIEW_VIEW_MANAGER_PLAIN_CLASS
+
+static void
+_emit_position(Eo *obj EINA_UNUSED, Efl_Ui_Active_View_View_Manager_Plain_Data *pd)
+{
+ double absolut_position = pd->current_content;
+ efl_event_callback_call(obj, EFL_UI_ACTIVE_VIEW_VIEW_MANAGER_EVENT_POS_UPDATE, &absolut_position);
+}
+
+static void
+_geom_sync(Eo *obj EINA_UNUSED, Efl_Ui_Active_View_View_Manager_Plain_Data *pd)
+{
+ Efl_Gfx_Entity *entity = efl_pack_content_get(pd->container, pd->current_content);
+ Eina_Rect group_pos = efl_gfx_entity_geometry_get(pd->group);
+ Eina_Rect goal = EINA_RECT_EMPTY();
+
+ goal.size = pd->page_size;
+ goal.y = (group_pos.y + group_pos.h/2)-pd->page_size.h/2;
+ goal.x = (group_pos.x + group_pos.w/2)-pd->page_size.w/2;
+ efl_gfx_entity_geometry_set(entity, goal);
+}
+
+static void
+_resize_cb(void *data, const Efl_Event *ev EINA_UNUSED)
+{
+ _geom_sync(data, efl_data_scope_get(data, MY_CLASS));
+}
+
+static void
+_move_cb(void *data, const Efl_Event *ev EINA_UNUSED)
+{
+ _geom_sync(data, efl_data_scope_get(data, MY_CLASS));
+}
+
+EFL_CALLBACKS_ARRAY_DEFINE(group_callback,
+ {EFL_GFX_ENTITY_EVENT_SIZE_CHANGED, _resize_cb},
+ {EFL_GFX_ENTITY_EVENT_POSITION_CHANGED, _move_cb},
+)
+
+EOLIAN static void
+_efl_ui_active_view_view_manager_plain_efl_ui_active_view_view_manager_bind(Eo *obj, Efl_Ui_Active_View_View_Manager_Plain_Data *pd, Efl_Ui_Active_View_Container *active_view, Efl_Canvas_Group *group)
+{
+ if (active_view && group)
+ {
+ int index;
+
+ pd->container = active_view;
+ pd->group = group;
+
+ efl_event_callback_array_add(pd->group, group_callback(), obj);
+
+ for (int i = 0; i < efl_content_count(active_view) ; ++i) {
+ Efl_Gfx_Entity *elem = efl_pack_content_get(active_view, i);
+ efl_canvas_group_member_add(pd->group, elem);
+ efl_gfx_entity_visible_set(elem, EINA_FALSE);
+ }
+ index = efl_ui_active_view_active_index_get(active_view);
+ if (index != -1)
+ {
+ pd->current_content = index;
+ efl_gfx_entity_visible_set(efl_pack_content_get(pd->container, pd->current_content), EINA_TRUE);
+ _geom_sync(obj, pd);
+ _emit_position(obj, pd);
+ }
+ }
+}
+
+static void
+_content_changed(Eo *obj, Efl_Ui_Active_View_View_Manager_Plain_Data *pd)
+{
+ if (efl_ui_active_view_active_index_get(pd->container) != pd->current_content)
+ {
+ pd->current_content = efl_ui_active_view_active_index_get(pd->container);
+ efl_gfx_entity_visible_set(efl_pack_content_get(pd->container, pd->current_content), EINA_FALSE);
+ _geom_sync(obj, pd);
+ _emit_position(obj, pd);
+ }
+}
+
+EOLIAN static void
+_efl_ui_active_view_view_manager_plain_efl_ui_active_view_view_manager_content_add(Eo *obj, Efl_Ui_Active_View_View_Manager_Plain_Data *pd, Efl_Gfx_Entity *subobj, int index EINA_UNUSED)
+{
+ efl_canvas_group_member_add(pd->group, subobj);
+ efl_gfx_entity_visible_set(subobj, EINA_FALSE);
+ _content_changed(obj, pd);
+}
+
+EOLIAN static void
+_efl_ui_active_view_view_manager_plain_efl_ui_active_view_view_manager_content_del(Eo *obj, Efl_Ui_Active_View_View_Manager_Plain_Data *pd, Efl_Gfx_Entity *subobj, int index EINA_UNUSED)
+{
+ efl_canvas_group_member_remove(pd->group, subobj);
+ _content_changed(obj, pd);
+}
+EOLIAN static void
+_efl_ui_active_view_view_manager_plain_efl_ui_active_view_view_manager_switch_to(Eo *obj, Efl_Ui_Active_View_View_Manager_Plain_Data *pd, int from EINA_UNUSED, int to)
+{
+ Efl_Gfx_Entity *to_obj, *from_obj;
+ to_obj = efl_pack_content_get(pd->container, to);
+ from_obj = efl_pack_content_get(pd->container, from);
+ if (from_obj)
+ {
+ efl_gfx_entity_visible_set(from_obj, EINA_FALSE);
+ pd->current_content = -1;
+ }
+
+ if (to_obj)
+ {
+ efl_gfx_entity_visible_set(to_obj, EINA_TRUE);
+ pd->current_content = to;
+ }
+
+ _emit_position(obj, pd);
+ _geom_sync(obj, pd);
+}
+
+EOLIAN static void
+_efl_ui_active_view_view_manager_plain_efl_ui_active_view_view_manager_view_size_set(Eo *obj, Efl_Ui_Active_View_View_Manager_Plain_Data *pd, Eina_Size2D size)
+{
+ pd->page_size = size;
+ _geom_sync(obj, pd);
+}
+
+EOLIAN static void
+_efl_ui_active_view_view_manager_plain_efl_object_destructor(Eo *obj, Efl_Ui_Active_View_View_Manager_Plain_Data *pd EINA_UNUSED)
+{
+ efl_destructor(efl_super(obj, MY_CLASS));
+
+ efl_event_callback_array_del(pd->group, group_callback(), obj);
+
+ for (int i = 0; i < efl_content_count(pd->container); ++i)
+ {
+ Efl_Gfx_Stack *elem = efl_pack_content_get(pd->container, i);
+ efl_gfx_entity_visible_set(elem, EINA_TRUE);
+ }
+}
+
+EOLIAN static void
+_efl_ui_active_view_view_manager_plain_efl_ui_active_view_view_manager_animation_enabled_set(Eo *obj EINA_UNUSED, Efl_Ui_Active_View_View_Manager_Plain_Data *pd, Eina_Bool animation)
+{
+ pd->animation = animation;
+}
+
+EOLIAN static Eina_Bool
+_efl_ui_active_view_view_manager_plain_efl_ui_active_view_view_manager_animation_enabled_get(const Eo *obj EINA_UNUSED, Efl_Ui_Active_View_View_Manager_Plain_Data *pd)
+{
+ return pd->animation;
+}
+
+
+#include "efl_ui_active_view_view_manager_plain.eo.c"