Add e_view_layout 05/320005/1
authorjinbong.lee <jinbong.lee@samsung.com>
Wed, 25 Sep 2024 09:18:18 +0000 (18:18 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Wed, 6 Nov 2024 10:41:56 +0000 (19:41 +0900)
  - e_view_layout for wrapping e_layout

Change-Id: I8280551633e69936595b79f2ab1a9bbadd9f8c5c

src/bin/Makefile.mk
src/bin/core/e_view_intern.h
src/bin/core/e_view_layout.c [new file with mode: 0644]
src/bin/core/e_view_layout_intern.h [new file with mode: 0644]
src/include/e_view_layout.h [new file with mode: 0644]

index b561a97e0b86804024c72a4608a2fccb8385e934..6d5cc2a8b944946345db98abc041e1815fc23690 100644 (file)
@@ -128,6 +128,7 @@ src/include/e_view_rect.h \
 src/include/e_view_image.h \
 src/include/e_view_client.h \
 src/include/e_view_edje.h \
+src/include/e_view_layout.h \
 src/include/e_blur_video_capture.h
 
 enlightenment_src = \
@@ -152,6 +153,7 @@ src/bin/core/e_view_image.c \
 src/bin/core/e_view_client.c \
 src/bin/core/e_view_edje.c \
 src/bin/core/e_view_event.c \
+src/bin/core/e_view_layout.c \
 src/bin/server/e_compositor.c \
 src/bin/server/e_comp_wl.c \
 src/bin/server/e_comp_wl_data.c \
index ed81d1f3d6acc9c1e8a246b87b5ab90178fc143d..8982b1cf21568d542db06b14307e3a3fa37bb61e 100644 (file)
@@ -25,6 +25,7 @@ typedef enum {
      E_VIEW_TYPE_IMAGE,
      E_VIEW_TYPE_CLIENT,
      E_VIEW_TYPE_EDJE,
+     E_VIEW_TYPE_LAYOUT,
 } E_View_Type;
 
 struct _E_View_Impl
diff --git a/src/bin/core/e_view_layout.c b/src/bin/core/e_view_layout.c
new file mode 100644 (file)
index 0000000..48db602
--- /dev/null
@@ -0,0 +1,252 @@
+#include "e_view_layout_intern.h"
+#include "e_layout_intern.h"
+#include "e_view_intern.h"
+
+struct _E_View_Layout
+{
+   E_View    view;
+
+   Eina_List *children;
+};
+
+static void _view_layout_handle_destroy(E_View *view);
+
+const static E_View_Impl view_layout_impl = {
+     .destroy = _view_layout_handle_destroy,
+};
+
+static E_View_Layout *
+_view_layout_from_view(E_View *view)
+{
+   E_View_Layout *layout;
+   assert(view->impl == &view_layout_impl);
+   return wl_container_of(view, layout, view);
+}
+
+static void
+_view_layout_handle_destroy(E_View *view)
+{
+   E_View_Layout *layout = _view_layout_from_view(view);
+
+   evas_object_del(view->eo);
+   free(layout);
+}
+
+EINTERN int
+e_view_layout_freeze(E_View *view)
+{
+   return e_layout_freeze(view->eo);
+}
+
+EINTERN int
+e_view_layout_thaw(E_View *view)
+{
+   return e_layout_thaw(view->eo);
+}
+
+EINTERN void
+e_view_layout_virtual_size_get(E_View *view, int *w, int *h)
+{
+   e_layout_virtual_size_get(view->eo, w, h);
+}
+
+EINTERN void
+e_view_layout_child_lower(E_View *view)
+{
+   e_layout_child_lower(view->eo);
+}
+
+EINTERN void
+e_view_layout_child_raise_above(E_View *view, E_View *above)
+{
+   e_layout_child_raise_above(view->eo, above->eo);
+}
+
+EINTERN void
+e_view_layout_child_lower_below (E_View *view, E_View *below)
+{
+   e_layout_child_lower_below(view->eo, below->eo);
+}
+
+EINTERN void
+e_view_layout_child_geometry_get(E_View *view, int *x, int *y, int *w, int *h)
+{
+   e_layout_child_geometry_get(view->eo, x, y, w, h);
+}
+
+EINTERN E_View *
+e_view_layout_top_child_at_xy_get(E_View *view, int x, int y, Eina_Bool vis, const Eina_List *ignore)
+{
+   Evas_Object* obj;
+   E_View *ignore_view;
+   Eina_List *l, *evas_list = NULL;
+   EINA_LIST_FOREACH((Eina_List *)ignore, l, ignore_view)
+     {
+        evas_list = eina_list_append(evas_list, ignore_view->eo);
+     }
+
+   obj = e_layout_top_child_at_xy_get(view->eo, x, y, vis, evas_list);
+   eina_list_free(evas_list);
+
+   if (obj)
+     return evas_object_data_get(obj, "e_view");
+
+   return NULL;
+}
+
+EINTERN E_View *
+e_view_layout_child_below_get(E_View *view)
+{
+   Evas_Object* obj;
+
+   obj = e_layout_child_below_get(view->eo);
+
+   if (obj)
+     return evas_object_data_get(obj, "e_view");
+
+   return NULL;
+}
+
+EINTERN E_View *
+e_view_layout_child_above_get(E_View *view)
+{
+   Evas_Object* obj;
+
+   obj = e_layout_child_above_get(view->eo);
+
+   if (obj)
+     return evas_object_data_get(obj, "e_view");
+
+   return NULL;
+}
+
+EINTERN E_View *
+e_view_layout_top_child_get(E_View *view)
+{
+   Evas_Object* obj;
+
+   obj = e_layout_top_child_get(view->eo);
+
+   if (obj)
+     return evas_object_data_get(obj, "e_view");
+
+   return NULL;
+}
+
+EINTERN void
+e_view_layout_coord_canvas_to_virtual(E_View *view, int cx, int cy, int *vx, int *vy)
+{
+   e_layout_coord_canvas_to_virtual(view->eo, cx, cy, vx, vy);
+}
+
+EINTERN void
+e_view_layout_coord_virtual_to_canvas(E_View *view, int vx, int vy, int *cx, int *cy)
+{
+   e_layout_coord_virtual_to_canvas(view->eo, vx, vy, cx, cy);
+}
+
+E_API E_View_Layout *
+e_view_layout_try_from_view(E_View *view)
+{
+   if (view->impl != &view_layout_impl)
+     return NULL;
+
+   return _view_layout_from_view(view);
+}
+
+
+E_API E_View *
+e_view_layout_view_get(E_View_Layout *layout)
+{
+   return &layout->view;
+}
+
+E_API E_View_Layout *
+e_view_layout_create(E_View_Tree *parent)
+{
+   E_Canvas *canvas;
+   E_View_Layout *layout;
+   Evas_Object *eo;
+
+   assert(parent != NULL);
+
+   layout = malloc(sizeof(*layout));
+   if (!layout) return NULL;
+
+   layout->children = NULL;
+
+   canvas = e_view_root_get(&parent->view);
+   eo = e_layout_add(canvas->evas);
+   if (!eo)
+     {
+        free(layout);
+        return NULL;
+     }
+
+   e_view_init(&layout->view, E_VIEW_TYPE_LAYOUT, (E_View_Impl*)&view_layout_impl, eo, parent);
+
+   return layout;
+}
+
+E_API void
+e_view_layout_virtual_size_set(E_View_Layout *layout, int w, int h)
+{
+   E_View *view;
+
+   if (!layout) return;
+
+   view = e_view_layout_view_get(layout);
+   e_layout_virtual_size_set(view->eo, w, h);
+}
+
+E_API void
+e_view_layout_pack(E_View_Layout *layout, E_View *child)
+{
+   E_View *view;
+
+   if (!layout || !child) return;
+
+   view = e_view_layout_view_get(layout);
+   e_layout_pack(view->eo, child->eo);
+
+   layout->children = eina_list_append(layout->children, child);
+   e_view_data_set(child, "e_view_layout", layout);
+}
+
+E_API void
+e_view_layout_unpack(E_View *child)
+{
+   if (!child) return;
+
+   E_View_Layout *layout = e_view_data_get(child, "e_view_layout");
+   if (!layout) return;
+
+   layout->children = eina_list_remove(layout->children, child);
+   e_layout_unpack(child->eo);
+}
+
+E_API Eina_List *
+e_view_layout_children_get(E_View_Layout *layout)
+{
+   if (!layout) return NULL;
+
+   return layout->children;
+}
+
+E_API void
+e_view_layout_child_move(E_View *child, int x, int y)
+{
+   e_layout_child_move(child->eo, x, y);
+}
+
+E_API void
+e_view_layout_child_resize(E_View *child, int w, int h)
+{
+   e_layout_child_resize(child->eo, w, h);
+}
+
+E_API void
+e_view_layout_child_raise (E_View *child)
+{
+   e_layout_child_raise(child->eo);
+}
diff --git a/src/bin/core/e_view_layout_intern.h b/src/bin/core/e_view_layout_intern.h
new file mode 100644 (file)
index 0000000..a8b5276
--- /dev/null
@@ -0,0 +1,22 @@
+#ifndef E_VIEW_LAYOUT_INTERN_H
+#define E_VIEW_LAYOUT_INTERN_H
+
+#include "e_intern.h"
+#include "e_view_layout.h"
+
+EINTERN int     e_view_layout_freeze            (E_View *view);
+EINTERN int     e_view_layout_thaw              (E_View *view);
+EINTERN void    e_view_layout_virtual_size_get  (E_View *view, int *w, int *h);
+EINTERN void    e_view_layout_child_lower       (E_View *view);
+EINTERN void    e_view_layout_child_raise_above (E_View *view, E_View *above);
+EINTERN void    e_view_layout_child_lower_below (E_View *view, E_View *below);
+EINTERN void    e_view_layout_child_geometry_get(E_View *view, int *x, int *y, int *w, int *h);
+EINTERN E_View *e_view_layout_top_child_at_xy_get(E_View *view, int x, int y, Eina_Bool vis, const Eina_List *ignore);
+EINTERN E_View *e_view_layout_child_below_get(E_View *view);
+EINTERN E_View *e_view_layout_child_above_get(E_View *view);
+EINTERN E_View *e_view_layout_top_child_get(E_View *view);
+
+EINTERN void e_view_layout_coord_canvas_to_virtual (E_View *view, int cx, int cy, int *vx, int *vy);
+EINTERN void e_view_layout_coord_virtual_to_canvas (E_View *view, int vx, int vy, int *cx, int *cy);
+
+#endif
diff --git a/src/include/e_view_layout.h b/src/include/e_view_layout.h
new file mode 100644 (file)
index 0000000..c29ab76
--- /dev/null
@@ -0,0 +1,30 @@
+#ifndef E_VIEW_LAYOUT_H
+#define E_VIEW_LAYOUT_H
+
+#ifdef  __cplusplus
+extern "C" {
+#endif
+
+#include <e_view.h>
+#include <e_types.h>
+
+typedef struct _E_View_Layout E_View_Layout;
+
+E_API E_View_Layout *e_view_layout_try_from_view(E_View *view);
+E_API E_View        *e_view_layout_view_get(E_View_Layout *layout);
+
+E_API E_View_Layout *e_view_layout_create            (E_View_Tree *parent);
+E_API void           e_view_layout_virtual_size_set  (E_View_Layout *layout, int w, int h);
+E_API void           e_view_layout_pack              (E_View_Layout *layout, E_View *child);
+E_API void           e_view_layout_unpack            (E_View *child);
+
+E_API Eina_List     *e_view_layout_children_get(E_View_Layout *layout);
+E_API void           e_view_layout_child_move  (E_View *child, int x, int y);
+E_API void           e_view_layout_child_resize(E_View *child, int w, int h);
+E_API void           e_view_layout_child_raise (E_View *child);
+
+#ifdef  __cplusplus
+}
+#endif
+
+#endif
\ No newline at end of file