1 #include <Elementary.h>
3 #include "elm_widget_check.h"
5 EAPI const char ELM_CHECK_SMART_NAME[] = "elm_check";
7 static const Elm_Layout_Part_Alias_Description _content_aliases[] =
9 {"icon", "elm.swallow.content"},
13 static const Elm_Layout_Part_Alias_Description _text_aliases[] =
15 {"default", "elm.text"},
17 {"off", "elm.offtext"},
21 static const char SIG_CHANGED[] = "changed";
23 /* smart callbacks coming from elm check objects: */
24 static const Evas_Smart_Cb_Description _smart_callbacks[] = {
29 EVAS_SMART_SUBCLASS_NEW
30 (ELM_CHECK_SMART_NAME, _elm_check, Elm_Check_Smart_Class,
31 Elm_Layout_Smart_Class, elm_layout_smart_class_get, _smart_callbacks);
34 _activate(Evas_Object *obj)
36 ELM_CHECK_DATA_GET(obj, sd);
38 sd->state = !sd->state;
39 if (sd->statep) *sd->statep = sd->state;
42 elm_layout_signal_emit(obj, "elm,state,check,on", "elm");
43 if (_elm_config->access_mode != ELM_ACCESS_MODE_OFF)
44 _elm_access_say(E_("State: On"));
48 elm_layout_signal_emit(obj, "elm,state,check,off", "elm");
49 if (_elm_config->access_mode != ELM_ACCESS_MODE_OFF)
50 _elm_access_say(E_("State: Off"));
53 evas_object_smart_callback_call(obj, SIG_CHANGED, NULL);
56 /* FIXME: replicated from elm_layout just because check's icon spot
57 * is elm.swallow.content, not elm.swallow.icon. Fix that whenever we
58 * can changed the theme API */
60 _icon_signal_emit(Evas_Object *obj)
64 snprintf(buf, sizeof(buf), "elm,state,icon,%s",
65 elm_layout_content_get(obj, "icon") ? "visible" : "hidden");
67 elm_layout_signal_emit(obj, buf, "elm");
70 /* FIXME: replicated from elm_layout just because check's icon spot
71 * is elm.swallow.content, not elm.swallow.icon. Fix that whenever we
72 * can changed the theme API */
74 _elm_check_smart_sub_object_del(Evas_Object *obj,
77 if (!ELM_WIDGET_CLASS(_elm_check_parent_sc)->sub_object_del(obj, sobj))
80 _icon_signal_emit(obj);
86 _elm_check_smart_activate(Evas_Object *obj, Elm_Activate act)
88 if (act != ELM_ACTIVATE_DEFAULT) return EINA_FALSE;
95 /* FIXME: replicated from elm_layout just because check's icon spot
96 * is elm.swallow.content, not elm.swallow.icon. Fix that whenever we
97 * can changed the theme API */
99 _elm_check_smart_content_set(Evas_Object *obj,
101 Evas_Object *content)
103 if (!ELM_CONTAINER_CLASS(_elm_check_parent_sc)->content_set
104 (obj, part, content))
107 _icon_signal_emit(obj);
113 _elm_check_smart_sizing_eval(Evas_Object *obj)
115 Evas_Coord minw = -1, minh = -1, maxw = -1, maxh = -1;
117 ELM_CHECK_DATA_GET(obj, sd);
119 elm_coords_finger_size_adjust(1, &minw, 1, &minh);
120 edje_object_size_min_restricted_calc
121 (ELM_WIDGET_DATA(sd)->resize_obj, &minw, &minh, minw, minh);
122 elm_coords_finger_size_adjust(1, &minw, 1, &minh);
123 evas_object_size_hint_min_set(obj, minw, minh);
124 evas_object_size_hint_max_set(obj, maxw, maxh);
128 _elm_check_smart_event(Evas_Object *obj,
129 Evas_Object *src __UNUSED__,
130 Evas_Callback_Type type,
133 Evas_Event_Key_Down *ev = event_info;
135 if (elm_widget_disabled_get(obj)) return EINA_FALSE;
137 if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
139 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE;
141 if ((strcmp(ev->keyname, "Return")) &&
142 (strcmp(ev->keyname, "KP_Enter")) &&
143 (strcmp(ev->keyname, "space")))
147 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
153 _elm_check_smart_theme(Evas_Object *obj)
155 ELM_CHECK_DATA_GET(obj, sd);
157 if (!ELM_WIDGET_CLASS(_elm_check_parent_sc)->theme(obj)) return EINA_FALSE;
159 if (!sd->state) elm_layout_signal_emit(obj, "elm,state,check,off", "elm");
160 else elm_layout_signal_emit(obj, "elm,state,check,on", "elm");
162 edje_object_message_signal_process(ELM_WIDGET_DATA(sd)->resize_obj);
164 /* FIXME: replicated from elm_layout just because check's icon spot
165 * is elm.swallow.content, not elm.swallow.icon. Fix that whenever
166 * we can changed the theme API */
167 _icon_signal_emit(obj);
169 elm_layout_sizing_eval(obj);
175 _access_info_cb(void *data __UNUSED__, Evas_Object *obj)
177 const char *txt = elm_widget_access_info_get(obj);
179 if (!txt) txt = elm_layout_text_get(obj, NULL);
180 if (txt) return strdup(txt);
186 _access_state_cb(void *data, Evas_Object *obj)
188 Elm_Check_Smart_Data *sd = data;
189 const char *on_text, *off_text;
191 if (elm_widget_disabled_get(obj))
192 return strdup(E_("State: Disabled"));
195 on_text = elm_layout_text_get(ELM_WIDGET_DATA(sd)->obj, "on");
201 snprintf(buf, sizeof(buf), "%s: %s", E_("State"), on_text);
205 return strdup(E_("State: On"));
208 off_text = elm_layout_text_get(ELM_WIDGET_DATA(sd)->obj, "off");
214 snprintf(buf, sizeof(buf), "%s: %s", E_("State"), off_text);
217 return strdup(E_("State: Off"));
221 _on_check_off(void *data,
222 Evas_Object *o __UNUSED__,
223 const char *emission __UNUSED__,
224 const char *source __UNUSED__)
226 Evas_Object *obj = data;
228 ELM_CHECK_DATA_GET(obj, sd);
230 sd->state = EINA_FALSE;
231 if (sd->statep) *sd->statep = sd->state;
233 elm_layout_signal_emit(obj, "elm,state,check,off", "elm");
234 evas_object_smart_callback_call(data, SIG_CHANGED, NULL);
238 _on_check_on(void *data,
239 Evas_Object *o __UNUSED__,
240 const char *emission __UNUSED__,
241 const char *source __UNUSED__)
243 Evas_Object *obj = data;
245 ELM_CHECK_DATA_GET(obj, sd);
247 sd->state = EINA_TRUE;
248 if (sd->statep) *sd->statep = sd->state;
249 elm_layout_signal_emit(obj, "elm,state,check,on", "elm");
250 evas_object_smart_callback_call(data, SIG_CHANGED, NULL);
254 _on_check_toggle(void *data,
255 Evas_Object *o __UNUSED__,
256 const char *emission __UNUSED__,
257 const char *source __UNUSED__)
263 _elm_check_smart_add(Evas_Object *obj)
265 EVAS_SMART_DATA_ALLOC(obj, Elm_Check_Smart_Data);
267 ELM_WIDGET_CLASS(_elm_check_parent_sc)->base.add(obj);
269 edje_object_signal_callback_add
270 (ELM_WIDGET_DATA(priv)->resize_obj, "elm,action,check,on", "",
272 edje_object_signal_callback_add
273 (ELM_WIDGET_DATA(priv)->resize_obj, "elm,action,check,off", "",
275 edje_object_signal_callback_add
276 (ELM_WIDGET_DATA(priv)->resize_obj, "elm,action,check,toggle", "",
277 _on_check_toggle, obj);
279 _elm_access_object_register(obj, ELM_WIDGET_DATA(priv)->resize_obj);
281 (_elm_access_object_get(obj), ELM_ACCESS_TYPE, E_("Check"));
282 _elm_access_callback_set
283 (_elm_access_object_get(obj), ELM_ACCESS_INFO, _access_info_cb, priv);
284 _elm_access_callback_set
285 (_elm_access_object_get(obj), ELM_ACCESS_STATE, _access_state_cb, priv);
287 elm_widget_can_focus_set(obj, EINA_TRUE);
289 elm_layout_theme_set(obj, "check", "base", elm_widget_style_get(obj));
290 elm_layout_sizing_eval(obj);
294 _elm_check_smart_set_user(Elm_Check_Smart_Class *sc)
296 ELM_WIDGET_CLASS(sc)->base.add = _elm_check_smart_add;
298 ELM_WIDGET_CLASS(sc)->theme = _elm_check_smart_theme;
299 ELM_WIDGET_CLASS(sc)->event = _elm_check_smart_event;
300 ELM_WIDGET_CLASS(sc)->sub_object_del = _elm_check_smart_sub_object_del;
301 ELM_WIDGET_CLASS(sc)->activate = _elm_check_smart_activate;
303 /* not a 'focus chain manager' */
304 ELM_WIDGET_CLASS(sc)->focus_next = NULL;
305 ELM_WIDGET_CLASS(sc)->focus_direction = NULL;
307 ELM_CONTAINER_CLASS(sc)->content_set = _elm_check_smart_content_set;
309 ELM_LAYOUT_CLASS(sc)->sizing_eval = _elm_check_smart_sizing_eval;
311 ELM_LAYOUT_CLASS(sc)->content_aliases = _content_aliases;
312 ELM_LAYOUT_CLASS(sc)->text_aliases = _text_aliases;
315 EAPI const Elm_Check_Smart_Class *
316 elm_check_smart_class_get(void)
318 static Elm_Check_Smart_Class _sc =
319 ELM_CHECK_SMART_CLASS_INIT_NAME_VERSION(ELM_CHECK_SMART_NAME);
320 static const Elm_Check_Smart_Class *class = NULL;
321 Evas_Smart_Class *esc = (Evas_Smart_Class *)&_sc;
326 _elm_check_smart_set(&_sc);
327 esc->callbacks = _smart_callbacks;
334 elm_check_add(Evas_Object *parent)
338 EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
340 obj = elm_widget_add(_elm_check_smart_class_new(), parent);
341 if (!obj) return NULL;
343 if (!elm_widget_sub_object_add(parent, obj))
344 ERR("could not add %p as sub object of %p", obj, parent);
350 elm_check_state_set(Evas_Object *obj,
353 ELM_CHECK_CHECK(obj);
354 ELM_CHECK_DATA_GET(obj, sd);
356 if (state != sd->state)
359 if (sd->statep) *sd->statep = sd->state;
361 elm_layout_signal_emit(obj, "elm,state,check,on", "elm");
363 elm_layout_signal_emit(obj, "elm,state,check,off", "elm");
366 edje_object_message_signal_process(ELM_WIDGET_DATA(sd)->resize_obj);
370 elm_check_state_get(const Evas_Object *obj)
372 ELM_CHECK_CHECK(obj) EINA_FALSE;
373 ELM_CHECK_DATA_GET(obj, sd);
379 elm_check_state_pointer_set(Evas_Object *obj,
382 ELM_CHECK_CHECK(obj);
383 ELM_CHECK_DATA_GET(obj, sd);
388 if (*sd->statep != sd->state)
390 sd->state = *sd->statep;
392 elm_layout_signal_emit(obj, "elm,state,check,on", "elm");
394 elm_layout_signal_emit(obj, "elm,state,check,off", "elm");