Send signal informing changes in icon state.

Inform that the item was disabled, highlighted or selected.
If a toolbar icon is an edje it can receive this signal and change the
icon image to a disabled image.

By: Otavio Pontes <otavio@profusion.mobi>



SVN revision: 54006
This commit is contained in:
Bruno Dilly 2010-10-29 18:42:01 +00:00
parent 1d23d0ae54
commit f94f6fb3ee
5 changed files with 94 additions and 4 deletions

View File

@ -10377,6 +10377,16 @@ collections {
source: "event";
action: SIGNAL_EMIT "elm,action,click" "elm";
}
program { name: "mouse,in";
signal: "mouse,in";
source: "event";
action: SIGNAL_EMIT "elm,mouse,in" "elm";
}
program { name: "mouse,out";
signal: "mouse,out";
source: "event";
action: SIGNAL_EMIT "elm,mouse,out" "elm";
}
program { name: "disable";
signal: "elm,state,disabled";
source: "elm";

View File

@ -63,6 +63,40 @@ _theme_hook(Evas_Object *obj)
_sizing_eval(obj);
}
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;
Evas_Object *icon_edje;
icon_edje = _els_smart_icon_edje_get(wd->img);
if (!icon_edje) return;
edje_object_signal_emit(icon_edje, emission, source);
}
static void
_signal_callback_add_hook(Evas_Object *obj, const char *emission, const char *source, void (*func_cb) (void *data, Evas_Object *o, const char *emission, const char *source), void *data)
{
Widget_Data *wd = elm_widget_data_get(obj);
if (!wd) return;
Evas_Object *icon_edje;
icon_edje = _els_smart_icon_edje_get(wd->img);
if (!icon_edje) return;
edje_object_signal_callback_add(icon_edje, emission, source, func_cb, data);
}
static void *
_signal_callback_del_hook(Evas_Object *obj, const char *emission, const char *source, void (*func_cb) (void *data, Evas_Object *o, const char *emission, const char *source))
{
Widget_Data *wd = elm_widget_data_get(obj);
if (!wd) return NULL;
Evas_Object *icon_edje;
icon_edje = _els_smart_icon_edje_get(wd->img);
if (!icon_edje) return NULL;
return edje_object_signal_callback_del(icon_edje, emission, source,
func_cb);
}
static void
_sizing_eval(Evas_Object *obj)
{
@ -142,6 +176,9 @@ elm_icon_add(Evas_Object *parent)
elm_widget_data_set(obj, wd);
elm_widget_del_hook_set(obj, _del_hook);
elm_widget_theme_hook_set(obj, _theme_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);
wd->lookup_order = ELM_ICON_LOOKUP_FDO_THEME;
wd->img = _els_smart_icon_add(e);

View File

@ -119,6 +119,7 @@ _item_select(Elm_Toolbar_Item *it)
it->selected = EINA_TRUE;
wd->selected_item = it;
edje_object_signal_emit(it->base.view, "elm,state,selected", "elm");
elm_widget_signal_emit(it->icon, "elm,state,selected", "elm");
_item_show(it);
obj2 = it->base.widget;
if(it->menu)
@ -173,9 +174,15 @@ _item_disable(Elm_Toolbar_Item *it, Eina_Bool disabled)
if (it->disabled == disabled) return;
it->disabled = disabled;
if (it->disabled)
edje_object_signal_emit(it->base.view, "elm,state,disabled", "elm");
{
edje_object_signal_emit(it->base.view, "elm,state,disabled", "elm");
elm_widget_signal_emit(it->icon, "elm,state,disabled", "elm");
}
else
edje_object_signal_emit(it->base.view, "elm,state,enabled", "elm");
{
edje_object_signal_emit(it->base.view, "elm,state,enabled", "elm");
elm_widget_signal_emit(it->icon, "elm,state,enabled", "elm");
}
}
static void
@ -228,9 +235,15 @@ _theme_hook(Evas_Object *obj)
if (!it->separator)
{
if (it->selected)
edje_object_signal_emit(view, "elm,state,selected", "elm");
{
edje_object_signal_emit(view, "elm,state,selected", "elm");
elm_widget_signal_emit(it->icon, "elm,state,selected", "elm");
}
if (it->disabled)
edje_object_signal_emit(view, "elm,state,disabled", "elm");
{
edje_object_signal_emit(view, "elm,state,disabled", "elm");
elm_widget_signal_emit(it->icon, "elm,state,disabled", "elm");
}
_elm_theme_object_set(obj, view, "toolbar", "item", style);
if (it->icon)
{
@ -470,6 +483,22 @@ _select(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__
_item_select(data);
}
static void
_mouse_in(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
{
Elm_Toolbar_Item *it = data;
edje_object_signal_emit(it->base.view, "elm,state,highlighted", "elm");
elm_widget_signal_emit(it->icon, "elm,state,highlighted", "elm");
}
static void
_mouse_out(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
{
Elm_Toolbar_Item *it = data;
edje_object_signal_emit(it->base.view, "elm,state,unhighlighted", "elm");
elm_widget_signal_emit(it->icon, "elm,state,unhighlighted", "elm");
}
static void
_layout(Evas_Object *o, Evas_Object_Box_Data *priv, void *data)
{
@ -517,6 +546,10 @@ _item_new(Evas_Object *obj, const char *icon, const char *label, Evas_Smart_Cb f
elm_widget_style_get(obj));
edje_object_signal_callback_add(it->base.view, "elm,action,click", "elm",
_select, it);
edje_object_signal_callback_add(it->base.view, "elm,mouse,in", "elm",
_mouse_in, it);
edje_object_signal_callback_add(it->base.view, "elm,mouse,out", "elm",
_mouse_out, it);
elm_widget_sub_object_add(obj, it->base.view);
if (it->icon)
{

View File

@ -405,6 +405,15 @@ _els_smart_icon_edit_get(const Evas_Object *obj)
return sd->edit;
}
Evas_Object *
_els_smart_icon_edje_get(Evas_Object *obj)
{
Smart_Data *sd = evas_object_smart_data_get(obj);
if (!sd) return NULL;
if (!sd->edje) return NULL;
return sd->obj;
}
/* local subsystem globals */
static void
_smart_reconfigure(Smart_Data *sd)

View File

@ -20,3 +20,4 @@ void _els_smart_icon_orient_set (Evas_Object *obj, Elm_Image_Orien
Elm_Image_Orient _els_smart_icon_orient_get (const Evas_Object *obj);
void _els_smart_icon_edit_set (Evas_Object *obj, Eina_Bool, Evas_Object *parent);
Eina_Bool _els_smart_icon_edit_get (const Evas_Object *obj);
Evas_Object *_els_smart_icon_edje_get(Evas_Object *obj);