2008-09-29 23:58:56 -07:00
|
|
|
#include <Elementary.h>
|
|
|
|
#include "elm_priv.h"
|
|
|
|
|
2012-05-02 18:19:05 -07:00
|
|
|
typedef struct _Widget_Data Widget_Data;
|
|
|
|
|
|
|
|
struct _Widget_Data
|
|
|
|
{
|
|
|
|
Evas_Object *btn, *icon;
|
|
|
|
const char *label;
|
|
|
|
double ar_threshold;
|
|
|
|
double ar_interval;
|
|
|
|
Ecore_Timer *timer;
|
|
|
|
Eina_Bool autorepeat : 1;
|
|
|
|
Eina_Bool repeating : 1;
|
|
|
|
Eina_Bool delete_me : 1;
|
|
|
|
};
|
|
|
|
|
|
|
|
static const char *widtype = NULL;
|
|
|
|
static void _del_hook(Evas_Object *obj);
|
|
|
|
static void _del_pre_hook(Evas_Object *obj);
|
|
|
|
static void _theme_hook(Evas_Object *obj);
|
|
|
|
static void _disable_hook(Evas_Object *obj);
|
|
|
|
static void _content_set_hook(Evas_Object *obj, const char *part, Evas_Object *content);
|
|
|
|
static Evas_Object *_content_get_hook(const Evas_Object *obj, const char *part);
|
|
|
|
static Evas_Object *_content_unset_hook(Evas_Object *obj, const char *part);
|
|
|
|
static void _sizing_eval(Evas_Object *obj);
|
|
|
|
static void _changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info);
|
|
|
|
static void _sub_del(void *data, Evas_Object *obj, void *event_info);
|
|
|
|
static void _signal_clicked(void *data, Evas_Object *obj, const char *emission, const char *source);
|
|
|
|
static void _signal_pressed(void *data, Evas_Object *obj, const char *emission, const char *source);
|
|
|
|
static void _signal_unpressed(void *data, Evas_Object *obj, const char *emission, const char *source);
|
|
|
|
static void _on_focus_hook(void *data, Evas_Object *obj);
|
|
|
|
static void _activate(Evas_Object *obj);
|
|
|
|
static void _activate_hook(Evas_Object *obj);
|
|
|
|
static Eina_Bool _event_hook(Evas_Object *obj, Evas_Object *src,
|
|
|
|
Evas_Callback_Type type, void *event_info);
|
2008-09-29 23:58:56 -07:00
|
|
|
|
Proxy Elementary widget signals to Edje.
Add support to automatic proxy events from Elementary to Edje using
callbacks described with Evas_Smart_Cb_Description and set to
Evas_Smart_Class or per-instance with
evas_object_smart_callbacks_descriptions_set().
Right now elm_widget is not subclassable, so there is no way to define
class signals, just instance signals.
Just doing it for button, lots of widgets to do... If you can help,
please follow the process:
* see example at src/lib/elm_button.c, copy it.
* read your widget documentation at Elementary.h
* grep for evas_object_smart_callback_call(), see if they are all
documented in Elementary.h, or if there are some missing. Fix Elementary.h
* paste and change based on fixed Elementary.h My recommendation is
to create "static const char []" variables and replace all
evas_object_smart_callback_call() with that, to force sync.
With callback descriptions pre-defined and using the same pointer with
a custom variation evas_object_smart_callback_call_ptr() we may later
optimize signal calling heavily, removing the requirement to call
eina_stringshare_add()/eina_stringshare_del() and also not mixing all
the callbacks in teh same list, instead having an array for defined
signals, and a list from there. These optimizations are not in, but
they are easily added later without breaking the API/ABI.
SVN revision: 47461
2010-03-25 17:58:14 -07:00
|
|
|
static const char SIG_CLICKED[] = "clicked";
|
|
|
|
static const char SIG_REPEATED[] = "repeated";
|
2011-06-30 16:43:24 -07:00
|
|
|
static const char SIG_PRESSED[] = "pressed";
|
Proxy Elementary widget signals to Edje.
Add support to automatic proxy events from Elementary to Edje using
callbacks described with Evas_Smart_Cb_Description and set to
Evas_Smart_Class or per-instance with
evas_object_smart_callbacks_descriptions_set().
Right now elm_widget is not subclassable, so there is no way to define
class signals, just instance signals.
Just doing it for button, lots of widgets to do... If you can help,
please follow the process:
* see example at src/lib/elm_button.c, copy it.
* read your widget documentation at Elementary.h
* grep for evas_object_smart_callback_call(), see if they are all
documented in Elementary.h, or if there are some missing. Fix Elementary.h
* paste and change based on fixed Elementary.h My recommendation is
to create "static const char []" variables and replace all
evas_object_smart_callback_call() with that, to force sync.
With callback descriptions pre-defined and using the same pointer with
a custom variation evas_object_smart_callback_call_ptr() we may later
optimize signal calling heavily, removing the requirement to call
eina_stringshare_add()/eina_stringshare_del() and also not mixing all
the callbacks in teh same list, instead having an array for defined
signals, and a list from there. These optimizations are not in, but
they are easily added later without breaking the API/ABI.
SVN revision: 47461
2010-03-25 17:58:14 -07:00
|
|
|
static const char SIG_UNPRESSED[] = "unpressed";
|
2012-05-02 18:19:05 -07:00
|
|
|
static const Evas_Smart_Cb_Description _signals[] = {
|
|
|
|
{SIG_CLICKED, ""},
|
|
|
|
{SIG_REPEATED, ""},
|
|
|
|
{SIG_PRESSED, ""},
|
|
|
|
{SIG_UNPRESSED, ""},
|
|
|
|
{NULL, NULL}
|
Proxy Elementary widget signals to Edje.
Add support to automatic proxy events from Elementary to Edje using
callbacks described with Evas_Smart_Cb_Description and set to
Evas_Smart_Class or per-instance with
evas_object_smart_callbacks_descriptions_set().
Right now elm_widget is not subclassable, so there is no way to define
class signals, just instance signals.
Just doing it for button, lots of widgets to do... If you can help,
please follow the process:
* see example at src/lib/elm_button.c, copy it.
* read your widget documentation at Elementary.h
* grep for evas_object_smart_callback_call(), see if they are all
documented in Elementary.h, or if there are some missing. Fix Elementary.h
* paste and change based on fixed Elementary.h My recommendation is
to create "static const char []" variables and replace all
evas_object_smart_callback_call() with that, to force sync.
With callback descriptions pre-defined and using the same pointer with
a custom variation evas_object_smart_callback_call_ptr() we may later
optimize signal calling heavily, removing the requirement to call
eina_stringshare_add()/eina_stringshare_del() and also not mixing all
the callbacks in teh same list, instead having an array for defined
signals, and a list from there. These optimizations are not in, but
they are easily added later without breaking the API/ABI.
SVN revision: 47461
2010-03-25 17:58:14 -07:00
|
|
|
};
|
|
|
|
|
2012-05-02 18:19:05 -07:00
|
|
|
static Eina_Bool
|
|
|
|
_event_hook(Evas_Object *obj, Evas_Object *src __UNUSED__, Evas_Callback_Type type, void *event_info)
|
2010-09-22 10:45:49 -07:00
|
|
|
{
|
2012-05-02 18:19:05 -07:00
|
|
|
if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
|
|
|
|
Evas_Event_Key_Down *ev = event_info;
|
|
|
|
Widget_Data *wd = elm_widget_data_get(obj);
|
|
|
|
if (!wd) return EINA_FALSE;
|
|
|
|
if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE;
|
|
|
|
if (elm_widget_disabled_get(obj)) return EINA_FALSE;
|
|
|
|
if ((strcmp(ev->keyname, "Return")) &&
|
|
|
|
(strcmp(ev->keyname, "KP_Enter")) &&
|
|
|
|
(strcmp(ev->keyname, "space")))
|
|
|
|
return EINA_FALSE;
|
|
|
|
_activate(obj);
|
|
|
|
ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
|
|
|
|
edje_object_signal_emit(wd->btn, "elm,anim,activate", "elm");
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
2011-09-14 02:53:11 -07:00
|
|
|
|
2012-05-02 18:19:05 -07:00
|
|
|
static void
|
|
|
|
_del_pre_hook(Evas_Object *obj)
|
|
|
|
{
|
|
|
|
Widget_Data *wd = elm_widget_data_get(obj);
|
|
|
|
if (!wd) return;
|
|
|
|
wd->delete_me = EINA_TRUE;
|
|
|
|
}
|
2008-09-29 23:58:56 -07:00
|
|
|
|
2010-01-10 22:23:00 -08:00
|
|
|
static void
|
2012-05-02 18:19:05 -07:00
|
|
|
_del_hook(Evas_Object *obj)
|
2010-01-10 22:23:00 -08:00
|
|
|
{
|
2012-05-02 18:19:05 -07:00
|
|
|
Widget_Data *wd = elm_widget_data_get(obj);
|
|
|
|
if (!wd) return;
|
|
|
|
if (wd->label) eina_stringshare_del(wd->label);
|
|
|
|
free(wd);
|
|
|
|
}
|
2012-05-02 09:58:26 -07:00
|
|
|
|
2012-05-02 18:19:05 -07:00
|
|
|
static void
|
|
|
|
_on_focus_hook(void *data __UNUSED__, Evas_Object *obj)
|
|
|
|
{
|
|
|
|
Widget_Data *wd = elm_widget_data_get(obj);
|
|
|
|
if (!wd) return;
|
|
|
|
if (elm_widget_focus_get(obj))
|
2010-04-20 13:03:05 -07:00
|
|
|
{
|
2012-05-02 18:19:05 -07:00
|
|
|
edje_object_signal_emit(wd->btn, "elm,action,focus", "elm");
|
|
|
|
evas_object_focus_set(wd->btn, EINA_TRUE);
|
2010-04-20 13:03:05 -07:00
|
|
|
}
|
2012-05-02 18:19:05 -07:00
|
|
|
else
|
|
|
|
{
|
|
|
|
edje_object_signal_emit(wd->btn, "elm,action,unfocus", "elm");
|
|
|
|
evas_object_focus_set(wd->btn, EINA_FALSE);
|
|
|
|
}
|
|
|
|
}
|
2009-08-16 04:35:55 -07:00
|
|
|
|
2012-05-02 18:19:05 -07:00
|
|
|
static void
|
|
|
|
_mirrored_set(Evas_Object *obj, Eina_Bool rtl)
|
|
|
|
{
|
|
|
|
Widget_Data *wd = elm_widget_data_get(obj);
|
|
|
|
if (!wd) return;
|
|
|
|
edje_object_mirrored_set(wd->btn, rtl);
|
|
|
|
}
|
2010-10-07 07:49:35 -07:00
|
|
|
|
2012-05-02 18:19:05 -07:00
|
|
|
static void
|
|
|
|
_theme_hook(Evas_Object *obj)
|
|
|
|
{
|
|
|
|
Widget_Data *wd = elm_widget_data_get(obj);
|
|
|
|
const char *str;
|
|
|
|
if (!wd) return;
|
|
|
|
_elm_widget_mirrored_reload(obj);
|
|
|
|
_mirrored_set(obj, elm_widget_mirrored_get(obj));
|
|
|
|
_elm_theme_object_set(obj, wd->btn, "button", "base", elm_widget_style_get(obj));
|
|
|
|
if (wd->icon)
|
|
|
|
edje_object_part_swallow(wd->btn, "elm.swallow.content", wd->icon);
|
|
|
|
if (wd->label)
|
|
|
|
edje_object_signal_emit(wd->btn, "elm,state,text,visible", "elm");
|
|
|
|
else
|
|
|
|
edje_object_signal_emit(wd->btn, "elm,state,text,hidden", "elm");
|
|
|
|
if (wd->icon)
|
|
|
|
edje_object_signal_emit(wd->btn, "elm,state,icon,visible", "elm");
|
|
|
|
else
|
|
|
|
edje_object_signal_emit(wd->btn, "elm,state,icon,hidden", "elm");
|
|
|
|
edje_object_part_text_escaped_set(wd->btn, "elm.text", wd->label);
|
|
|
|
if (elm_object_disabled_get(obj))
|
|
|
|
edje_object_signal_emit(wd->btn, "elm,state,disabled", "elm");
|
|
|
|
edje_object_message_signal_process(wd->btn);
|
|
|
|
edje_object_scale_set(wd->btn, elm_widget_scale_get(obj) * _elm_config->scale);
|
|
|
|
str = edje_object_data_get(wd->btn, "focus_highlight");
|
|
|
|
if ((str) && (!strcmp(str, "on")))
|
|
|
|
elm_widget_highlight_in_theme_set(obj, EINA_TRUE);
|
|
|
|
else
|
|
|
|
elm_widget_highlight_in_theme_set(obj, EINA_FALSE);
|
|
|
|
_sizing_eval(obj);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_disable_hook(Evas_Object *obj)
|
|
|
|
{
|
|
|
|
Widget_Data *wd = elm_widget_data_get(obj);
|
|
|
|
if (!wd) return;
|
|
|
|
if (elm_widget_disabled_get(obj))
|
|
|
|
edje_object_signal_emit(wd->btn, "elm,state,disabled", "elm");
|
|
|
|
else
|
|
|
|
edje_object_signal_emit(wd->btn, "elm,state,enabled", "elm");
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_signal_emit_hook(Evas_Object *obj, const char *emission, const char *source)
|
|
|
|
{
|
|
|
|
Widget_Data *wd = elm_widget_data_get(obj);
|
|
|
|
if (!wd) return;
|
|
|
|
edje_object_signal_emit(wd->btn, emission, source);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_signal_callback_add_hook(Evas_Object *obj, const char *emission, const char *source, Edje_Signal_Cb func_cb, void *data)
|
|
|
|
{
|
|
|
|
Widget_Data *wd = elm_widget_data_get(obj);
|
|
|
|
if (!wd) return;
|
|
|
|
edje_object_signal_callback_add(wd->btn, emission, source, func_cb, data);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_signal_callback_del_hook(Evas_Object *obj, const char *emission, const char *source, Edje_Signal_Cb func_cb, void *data)
|
|
|
|
{
|
|
|
|
Widget_Data *wd = elm_widget_data_get(obj);
|
|
|
|
edje_object_signal_callback_del_full(wd->btn, emission, source, func_cb,
|
|
|
|
data);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_content_set_hook(Evas_Object *obj, const char *part, Evas_Object *content)
|
|
|
|
{
|
|
|
|
ELM_CHECK_WIDTYPE(obj, widtype);
|
|
|
|
Widget_Data *wd = elm_widget_data_get(obj);
|
|
|
|
if (!wd) return;
|
|
|
|
if (part && strcmp(part, "icon")) return;
|
|
|
|
if (wd->icon == content) return;
|
|
|
|
if (wd->icon) evas_object_del(wd->icon);
|
|
|
|
wd->icon = content;
|
|
|
|
if (content)
|
2012-03-01 18:03:24 -08:00
|
|
|
{
|
2012-05-02 18:19:05 -07:00
|
|
|
elm_widget_sub_object_add(obj, content);
|
|
|
|
evas_object_event_callback_add(content,
|
|
|
|
EVAS_CALLBACK_CHANGED_SIZE_HINTS,
|
|
|
|
_changed_size_hints, obj);
|
|
|
|
edje_object_part_swallow(wd->btn, "elm.swallow.content", content);
|
|
|
|
edje_object_signal_emit(wd->btn, "elm,state,icon,visible", "elm");
|
|
|
|
edje_object_message_signal_process(wd->btn);
|
2011-10-24 18:23:25 -07:00
|
|
|
}
|
2012-05-02 18:19:05 -07:00
|
|
|
_sizing_eval(obj);
|
|
|
|
}
|
|
|
|
|
|
|
|
static Evas_Object *
|
|
|
|
_content_get_hook(const Evas_Object *obj, const char *part)
|
|
|
|
{
|
|
|
|
ELM_CHECK_WIDTYPE(obj, widtype) NULL;
|
|
|
|
Widget_Data *wd;
|
|
|
|
|
|
|
|
if (part && strcmp(part, "icon")) return NULL;
|
|
|
|
wd = elm_widget_data_get(obj);
|
|
|
|
if (!wd) return NULL;
|
|
|
|
return wd->icon;
|
|
|
|
}
|
|
|
|
|
|
|
|
static Evas_Object *
|
|
|
|
_content_unset_hook(Evas_Object *obj, const char *part)
|
|
|
|
{
|
|
|
|
ELM_CHECK_WIDTYPE(obj, widtype) NULL;
|
|
|
|
Widget_Data *wd;
|
|
|
|
|
|
|
|
if (part && strcmp(part, "icon")) return NULL;
|
|
|
|
wd = elm_widget_data_get(obj);
|
|
|
|
if (!wd) return NULL;
|
|
|
|
if (!wd->icon) return NULL;
|
|
|
|
Evas_Object *icon = wd->icon;
|
|
|
|
elm_widget_sub_object_del(obj, wd->icon);
|
|
|
|
edje_object_part_unswallow(wd->btn, icon);
|
|
|
|
return icon;
|
2011-10-24 18:23:25 -07:00
|
|
|
}
|
|
|
|
|
2008-09-29 23:58:56 -07:00
|
|
|
static void
|
2012-05-02 18:19:05 -07:00
|
|
|
_sizing_eval(Evas_Object *obj)
|
2008-09-29 23:58:56 -07:00
|
|
|
{
|
2012-05-02 18:19:05 -07:00
|
|
|
Widget_Data *wd = elm_widget_data_get(obj);
|
2010-12-21 01:32:50 -08:00
|
|
|
Evas_Coord minw = -1, minh = -1;
|
2009-07-06 23:46:51 -07:00
|
|
|
|
2012-05-02 18:19:05 -07:00
|
|
|
if (!wd) return;
|
|
|
|
if (wd->delete_me) return;
|
2009-02-11 03:49:43 -08:00
|
|
|
elm_coords_finger_size_adjust(1, &minw, 1, &minh);
|
2012-05-02 18:19:05 -07:00
|
|
|
edje_object_size_min_restricted_calc(wd->btn, &minw, &minh, minw, minh);
|
2009-02-11 03:49:43 -08:00
|
|
|
elm_coords_finger_size_adjust(1, &minw, 1, &minh);
|
2008-10-06 18:23:49 -07:00
|
|
|
evas_object_size_hint_min_set(obj, minw, minh);
|
2008-09-29 23:58:56 -07:00
|
|
|
}
|
|
|
|
|
2012-05-02 18:19:05 -07:00
|
|
|
static void
|
|
|
|
_changed_size_hints(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
|
2008-09-29 23:58:56 -07:00
|
|
|
{
|
2012-05-02 18:19:05 -07:00
|
|
|
Widget_Data *wd = elm_widget_data_get(data);
|
|
|
|
if (!wd) return;
|
|
|
|
if (obj != wd->icon) return;
|
|
|
|
_sizing_eval(data);
|
|
|
|
}
|
2008-10-06 23:55:11 -07:00
|
|
|
|
2012-05-02 18:19:05 -07:00
|
|
|
static void
|
|
|
|
_sub_del(void *data __UNUSED__, Evas_Object *obj, void *event_info)
|
|
|
|
{
|
|
|
|
Widget_Data *wd = elm_widget_data_get(obj);
|
|
|
|
Evas_Object *sub = event_info;
|
|
|
|
if (!wd) return;
|
|
|
|
if (sub == wd->icon)
|
|
|
|
{
|
|
|
|
edje_object_signal_emit(wd->btn, "elm,state,icon,hidden", "elm");
|
|
|
|
evas_object_event_callback_del_full(sub, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
|
|
|
|
_changed_size_hints, obj);
|
|
|
|
wd->icon = NULL;
|
|
|
|
edje_object_message_signal_process(wd->btn);
|
|
|
|
_sizing_eval(obj);
|
|
|
|
}
|
|
|
|
}
|
2012-05-02 09:58:26 -07:00
|
|
|
|
2012-05-02 18:19:05 -07:00
|
|
|
static void
|
|
|
|
_activate(Evas_Object *obj)
|
|
|
|
{
|
|
|
|
Widget_Data *wd = elm_widget_data_get(obj);
|
|
|
|
if (!wd) return;
|
|
|
|
if (wd->timer)
|
|
|
|
{
|
|
|
|
ecore_timer_del(wd->timer);
|
|
|
|
wd->timer = NULL;
|
|
|
|
}
|
|
|
|
wd->repeating = EINA_FALSE;
|
|
|
|
if ((_elm_config->access_mode == ELM_ACCESS_MODE_OFF) ||
|
|
|
|
(_elm_access_2nd_click_timeout(obj)))
|
|
|
|
{
|
|
|
|
if (_elm_config->access_mode != ELM_ACCESS_MODE_OFF)
|
|
|
|
_elm_access_say(E_("Clicked"));
|
|
|
|
if (!elm_widget_disabled_get(obj) &&
|
|
|
|
!evas_object_freeze_events_get(obj))
|
|
|
|
evas_object_smart_callback_call(obj, SIG_CLICKED, NULL);
|
|
|
|
}
|
|
|
|
}
|
2010-09-22 10:45:43 -07:00
|
|
|
|
2012-05-02 18:19:05 -07:00
|
|
|
static void
|
|
|
|
_activate_hook(Evas_Object *obj)
|
|
|
|
{
|
2010-09-22 10:45:43 -07:00
|
|
|
_activate(obj);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-05-02 18:19:05 -07:00
|
|
|
_signal_clicked(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
|
2010-09-22 10:45:43 -07:00
|
|
|
{
|
|
|
|
_activate(data);
|
2010-01-23 17:53:37 -08:00
|
|
|
}
|
|
|
|
|
2010-06-25 02:58:14 -07:00
|
|
|
static Eina_Bool
|
2010-01-23 17:53:37 -08:00
|
|
|
_autorepeat_send(void *data)
|
|
|
|
{
|
2012-05-02 18:19:05 -07:00
|
|
|
Widget_Data *wd = elm_widget_data_get(data);
|
|
|
|
if (!wd) return ECORE_CALLBACK_CANCEL;
|
2010-01-23 17:53:37 -08:00
|
|
|
|
Proxy Elementary widget signals to Edje.
Add support to automatic proxy events from Elementary to Edje using
callbacks described with Evas_Smart_Cb_Description and set to
Evas_Smart_Class or per-instance with
evas_object_smart_callbacks_descriptions_set().
Right now elm_widget is not subclassable, so there is no way to define
class signals, just instance signals.
Just doing it for button, lots of widgets to do... If you can help,
please follow the process:
* see example at src/lib/elm_button.c, copy it.
* read your widget documentation at Elementary.h
* grep for evas_object_smart_callback_call(), see if they are all
documented in Elementary.h, or if there are some missing. Fix Elementary.h
* paste and change based on fixed Elementary.h My recommendation is
to create "static const char []" variables and replace all
evas_object_smart_callback_call() with that, to force sync.
With callback descriptions pre-defined and using the same pointer with
a custom variation evas_object_smart_callback_call_ptr() we may later
optimize signal calling heavily, removing the requirement to call
eina_stringshare_add()/eina_stringshare_del() and also not mixing all
the callbacks in teh same list, instead having an array for defined
signals, and a list from there. These optimizations are not in, but
they are easily added later without breaking the API/ABI.
SVN revision: 47461
2010-03-25 17:58:14 -07:00
|
|
|
evas_object_smart_callback_call(data, SIG_REPEATED, NULL);
|
2012-05-02 18:19:05 -07:00
|
|
|
if (!wd->repeating)
|
2010-04-08 08:15:22 -07:00
|
|
|
{
|
2012-05-02 18:19:05 -07:00
|
|
|
wd->timer = NULL;
|
2011-02-27 14:59:12 -08:00
|
|
|
return ECORE_CALLBACK_CANCEL;
|
2010-04-08 08:15:22 -07:00
|
|
|
}
|
2010-01-23 17:53:37 -08:00
|
|
|
|
|
|
|
return ECORE_CALLBACK_RENEW;
|
|
|
|
}
|
|
|
|
|
2010-06-25 02:58:14 -07:00
|
|
|
static Eina_Bool
|
2010-01-23 17:53:37 -08:00
|
|
|
_autorepeat_initial_send(void *data)
|
|
|
|
{
|
2012-05-02 18:19:05 -07:00
|
|
|
Widget_Data *wd = elm_widget_data_get(data);
|
|
|
|
if (!wd) return ECORE_CALLBACK_CANCEL;
|
2010-01-23 17:53:37 -08:00
|
|
|
|
2012-05-02 18:19:05 -07:00
|
|
|
if (wd->timer) ecore_timer_del(wd->timer);
|
|
|
|
wd->repeating = EINA_TRUE;
|
2010-01-23 17:53:37 -08:00
|
|
|
_autorepeat_send(data);
|
2012-05-02 18:19:05 -07:00
|
|
|
wd->timer = ecore_timer_add(wd->ar_interval, _autorepeat_send, data);
|
2010-01-23 17:53:37 -08:00
|
|
|
|
|
|
|
return ECORE_CALLBACK_CANCEL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-05-02 18:19:05 -07:00
|
|
|
_signal_pressed(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
|
2010-01-23 17:53:37 -08:00
|
|
|
{
|
2012-05-02 18:19:05 -07:00
|
|
|
Widget_Data *wd = elm_widget_data_get(data);
|
|
|
|
if (!wd) return;
|
2010-01-23 17:53:37 -08:00
|
|
|
|
2012-05-02 18:19:05 -07:00
|
|
|
if ((wd->autorepeat) && (!wd->repeating))
|
2010-01-23 17:53:37 -08:00
|
|
|
{
|
2012-05-02 18:19:05 -07:00
|
|
|
if (wd->ar_threshold <= 0.0)
|
|
|
|
_autorepeat_initial_send(data); /* call immediately */
|
2011-02-27 14:59:12 -08:00
|
|
|
else
|
2012-05-02 18:19:05 -07:00
|
|
|
wd->timer = ecore_timer_add(wd->ar_threshold, _autorepeat_initial_send, data);
|
2010-01-23 17:53:37 -08:00
|
|
|
}
|
2011-06-30 16:43:24 -07:00
|
|
|
|
|
|
|
evas_object_smart_callback_call(data, SIG_PRESSED, NULL);
|
2010-01-23 17:53:37 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-05-02 18:19:05 -07:00
|
|
|
_signal_unpressed(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
|
2010-01-23 17:53:37 -08:00
|
|
|
{
|
2012-05-02 18:19:05 -07:00
|
|
|
Widget_Data *wd = elm_widget_data_get(data);
|
|
|
|
if (!wd) return;
|
2010-01-23 17:53:37 -08:00
|
|
|
|
2012-05-02 18:19:05 -07:00
|
|
|
if (wd->timer)
|
2010-01-23 17:53:37 -08:00
|
|
|
{
|
2012-05-02 18:19:05 -07:00
|
|
|
ecore_timer_del(wd->timer);
|
|
|
|
wd->timer = NULL;
|
2010-01-23 17:53:37 -08:00
|
|
|
}
|
2012-05-02 18:19:05 -07:00
|
|
|
wd->repeating = EINA_FALSE;
|
2010-04-08 08:15:22 -07:00
|
|
|
evas_object_smart_callback_call(data, SIG_UNPRESSED, NULL);
|
2008-09-29 23:58:56 -07:00
|
|
|
}
|
|
|
|
|
2012-05-02 18:19:05 -07:00
|
|
|
static void
|
|
|
|
_elm_button_label_set(Evas_Object *obj, const char *item, const char *label)
|
|
|
|
{
|
|
|
|
ELM_CHECK_WIDTYPE(obj, widtype);
|
|
|
|
Widget_Data *wd = elm_widget_data_get(obj);
|
|
|
|
if (item && strcmp(item, "default")) return;
|
|
|
|
if (!wd) return;
|
|
|
|
eina_stringshare_replace(&wd->label, label);
|
|
|
|
if (label)
|
|
|
|
edje_object_signal_emit(wd->btn, "elm,state,text,visible", "elm");
|
|
|
|
else
|
|
|
|
edje_object_signal_emit(wd->btn, "elm,state,text,hidden", "elm");
|
|
|
|
edje_object_message_signal_process(wd->btn);
|
|
|
|
edje_object_part_text_escaped_set(wd->btn, "elm.text", label);
|
|
|
|
_sizing_eval(obj);
|
|
|
|
}
|
|
|
|
|
|
|
|
static const char *
|
|
|
|
_elm_button_label_get(const Evas_Object *obj, const char *item)
|
|
|
|
{
|
|
|
|
ELM_CHECK_WIDTYPE(obj, widtype) NULL;
|
|
|
|
Widget_Data *wd = elm_widget_data_get(obj);
|
|
|
|
if (item && strcmp(item, "default")) return NULL;
|
|
|
|
if (!wd) return NULL;
|
|
|
|
return wd->label;
|
|
|
|
}
|
|
|
|
|
2011-08-19 04:07:42 -07:00
|
|
|
static char *
|
2012-05-02 18:19:05 -07:00
|
|
|
_access_info_cb(void *data __UNUSED__, Evas_Object *obj, Elm_Widget_Item *item __UNUSED__)
|
2011-08-19 04:07:42 -07:00
|
|
|
{
|
2011-08-25 19:02:15 -07:00
|
|
|
const char *txt = elm_widget_access_info_get(obj);
|
2012-05-02 18:19:05 -07:00
|
|
|
if (!txt) txt = _elm_button_label_get(obj, NULL);
|
2011-08-19 04:07:42 -07:00
|
|
|
if (txt) return strdup(txt);
|
2011-08-25 19:02:15 -07:00
|
|
|
return NULL;
|
2011-08-19 04:07:42 -07:00
|
|
|
}
|
|
|
|
|
2011-08-19 04:20:45 -07:00
|
|
|
static char *
|
2012-05-02 18:19:05 -07:00
|
|
|
_access_state_cb(void *data __UNUSED__, Evas_Object *obj, Elm_Widget_Item *item __UNUSED__)
|
2011-08-19 04:20:45 -07:00
|
|
|
{
|
|
|
|
if (elm_widget_disabled_get(obj))
|
2011-08-25 19:02:15 -07:00
|
|
|
return strdup(E_("State: Disabled"));
|
2011-08-19 04:20:45 -07:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2008-10-06 18:23:49 -07:00
|
|
|
EAPI Evas_Object *
|
|
|
|
elm_button_add(Evas_Object *parent)
|
2008-09-29 23:58:56 -07:00
|
|
|
{
|
2012-05-02 09:58:26 -07:00
|
|
|
Evas_Object *obj;
|
2012-05-02 18:19:05 -07:00
|
|
|
Evas *e;
|
|
|
|
Widget_Data *wd;
|
|
|
|
|
|
|
|
ELM_WIDGET_STANDARD_SETUP(wd, Widget_Data, parent, e, obj, NULL);
|
|
|
|
|
|
|
|
ELM_SET_WIDTYPE(widtype, "button");
|
|
|
|
elm_widget_type_set(obj, "button");
|
|
|
|
elm_widget_sub_object_add(parent, obj);
|
|
|
|
elm_widget_on_focus_hook_set(obj, _on_focus_hook, NULL);
|
|
|
|
elm_widget_data_set(obj, wd);
|
|
|
|
elm_widget_del_hook_set(obj, _del_hook);
|
|
|
|
elm_widget_del_pre_hook_set(obj, _del_pre_hook);
|
|
|
|
elm_widget_theme_hook_set(obj, _theme_hook);
|
|
|
|
elm_widget_disable_hook_set(obj, _disable_hook);
|
|
|
|
elm_widget_can_focus_set(obj, EINA_TRUE);
|
|
|
|
elm_widget_activate_hook_set(obj, _activate_hook);
|
|
|
|
elm_widget_event_hook_set(obj, _event_hook);
|
|
|
|
elm_widget_signal_emit_hook_set(obj, _signal_emit_hook);
|
|
|
|
elm_widget_signal_callback_add_hook_set(obj, _signal_callback_add_hook);
|
|
|
|
elm_widget_signal_callback_del_hook_set(obj, _signal_callback_del_hook);
|
|
|
|
elm_widget_text_set_hook_set(obj, _elm_button_label_set);
|
|
|
|
elm_widget_text_get_hook_set(obj, _elm_button_label_get);
|
|
|
|
elm_widget_content_set_hook_set(obj, _content_set_hook);
|
|
|
|
elm_widget_content_get_hook_set(obj, _content_get_hook);
|
|
|
|
elm_widget_content_unset_hook_set(obj, _content_unset_hook);
|
|
|
|
|
|
|
|
wd->btn = edje_object_add(e);
|
|
|
|
_elm_theme_object_set(obj, wd->btn, "button", "base", "default");
|
|
|
|
edje_object_signal_callback_add(wd->btn, "elm,action,click", "",
|
|
|
|
_signal_clicked, obj);
|
|
|
|
edje_object_signal_callback_add(wd->btn, "elm,action,press", "",
|
|
|
|
_signal_pressed, obj);
|
|
|
|
edje_object_signal_callback_add(wd->btn, "elm,action,unpress", "",
|
|
|
|
_signal_unpressed, obj);
|
|
|
|
elm_widget_resize_object_set(obj, wd->btn);
|
|
|
|
|
|
|
|
evas_object_smart_callback_add(obj, "sub-object-del", _sub_del, obj);
|
|
|
|
|
|
|
|
_theme_hook(obj);
|
|
|
|
|
|
|
|
// TODO: convert Elementary to subclassing of Evas_Smart_Class
|
|
|
|
// TODO: and save some bytes, making descriptions per-class and not instance!
|
|
|
|
evas_object_smart_callbacks_descriptions_set(obj, _signals);
|
|
|
|
|
|
|
|
_elm_access_object_register(obj, wd->btn);
|
|
|
|
_elm_access_text_set(_elm_access_object_get(obj),
|
|
|
|
ELM_ACCESS_TYPE, E_("Button"));
|
|
|
|
_elm_access_callback_set(_elm_access_object_get(obj),
|
|
|
|
ELM_ACCESS_INFO, _access_info_cb, obj);
|
|
|
|
_elm_access_callback_set(_elm_access_object_get(obj),
|
|
|
|
ELM_ACCESS_STATE, _access_state_cb, obj);
|
2008-10-06 18:23:49 -07:00
|
|
|
return obj;
|
2008-09-29 23:58:56 -07:00
|
|
|
}
|
|
|
|
|
2010-01-23 17:53:37 -08:00
|
|
|
EAPI void
|
2012-05-02 18:19:05 -07:00
|
|
|
elm_button_autorepeat_set(Evas_Object *obj, Eina_Bool on)
|
2010-01-23 17:53:37 -08:00
|
|
|
{
|
2012-05-02 18:19:05 -07:00
|
|
|
ELM_CHECK_WIDTYPE(obj, widtype);
|
|
|
|
Widget_Data *wd = elm_widget_data_get(obj);
|
|
|
|
if (!wd) return;
|
|
|
|
if (wd->timer)
|
2010-03-08 23:30:48 -08:00
|
|
|
{
|
2012-05-02 18:19:05 -07:00
|
|
|
ecore_timer_del(wd->timer);
|
|
|
|
wd->timer = NULL;
|
2010-03-08 23:30:48 -08:00
|
|
|
}
|
2012-05-02 18:19:05 -07:00
|
|
|
wd->autorepeat = on;
|
|
|
|
wd->repeating = EINA_FALSE;
|
2010-01-23 17:53:37 -08:00
|
|
|
}
|
|
|
|
|
2010-10-27 07:38:45 -07:00
|
|
|
EAPI Eina_Bool
|
|
|
|
elm_button_autorepeat_get(const Evas_Object *obj)
|
|
|
|
{
|
2012-05-02 18:19:05 -07:00
|
|
|
ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
|
|
|
|
Widget_Data *wd = elm_widget_data_get(obj);
|
|
|
|
if (!wd) return EINA_FALSE;
|
|
|
|
return wd->autorepeat;
|
2010-10-27 07:38:45 -07:00
|
|
|
}
|
|
|
|
|
2010-01-23 17:53:37 -08:00
|
|
|
EAPI void
|
2012-05-02 18:19:05 -07:00
|
|
|
elm_button_autorepeat_initial_timeout_set(Evas_Object *obj, double t)
|
2010-01-23 17:53:37 -08:00
|
|
|
{
|
2012-05-02 18:19:05 -07:00
|
|
|
ELM_CHECK_WIDTYPE(obj, widtype);
|
|
|
|
Widget_Data *wd = elm_widget_data_get(obj);
|
|
|
|
if (!wd) return;
|
|
|
|
if (wd->ar_threshold == t) return;
|
|
|
|
if (wd->timer)
|
2010-01-23 17:53:37 -08:00
|
|
|
{
|
2012-05-02 18:19:05 -07:00
|
|
|
ecore_timer_del(wd->timer);
|
|
|
|
wd->timer = NULL;
|
2010-01-23 17:53:37 -08:00
|
|
|
}
|
2012-05-02 18:19:05 -07:00
|
|
|
wd->ar_threshold = t;
|
2010-01-23 17:53:37 -08:00
|
|
|
}
|
|
|
|
|
2010-10-27 07:38:45 -07:00
|
|
|
EAPI double
|
|
|
|
elm_button_autorepeat_initial_timeout_get(const Evas_Object *obj)
|
|
|
|
{
|
2012-05-02 18:19:05 -07:00
|
|
|
ELM_CHECK_WIDTYPE(obj, widtype) 0.0;
|
|
|
|
Widget_Data *wd = elm_widget_data_get(obj);
|
|
|
|
if (!wd) return 0.0;
|
|
|
|
return wd->ar_threshold;
|
2010-10-27 07:38:45 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
EAPI void
|
2012-05-02 18:19:05 -07:00
|
|
|
elm_button_autorepeat_gap_timeout_set(Evas_Object *obj, double t)
|
2010-01-23 17:53:37 -08:00
|
|
|
{
|
2012-05-02 18:19:05 -07:00
|
|
|
ELM_CHECK_WIDTYPE(obj, widtype);
|
|
|
|
Widget_Data *wd = elm_widget_data_get(obj);
|
|
|
|
if (!wd) return;
|
|
|
|
if (wd->ar_interval == t) return;
|
2010-04-08 08:15:22 -07:00
|
|
|
|
2012-05-02 18:19:05 -07:00
|
|
|
wd->ar_interval = t;
|
|
|
|
if ((wd->repeating) && (wd->timer)) ecore_timer_interval_set(wd->timer, t);
|
2010-01-23 17:53:37 -08:00
|
|
|
}
|
2010-10-27 07:38:45 -07:00
|
|
|
|
|
|
|
EAPI double
|
|
|
|
elm_button_autorepeat_gap_timeout_get(const Evas_Object *obj)
|
|
|
|
{
|
2012-05-02 18:19:05 -07:00
|
|
|
ELM_CHECK_WIDTYPE(obj, widtype) 0.0;
|
|
|
|
Widget_Data *wd = elm_widget_data_get(obj);
|
|
|
|
if (!wd) return 0.0;
|
|
|
|
return wd->ar_interval;
|
2010-10-27 07:38:45 -07:00
|
|
|
}
|