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