1 #ifdef HAVE_CONFIG_H
2 # include "elementary_config.h"
3 #endif
4 
5 #define EFL_ACCESS_OBJECT_PROTECTED
6 #define EFL_UI_FOCUS_COMPOSITION_PROTECTED
7 
8 #include <Elementary.h>
9 #include <elm_grid_eo.h>
10 #include "elm_priv.h"
11 #include "elm_widget_grid.h"
12 
13 #define MY_CLASS ELM_GRID_CLASS
14 #define MY_CLASS_NAME "Elm_Grid"
15 #define MY_CLASS_NAME_LEGACY "elm_grid"
16 
17 static void
_elm_grid_efl_ui_focus_composition_prepare(Eo * obj,void * pd EINA_UNUSED)18 _elm_grid_efl_ui_focus_composition_prepare(Eo *obj, void *pd EINA_UNUSED)
19 {
20    Eina_List *l, *ll;
21    Efl_Ui_Widget *elem;
22 
23    Elm_Widget_Smart_Data *wpd = efl_data_scope_get(obj, EFL_UI_WIDGET_CLASS);
24    Eina_List *order = evas_object_grid_children_get(wpd->resize_obj);
25 
26    EINA_LIST_FOREACH_SAFE(order, l, ll, elem)
27      {
28         if (!efl_isa(elem, EFL_UI_WIDGET_CLASS))
29           order = eina_list_remove(order, elem);
30      }
31 
32    efl_ui_focus_composition_elements_set(obj, order);
33 }
34 
35 static void
_mirrored_set(Evas_Object * obj,Eina_Bool rtl)36 _mirrored_set(Evas_Object *obj, Eina_Bool rtl)
37 {
38    ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
39 
40    evas_object_grid_mirrored_set(wd->resize_obj, rtl);
41 }
42 
43 EOLIAN static Eina_Error
_elm_grid_efl_ui_widget_theme_apply(Eo * obj,void * sd EINA_UNUSED)44 _elm_grid_efl_ui_widget_theme_apply(Eo *obj, void *sd EINA_UNUSED)
45 {
46    Eina_Error int_ret = EFL_UI_THEME_APPLY_ERROR_GENERIC;
47 
48    int_ret = efl_ui_widget_theme_apply(efl_super(obj, MY_CLASS));
49    if (int_ret == EFL_UI_THEME_APPLY_ERROR_GENERIC) return int_ret;
50 
51    _mirrored_set(obj, efl_ui_mirrored_get(obj));
52 
53    return int_ret;
54 }
55 
56 EOLIAN static void
_elm_grid_efl_canvas_group_group_add(Eo * obj,void * _pd EINA_UNUSED)57 _elm_grid_efl_canvas_group_group_add(Eo *obj, void *_pd EINA_UNUSED)
58 {
59    ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
60    Evas_Object *grid;
61 
62    grid = evas_object_grid_add(evas_object_evas_get(obj));
63    elm_widget_resize_object_set(obj, grid);
64    evas_object_grid_size_set(wd->resize_obj, 100, 100);
65 
66    efl_canvas_group_add(efl_super(obj, MY_CLASS));
67 
68    elm_widget_can_focus_set(obj, EINA_FALSE);
69 
70    efl_ui_widget_theme_apply(obj);
71 }
72 
73 EOLIAN static void
_elm_grid_efl_canvas_group_group_del(Eo * obj,void * _pd EINA_UNUSED)74 _elm_grid_efl_canvas_group_group_del(Eo *obj, void *_pd EINA_UNUSED)
75 {
76    ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
77 
78    /* let's make our grid object the *last* to be processed, since it
79     * may (smart) parent other sub objects here */
80    {
81       unsigned int resize_id = 0;
82       if (eina_array_find(wd->children, wd->resize_obj, &resize_id))
83         {
84            //exchange with last
85            eina_array_data_set(wd->children, resize_id, eina_array_data_get(wd->children, eina_array_count(wd->children) - 1));
86            eina_array_data_set(wd->children, eina_array_count(wd->children) - 1, wd->resize_obj);
87         }
88    }
89 
90    efl_canvas_group_del(efl_super(obj, MY_CLASS));
91 }
92 
93 EAPI Evas_Object *
elm_grid_add(Evas_Object * parent)94 elm_grid_add(Evas_Object *parent)
95 {
96    EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
97    return elm_legacy_add(MY_CLASS, parent);
98 }
99 
100 EOLIAN static Eo *
_elm_grid_efl_object_constructor(Eo * obj,void * _pd EINA_UNUSED)101 _elm_grid_efl_object_constructor(Eo *obj, void *_pd EINA_UNUSED)
102 {
103    obj = efl_constructor(efl_super(obj, MY_CLASS));
104    efl_canvas_object_type_set(obj, MY_CLASS_NAME_LEGACY);
105    efl_access_object_role_set(obj, EFL_ACCESS_ROLE_FILLER);
106 
107    return obj;
108 }
109 
110 EOLIAN static void
_elm_grid_grid_size_set(Eo * obj,void * _pd EINA_UNUSED,Evas_Coord w,Evas_Coord h)111 _elm_grid_grid_size_set(Eo *obj, void *_pd EINA_UNUSED, Evas_Coord w, Evas_Coord h)
112 {
113    ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
114 
115    evas_object_grid_size_set(wd->resize_obj, w, h);
116 }
117 
118 EOLIAN static void
_elm_grid_grid_size_get(const Eo * obj,void * _pd EINA_UNUSED,Evas_Coord * w,Evas_Coord * h)119 _elm_grid_grid_size_get(const Eo *obj, void *_pd EINA_UNUSED, Evas_Coord *w, Evas_Coord *h)
120 {
121    ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
122 
123    evas_object_grid_size_get(wd->resize_obj, w, h);
124 }
125 
126 EOLIAN static void
_elm_grid_pack(Eo * obj,void * _pd EINA_UNUSED,Evas_Object * subobj,Evas_Coord x,Evas_Coord y,Evas_Coord w,Evas_Coord h)127 _elm_grid_pack(Eo *obj, void *_pd EINA_UNUSED, Evas_Object *subobj, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h)
128 {
129    ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
130 
131    elm_widget_sub_object_add(obj, subobj);
132    evas_object_grid_pack(wd->resize_obj, subobj, x, y, w, h);
133    efl_ui_focus_composition_dirty(obj);
134 }
135 
136 EOLIAN static void
_elm_grid_unpack(Eo * obj,void * _pd EINA_UNUSED,Evas_Object * subobj)137 _elm_grid_unpack(Eo *obj, void *_pd EINA_UNUSED, Evas_Object *subobj)
138 {
139    ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
140 
141    _elm_widget_sub_object_redirect_to_top(obj, subobj);
142    evas_object_grid_unpack(wd->resize_obj, subobj);
143    efl_ui_focus_composition_dirty(obj);
144 }
145 
146 EOLIAN static void
_elm_grid_clear(Eo * obj,void * _pd EINA_UNUSED,Eina_Bool clear)147 _elm_grid_clear(Eo *obj, void *_pd EINA_UNUSED, Eina_Bool clear)
148 {
149    Eina_List *chld;
150    Evas_Object *o;
151 
152    ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
153 
154    if (!clear)
155      {
156         chld = evas_object_grid_children_get(wd->resize_obj);
157         EINA_LIST_FREE(chld, o)
158           _elm_widget_sub_object_redirect_to_top(obj, o);
159      }
160 
161    evas_object_grid_clear(wd->resize_obj, clear);
162    efl_ui_focus_composition_dirty(obj);
163 }
164 
165 EAPI void
elm_grid_pack_set(Evas_Object * subobj,Evas_Coord x,Evas_Coord y,Evas_Coord w,Evas_Coord h)166 elm_grid_pack_set(Evas_Object *subobj,
167                   Evas_Coord x,
168                   Evas_Coord y,
169                   Evas_Coord w,
170                   Evas_Coord h)
171 {
172    Evas_Object *obj = elm_widget_parent_widget_get(subobj);
173 
174    ELM_GRID_CHECK(obj);
175    ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
176 
177    evas_object_grid_pack(wd->resize_obj, subobj, x, y, w, h);
178    efl_ui_focus_composition_dirty(obj);
179 }
180 
181 EAPI void
elm_grid_pack_get(Evas_Object * subobj,int * x,int * y,int * w,int * h)182 elm_grid_pack_get(Evas_Object *subobj,
183                   int *x,
184                   int *y,
185                   int *w,
186                   int *h)
187 {
188    Evas_Object *obj = elm_widget_parent_widget_get(subobj);
189 
190    ELM_GRID_CHECK(obj);
191    ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
192 
193    evas_object_grid_pack_get
194      (wd->resize_obj, subobj, x, y, w, h);
195 }
196 
197 EOLIAN static Eina_List*
_elm_grid_children_get(const Eo * obj,void * _pd EINA_UNUSED)198 _elm_grid_children_get(const Eo *obj, void *_pd EINA_UNUSED)
199 {
200    ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, NULL);
201    return evas_object_grid_children_get(wd->resize_obj);
202 }
203 
204 static void
_elm_grid_class_constructor(Efl_Class * klass)205 _elm_grid_class_constructor(Efl_Class *klass)
206 {
207    evas_smart_legacy_type_register(MY_CLASS_NAME_LEGACY, klass);
208 }
209 
210 /* Internal EO APIs and hidden overrides */
211 
212 #define ELM_GRID_EXTRA_OPS \
213    EFL_CANVAS_GROUP_ADD_DEL_OPS(elm_grid)
214 
215 #include "elm_grid_eo.c"
216