1 #ifndef _ELM_PART_HELPER_H
2 #define _ELM_PART_HELPER_H
3 
4 #include "Elementary.h"
5 #include "elm_priv.h"
6 #include "efl_ui_layout_part_legacy.eo.h"
7 
8 //#define ELM_PART_HOOK do { ERR("%s@%p:%s [%d]", efl_class_name_get(pd->obj), pd->obj, pd->part, (int) pd->temp); } while(0)
9 #define ELM_PART_HOOK do {} while(0)
10 
11 typedef struct _Elm_Part_Data Elm_Part_Data;
12 struct _Elm_Part_Data
13 {
14    Eo             *obj;
15    Eina_Tmpstr    *part;
16 };
17 
18 // Note: this generic implementation can be improved to support part object
19 // caching or something...
20 
21 // FIXME: Some widgets return the alias name, some return the real name
22 // alias doesn't work for frame, _elm_layout_part_aliasing_eval() fails for scroller
23 #define ELM_PART_CONTENT_DEFAULT_GET(type, part) \
24    static const char * _ ## type ## _default_content_part_get(const Eo *obj EINA_UNUSED, void *sd EINA_UNUSED) { return part; }
25 
26 #define ELM_PART_CONTENT_DEFAULT_OPS(type) \
27    EFL_OBJECT_OP_FUNC(efl_ui_widget_default_content_part_get, _ ## type ## _default_content_part_get)
28 
29 #define ELM_PART_TEXT_DEFAULT_GET(type, part) \
30    static const char * _ ## type ## _default_text_part_get(const Eo *obj EINA_UNUSED, void *sd EINA_UNUSED) { return part; }
31 
32 #define ELM_PART_TEXT_DEFAULT_OPS(type) \
33    EFL_OBJECT_OP_FUNC(efl_ui_widget_default_text_part_get, _ ## type ## _default_text_part_get)
34 
35 #define ELM_PART_CONTENT_DEFAULT_IMPLEMENT(type, typedata) \
36    static void \
37    _ ## type ## _invalidated_cb(void *data, const Efl_Event *ev EINA_UNUSED) \
38    { \
39       efl_content_set(data, NULL); \
40    } \
41    \
42    EOLIAN static Eina_Bool \
43    _ ## type ## _efl_content_content_set(Eo *obj, typedata *sd EINA_UNUSED, Evas_Object *content) \
44    { \
45       Eina_Bool result; \
46       Efl_Ui_Widget *former; \
47       former = efl_content_get(efl_part(obj, efl_ui_widget_default_content_part_get(obj))); \
48       if (former) \
49         efl_event_callback_del(former, EFL_EVENT_INVALIDATE, _ ## type ## _invalidated_cb, obj); \
50       result = efl_content_set(efl_part(obj, efl_ui_widget_default_content_part_get(obj)), content); \
51       if (content && result) \
52         efl_event_callback_add(content, EFL_EVENT_INVALIDATE, _ ## type ## _invalidated_cb, obj); \
53       efl_event_callback_call(obj, EFL_CONTENT_EVENT_CONTENT_CHANGED, result ? content : NULL); \
54       return result; \
55    } \
56    \
57    EOLIAN static Evas_Object* \
58    _ ## type ## _efl_content_content_get(const Eo *obj, typedata *sd EINA_UNUSED) \
59    { \
60       return efl_content_get(efl_part(obj, efl_ui_widget_default_content_part_get(obj))); \
61    } \
62    \
63    EOLIAN static Evas_Object* \
64    _ ## type ## _efl_content_content_unset(Eo *obj, typedata *sd EINA_UNUSED) \
65    { \
66       Eo *result = efl_content_unset(efl_part(obj, efl_ui_widget_default_content_part_get(obj))); \
67       if (result) \
68         efl_event_callback_del(result, EFL_EVENT_INVALIDATE, _ ## type ## _invalidated_cb, obj); \
69       efl_event_callback_call(obj, EFL_CONTENT_EVENT_CONTENT_CHANGED, NULL); \
70       return result; \
71    }
72 
73 static inline Eo *
_elm_part_initialize(Eo * proxy,Eo * obj,const char * part)74 _elm_part_initialize(Eo *proxy, Eo *obj, const char *part)
75 {
76    Elm_Part_Data *pd = efl_data_scope_get(proxy, EFL_UI_WIDGET_PART_CLASS);
77 
78    EINA_SAFETY_ON_FALSE_RETURN_VAL(pd && obj && part, NULL);
79    pd->part = eina_tmpstr_add(part);
80    pd->obj = obj;
81 
82    return proxy;
83 }
84 
85 static inline Eo *
ELM_PART_IMPLEMENT(const Efl_Class * part_klass,const Eo * obj,const char * part)86 ELM_PART_IMPLEMENT(const Efl_Class *part_klass, const Eo *obj, const char *part)
87 {
88    return efl_add(part_klass, (Eo *) obj,
89                   _elm_part_initialize(efl_added, (Eo *) obj, part));
90 }
91 
92 #define ELM_PART_OVERRIDE_PARTIAL(type, TYPE, typedata, _is_part_cb) \
93    EOLIAN static Efl_Object * \
94    _ ## type ## _efl_part_part_get(const Eo *obj, typedata *priv EINA_UNUSED, const char *part) \
95    { \
96      EINA_SAFETY_ON_NULL_RETURN_VAL(part, NULL); \
97      if (_is_part_cb(obj, part)) \
98        return ELM_PART_IMPLEMENT(TYPE ## _PART_CLASS, obj, part); \
99      return efl_part_get(efl_super(obj, TYPE ## _CLASS), part); \
100    }
101 
102 #define ELM_PART_OVERRIDE(type, TYPE, typedata) \
103 EOLIAN static Efl_Object * \
104 _ ## type ## _efl_part_part_get(const Eo *obj, typedata *priv EINA_UNUSED, const char *part) \
105 { \
106    EINA_SAFETY_ON_NULL_RETURN_VAL(part, NULL); \
107    return ELM_PART_IMPLEMENT(TYPE ## _PART_CLASS, obj, part); \
108 }
109 
110 #define ELM_PART_OVERRIDE_INTERNALS_FETCH(TYPE, typedata) \
111    Elm_Part_Data *pd = efl_data_scope_get(obj, EFL_UI_WIDGET_PART_CLASS); \
112    typedata *sd = efl_data_scope_get(pd->obj, TYPE ## _CLASS);
113 
114 #define ELM_PART_OVERRIDE_INTERNALS_FETCH_NO_SD() \
115    Elm_Part_Data *pd = efl_data_scope_get(obj, EFL_UI_WIDGET_PART_CLASS); \
116    void *sd = NULL;
117 
118 #define ELM_PART_OVERRIDE_CONTENT_SET_FULL(full, type, internals) \
119 EOLIAN static Eina_Bool \
120 _ ## full ## _efl_content_content_set(Eo *obj, void *_pd EINA_UNUSED, Efl_Gfx_Entity *content) \
121 { \
122    internals \
123    return _ ## type ## _content_set(pd->obj, sd, pd->part, content); \
124 }
125 
126 #define ELM_PART_OVERRIDE_CONTENT_GET_FULL(full, type, internals) \
127 EOLIAN static Efl_Gfx_Entity * \
128 _ ## full ## _efl_content_content_get(const Eo *obj, void *_pd EINA_UNUSED) \
129 { \
130    internals \
131    return _ ## type ## _content_get(pd->obj, sd, pd->part); \
132 }
133 
134 #define ELM_PART_OVERRIDE_CONTENT_UNSET_FULL(full, type, internals) \
135 EOLIAN static Efl_Gfx_Entity * \
136 _ ## full ## _efl_content_content_unset(Eo *obj, void *_pd EINA_UNUSED) \
137 { \
138    internals \
139    return _ ## type ## _content_unset(pd->obj, sd, pd->part); \
140 }
141 
142 #define ELM_PART_OVERRIDE_TEXT_TEXT_SET_FULL(full, type, internals) \
143 EOLIAN static void \
144 _ ## full ## _efl_text_text_set(Eo *obj, void *_pd EINA_UNUSED, const char *text) \
145 { \
146    internals \
147    _ ## type ## _text_set(pd->obj, sd, pd->part, text); \
148 }
149 
150 #define ELM_PART_OVERRIDE_TEXT_TEXT_GET_FULL(full, type, internals) \
151 EOLIAN static const char *\
152 _ ## full ## _efl_text_text_get(const Eo *obj, void *_pd EINA_UNUSED) \
153 { \
154    internals \
155    return _ ## type ## _text_get(pd->obj, sd, pd->part); \
156 }
157 
158 #define ELM_PART_OVERRIDE_TEXT_MARKUP_GET_FULL(full, type, internals) \
159 EOLIAN static const char *\
160 _ ## full ## _efl_text_markup_markup_get(const Eo *obj, void *_pd EINA_UNUSED) \
161 { \
162    internals \
163    return _ ## type ## _text_markup_get(pd->obj, sd, pd->part); \
164 }
165 
166 #define ELM_PART_OVERRIDE_TEXT_MARKUP_SET_FULL(full, type, internals) \
167 EOLIAN static void \
168 _ ## full ## _efl_text_markup_markup_set(Eo *obj, void *_pd EINA_UNUSED, const char *markup) \
169 { \
170    internals \
171    _ ## type ## _text_markup_set(pd->obj, sd, pd->part, markup); \
172 }
173 
174 #define ELM_PART_OVERRIDE_CONTENT_SET(type, TYPE, typedata) \
175    ELM_PART_OVERRIDE_CONTENT_SET_FULL(type ## _part, type, ELM_PART_OVERRIDE_INTERNALS_FETCH(TYPE, typedata))
176 
177 #define ELM_PART_OVERRIDE_CONTENT_GET(type, TYPE, typedata) \
178    ELM_PART_OVERRIDE_CONTENT_GET_FULL(type ## _part, type, ELM_PART_OVERRIDE_INTERNALS_FETCH(TYPE, typedata))
179 
180 #define ELM_PART_OVERRIDE_CONTENT_UNSET(type, TYPE, typedata) \
181    ELM_PART_OVERRIDE_CONTENT_UNSET_FULL(type ## _part, type, ELM_PART_OVERRIDE_INTERNALS_FETCH(TYPE, typedata))
182 
183 #define ELM_PART_OVERRIDE_TEXT_SET(type, TYPE, typedata) \
184    ELM_PART_OVERRIDE_TEXT_TEXT_SET_FULL(type ## _part, type, ELM_PART_OVERRIDE_INTERNALS_FETCH(TYPE, typedata))
185 
186 #define ELM_PART_OVERRIDE_TEXT_GET(type, TYPE, typedata) \
187    ELM_PART_OVERRIDE_TEXT_TEXT_GET_FULL(type ## _part, type, ELM_PART_OVERRIDE_INTERNALS_FETCH(TYPE, typedata))
188 
189 #define ELM_PART_OVERRIDE_MARKUP_SET(type, TYPE, typedata) \
190    ELM_PART_OVERRIDE_TEXT_MARKUP_SET_FULL(type ## _part, type, ELM_PART_OVERRIDE_INTERNALS_FETCH(TYPE, typedata))
191 
192 #define ELM_PART_OVERRIDE_MARKUP_GET(type, TYPE, typedata) \
193    ELM_PART_OVERRIDE_TEXT_MARKUP_GET_FULL(type ## _part, type, ELM_PART_OVERRIDE_INTERNALS_FETCH(TYPE, typedata))
194 
195 #define ELM_PART_OVERRIDE_CONTENT_SET_NO_SD(type) \
196    ELM_PART_OVERRIDE_CONTENT_SET_FULL(type ## _part, type, ELM_PART_OVERRIDE_INTERNALS_FETCH_NO_SD())
197 
198 #define ELM_PART_OVERRIDE_CONTENT_GET_NO_SD(type) \
199    ELM_PART_OVERRIDE_CONTENT_GET_FULL(type ## _part, type, ELM_PART_OVERRIDE_INTERNALS_FETCH_NO_SD())
200 
201 #define ELM_PART_OVERRIDE_CONTENT_UNSET_NO_SD(type) \
202    ELM_PART_OVERRIDE_CONTENT_UNSET_FULL(type ## _part, type, ELM_PART_OVERRIDE_INTERNALS_FETCH_NO_SD())
203 
204 #define ELM_PART_OVERRIDE_TEXT_SET_NO_SD(type) \
205    ELM_PART_OVERRIDE_TEXT_TEXT_SET_FULL(type ## _part, type, ELM_PART_OVERRIDE_INTERNALS_FETCH_NO_SD())
206 
207 #define ELM_PART_OVERRIDE_TEXT_GET_NO_SD(type) \
208    ELM_PART_OVERRIDE_TEXT_TEXT_GET_FULL(type ## _part, type, ELM_PART_OVERRIDE_INTERNALS_FETCH_NO_SD())
209 
210 #define ELM_PART_OVERRIDE_MARKUP_SET_NO_SD(type) \
211    ELM_PART_OVERRIDE_TEXT_MARKUP_SET_FULL(type ## _part, type, ELM_PART_OVERRIDE_INTERNALS_FETCH_NO_SD())
212 
213 #define ELM_PART_OVERRIDE_MARKUP_GET_NO_SD(type) \
214    ELM_PART_OVERRIDE_TEXT_MARKUP_GET_FULL(type ## _part, type, ELM_PART_OVERRIDE_INTERNALS_FETCH_NO_SD())
215 
216 
217 #define ELM_PART_TEXT_DEFAULT_IMPLEMENT(type, typedata) \
218 EOLIAN static void \
219 _ ## type ## _efl_text_text_set(Eo *obj, typedata *sd EINA_UNUSED, const char *text) \
220 { \
221    efl_text_set(efl_part(obj, efl_ui_widget_default_text_part_get(obj)), text); \
222 } \
223 EOLIAN static const char * \
224 _ ## type ## _efl_text_text_get(const Eo *obj, typedata *sd EINA_UNUSED) \
225 { \
226   return efl_text_get(efl_part(obj, efl_ui_widget_default_text_part_get(obj))); \
227 } \
228 EOLIAN static void \
229 _ ## type ## _efl_ui_l10n_l10n_text_set(Eo *obj, typedata *sd EINA_UNUSED, const char *label, const char *domain) \
230 { \
231    efl_ui_l10n_text_set(efl_part(obj, efl_ui_widget_default_text_part_get(obj)), label, domain); \
232 } \
233 EOLIAN static const char * \
234 _ ## type ## _efl_ui_l10n_l10n_text_get(const Eo *obj, typedata *sd EINA_UNUSED, const char **domain) \
235 { \
236   return efl_ui_l10n_text_get(efl_part(obj, efl_ui_widget_default_text_part_get(obj)), domain); \
237 }
238 
239 #define ELM_PART_MARKUP_DEFAULT_IMPLEMENT(type, typedata) \
240 EOLIAN static const char * \
241 _ ## type ## _efl_text_markup_markup_get(const Eo *obj, typedata *sd EINA_UNUSED) \
242 { \
243   return efl_text_markup_get(efl_part(obj, efl_ui_widget_default_text_part_get(obj))); \
244 } \
245 EOLIAN static void \
246 _ ## type ## _efl_text_markup_markup_set(Eo *obj, typedata *sd EINA_UNUSED, const char *markup) \
247 { \
248   efl_text_markup_set(efl_part(obj, efl_ui_widget_default_text_part_get(obj)), markup); \
249 }
250 
251 #endif
252