1 #ifdef HAVE_CONFIG_H
2 # include "elementary_config.h"
3 #endif
4 
5 #define EFL_ACCESS_OBJECT_PROTECTED
6 #define ELM_LAYOUT_PROTECTED
7 
8 #include <Elementary.h>
9 #include "elm_priv.h"
10 #include "efl_ui_bg_private.h"
11 
12 #define MY_CLASS EFL_UI_BG_CLASS
13 #define MY_CLASS_PFX efl_ui_bg
14 
15 #define MY_CLASS_NAME "Efl.Ui.Bg"
16 
17 static const Elm_Layout_Part_Alias_Description _content_aliases[] =
18 {
19    {"overlay", "elm.swallow.content"},
20    {NULL, NULL}
21 };
22 
23 EOLIAN static Eo *
_efl_ui_bg_efl_object_constructor(Eo * obj,Efl_Ui_Bg_Data * pd)24 _efl_ui_bg_efl_object_constructor(Eo *obj, Efl_Ui_Bg_Data *pd)
25 {
26    ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, NULL);
27 
28    if (!elm_widget_theme_klass_get(obj))
29      elm_widget_theme_klass_set(obj, "bg");
30 
31    obj = efl_constructor(efl_super(obj, MY_CLASS));
32    elm_widget_can_focus_set(obj, EINA_FALSE);
33 
34    if (elm_widget_theme_object_set(obj, wd->resize_obj,
35                                        elm_widget_theme_klass_get(obj),
36                                        elm_widget_theme_element_get(obj),
37                                        elm_widget_theme_style_get(obj)) == EFL_UI_THEME_APPLY_ERROR_GENERIC)
38      CRI("Failed to set layout!");
39 
40    if (elm_widget_is_legacy(obj))
41      {
42         pd->rect = efl_add(EFL_CANVAS_RECTANGLE_CLASS, obj,
43                            efl_gfx_color_set(efl_added, 0, 0, 0, 0),
44                            efl_content_set(efl_part(obj, "elm.swallow.rectangle"), efl_added));
45 
46         pd->img = elm_image_add(obj);
47         efl_gfx_image_scale_method_set(pd->img, EFL_GFX_IMAGE_SCALE_METHOD_EXPAND);
48         elm_layout_content_set(obj, "elm.swallow.background", pd->img);
49      }
50    else
51      {
52         pd->rect = efl_add(EFL_CANVAS_RECTANGLE_CLASS, obj,
53                            efl_gfx_color_set(efl_added, 0, 0, 0, 0),
54                            efl_content_set(efl_part(obj, "efl.rectangle"), efl_added));
55 
56         pd->img = efl_add(EFL_UI_IMAGE_CLASS, obj,
57                           efl_gfx_image_scale_method_set(efl_added, EFL_GFX_IMAGE_SCALE_METHOD_EXPAND),
58                           efl_content_set(efl_part(obj, "efl.background"), efl_added));
59      }
60    pd->file = NULL;
61    pd->key = NULL;
62 
63    efl_access_object_access_type_set(obj, EFL_ACCESS_TYPE_DISABLED);
64 
65    efl_ui_widget_focus_allow_set(obj, EINA_FALSE);
66 
67    efl_composite_attach(obj, pd->img);
68 
69    return obj;
70 }
71 
72 EOLIAN static void
_efl_ui_bg_efl_object_destructor(Eo * obj,Efl_Ui_Bg_Data * sd)73 _efl_ui_bg_efl_object_destructor(Eo *obj, Efl_Ui_Bg_Data *sd)
74 {
75    ELM_SAFE_FREE(sd->file, eina_stringshare_del);
76    ELM_SAFE_FREE(sd->key, eina_stringshare_del);
77 
78    efl_destructor(efl_super(obj, MY_CLASS));
79 }
80 
81 EAPI void
elm_bg_option_set(Evas_Object * obj,Elm_Bg_Option option)82 elm_bg_option_set(Evas_Object *obj, Elm_Bg_Option option)
83 {
84    Efl_Gfx_Image_Scale_Method type;
85 
86    switch (option)
87      {
88        case ELM_BG_OPTION_CENTER:
89          type = EFL_GFX_IMAGE_SCALE_METHOD_NONE;
90          break;
91        case ELM_BG_OPTION_SCALE:
92          type = EFL_GFX_IMAGE_SCALE_METHOD_EXPAND;
93          break;
94        case ELM_BG_OPTION_TILE:
95          type = EFL_GFX_IMAGE_SCALE_METHOD_TILE;
96          break;
97        case ELM_BG_OPTION_STRETCH:
98          type = EFL_GFX_IMAGE_SCALE_METHOD_FILL;
99          break;
100        case ELM_BG_OPTION_LAST:
101        default:
102          type = EFL_GFX_IMAGE_SCALE_METHOD_EXPAND;
103      }
104    efl_gfx_image_scale_method_set(obj, type);
105 }
106 
107 EAPI Elm_Bg_Option
elm_bg_option_get(const Evas_Object * obj)108 elm_bg_option_get(const Evas_Object *obj)
109 {
110    Efl_Gfx_Image_Scale_Method type;
111    Elm_Bg_Option option = ELM_BG_OPTION_LAST;
112 
113    type = efl_gfx_image_scale_method_get(obj);
114    switch (type)
115      {
116        case EFL_GFX_IMAGE_SCALE_METHOD_NONE:
117          option = ELM_BG_OPTION_CENTER;
118         break;
119        case EFL_GFX_IMAGE_SCALE_METHOD_EXPAND:
120          option = ELM_BG_OPTION_SCALE;
121         break;
122        case EFL_GFX_IMAGE_SCALE_METHOD_TILE:
123          option = ELM_BG_OPTION_TILE;
124          break;
125        case EFL_GFX_IMAGE_SCALE_METHOD_FILL:
126          option = ELM_BG_OPTION_STRETCH;
127          break;
128        case EFL_GFX_IMAGE_SCALE_METHOD_FIT:
129        default:
130          ERR("Scale type %d cannot be converted to Elm_Bg_Option", type);
131          break;
132      }
133 
134    return option;
135 }
136 
137 EAPI void
elm_bg_color_set(Evas_Object * obj,int r,int g,int b)138 elm_bg_color_set(Evas_Object *obj,
139                  int r,
140                  int g,
141                  int b)
142 {
143    int a = 255;
144    EFL_UI_BG_DATA_GET_OR_RETURN(obj, sd);
145 
146    // reset color
147    if ((r == -1) && (g == -1) && (b == -1))
148    {
149       r = g = b = a = 0;
150    }
151    efl_gfx_color_set(sd->rect, r, g, b, a);
152 }
153 
154 EOLIAN static void
_efl_ui_bg_efl_gfx_color_color_set(Eo * obj,Efl_Ui_Bg_Data * sd,int r,int g,int b,int a)155 _efl_ui_bg_efl_gfx_color_color_set(Eo *obj, Efl_Ui_Bg_Data *sd, int r, int g, int b, int a)
156 {
157    efl_gfx_color_set(efl_super(obj, MY_CLASS), r, g, b, a);
158    efl_gfx_color_set(sd->rect, r, g, b, a);
159 }
160 
161 EAPI void
elm_bg_color_get(const Evas_Object * obj,int * r,int * g,int * b)162 elm_bg_color_get(const Evas_Object *obj,
163                  int *r,
164                  int *g,
165                  int *b)
166 {
167    EFL_UI_BG_CHECK(obj);
168    efl_gfx_color_get((Eo *) obj, r, g, b, NULL);
169 }
170 
171 EOLIAN static void
_efl_ui_bg_efl_gfx_color_color_get(const Eo * obj,Efl_Ui_Bg_Data * sd,int * r,int * g,int * b,int * a)172 _efl_ui_bg_efl_gfx_color_color_get(const Eo *obj, Efl_Ui_Bg_Data *sd, int *r, int *g, int *b, int *a)
173 {
174    if (!sd->rect)
175      efl_gfx_color_get(efl_super(obj, MY_CLASS), r, g, b, a);
176    else
177      efl_gfx_color_get(sd->rect, r, g, b, a);
178 }
179 
180 EAPI void
elm_bg_load_size_set(Evas_Object * obj,int w,int h)181 elm_bg_load_size_set(Evas_Object *obj, int w, int h)
182 {
183    EFL_UI_BG_DATA_GET_OR_RETURN(obj, sd);
184    efl_gfx_image_load_controller_load_size_set(sd->img, EINA_SIZE2D(w, h));
185 }
186 
187 EAPI Eina_Bool
elm_bg_file_set(Eo * obj,const char * file,const char * group)188 elm_bg_file_set(Eo *obj, const char *file, const char *group)
189 {
190    EFL_UI_BG_DATA_GET_OR_RETURN_VAL(obj, sd, EINA_FALSE);
191    Eina_Bool ret = efl_file_simple_load((Eo *) obj, file, group);
192    if (ret) elm_image_preload_disabled_set(sd->img, EINA_TRUE);
193 
194    return ret;
195 }
196 
197 EOLIAN static Eina_Error
_efl_ui_bg_efl_file_load(Eo * obj EINA_UNUSED,Efl_Ui_Bg_Data * sd)198 _efl_ui_bg_efl_file_load(Eo *obj EINA_UNUSED, Efl_Ui_Bg_Data *sd)
199 {
200    return efl_file_load(sd->img);
201 }
202 
203 EOLIAN static void
_efl_ui_bg_efl_file_unload(Eo * obj EINA_UNUSED,Efl_Ui_Bg_Data * sd)204 _efl_ui_bg_efl_file_unload(Eo *obj EINA_UNUSED, Efl_Ui_Bg_Data *sd)
205 {
206    efl_file_unload(sd->img);
207 }
208 
209 EOLIAN static Eina_Error
_efl_ui_bg_efl_file_file_set(Eo * obj EINA_UNUSED,Efl_Ui_Bg_Data * sd,const char * file)210 _efl_ui_bg_efl_file_file_set(Eo *obj EINA_UNUSED, Efl_Ui_Bg_Data *sd, const char *file)
211 {
212    eina_stringshare_replace(&sd->file, file);
213 
214    return efl_file_set(sd->img, file);
215 }
216 
217 EOLIAN static void
_efl_ui_bg_efl_file_key_set(Eo * obj EINA_UNUSED,Efl_Ui_Bg_Data * sd,const char * key)218 _efl_ui_bg_efl_file_key_set(Eo *obj EINA_UNUSED, Efl_Ui_Bg_Data *sd, const char *key)
219 {
220    eina_stringshare_replace(&sd->key, key);
221 
222    efl_file_key_set(sd->img, key);
223 }
224 
225 EAPI void
elm_bg_file_get(const Eo * obj,const char ** file,const char ** group)226 elm_bg_file_get(const Eo *obj, const char **file, const char **group)
227 {
228    efl_file_simple_get((Eo *) obj, file, group);
229 }
230 
231 EOLIAN static const char *
_efl_ui_bg_efl_file_file_get(const Eo * obj,Efl_Ui_Bg_Data * sd)232 _efl_ui_bg_efl_file_file_get(const Eo *obj, Efl_Ui_Bg_Data *sd)
233 {
234    if (elm_widget_is_legacy(obj))
235      return sd->file;
236 
237    return efl_file_get(sd->img);
238 }
239 
240 EOLIAN static const char *
_efl_ui_bg_efl_file_key_get(const Eo * obj,Efl_Ui_Bg_Data * sd)241 _efl_ui_bg_efl_file_key_get(const Eo *obj, Efl_Ui_Bg_Data *sd)
242 {
243    if (elm_widget_is_legacy(obj))
244      return sd->key;
245 
246    return efl_file_key_get(sd->img);
247 }
248 
249 EOLIAN static Eina_Error
_efl_ui_bg_efl_file_mmap_set(Eo * obj EINA_UNUSED,Efl_Ui_Bg_Data * sd,const Eina_File * file)250 _efl_ui_bg_efl_file_mmap_set(Eo *obj EINA_UNUSED, Efl_Ui_Bg_Data *sd,
251                              const Eina_File *file)
252 {
253    return efl_file_mmap_set(sd->img, file);
254 }
255 
256 EOLIAN static const Eina_File *
_efl_ui_bg_efl_file_mmap_get(const Eo * obj EINA_UNUSED,Efl_Ui_Bg_Data * sd)257 _efl_ui_bg_efl_file_mmap_get(const Eo *obj EINA_UNUSED, Efl_Ui_Bg_Data *sd)
258 {
259    return efl_file_mmap_get(sd->img);
260 }
261 
262 
263 EOLIAN static Eo *
_efl_ui_bg_efl_object_finalize(Eo * obj,Efl_Ui_Bg_Data * sd)264 _efl_ui_bg_efl_object_finalize(Eo *obj, Efl_Ui_Bg_Data *sd)
265 {
266    obj = efl_finalize(efl_super(obj, MY_CLASS));
267    if (!obj) return NULL;
268    if (efl_file_get(sd->img) || efl_file_mmap_get(sd->img)) efl_file_load(sd->img);
269    return obj;
270 }
271 
272 /* Internal EO APIs and hidden overrides */
273 
EFL_UI_LAYOUT_CONTENT_ALIASES_IMPLEMENT(MY_CLASS_PFX)274 EFL_UI_LAYOUT_CONTENT_ALIASES_IMPLEMENT(MY_CLASS_PFX)
275 
276 #define EFL_UI_BG_EXTRA_OPS \
277    EFL_UI_LAYOUT_CONTENT_ALIASES_OPS(MY_CLASS_PFX)
278 
279 #include "efl_ui_bg.eo.c"
280 
281 
282 #include "efl_ui_bg_legacy_eo.h"
283 
284 #define MY_CLASS_NAME_LEGACY "elm_bg"
285 
286 static void
287 _efl_ui_bg_legacy_class_constructor(Efl_Class *klass)
288 {
289    evas_smart_legacy_type_register(MY_CLASS_NAME_LEGACY, klass);
290 }
291 
292 EOLIAN static Eo *
_efl_ui_bg_legacy_efl_object_constructor(Eo * obj,void * _pd EINA_UNUSED)293 _efl_ui_bg_legacy_efl_object_constructor(Eo *obj, void *_pd EINA_UNUSED)
294 {
295    obj = efl_constructor(efl_super(obj, EFL_UI_BG_LEGACY_CLASS));
296    efl_canvas_object_type_set(obj, MY_CLASS_NAME_LEGACY);
297    EFL_UI_BG_DATA_GET_OR_RETURN_VAL(obj, pd, obj);
298    efl_gfx_entity_scale_set(pd->img, 1.0);
299    efl_ui_layout_finger_size_multiplier_set(obj, 0, 0);
300    return obj;
301 }
302 
303 EAPI Evas_Object *
elm_bg_add(Evas_Object * parent)304 elm_bg_add(Evas_Object *parent)
305 {
306    EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
307    return elm_legacy_add(EFL_UI_BG_LEGACY_CLASS, parent);
308 }
309 
310 #include "efl_ui_bg_legacy_eo.c"
311