[Elm] Not very fancy solution, but... now hover won't

ruin elementary_config
when used by elm_menu.



SVN revision: 70673
This commit is contained in:
Gustavo Lima Chaves 2012-05-02 19:25:56 +00:00
parent 7f2ba3a399
commit b9b70f8d3a
1 changed files with 77 additions and 59 deletions

View File

@ -54,6 +54,8 @@ struct _Elm_Hover_Smart_Data
Content_Info *smt_sub; /* 'smart placement' sub object */
Content_Info subs[sizeof(_content_aliases) /
sizeof(_content_aliases[0]) - 1];
Eina_Bool on_del : 1;
};
static const char SIG_CLICKED[] = "clicked";
@ -95,6 +97,71 @@ EVAS_SMART_SUBCLASS_NEW
(HOVER_SMART_NAME, _elm_hover, Elm_Layout_Smart_Class,
Elm_Layout_Smart_Class, elm_layout_smart_class_get, _smart_callbacks);
static void
_parent_move_cb(void *data,
Evas *e __UNUSED__,
Evas_Object *obj __UNUSED__,
void *event_info __UNUSED__)
{
elm_layout_sizing_eval(data);
}
static void
_parent_resize_cb(void *data,
Evas *e __UNUSED__,
Evas_Object *obj __UNUSED__,
void *event_info __UNUSED__)
{
elm_layout_sizing_eval(data);
}
static void
_parent_show_cb(void *data __UNUSED__,
Evas *e __UNUSED__,
Evas_Object *obj __UNUSED__,
void *event_info __UNUSED__)
{
}
static void
_parent_hide_cb(void *data,
Evas *e __UNUSED__,
Evas_Object *obj __UNUSED__,
void *event_info __UNUSED__)
{
evas_object_hide(data);
}
static void
_parent_del_cb(void *data,
Evas *e __UNUSED__,
Evas_Object *obj __UNUSED__,
void *event_info __UNUSED__)
{
elm_hover_parent_set(data, NULL);
elm_layout_sizing_eval(data);
}
static void
_elm_hover_parent_detach(Evas_Object *obj)
{
ELM_HOVER_DATA_GET(obj, sd);
if (sd->parent)
{
evas_object_event_callback_del_full
(sd->parent, EVAS_CALLBACK_MOVE, _parent_move_cb, obj);
evas_object_event_callback_del_full
(sd->parent, EVAS_CALLBACK_RESIZE, _parent_resize_cb, obj);
evas_object_event_callback_del_full
(sd->parent, EVAS_CALLBACK_SHOW, _parent_show_cb, obj);
evas_object_event_callback_del_full
(sd->parent, EVAS_CALLBACK_HIDE, _parent_hide_cb, obj);
evas_object_event_callback_del_full
(sd->parent, EVAS_CALLBACK_DEL, _parent_del_cb, obj);
}
}
static void
_elm_hover_left_space_calc(Elm_Hover_Smart_Data *sd,
Evas_Coord *spc_l,
@ -277,6 +344,8 @@ _elm_hover_smart_sizing_eval(Evas_Object *obj)
ELM_HOVER_DATA_GET(obj, sd);
if (sd->on_del) return;
if (sd->parent) evas_object_geometry_get(sd->parent, &x, &y, &w, &h);
evas_object_geometry_get(obj, &x2, &y2, &w2, &h2);
@ -491,51 +560,6 @@ _hov_dismiss_cb(void *data,
evas_object_smart_callback_call(data, SIG_CLICKED, NULL);
}
static void
_parent_move_cb(void *data,
Evas *e __UNUSED__,
Evas_Object *obj __UNUSED__,
void *event_info __UNUSED__)
{
elm_layout_sizing_eval(data);
}
static void
_parent_resize_cb(void *data,
Evas *e __UNUSED__,
Evas_Object *obj __UNUSED__,
void *event_info __UNUSED__)
{
elm_layout_sizing_eval(data);
}
static void
_parent_show_cb(void *data __UNUSED__,
Evas *e __UNUSED__,
Evas_Object *obj __UNUSED__,
void *event_info __UNUSED__)
{
}
static void
_parent_hide_cb(void *data,
Evas *e __UNUSED__,
Evas_Object *obj __UNUSED__,
void *event_info __UNUSED__)
{
evas_object_hide(data);
}
static void
_parent_del_cb(void *data,
Evas *e __UNUSED__,
Evas_Object *obj __UNUSED__,
void *event_info __UNUSED__)
{
elm_hover_parent_set(data, NULL);
elm_layout_sizing_eval(data);
}
static void
_elm_hover_smart_add(Evas_Object *obj)
{
@ -569,11 +593,17 @@ _elm_hover_smart_add(Evas_Object *obj)
static void
_elm_hover_smart_del(Evas_Object *obj)
{
ELM_HOVER_DATA_GET(obj, sd);
sd->on_del = EINA_TRUE;
if (evas_object_visible_get(obj))
evas_object_smart_callback_call(obj, SIG_CLICKED, NULL);
elm_hover_target_set(obj, NULL);
elm_hover_parent_set(obj, NULL);
_elm_hover_parent_detach(obj);
sd->parent = NULL;
ELM_WIDGET_CLASS(_elm_hover_parent_sc)->base.del(obj);
}
@ -709,19 +739,7 @@ elm_hover_parent_set(Evas_Object *obj,
ELM_HOVER_CHECK(obj);
ELM_HOVER_DATA_GET(obj, sd);
if (sd->parent)
{
evas_object_event_callback_del_full
(sd->parent, EVAS_CALLBACK_MOVE, _parent_move_cb, obj);
evas_object_event_callback_del_full
(sd->parent, EVAS_CALLBACK_RESIZE, _parent_resize_cb, obj);
evas_object_event_callback_del_full
(sd->parent, EVAS_CALLBACK_SHOW, _parent_show_cb, obj);
evas_object_event_callback_del_full
(sd->parent, EVAS_CALLBACK_HIDE, _parent_hide_cb, obj);
evas_object_event_callback_del_full
(sd->parent, EVAS_CALLBACK_DEL, _parent_del_cb, obj);
}
_elm_hover_parent_detach(obj);
sd->parent = parent;
if (sd->parent)