elementary/map - map supports language,changed
[framework/uifw/elementary.git] / src / lib / elm_bg.c
1 #include <Elementary.h>
2 #include "elm_priv.h"
3 #include "elm_widget_bg.h"
4
5 EAPI const char ELM_BG_SMART_NAME[] = "elm_bg";
6
7 static const Elm_Layout_Part_Alias_Description _content_aliases[] =
8 {
9    {"overlay", "elm.swallow.content"},
10    {NULL, NULL}
11 };
12
13 EVAS_SMART_SUBCLASS_NEW
14   (ELM_BG_SMART_NAME, _elm_bg, Elm_Bg_Smart_Class, Elm_Layout_Smart_Class,
15   elm_layout_smart_class_get, NULL);
16
17 static void
18 _elm_bg_smart_sizing_eval(Evas_Object *obj)
19 {
20    Evas_Coord iw = 0, ih = 0, mw = -1, mh = -1;
21    Evas_Coord bx = 0, by = 0, bw = 0, bh = 0;
22    Evas_Coord fx = 0, fy = 0, fw = 0, fh = 0;
23    Evas_Coord nx = 0, ny = 0, nw = 0, nh = 0;
24    const char *p;
25
26    ELM_BG_DATA_GET(obj, sd);
27
28    if ((!sd->img) || (!sd->file)) return;
29    if (((p = strrchr(sd->file, '.'))) && (!strcasecmp(p, ".edj"))) return;
30
31    /* grab image size */
32    evas_object_image_size_get(sd->img, &iw, &ih);
33    if ((iw < 1) || (ih < 1)) return;
34
35    /* grab base object dimensions */
36    evas_object_geometry_get
37      (ELM_WIDGET_DATA(sd)->resize_obj, &bx, &by, &bw, &bh);
38
39    /* set some defaults */
40    nx = bx;
41    ny = by;
42    nw = bw;
43    nh = bh;
44
45    switch (sd->option)
46      {
47       case ELM_BG_OPTION_CENTER:
48         fw = nw = iw;
49         fh = nh = ih;
50         nx = ((bw - fw) / 2);
51         ny = ((bh - fh) / 2);
52         mw = iw;
53         mh = ih;
54         break;
55
56       case ELM_BG_OPTION_SCALE:
57         fw = bw;
58         fh = ((ih * fw) / iw);
59         if (fh < bh)
60           {
61              fh = bh;
62              fw = ((iw * fh) / ih);
63           }
64         fx = ((bw - fw) / 2);
65         fy = ((bh - fh) / 2);
66         break;
67
68       case ELM_BG_OPTION_TILE:
69         fw = iw;
70         fh = ih;
71         break;
72
73       case ELM_BG_OPTION_STRETCH:
74       default:
75         fw = bw;
76         fh = bh;
77         break;
78      }
79
80    evas_object_move(sd->img, nx, ny);
81    evas_object_resize(sd->img, nw, nh);
82    evas_object_image_fill_set(sd->img, fx, fy, fw, fh);
83
84    evas_object_size_hint_min_set(sd->img, mw, mh);
85    evas_object_size_hint_max_set(sd->img, mw, mh);
86 }
87
88 static void
89 _on_resize(void *data,
90            Evas *e __UNUSED__,
91            Evas_Object *obj __UNUSED__,
92            void *event_info __UNUSED__)
93 {
94    elm_layout_sizing_eval(data);
95 }
96
97 static void
98 _elm_bg_smart_add(Evas_Object *obj)
99 {
100    EVAS_SMART_DATA_ALLOC(obj, Elm_Bg_Smart_Data);
101
102    ELM_WIDGET_CLASS(_elm_bg_parent_sc)->base.add(obj);
103
104    elm_widget_can_focus_set(obj, EINA_FALSE);
105
106    priv->option = ELM_BG_OPTION_SCALE;
107
108    evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE, _on_resize, obj);
109
110    elm_layout_theme_set(obj, "bg", "base", elm_widget_style_get(obj));
111 }
112
113 static void
114 _elm_bg_smart_set_user(Elm_Bg_Smart_Class *sc)
115 {
116    ELM_WIDGET_CLASS(sc)->base.add = _elm_bg_smart_add;
117
118    ELM_LAYOUT_CLASS(sc)->sizing_eval = _elm_bg_smart_sizing_eval;
119
120    ELM_LAYOUT_CLASS(sc)->content_aliases = _content_aliases;
121 }
122
123 EAPI const Elm_Bg_Smart_Class *
124 elm_bg_smart_class_get(void)
125 {
126    static Elm_Bg_Smart_Class _sc =
127      ELM_BG_SMART_CLASS_INIT_NAME_VERSION(ELM_BG_SMART_NAME);
128    static const Elm_Bg_Smart_Class *class = NULL;
129
130    if (class)
131      return class;
132
133    _elm_bg_smart_set(&_sc);
134    class = &_sc;
135
136    return class;
137 }
138
139 EAPI Evas_Object *
140 elm_bg_add(Evas_Object *parent)
141 {
142    Evas_Object *obj;
143
144    EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
145
146    obj = elm_widget_add(_elm_bg_smart_class_new(), parent);
147    if (!obj) return NULL;
148
149    if (!elm_widget_sub_object_add(parent, obj))
150      ERR("could not add %p as sub object of %p", obj, parent);
151
152    return obj;
153 }
154
155 static void
156 _elm_bg_file_reload(void *data, Evas_Object *obj,
157                     const char *emission __UNUSED__,
158                     const char *source __UNUSED__)
159 {
160    Evas_Object *bg = data;
161    const char *file;
162    const char *group;
163
164    edje_object_file_get(obj, &file, &group);
165    elm_bg_file_set(bg, file, group);
166 }
167
168 EAPI Eina_Bool
169 elm_bg_file_set(Evas_Object *obj,
170                 const char *file,
171                 const char *group)
172 {
173    ELM_BG_CHECK(obj) EINA_FALSE;
174    ELM_BG_DATA_GET_OR_RETURN_VAL(obj, sd, EINA_FALSE);
175
176    const char *p;
177    Eina_Bool ret;
178
179    if (sd->img)
180      {
181         evas_object_del(sd->img);
182         sd->img = NULL;
183      }
184    if (!file)
185      {
186         eina_stringshare_del(sd->file);
187         sd->file = NULL;
188         eina_stringshare_del(sd->group);
189         sd->group = NULL;
190         return EINA_TRUE;
191      }
192    eina_stringshare_replace(&sd->file, file);
193    eina_stringshare_replace(&sd->group, group);
194    if (((p = strrchr(file, '.'))) && (!strcasecmp(p, ".edj")))
195      {
196         sd->img = edje_object_add
197             (evas_object_evas_get(ELM_WIDGET_DATA(sd)->resize_obj));
198         ret = edje_object_file_set(sd->img, file, group);
199         edje_object_signal_callback_del
200           (sd->img, "edje,change,file", "edje", _elm_bg_file_reload);
201         edje_object_signal_callback_add
202           (sd->img, "edje,change,file", "edje", _elm_bg_file_reload, obj);
203      }
204    else
205      {
206         int err;
207
208         sd->img = evas_object_image_add
209             (evas_object_evas_get(ELM_WIDGET_DATA(sd)->resize_obj));
210         if ((sd->load_opts.w > 0) && (sd->load_opts.h > 0))
211           evas_object_image_load_size_set
212             (sd->img, sd->load_opts.w, sd->load_opts.h);
213         evas_object_image_file_set(sd->img, file, group);
214
215         err = evas_object_image_load_error_get(sd->img);
216         if (err != EVAS_LOAD_ERROR_NONE)
217           {
218              ERR("Could not load image '%s': %s\n",
219                  file, evas_load_error_str(err));
220              ret = EINA_FALSE;
221           }
222         else
223           ret = EINA_TRUE;
224      }
225
226    evas_object_repeat_events_set(sd->img, EINA_TRUE);
227
228    ret &= elm_layout_content_set(obj, "elm.swallow.background", sd->img);
229
230    elm_layout_sizing_eval(obj);
231
232    return ret;
233 }
234
235 EAPI void
236 elm_bg_file_get(const Evas_Object *obj,
237                 const char **file,
238                 const char **group)
239 {
240    ELM_BG_CHECK(obj);
241    ELM_BG_DATA_GET_OR_RETURN(obj, sd);
242
243    if (file) *file = sd->file;
244    if (group) *group = sd->group;
245 }
246
247 EAPI void
248 elm_bg_option_set(Evas_Object *obj,
249                   Elm_Bg_Option option)
250 {
251    ELM_BG_CHECK(obj);
252    ELM_BG_DATA_GET_OR_RETURN(obj, sd);
253
254    sd->option = option;
255
256    elm_layout_sizing_eval(obj);
257 }
258
259 EAPI Elm_Bg_Option
260 elm_bg_option_get(const Evas_Object *obj)
261 {
262    ELM_BG_CHECK(obj) EINA_FALSE;
263    ELM_BG_DATA_GET_OR_RETURN_VAL(obj, sd, ELM_BG_OPTION_LAST);
264
265    return sd->option;
266 }
267
268 EAPI void
269 elm_bg_color_set(Evas_Object *obj,
270                  int r,
271                  int g,
272                  int b)
273 {
274    ELM_BG_CHECK(obj);
275    ELM_BG_DATA_GET_OR_RETURN(obj, sd);
276
277    if (!sd->rect)
278      {
279         sd->rect = evas_object_rectangle_add
280             (evas_object_evas_get(ELM_WIDGET_DATA(sd)->resize_obj));
281
282         elm_layout_content_set(obj, "elm.swallow.rectangle", sd->rect);
283
284         elm_layout_sizing_eval(obj);
285      }
286
287    evas_object_color_set(sd->rect, r, g, b, 255);
288 }
289
290 EAPI void
291 elm_bg_color_get(const Evas_Object *obj,
292                  int *r,
293                  int *g,
294                  int *b)
295 {
296    ELM_BG_CHECK(obj);
297    ELM_BG_DATA_GET_OR_RETURN(obj, sd);
298
299    evas_object_color_get(sd->rect, r, g, b, NULL);
300 }
301
302 EAPI void
303 elm_bg_load_size_set(Evas_Object *obj,
304                      Evas_Coord w,
305                      Evas_Coord h)
306 {
307    ELM_BG_CHECK(obj);
308    ELM_BG_DATA_GET_OR_RETURN(obj, sd);
309    const char *p;
310
311    sd->load_opts.w = w;
312    sd->load_opts.h = h;
313    if (!sd->img) return;
314
315    if (!(((p = strrchr(sd->file, '.'))) && (!strcasecmp(p, ".edj"))))
316      evas_object_image_load_size_set(sd->img, w, h);
317 }