1 #ifndef ELM_WIDGET_HOVERSEL_H
2 #define ELM_WIDGET_HOVERSEL_H
3 
4 #include "Elementary.h"
5 
6 
7 #include <Eio.h>
8 
9 /* DO NOT USE THIS HEADER UNLESS YOU ARE PREPARED FOR BREAKING OF YOUR
10  * CODE. THIS IS ELEMENTARY'S INTERNAL WIDGET API (for now) AND IS NOT
11  * FINAL. CALL elm_widget_api_check(ELM_INTERNAL_API_VERSION) TO CHECK
12  * IT AT RUNTIME.
13  */
14 
15 /**
16  * @addtogroup Widget
17  * @{
18  *
19  * @section elm-hoversel-class The Elementary Hoversel Class
20  *
21  * Elementary, besides having the @ref Hoversel widget, exposes its
22  * foundation -- the Elementary Hoversel Class -- in order to create other
23  * widgets which are a hoversel with some more logic on top.
24  */
25 
26 /**
27  * Base button smart data extended with hoversel instance data.
28  */
29 typedef struct _Elm_Hoversel_Data Elm_Hoversel_Data;
30 struct _Elm_Hoversel_Data
31 {
32    /* aggregates a hover */
33    Evas_Object          *hover;
34    Evas_Object          *hover_parent;
35    Evas_Object          *spacer;
36    Evas_Object          *tbl;
37    Evas_Object          *scr;
38    Evas_Object          *bx;
39    const char           *last_location;
40 
41    Eina_List            *items;
42    Ecore_Job            *resize_job;
43 
44    Eina_Bool             horizontal    : 1;
45    Eina_Bool             expanded      : 1;
46    Eina_Bool             scrollable    : 1;
47    Eina_Bool             auto_update   : 1;
48 };
49 
50 typedef struct _Elm_Hoversel_Item_Data Elm_Hoversel_Item_Data;
51 struct _Elm_Hoversel_Item_Data
52 {
53    Elm_Widget_Item_Data *base;
54 
55    const char   *label;
56    const char   *icon_file;
57    const char   *icon_group;
58 
59    Elm_Icon_Type icon_type;
60    Evas_Smart_Cb func;
61 };
62 
63 /**
64  * @}
65  */
66 
67 #define ELM_HOVERSEL_DATA_GET(o, sd) \
68   Elm_Hoversel_Data * sd = efl_data_scope_get(o, ELM_HOVERSEL_CLASS)
69 
70 #define ELM_HOVERSEL_DATA_GET_OR_RETURN(o, ptr)      \
71   ELM_HOVERSEL_DATA_GET(o, ptr);                     \
72   if (EINA_UNLIKELY(!ptr))                           \
73     {                                                \
74        ERR("No widget data for object %p (%s)",      \
75            o, evas_object_type_get(o));              \
76        return;                                       \
77     }
78 
79 #define ELM_HOVERSEL_DATA_GET_OR_RETURN_VAL(o, ptr, val) \
80   ELM_HOVERSEL_DATA_GET(o, ptr);                         \
81   if (EINA_UNLIKELY(!ptr))                               \
82     {                                                    \
83        ERR("No widget data for object %p (%s)",          \
84            o, evas_object_type_get(o));                  \
85        return val;                                       \
86     }
87 
88 #define ELM_HOVERSEL_CHECK(obj)                          \
89   if (EINA_UNLIKELY(!efl_isa((obj), ELM_HOVERSEL_CLASS))) \
90     return
91 
92 #define ELM_HOVERSEL_ITEM_DATA_GET(o, sd) \
93   Elm_Hoversel_Item_Data *sd = efl_data_scope_get(o, ELM_HOVERSEL_ITEM_CLASS)
94 
95 #define ELM_HOVERSEL_ITEM_CHECK(it)                           \
96   if (EINA_UNLIKELY(!efl_isa(it->base->eo_obj, ELM_HOVERSEL_ITEM_CLASS))) \
97     return
98 
99 #define ELM_HOVERSEL_ITEM_CHECK_OR_RETURN(it, ...)         \
100   if (EINA_UNLIKELY(!efl_isa(it->base->eo_obj, ELM_HOVERSEL_ITEM_CLASS))) \
101     return __VA_ARGS__;
102 
103 #endif
104