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);
218 elm_widget_mirrored_automatic_set(obj, EINA_FALSE);
220 priv->expanded = EINA_FALSE;
222 evas_object_smart_callback_add(obj, "clicked", _on_clicked, obj);
224 _elm_hoversel_smart_theme(obj);
228 _elm_hoversel_smart_del(Evas_Object *obj)
230 Elm_Hoversel_Item *item;
232 ELM_HOVERSEL_DATA_GET(obj, sd);
234 EINA_LIST_FREE (sd->items, item)
236 eina_stringshare_del(item->label);
237 eina_stringshare_del(item->icon_file);
238 eina_stringshare_del(item->icon_group);
239 elm_widget_item_free(item);
241 elm_hoversel_hover_parent_set(obj, NULL);
243 ELM_WIDGET_CLASS(_elm_hoversel_parent_sc)->base.del(obj);
247 _elm_hoversel_smart_parent_set(Evas_Object *obj,
250 elm_hoversel_hover_parent_set(obj, parent);
254 _elm_hoversel_smart_set_user(Elm_Hoversel_Smart_Class *sc)
256 ELM_WIDGET_CLASS(sc)->base.add = _elm_hoversel_smart_add;
257 ELM_WIDGET_CLASS(sc)->base.del = _elm_hoversel_smart_del;
259 ELM_WIDGET_CLASS(sc)->parent_set = _elm_hoversel_smart_parent_set;
260 ELM_WIDGET_CLASS(sc)->theme = _elm_hoversel_smart_theme;
261 ELM_WIDGET_CLASS(sc)->translate = _elm_hoversel_smart_translate;
263 ELM_BUTTON_CLASS(sc)->admits_autorepeat = EINA_FALSE;
266 EAPI const Elm_Hoversel_Smart_Class *
267 elm_hoversel_smart_class_get(void)
269 static Elm_Hoversel_Smart_Class _sc =
270 ELM_HOVERSEL_SMART_CLASS_INIT_NAME_VERSION(ELM_HOVERSEL_SMART_NAME);
271 static const Elm_Hoversel_Smart_Class *class = NULL;
272 Evas_Smart_Class *esc = (Evas_Smart_Class *)&_sc;
274 if (class) return class;
276 _elm_hoversel_smart_set(&_sc);
277 esc->callbacks = _smart_callbacks;
284 elm_hoversel_add(Evas_Object *parent)
288 EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
290 obj = elm_widget_add(_elm_hoversel_smart_class_new(), parent);
291 if (!obj) return NULL;
293 if (!elm_widget_sub_object_add(parent, obj))
294 ERR("could not add %p as sub object of %p", obj, parent);
300 elm_hoversel_hover_parent_set(Evas_Object *obj,
303 ELM_HOVERSEL_CHECK(obj);
304 ELM_HOVERSEL_DATA_GET(obj, sd);
306 if (sd->hover_parent)
307 evas_object_event_callback_del_full
308 (sd->hover_parent, EVAS_CALLBACK_DEL, _on_parent_del, obj);
310 sd->hover_parent = parent;
311 if (sd->hover_parent)
312 evas_object_event_callback_add
313 (sd->hover_parent, EVAS_CALLBACK_DEL, _on_parent_del, obj);
317 elm_hoversel_hover_parent_get(const Evas_Object *obj)
319 ELM_HOVERSEL_CHECK(obj) NULL;
320 ELM_HOVERSEL_DATA_GET(obj, sd);
322 return sd->hover_parent;
326 elm_hoversel_horizontal_set(Evas_Object *obj,
327 Eina_Bool horizontal)
329 ELM_HOVERSEL_CHECK(obj);
330 ELM_HOVERSEL_DATA_GET(obj, sd);
332 sd->horizontal = !!horizontal;
334 _elm_hoversel_smart_theme(obj);
338 elm_hoversel_horizontal_get(const Evas_Object *obj)
340 ELM_HOVERSEL_CHECK(obj) EINA_FALSE;
341 ELM_HOVERSEL_DATA_GET(obj, sd);
343 return sd->horizontal;
347 elm_hoversel_hover_begin(Evas_Object *obj)
349 ELM_HOVERSEL_CHECK(obj);
350 ELM_HOVERSEL_DATA_GET(obj, sd);
352 if (sd->hover) return;
358 elm_hoversel_hover_end(Evas_Object *obj)
360 ELM_HOVERSEL_CHECK(obj);
361 ELM_HOVERSEL_DATA_GET(obj, sd);
363 if (!sd->hover) return;
365 sd->expanded = EINA_FALSE;
367 evas_object_del(sd->hover);
370 evas_object_smart_callback_call(obj, SIG_DISMISSED, NULL);
374 elm_hoversel_expanded_get(const Evas_Object *obj)
376 ELM_HOVERSEL_CHECK(obj) EINA_FALSE;
377 ELM_HOVERSEL_DATA_GET(obj, sd);
379 return (sd->hover) ? EINA_TRUE : EINA_FALSE;
383 elm_hoversel_clear(Evas_Object *obj)
388 ELM_HOVERSEL_CHECK(obj);
389 ELM_HOVERSEL_DATA_GET(obj, sd);
391 EINA_LIST_FOREACH_SAFE(sd->items, l, ll, it)
393 elm_widget_item_del(it);
397 EAPI const Eina_List *
398 elm_hoversel_items_get(const Evas_Object *obj)
400 ELM_HOVERSEL_CHECK(obj) NULL;
401 ELM_HOVERSEL_DATA_GET(obj, sd);
406 EAPI Elm_Object_Item *
407 elm_hoversel_item_add(Evas_Object *obj,
409 const char *icon_file,
410 Elm_Icon_Type icon_type,
414 ELM_HOVERSEL_CHECK(obj) NULL;
415 ELM_HOVERSEL_DATA_GET(obj, sd);
417 Elm_Hoversel_Item *item = elm_widget_item_new(obj, Elm_Hoversel_Item);
418 if (!item) return NULL;
420 elm_widget_item_del_pre_hook_set(item, _item_del_pre_hook);
421 elm_widget_item_text_get_hook_set(item, _item_text_get_hook);
423 item->label = eina_stringshare_add(label);
424 item->icon_file = eina_stringshare_add(icon_file);
425 item->icon_type = icon_type;
427 item->base.data = data;
429 sd->items = eina_list_append(sd->items, item);
431 return (Elm_Object_Item *)item;
435 elm_hoversel_item_icon_set(Elm_Object_Item *it,
436 const char *icon_file,
437 const char *icon_group,
438 Elm_Icon_Type icon_type)
440 ELM_HOVERSEL_ITEM_CHECK_OR_RETURN(it);
442 Elm_Hoversel_Item *item = (Elm_Hoversel_Item *)it;
444 eina_stringshare_replace(&item->icon_file, icon_file);
445 eina_stringshare_replace(&item->icon_group, icon_group);
447 item->icon_type = icon_type;
451 elm_hoversel_item_icon_get(const Elm_Object_Item *it,
452 const char **icon_file,
453 const char **icon_group,
454 Elm_Icon_Type *icon_type)
456 ELM_HOVERSEL_ITEM_CHECK_OR_RETURN(it);
458 Elm_Hoversel_Item *item = (Elm_Hoversel_Item *)it;
460 if (icon_file) *icon_file = item->icon_file;
461 if (icon_group) *icon_group = item->icon_group;
462 if (icon_type) *icon_type = item->icon_type;