1 #ifndef ELM_WIDGET_DISKSELECTOR_H 2 #define ELM_WIDGET_DISKSELECTOR_H 3 4 #include "Elementary.h" 5 6 /* DO NOT USE THIS HEADER UNLESS YOU ARE PREPARED FOR BREAKING OF YOUR 7 * CODE. THIS IS ELEMENTARY'S INTERNAL WIDGET API (for now) AND IS NOT 8 * FINAL. CALL elm_widget_api_check(ELM_INTERNAL_API_VERSION) TO CHECK 9 * IT AT RUNTIME. 10 */ 11 12 /** 13 * @addtogroup Widget 14 * @{ 15 * 16 * @section elm-diskselector-class The Elementary Diskselector Class 17 * 18 * Elementary, besides having the @ref Diskselector widget, exposes its 19 * foundation -- the Elementary Diskselector Class -- in order to create other 20 * widgets which are a diskselector with some more logic on top. 21 */ 22 23 /** 24 * Base widget smart data extended with diskselector instance data. 25 */ 26 typedef struct _Elm_Diskselector_Data Elm_Diskselector_Data; 27 typedef struct _Elm_Diskselector_Item_Data Elm_Diskselector_Item_Data; 28 29 struct _Elm_Diskselector_Data 30 { 31 Evas_Object *hit_rect; 32 33 Evas_Object *main_box; 34 Elm_Diskselector_Item_Data *selected_item; 35 Elm_Diskselector_Item_Data *first; 36 Elm_Diskselector_Item_Data *second; 37 Elm_Diskselector_Item_Data *s_last; 38 Elm_Diskselector_Item_Data *last; 39 Eina_List *items; 40 Eina_List *r_items; 41 Eina_List *over_items; 42 Eina_List *under_items; 43 Eina_List *left_blanks; 44 Eina_List *right_blanks; 45 Ecore_Idle_Enterer *scroller_move_idle_enterer; // idle enterer for scroller move 46 Ecore_Idle_Enterer *string_check_idle_enterer; // idle enterer for string check 47 48 int item_count, len_threshold, len_side, 49 display_item_num; 50 Evas_Coord minw, minh; 51 52 Eina_Bool init : 1; 53 Eina_Bool round : 1; 54 Eina_Bool display_item_num_by_api : 1; 55 Eina_Bool left_boundary_reached:1; 56 Eina_Bool right_boundary_reached:1; 57 }; 58 59 struct _Elm_Diskselector_Item_Data 60 { 61 Elm_Widget_Item_Data *base; 62 63 Eina_List *node; 64 Evas_Object *icon; 65 const char *label; 66 Evas_Smart_Cb func; 67 }; 68 69 /** 70 * @} 71 */ 72 73 #define ELM_DISKSELECTOR_DATA_GET(o, sd) \ 74 Elm_Diskselector_Data * sd = efl_data_scope_get(o, ELM_DISKSELECTOR_CLASS) 75 76 #define ELM_DISKSELECTOR_DATA_GET_OR_RETURN(o, ptr) \ 77 ELM_DISKSELECTOR_DATA_GET(o, ptr); \ 78 if (EINA_UNLIKELY(!ptr)) \ 79 { \ 80 ERR("No widget data for object %p (%s)", \ 81 o, evas_object_type_get(o)); \ 82 return; \ 83 } 84 85 #define ELM_DISKSELECTOR_DATA_GET_OR_RETURN_VAL(o, ptr, val) \ 86 ELM_DISKSELECTOR_DATA_GET(o, ptr); \ 87 if (EINA_UNLIKELY(!ptr)) \ 88 { \ 89 ERR("No widget data for object %p (%s)", \ 90 o, evas_object_type_get(o)); \ 91 return val; \ 92 } 93 94 #define ELM_DISKSELECTOR_CHECK(obj) \ 95 if (EINA_UNLIKELY(!efl_isa((obj), ELM_DISKSELECTOR_CLASS))) \ 96 return 97 98 #define ELM_DISKSELECTOR_ITEM_CHECK(it) \ 99 ELM_WIDGET_ITEM_CHECK_OR_RETURN(it->base, ); \ 100 ELM_DISKSELECTOR_CHECK(it->base->widget); 101 102 #define ELM_DISKSELECTOR_ITEM_CHECK_OR_RETURN(it, ...) \ 103 ELM_WIDGET_ITEM_CHECK_OR_RETURN(it->base, __VA_ARGS__); \ 104 ELM_DISKSELECTOR_CHECK(it->base->widget) __VA_ARGS__; 105 106 #define ELM_DISKSELECTOR_ITEM_CHECK_OR_GOTO(it, label) \ 107 ELM_WIDGET_ITEM_CHECK_OR_GOTO(it->base, label); \ 108 if (!it->base->widget || !efl_isa((it->base->widget), ELM_DISKSELECTOR_CLASS)) \ 109 goto label; 110 111 #define ELM_DISKSELECTOR_ITEM_DATA_GET(o, sd) \ 112 Elm_Diskselector_Item_Data* sd = efl_data_scope_get(o, ELM_DISKSELECTOR_ITEM_CLASS) 113 114 #endif 115