1 #include <Elementary.h>
3 #include "elm_widget_hoversel.h"
5 EAPI const char ELM_HOVERSEL_SMART_NAME[] = "elm_hoversel";
7 static const char SIG_SELECTED[] = "selected";
8 static const char SIG_DISMISSED[] = "dismissed";
9 static const Evas_Smart_Cb_Description _smart_callbacks[] = {
15 EVAS_SMART_SUBCLASS_NEW
16 (ELM_HOVERSEL_SMART_NAME, _elm_hoversel, Elm_Hoversel_Smart_Class,
17 Elm_Button_Smart_Class, elm_button_smart_class_get, _smart_callbacks);
20 _elm_hoversel_smart_translate(Evas_Object *obj)
22 ELM_HOVERSEL_DATA_GET(obj, sd);
23 Elm_Hoversel_Item *it;
26 EINA_LIST_FOREACH(sd->items, l, it)
27 elm_widget_item_translate(it);
33 _elm_hoversel_smart_theme(Evas_Object *obj)
38 ELM_HOVERSEL_DATA_GET(obj, sd);
40 style = eina_stringshare_add(elm_widget_style_get(obj));
43 snprintf(buf, sizeof(buf), "hoversel_horizontal/%s", style);
45 snprintf(buf, sizeof(buf), "hoversel_vertical/%s", style);
47 /* hoversel's style has an extra bit: orientation */
48 eina_stringshare_replace(&(ELM_WIDGET_DATA(sd)->style), buf);
50 if (!ELM_WIDGET_CLASS(_elm_hoversel_parent_sc)->theme(obj))
53 eina_stringshare_replace(&(ELM_WIDGET_DATA(sd)->style), style);
55 eina_stringshare_del(style);
58 elm_widget_mirrored_set(sd->hover, elm_widget_mirrored_get(obj));
60 elm_hoversel_hover_end(obj);
66 _on_hover_clicked(void *data,
67 Evas_Object *obj __UNUSED__,
68 void *event_info __UNUSED__)
70 elm_hoversel_hover_end(data);
74 _on_item_clicked(void *data,
75 Evas_Object *obj __UNUSED__,
76 void *event_info __UNUSED__)
78 Elm_Hoversel_Item *item = data;
79 Evas_Object *obj2 = WIDGET(item);
81 if (item->func) item->func((void *)item->base.data, obj2, item);
82 evas_object_smart_callback_call(obj2, SIG_SELECTED, item);
83 elm_hoversel_hover_end(obj2);
87 _activate(Evas_Object *obj)
89 const Elm_Hoversel_Item *item;
90 Evas_Object *bt, *bx, *ic;
94 ELM_HOVERSEL_DATA_GET(obj, sd);
98 elm_hoversel_hover_end(obj);
101 sd->expanded = EINA_TRUE;
103 if (elm_widget_disabled_get(obj)) return;
105 sd->hover = elm_hover_add(sd->hover_parent);
106 elm_widget_mirrored_automatic_set(sd->hover, EINA_FALSE);
109 snprintf(buf, sizeof(buf), "hoversel_horizontal/%s",
110 elm_widget_style_get(obj));
112 snprintf(buf, sizeof(buf), "hoversel_vertical/%s",
113 elm_widget_style_get(obj));
115 elm_object_style_set(sd->hover, buf);
117 evas_object_smart_callback_add
118 (sd->hover, "clicked", _on_hover_clicked, obj);
119 elm_hover_target_set(sd->hover, obj);
121 /* hover's content */
122 bx = elm_box_add(sd->hover);
123 elm_widget_mirrored_automatic_set(bx, EINA_FALSE);
124 elm_box_homogeneous_set(bx, EINA_TRUE);
125 elm_box_horizontal_set(bx, sd->horizontal);
128 snprintf(buf, sizeof(buf), "hoversel_horizontal_entry/%s",
129 elm_widget_style_get(obj));
131 snprintf(buf, sizeof(buf), "hoversel_vertical_entry/%s",
132 elm_widget_style_get(obj));
134 EINA_LIST_FOREACH(sd->items, l, item)
136 bt = elm_button_add(bx);
137 elm_widget_mirrored_automatic_set(bt, EINA_FALSE);
138 elm_widget_mirrored_set(bt, elm_widget_mirrored_get(obj));
139 elm_object_style_set(bt, buf);
140 elm_object_text_set(bt, item->label);
144 ic = elm_icon_add(obj);
145 elm_image_resizable_set(ic, EINA_FALSE, EINA_TRUE);
146 if (item->icon_type == ELM_ICON_FILE)
147 elm_image_file_set(ic, item->icon_file, item->icon_group);
148 else if (item->icon_type == ELM_ICON_STANDARD)
149 elm_icon_standard_set(ic, item->icon_file);
150 elm_object_part_content_set(bt, "icon", ic);
153 evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
154 evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
155 elm_box_pack_end(bx, bt);
156 evas_object_smart_callback_add(bt, "clicked", _on_item_clicked, item);
157 evas_object_show(bt);
161 elm_object_part_content_set(sd->hover, elm_hover_best_content_location_get
162 (sd->hover, ELM_HOVER_AXIS_HORIZONTAL), bx);
164 elm_object_part_content_set(sd->hover, elm_hover_best_content_location_get
165 (sd->hover, ELM_HOVER_AXIS_VERTICAL), bx);
167 evas_object_show(sd->hover);
171 _on_clicked(void *data,
172 Evas_Object *obj __UNUSED__,
173 void *event_info __UNUSED__)
179 _on_parent_del(void *data,
181 Evas_Object *obj __UNUSED__,
182 void *event_info __UNUSED__)
184 elm_hoversel_hover_parent_set(data, NULL);
188 _item_text_get_hook(const Elm_Object_Item *it,
191 if (part && strcmp(part, "default")) return NULL;
192 return ((Elm_Hoversel_Item *)it)->label;
196 _item_del_pre_hook(Elm_Object_Item *it)
198 Elm_Hoversel_Item *item = (Elm_Hoversel_Item *)it;
200 ELM_HOVERSEL_DATA_GET_OR_RETURN_VAL(WIDGET(item), sd, EINA_FALSE);
202 elm_hoversel_hover_end(WIDGET(item));
203 sd->items = eina_list_remove(sd->items, item);
204 eina_stringshare_del(item->label);
205 eina_stringshare_del(item->icon_file);
206 eina_stringshare_del(item->icon_group);
212 _elm_hoversel_smart_add(Evas_Object *obj)
214 EVAS_SMART_DATA_ALLOC(obj, Elm_Hoversel_Smart_Data);
216 ELM_WIDGET_CLASS(_elm_hoversel_parent_sc)->base.add(obj);
220 _elm_hoversel_smart_del(Evas_Object *obj)
222 Elm_Hoversel_Item *item;
224 ELM_HOVERSEL_DATA_GET(obj, sd);
226 EINA_LIST_FREE (sd->items, item)
228 eina_stringshare_del(item->label);
229 eina_stringshare_del(item->icon_file);
230 eina_stringshare_del(item->icon_group);
231 elm_widget_item_free(item);
233 elm_hoversel_hover_parent_set(obj, NULL);
235 ELM_WIDGET_CLASS(_elm_hoversel_parent_sc)->base.del(obj);
239 _elm_hoversel_smart_parent_set(Evas_Object *obj,
242 elm_hoversel_hover_parent_set(obj, parent);
246 _elm_hoversel_smart_set_user(Elm_Hoversel_Smart_Class *sc)
248 ELM_WIDGET_CLASS(sc)->base.add = _elm_hoversel_smart_add;
249 ELM_WIDGET_CLASS(sc)->base.del = _elm_hoversel_smart_del;
251 ELM_WIDGET_CLASS(sc)->parent_set = _elm_hoversel_smart_parent_set;
252 ELM_WIDGET_CLASS(sc)->theme = _elm_hoversel_smart_theme;
253 ELM_WIDGET_CLASS(sc)->translate = _elm_hoversel_smart_translate;
255 ELM_BUTTON_CLASS(sc)->admits_autorepeat = EINA_FALSE;
258 EAPI const Elm_Hoversel_Smart_Class *
259 elm_hoversel_smart_class_get(void)
261 static Elm_Hoversel_Smart_Class _sc =
262 ELM_HOVERSEL_SMART_CLASS_INIT_NAME_VERSION(ELM_HOVERSEL_SMART_NAME);
263 static const Elm_Hoversel_Smart_Class *class = NULL;
264 Evas_Smart_Class *esc = (Evas_Smart_Class *)&_sc;
266 if (class) return class;
268 _elm_hoversel_smart_set(&_sc);
269 esc->callbacks = _smart_callbacks;
276 elm_hoversel_add(Evas_Object *parent)
280 EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
282 obj = elm_widget_add(_elm_hoversel_smart_class_new(), parent);
283 if (!obj) return NULL;
285 if (!elm_widget_sub_object_add(parent, obj))
286 ERR("could not add %p as sub object of %p", obj, parent);
288 ELM_HOVERSEL_DATA_GET(obj, sd);
290 elm_widget_mirrored_automatic_set(obj, EINA_FALSE);
292 sd->expanded = EINA_FALSE;
294 evas_object_smart_callback_add(obj, "clicked", _on_clicked, obj);
296 _elm_hoversel_smart_theme(obj);
298 //Tizen Only: This should be removed when eo is applied.
299 ELM_WIDGET_DATA_GET(obj, wsd);
300 wsd->on_create = EINA_FALSE;
306 elm_hoversel_hover_parent_set(Evas_Object *obj,
309 ELM_HOVERSEL_CHECK(obj);
310 ELM_HOVERSEL_DATA_GET(obj, sd);
312 if (sd->hover_parent)
313 evas_object_event_callback_del_full
314 (sd->hover_parent, EVAS_CALLBACK_DEL, _on_parent_del, obj);
316 sd->hover_parent = parent;
317 if (sd->hover_parent)
318 evas_object_event_callback_add
319 (sd->hover_parent, EVAS_CALLBACK_DEL, _on_parent_del, obj);
323 elm_hoversel_hover_parent_get(const Evas_Object *obj)
325 ELM_HOVERSEL_CHECK(obj) NULL;
326 ELM_HOVERSEL_DATA_GET(obj, sd);
328 return sd->hover_parent;
332 elm_hoversel_horizontal_set(Evas_Object *obj,
333 Eina_Bool horizontal)
335 ELM_HOVERSEL_CHECK(obj);
336 ELM_HOVERSEL_DATA_GET(obj, sd);
338 sd->horizontal = !!horizontal;
340 _elm_hoversel_smart_theme(obj);
344 elm_hoversel_horizontal_get(const Evas_Object *obj)
346 ELM_HOVERSEL_CHECK(obj) EINA_FALSE;
347 ELM_HOVERSEL_DATA_GET(obj, sd);
349 return sd->horizontal;
353 elm_hoversel_hover_begin(Evas_Object *obj)
355 ELM_HOVERSEL_CHECK(obj);
356 ELM_HOVERSEL_DATA_GET(obj, sd);
358 if (sd->hover) return;
364 elm_hoversel_hover_end(Evas_Object *obj)
366 ELM_HOVERSEL_CHECK(obj);
367 ELM_HOVERSEL_DATA_GET(obj, sd);
369 if (!sd->hover) return;
371 sd->expanded = EINA_FALSE;
373 evas_object_del(sd->hover);
376 evas_object_smart_callback_call(obj, SIG_DISMISSED, NULL);
380 elm_hoversel_expanded_get(const Evas_Object *obj)
382 ELM_HOVERSEL_CHECK(obj) EINA_FALSE;
383 ELM_HOVERSEL_DATA_GET(obj, sd);
385 return (sd->hover) ? EINA_TRUE : EINA_FALSE;
389 elm_hoversel_clear(Evas_Object *obj)
394 ELM_HOVERSEL_CHECK(obj);
395 ELM_HOVERSEL_DATA_GET(obj, sd);
397 EINA_LIST_FOREACH_SAFE(sd->items, l, ll, it)
399 elm_widget_item_del(it);
403 EAPI const Eina_List *
404 elm_hoversel_items_get(const Evas_Object *obj)
406 ELM_HOVERSEL_CHECK(obj) NULL;
407 ELM_HOVERSEL_DATA_GET(obj, sd);
412 EAPI Elm_Object_Item *
413 elm_hoversel_item_add(Evas_Object *obj,
415 const char *icon_file,
416 Elm_Icon_Type icon_type,
420 ELM_HOVERSEL_CHECK(obj) NULL;
421 ELM_HOVERSEL_DATA_GET(obj, sd);
423 Elm_Hoversel_Item *item = elm_widget_item_new(obj, Elm_Hoversel_Item);
424 if (!item) return NULL;
426 elm_widget_item_del_pre_hook_set(item, _item_del_pre_hook);
427 elm_widget_item_text_get_hook_set(item, _item_text_get_hook);
429 item->label = eina_stringshare_add(label);
430 item->icon_file = eina_stringshare_add(icon_file);
431 item->icon_type = icon_type;
433 item->base.data = data;
435 sd->items = eina_list_append(sd->items, item);
437 return (Elm_Object_Item *)item;
441 elm_hoversel_item_icon_set(Elm_Object_Item *it,
442 const char *icon_file,
443 const char *icon_group,
444 Elm_Icon_Type icon_type)
446 ELM_HOVERSEL_ITEM_CHECK_OR_RETURN(it);
448 Elm_Hoversel_Item *item = (Elm_Hoversel_Item *)it;
450 eina_stringshare_replace(&item->icon_file, icon_file);
451 eina_stringshare_replace(&item->icon_group, icon_group);
453 item->icon_type = icon_type;
457 elm_hoversel_item_icon_get(const Elm_Object_Item *it,
458 const char **icon_file,
459 const char **icon_group,
460 Elm_Icon_Type *icon_type)
462 ELM_HOVERSEL_ITEM_CHECK_OR_RETURN(it);
464 Elm_Hoversel_Item *item = (Elm_Hoversel_Item *)it;
466 if (icon_file) *icon_file = item->icon_file;
467 if (icon_group) *icon_group = item->icon_group;
468 if (icon_type) *icon_type = item->icon_type;