1 #ifdef HAVE_CONFIG_H
2 # include "elementary_config.h"
3 #endif
4 
5 #include "elm_priv.h"
6 
7 #define MY_CLASS EFL_UI_RADIO_BOX_CLASS
8 
9 typedef struct {
10    Eina_Bool in_pack;
11    Efl_Ui_Radio_Group *group;
12 } Efl_Ui_Radio_Box_Data;
13 
14 static inline Eina_Bool
register_safe_in_group_begin(Eo * subobj,Efl_Ui_Radio_Box_Data * pd,Eina_Bool is_radio)15 register_safe_in_group_begin(Eo *subobj, Efl_Ui_Radio_Box_Data *pd, Eina_Bool is_radio)
16 {
17    if (pd->in_pack) return EINA_TRUE;
18    if (is_radio)
19      efl_ui_radio_group_register(pd->group, subobj);
20    pd->in_pack = EINA_TRUE;
21 
22    return EINA_TRUE;
23 }
24 
25 static inline Eina_Bool
register_safe_group_end(Eo * subobj,Efl_Ui_Radio_Box_Data * pd,Eina_Bool is_radio,Eina_Bool result)26 register_safe_group_end(Eo *subobj, Efl_Ui_Radio_Box_Data *pd, Eina_Bool is_radio, Eina_Bool result)
27 {
28    if (is_radio && (!result))
29      efl_ui_radio_group_unregister(pd->group, subobj);
30    pd->in_pack = EINA_FALSE;
31 
32    return result;
33 }
34 
35 #define REGISTER_SAFE(f) \
36   Eina_Bool result, is_radio = efl_isa(subobj, EFL_UI_RADIO_CLASS); \
37   if (!register_safe_in_group_begin(subobj, pd, is_radio)) \
38     return EINA_FALSE; \
39   result = f ; \
40   return register_safe_group_end(subobj, pd, is_radio, result);
41 
42 static void
unpack_from_logical(Eo * obj,Efl_Ui_Radio_Box_Data * pd)43 unpack_from_logical(Eo *obj, Efl_Ui_Radio_Box_Data *pd)
44 {
45    int length = efl_content_count(obj);
46    for (int i = 0; i < length; ++i)
47      {
48         efl_ui_radio_group_unregister(pd->group, efl_pack_content_get(obj, i));
49      }
50 }
51 
52 EOLIAN static Eina_Bool
_efl_ui_radio_box_efl_pack_pack_clear(Eo * obj,Efl_Ui_Radio_Box_Data * pd)53 _efl_ui_radio_box_efl_pack_pack_clear(Eo *obj, Efl_Ui_Radio_Box_Data *pd)
54 {
55    unpack_from_logical(obj, pd);
56    return efl_pack_clear(efl_super(obj, MY_CLASS));
57 }
58 
59 EOLIAN static Eina_Bool
_efl_ui_radio_box_efl_pack_unpack_all(Eo * obj,Efl_Ui_Radio_Box_Data * pd)60 _efl_ui_radio_box_efl_pack_unpack_all(Eo *obj, Efl_Ui_Radio_Box_Data *pd)
61 {
62    unpack_from_logical(obj, pd);
63    return efl_pack_unpack_all(efl_super(obj, MY_CLASS));
64 }
65 
66 EOLIAN static Eina_Bool
_efl_ui_radio_box_efl_pack_unpack(Eo * obj,Efl_Ui_Radio_Box_Data * pd,Efl_Gfx_Entity * subobj)67 _efl_ui_radio_box_efl_pack_unpack(Eo *obj, Efl_Ui_Radio_Box_Data *pd, Efl_Gfx_Entity *subobj)
68 {
69    efl_ui_radio_group_unregister(pd->group, subobj);
70    return efl_pack_unpack(efl_super(obj, MY_CLASS), subobj);
71 }
72 
73 EOLIAN static Efl_Gfx_Entity*
_efl_ui_radio_box_efl_pack_linear_pack_unpack_at(Eo * obj,Efl_Ui_Radio_Box_Data * pd,int index)74 _efl_ui_radio_box_efl_pack_linear_pack_unpack_at(Eo *obj, Efl_Ui_Radio_Box_Data *pd, int index)
75 {
76    efl_ui_radio_group_unregister(pd->group, efl_pack_content_get(obj, index));
77    return efl_pack_unpack_at(efl_super(obj, MY_CLASS), index);
78 }
79 
80 EOLIAN static Eina_Bool
_efl_ui_radio_box_efl_pack_pack(Eo * obj,Efl_Ui_Radio_Box_Data * pd,Efl_Gfx_Entity * subobj)81 _efl_ui_radio_box_efl_pack_pack(Eo *obj, Efl_Ui_Radio_Box_Data *pd, Efl_Gfx_Entity *subobj)
82 {
83    REGISTER_SAFE(efl_pack(efl_super(obj, MY_CLASS), subobj))
84 }
85 
86 EOLIAN static Eina_Bool
_efl_ui_radio_box_efl_pack_linear_pack_begin(Eo * obj,Efl_Ui_Radio_Box_Data * pd,Efl_Gfx_Entity * subobj)87 _efl_ui_radio_box_efl_pack_linear_pack_begin(Eo *obj, Efl_Ui_Radio_Box_Data *pd, Efl_Gfx_Entity *subobj)
88 {
89    REGISTER_SAFE(efl_pack_begin(efl_super(obj, MY_CLASS), subobj))
90 }
91 
92 EOLIAN static Eina_Bool
_efl_ui_radio_box_efl_pack_linear_pack_end(Eo * obj,Efl_Ui_Radio_Box_Data * pd,Efl_Gfx_Entity * subobj)93 _efl_ui_radio_box_efl_pack_linear_pack_end(Eo *obj, Efl_Ui_Radio_Box_Data *pd, Efl_Gfx_Entity *subobj)
94 {
95    REGISTER_SAFE(efl_pack_end(efl_super(obj, MY_CLASS), subobj))
96 }
97 
98 EOLIAN static Eina_Bool
_efl_ui_radio_box_efl_pack_linear_pack_before(Eo * obj,Efl_Ui_Radio_Box_Data * pd,Efl_Gfx_Entity * subobj,const Efl_Gfx_Entity * existing)99 _efl_ui_radio_box_efl_pack_linear_pack_before(Eo *obj, Efl_Ui_Radio_Box_Data *pd, Efl_Gfx_Entity *subobj, const Efl_Gfx_Entity *existing)
100 {
101    REGISTER_SAFE(efl_pack_before(efl_super(obj, MY_CLASS), subobj, existing));
102 }
103 
104 EOLIAN static Eina_Bool
_efl_ui_radio_box_efl_pack_linear_pack_after(Eo * obj,Efl_Ui_Radio_Box_Data * pd,Efl_Gfx_Entity * subobj,const Efl_Gfx_Entity * existing)105 _efl_ui_radio_box_efl_pack_linear_pack_after(Eo *obj, Efl_Ui_Radio_Box_Data *pd, Efl_Gfx_Entity *subobj, const Efl_Gfx_Entity *existing)
106 {
107    REGISTER_SAFE(efl_pack_after(efl_super(obj, MY_CLASS), subobj, existing));
108 }
109 
110 EOLIAN static Eina_Bool
_efl_ui_radio_box_efl_pack_linear_pack_at(Eo * obj,Efl_Ui_Radio_Box_Data * pd,Efl_Gfx_Entity * subobj,int index)111 _efl_ui_radio_box_efl_pack_linear_pack_at(Eo *obj, Efl_Ui_Radio_Box_Data *pd, Efl_Gfx_Entity *subobj, int index)
112 {
113    REGISTER_SAFE(efl_pack_at(efl_super(obj, MY_CLASS), subobj, index));
114 }
115 
116 EOLIAN static Efl_Object*
_efl_ui_radio_box_efl_object_constructor(Eo * obj,Efl_Ui_Radio_Box_Data * pd)117 _efl_ui_radio_box_efl_object_constructor(Eo *obj, Efl_Ui_Radio_Box_Data *pd)
118 {
119    pd->group = efl_new(EFL_UI_RADIO_GROUP_IMPL_CLASS, NULL);
120    efl_composite_attach(obj, pd->group);
121    efl_event_callback_forwarder_add(pd->group, EFL_UI_SELECTABLE_EVENT_SELECTION_CHANGED, obj);
122    efl_event_callback_forwarder_add(pd->group, EFL_UI_RADIO_GROUP_EVENT_VALUE_CHANGED, obj);
123    return efl_constructor(efl_super(obj, MY_CLASS));
124 }
125 
126 
127 #include "efl_ui_radio_box.eo.c"
128