1 #include <Elementary.h>
3 #include "elm_widget_check.h"
7 EAPI const char ELM_CHECK_SMART_NAME[] = "elm_check";
9 static const Elm_Layout_Part_Alias_Description _content_aliases[] =
11 {"icon", "elm.swallow.content"},
15 static const Elm_Layout_Part_Alias_Description _text_aliases[] =
17 {"default", "elm.text"},
19 {"off", "elm.offtext"},
23 static const char SIG_CHANGED[] = "changed";
25 /* smart callbacks coming from elm check objects: */
26 static const Evas_Smart_Cb_Description _smart_callbacks[] = {
31 EVAS_SMART_SUBCLASS_NEW
32 (ELM_CHECK_SMART_NAME, _elm_check, Elm_Check_Smart_Class,
33 Elm_Layout_Smart_Class, elm_layout_smart_class_get, _smart_callbacks);
36 _activate(Evas_Object *obj)
38 ELM_CHECK_DATA_GET(obj, sd);
40 sd->state = !sd->state;
41 if (sd->statep) *sd->statep = sd->state;
44 elm_layout_signal_emit(obj, "elm,state,check,on", "elm");
45 if (_elm_config->access_mode != ELM_ACCESS_MODE_OFF)
46 _elm_access_say(E_("State: On"));
50 elm_layout_signal_emit(obj, "elm,state,check,off", "elm");
51 if (_elm_config->access_mode != ELM_ACCESS_MODE_OFF)
52 _elm_access_say(E_("State: Off"));
55 evas_object_smart_callback_call(obj, SIG_CHANGED, NULL);
58 /* FIXME: replicated from elm_layout just because check's icon spot
59 * is elm.swallow.content, not elm.swallow.icon. Fix that whenever we
60 * can changed the theme API */
62 _icon_signal_emit(Evas_Object *obj)
66 snprintf(buf, sizeof(buf), "elm,state,icon,%s",
67 elm_layout_content_get(obj, "icon") ? "visible" : "hidden");
69 elm_layout_signal_emit(obj, buf, "elm");
72 /* FIXME: replicated from elm_layout just because check's icon spot
73 * is elm.swallow.content, not elm.swallow.icon. Fix that whenever we
74 * can changed the theme API */
76 _elm_check_smart_sub_object_del(Evas_Object *obj,
79 if (!ELM_WIDGET_CLASS(_elm_check_parent_sc)->sub_object_del(obj, sobj))
82 _icon_signal_emit(obj);
88 _elm_check_smart_activate(Evas_Object *obj, Elm_Activate act)
90 if (act != ELM_ACTIVATE_DEFAULT) return EINA_FALSE;
97 /* FIXME: replicated from elm_layout just because check's icon spot
98 * is elm.swallow.content, not elm.swallow.icon. Fix that whenever we
99 * can changed the theme API */
101 _elm_check_smart_content_set(Evas_Object *obj,
103 Evas_Object *content)
105 if (!ELM_CONTAINER_CLASS(_elm_check_parent_sc)->content_set
106 (obj, part, content))
109 _icon_signal_emit(obj);
115 _elm_check_smart_sizing_eval(Evas_Object *obj)
117 Evas_Coord minw = -1, minh = -1, maxw = -1, maxh = -1;
119 ELM_CHECK_DATA_GET(obj, sd);
121 elm_coords_finger_size_adjust(1, &minw, 1, &minh);
122 edje_object_size_min_restricted_calc
123 (ELM_WIDGET_DATA(sd)->resize_obj, &minw, &minh, minw, minh);
124 elm_coords_finger_size_adjust(1, &minw, 1, &minh);
125 evas_object_size_hint_min_set(obj, minw, minh);
126 evas_object_size_hint_max_set(obj, maxw, maxh);
130 _elm_check_smart_event(Evas_Object *obj,
131 Evas_Object *src __UNUSED__,
132 Evas_Callback_Type type,
135 Evas_Event_Key_Down *ev = event_info;
137 if (elm_widget_disabled_get(obj)) return EINA_FALSE;
139 if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
141 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE;
143 if ((strcmp(ev->keyname, "Return")) &&
144 (strcmp(ev->keyname, "KP_Enter")) &&
145 (strcmp(ev->keyname, "space")))
149 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
155 _elm_check_smart_theme(Evas_Object *obj)
157 ELM_CHECK_DATA_GET(obj, sd);
159 if (!ELM_WIDGET_CLASS(_elm_check_parent_sc)->theme(obj)) return EINA_FALSE;
161 if (!sd->state) elm_layout_signal_emit(obj, "elm,state,check,off", "elm");
162 else elm_layout_signal_emit(obj, "elm,state,check,on", "elm");
164 edje_object_message_signal_process(ELM_WIDGET_DATA(sd)->resize_obj);
166 /* FIXME: replicated from elm_layout just because check's icon spot
167 * is elm.swallow.content, not elm.swallow.icon. Fix that whenever
168 * we can changed the theme API */
169 _icon_signal_emit(obj);
171 elm_layout_sizing_eval(obj);
177 _access_info_cb(void *data __UNUSED__, Evas_Object *obj)
179 const char *txt = elm_widget_access_info_get(obj);
181 if (!txt) txt = elm_layout_text_get(obj, NULL);
182 if (txt) return strdup(txt);
188 _access_state_cb(void *data, Evas_Object *obj)
190 Elm_Check_Smart_Data *sd = data;
191 const char *on_text, *off_text;
193 if (elm_widget_disabled_get(obj))
194 return strdup(E_("State: Disabled"));
197 on_text = elm_layout_text_get(ELM_WIDGET_DATA(sd)->obj, "on");
203 snprintf(buf, sizeof(buf), "%s: %s", E_("State"), on_text);
207 return strdup(E_("State: On"));
210 off_text = elm_layout_text_get(ELM_WIDGET_DATA(sd)->obj, "off");
216 snprintf(buf, sizeof(buf), "%s: %s", E_("State"), off_text);
219 return strdup(E_("State: Off"));
223 _on_check_off(void *data,
224 Evas_Object *o __UNUSED__,
225 const char *emission __UNUSED__,
226 const char *source __UNUSED__)
228 Evas_Object *obj = data;
230 ELM_CHECK_DATA_GET(obj, sd);
232 sd->state = EINA_FALSE;
233 if (sd->statep) *sd->statep = sd->state;
235 elm_layout_signal_emit(obj, "elm,state,check,off", "elm");
236 evas_object_smart_callback_call(data, SIG_CHANGED, NULL);
240 _on_check_on(void *data,
241 Evas_Object *o __UNUSED__,
242 const char *emission __UNUSED__,
243 const char *source __UNUSED__)
245 Evas_Object *obj = data;
247 ELM_CHECK_DATA_GET(obj, sd);
249 sd->state = EINA_TRUE;
250 if (sd->statep) *sd->statep = sd->state;
251 elm_layout_signal_emit(obj, "elm,state,check,on", "elm");
252 evas_object_smart_callback_call(data, SIG_CHANGED, NULL);
256 _on_check_toggle(void *data,
257 Evas_Object *o __UNUSED__,
258 const char *emission __UNUSED__,
259 const char *source __UNUSED__)
265 static void _check_drag_start(void *data,
266 Evas_Object *o __UNUSED__,
267 const char *emission __UNUSED__,
268 const char *source __UNUSED__)
270 Evas_Object *obj = data;
272 elm_widget_scroll_freeze_push(obj);
275 static void _check_drag_stop(void *data,
276 Evas_Object *o __UNUSED__,
277 const char *emission __UNUSED__,
278 const char *source __UNUSED__)
280 Evas_Object *obj = data;
282 elm_widget_scroll_freeze_pop(obj);
287 _elm_check_smart_add(Evas_Object *obj)
289 EVAS_SMART_DATA_ALLOC(obj, Elm_Check_Smart_Data);
291 ELM_WIDGET_CLASS(_elm_check_parent_sc)->base.add(obj);
293 edje_object_signal_callback_add
294 (ELM_WIDGET_DATA(priv)->resize_obj, "elm,action,check,on", "",
296 edje_object_signal_callback_add
297 (ELM_WIDGET_DATA(priv)->resize_obj, "elm,action,check,off", "",
299 edje_object_signal_callback_add
300 (ELM_WIDGET_DATA(priv)->resize_obj, "elm,action,check,toggle", "",
301 _on_check_toggle, obj);
304 edje_object_signal_callback_add
305 (ELM_WIDGET_DATA(priv)->resize_obj, "elm,action,check,drag,start", "",
306 _check_drag_start, obj);
307 edje_object_signal_callback_add
308 (ELM_WIDGET_DATA(priv)->resize_obj, "elm,action,check,drag,stop", "",
309 _check_drag_stop, obj);
312 _elm_access_object_register(obj, ELM_WIDGET_DATA(priv)->resize_obj);
314 (_elm_access_object_get(obj), ELM_ACCESS_TYPE, E_("Check"));
315 _elm_access_callback_set
316 (_elm_access_object_get(obj), ELM_ACCESS_INFO, _access_info_cb, priv);
317 _elm_access_callback_set
318 (_elm_access_object_get(obj), ELM_ACCESS_STATE, _access_state_cb, priv);
320 elm_widget_can_focus_set(obj, EINA_TRUE);
322 elm_layout_theme_set(obj, "check", "base", elm_widget_style_get(obj));
323 elm_layout_sizing_eval(obj);
328 _elm_check_smart_del(Evas_Object *obj)
331 if (0 != elm_widget_scroll_freeze_get(obj))
332 elm_widget_scroll_freeze_pop(obj);
334 ELM_WIDGET_CLASS(_elm_check_parent_sc)->base.del(obj);
339 _elm_check_smart_set_user(Elm_Check_Smart_Class *sc)
341 ELM_WIDGET_CLASS(sc)->base.add = _elm_check_smart_add;
344 ELM_WIDGET_CLASS(sc)->base.del = _elm_check_smart_del;
347 ELM_WIDGET_CLASS(sc)->theme = _elm_check_smart_theme;
348 ELM_WIDGET_CLASS(sc)->event = _elm_check_smart_event;
349 ELM_WIDGET_CLASS(sc)->sub_object_del = _elm_check_smart_sub_object_del;
350 ELM_WIDGET_CLASS(sc)->activate = _elm_check_smart_activate;
352 /* not a 'focus chain manager' */
353 ELM_WIDGET_CLASS(sc)->focus_next = NULL;
354 ELM_WIDGET_CLASS(sc)->focus_direction = NULL;
356 ELM_CONTAINER_CLASS(sc)->content_set = _elm_check_smart_content_set;
358 ELM_LAYOUT_CLASS(sc)->sizing_eval = _elm_check_smart_sizing_eval;
360 ELM_LAYOUT_CLASS(sc)->content_aliases = _content_aliases;
361 ELM_LAYOUT_CLASS(sc)->text_aliases = _text_aliases;
364 EAPI const Elm_Check_Smart_Class *
365 elm_check_smart_class_get(void)
367 static Elm_Check_Smart_Class _sc =
368 ELM_CHECK_SMART_CLASS_INIT_NAME_VERSION(ELM_CHECK_SMART_NAME);
369 static const Elm_Check_Smart_Class *class = NULL;
370 Evas_Smart_Class *esc = (Evas_Smart_Class *)&_sc;
375 _elm_check_smart_set(&_sc);
376 esc->callbacks = _smart_callbacks;
383 elm_check_add(Evas_Object *parent)
387 EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
389 obj = elm_widget_add(_elm_check_smart_class_new(), parent);
390 if (!obj) return NULL;
392 if (!elm_widget_sub_object_add(parent, obj))
393 ERR("could not add %p as sub object of %p", obj, parent);
399 elm_check_state_set(Evas_Object *obj,
402 ELM_CHECK_CHECK(obj);
403 ELM_CHECK_DATA_GET(obj, sd);
405 if (state != sd->state)
408 if (sd->statep) *sd->statep = sd->state;
410 elm_layout_signal_emit(obj, "elm,state,check,on", "elm");
412 elm_layout_signal_emit(obj, "elm,state,check,off", "elm");
415 edje_object_message_signal_process(ELM_WIDGET_DATA(sd)->resize_obj);
419 elm_check_state_get(const Evas_Object *obj)
421 ELM_CHECK_CHECK(obj) EINA_FALSE;
422 ELM_CHECK_DATA_GET(obj, sd);
428 elm_check_state_pointer_set(Evas_Object *obj,
431 ELM_CHECK_CHECK(obj);
432 ELM_CHECK_DATA_GET(obj, sd);
437 if (*sd->statep != sd->state)
439 sd->state = *sd->statep;
441 elm_layout_signal_emit(obj, "elm,state,check,on", "elm");
443 elm_layout_signal_emit(obj, "elm,state,check,off", "elm");