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