jpeg pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=c17b3d40a25f6a2202d15d278bc87e01246988dc
commit c17b3d40a25f6a2202d15d278bc87e01246988dc Author: Jee-Yong Um <jc9...@samsung.com> Date: Fri Jun 10 13:29:33 2016 +0900 Efl.Ui.Grid.Static: Add implementation of simple grid Summary: Efl.Ui.Grid.Static uses virtual coordinates when arranging its child objects. (like Evas.Grid) Reviewers: jpeg Subscribers: woohyun, cedric Differential Revision: https://phab.enlightenment.org/D3989 --- src/Makefile_Elementary.am | 3 ++ src/lib/elementary/Elementary.h.in | 1 + src/lib/elementary/Makefile.am | 3 ++ src/lib/elementary/efl_ui_grid.c | 58 +------------------------ src/lib/elementary/efl_ui_grid_private.h | 62 ++++++++++++++++++++++++++ src/lib/elementary/efl_ui_grid_static.c | 74 ++++++++++++++++++++++++++++++++ src/lib/elementary/efl_ui_grid_static.eo | 8 ++++ 7 files changed, 152 insertions(+), 57 deletions(-) diff --git a/src/Makefile_Elementary.am b/src/Makefile_Elementary.am index 4f7dc08..9034a8d 100644 --- a/src/Makefile_Elementary.am +++ b/src/Makefile_Elementary.am @@ -118,6 +118,7 @@ elm_public_eolian_files = \ lib/elementary/efl_ui_box.eo \ lib/elementary/efl_ui_box_flow.eo \ lib/elementary/efl_ui_grid.eo \ + lib/elementary/efl_ui_grid_static.eo \ lib/elementary/efl_ui_layout_internal_box.eo \ lib/elementary/efl_ui_layout_internal_table.eo \ lib/elementary/elm_button_internal_part.eo \ @@ -677,6 +678,8 @@ lib_elementary_libelementary_la_SOURCES = \ lib/elementary/efl_ui_box_layout.c \ lib/elementary/efl_ui_box_private.h \ lib/elementary/efl_ui_grid.c \ + lib/elementary/efl_ui_grid_static.c \ + lib/elementary/efl_ui_grid_private.h \ $(NULL) diff --git a/src/lib/elementary/Elementary.h.in b/src/lib/elementary/Elementary.h.in index 6f362ec..dee412d 100644 --- a/src/lib/elementary/Elementary.h.in +++ b/src/lib/elementary/Elementary.h.in @@ -272,6 +272,7 @@ EAPI extern Elm_Version *elm_version; # include <efl_ui_box.eo.h> # include <efl_ui_box_flow.eo.h> # include <efl_ui_grid.eo.h> +# include <efl_ui_grid_static.eo.h> # include <efl_ui_image.eo.h> # include <efl_ui_win.eo.h> # include <efl_ui_win_standard.eo.h> diff --git a/src/lib/elementary/Makefile.am b/src/lib/elementary/Makefile.am index a553e07..13854bc 100644 --- a/src/lib/elementary/Makefile.am +++ b/src/lib/elementary/Makefile.am @@ -125,6 +125,7 @@ elm_eolian_files = \ efl_ui_box.eo \ efl_ui_box_flow.eo \ efl_ui_grid.eo \ + efl_ui_grid_static.eo \ efl_ui_layout_internal_box.eo \ efl_ui_layout_internal_table.eo \ $(NULL) @@ -496,6 +497,7 @@ includesub_HEADERS = \ elm_win_standard.h \ elm_helper.h \ efl_ui_box_private.h \ + efl_ui_grid_private.h \ $(NULL) includesubdir = $(includedir)/elementary-@VMAJ@/ @@ -627,6 +629,7 @@ libelementary_la_SOURCES = \ efl_ui_box_flow.c \ efl_ui_box_layout.c \ efl_ui_grid.c \ + efl_ui_grid_static.c \ $(NULL) libelementary_la_CFLAGS = @ELEMENTARY_CFLAGS@ diff --git a/src/lib/elementary/efl_ui_grid.c b/src/lib/elementary/efl_ui_grid.c index 66c8635..0828cae 100644 --- a/src/lib/elementary/efl_ui_grid.c +++ b/src/lib/elementary/efl_ui_grid.c @@ -1,65 +1,15 @@ -#ifdef HAVE_CONFIG_H -# include "elementary_config.h" -#endif +#include "efl_ui_grid_private.h" -#define EFL_PACK_LAYOUT_PROTECTED - -#include <Elementary.h> -#include "elm_priv.h" - -#include "efl_ui_grid.eo.h" #include "../evas/canvas/evas_table.eo.h" #define MY_CLASS EFL_UI_GRID_CLASS #define MY_CLASS_NAME "Efl.Ui.Grid" -typedef struct _Efl_Ui_Grid_Data Efl_Ui_Grid_Data; -typedef struct _Grid_Item_Iterator Grid_Item_Iterator; -typedef struct _Grid_Item Grid_Item; typedef struct _Custom_Table_Data Custom_Table_Data; static Eina_Bool _subobj_del_cb(void *data, const Eo_Event *event); static void _item_remove(Efl_Ui_Grid *obj, Efl_Ui_Grid_Data *pd, Efl_Gfx *subobj); -#define GRID_ITEM_KEY "__grid_item" - -struct _Grid_Item -{ - EINA_INLIST; - - Efl_Gfx *object; - int col_span, row_span; - int col, row; - - Eina_Bool linear : 1; -}; - -struct _Efl_Ui_Grid_Data -{ - const Eo_Class *layout_engine; - const void *layout_data; - - Grid_Item *items; - int count; - - int req_cols, req_rows; // requested - 0 means infinite - int last_col, last_row; // only used by linear apis - Efl_Orient dir1, dir2; // must be orthogonal (H,V or V,H) - struct { - double h, v; - Eina_Bool scalable: 1; - } pad; - Eina_Bool linear_recalc : 1; -}; - -struct _Grid_Item_Iterator -{ - Eina_Iterator iterator; - Eina_Iterator *real_iterator; - Eina_List *list; - Efl_Ui_Grid *object; -}; - struct _Custom_Table_Data { Efl_Ui_Grid *parent; @@ -69,12 +19,6 @@ struct _Custom_Table_Data EO_CALLBACKS_ARRAY_DEFINE(subobj_callbacks, { EO_EVENT_DEL, _subobj_del_cb }); -static inline Eina_Bool -_horiz(Efl_Orient dir) -{ - return dir % 180 == EFL_ORIENT_RIGHT; -} - EOLIAN static Eina_Bool _efl_ui_grid_elm_widget_focus_next_manager_is(Eo *obj EINA_UNUSED, Efl_Ui_Grid_Data *pd EINA_UNUSED) { diff --git a/src/lib/elementary/efl_ui_grid_private.h b/src/lib/elementary/efl_ui_grid_private.h new file mode 100644 index 0000000..ab2aa85 --- /dev/null +++ b/src/lib/elementary/efl_ui_grid_private.h @@ -0,0 +1,62 @@ +#ifndef EFL_UI_GRID_PRIVATE_H +#define EFL_UI_GRID_PRIVATE_H + +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif + +#define EFL_PACK_LAYOUT_PROTECTED + +#include <Elementary.h> +#include "elm_priv.h" + +typedef struct _Efl_Ui_Grid_Data Efl_Ui_Grid_Data; +typedef struct _Grid_Item_Iterator Grid_Item_Iterator; +typedef struct _Grid_Item Grid_Item; + +#define GRID_ITEM_KEY "__grid_item" + +struct _Grid_Item +{ + EINA_INLIST; + + Efl_Gfx *object; + int col_span, row_span; + int col, row; + + Eina_Bool linear : 1; +}; + +struct _Efl_Ui_Grid_Data +{ + const Eo_Class *layout_engine; + const void *layout_data; + + Grid_Item *items; + int count; + + int req_cols, req_rows; // requested - 0 means infinite + int last_col, last_row; // only used by linear apis + Efl_Orient dir1, dir2; // must be orthogonal (H,V or V,H) + struct { + double h, v; + Eina_Bool scalable: 1; + } pad; + Eina_Bool linear_recalc : 1; +}; + +struct _Grid_Item_Iterator +{ + Eina_Iterator iterator; + Eina_Iterator *real_iterator; + Eina_List *list; + Efl_Ui_Grid *object; +}; + +static inline Eina_Bool +_horiz(Efl_Orient dir) +{ + return dir % 180 == EFL_ORIENT_RIGHT; +} + +#endif diff --git a/src/lib/elementary/efl_ui_grid_static.c b/src/lib/elementary/efl_ui_grid_static.c new file mode 100644 index 0000000..a8209d2 --- /dev/null +++ b/src/lib/elementary/efl_ui_grid_static.c @@ -0,0 +1,74 @@ +#include "efl_ui_grid_private.h" + +#define MY_CLASS EFL_UI_GRID_STATIC_CLASS +#define MY_CLASS_NAME "Efl.Ui.Grid.Static" + +EOLIAN static Eo * +_efl_ui_grid_static_eo_base_constructor(Eo *obj, void *pd EINA_UNUSED) +{ + Efl_Ui_Grid_Data *gd; + + obj = eo_constructor(eo_super(obj, MY_CLASS)); + evas_obj_type_set(obj, MY_CLASS_NAME); + elm_interface_atspi_accessible_role_set(obj, ELM_ATSPI_ROLE_FILLER); + + gd = eo_data_scope_get(obj, EFL_UI_GRID_CLASS); + gd->layout_engine = MY_CLASS; + gd->req_cols = 100; + gd->req_rows = 100; + + return obj; +} + +EOLIAN static void +_efl_ui_grid_static_efl_pack_layout_layout_do(Eo_Class *klass EINA_UNUSED, + void *_pd EINA_UNUSED, + Eo *obj, const void *data EINA_UNUSED) +{ + Efl_Ui_Grid_Data *gd; + Grid_Item *gi; + Evas *e; + Evas_Coord x, y, w, h; + long long xl, yl, wl, hl, vwl, vhl; + Eina_Bool mirror; + + gd = eo_data_scope_get(obj, EFL_UI_GRID_CLASS); + if (!gd->items) return; + + e = evas_common_evas_get(obj); + eo_event_freeze(e); + + efl_gfx_position_get(obj, &x, &y); + efl_gfx_size_get(obj, &w, &h); + xl = x; + yl = y; + wl = w; + hl = h; + mirror = elm_widget_mirrored_get(obj); + vwl = gd->req_cols; + vhl = gd->req_rows; + + EINA_INLIST_FOREACH(gd->items, gi) + { + long long x1, y1, x2, y2; + + if (!mirror) + { + x1 = xl + ((wl * (long long)gi->col) / vwl); + x2 = xl + ((wl * (long long)(gi->col + gi->col_span)) / vwl); + } + else + { + x1 = xl + ((wl * (vwl - (long long)(gi->col + gi->col_span))) / vwl); + x2 = xl + ((wl * (vwl - (long long)gi->col)) / vwl); + } + y1 = yl + ((hl * (long long)gi->row) / vhl); + y2 = yl + ((hl * (long long)(gi->row + gi->row_span)) / vhl); + efl_gfx_position_set(gi->object, x1, y1); + efl_gfx_size_set(gi->object, x2 - x1, y2 - y1); + } + + eo_event_thaw(e); +} + +#include "efl_ui_grid_static.eo.c" diff --git a/src/lib/elementary/efl_ui_grid_static.eo b/src/lib/elementary/efl_ui_grid_static.eo new file mode 100644 index 0000000..1514dbb --- /dev/null +++ b/src/lib/elementary/efl_ui_grid_static.eo @@ -0,0 +1,8 @@ +class Efl.Ui.Grid.Static (Efl.Ui.Grid) +{ + data: null; + implements { + Eo.Base.constructor; + Efl.Pack.Layout.layout_do; + } +} --