2013-04-25 22:13:00 -07:00
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
# include "elementary_config.h"
|
|
|
|
#endif
|
|
|
|
|
2016-04-11 09:51:15 -07:00
|
|
|
#define ELM_WIDGET_PROTECTED
|
2018-04-03 04:27:30 -07:00
|
|
|
#define EFL_ACCESS_OBJECT_PROTECTED
|
2017-11-15 18:31:26 -08:00
|
|
|
#define EFL_ACCESS_WIDGET_ACTION_PROTECTED
|
2016-04-20 05:07:38 -07:00
|
|
|
#define ELM_LAYOUT_PROTECTED
|
2018-05-03 16:34:17 -07:00
|
|
|
#define EFL_PART_PROTECTED
|
2014-10-17 08:56:11 -07:00
|
|
|
|
2008-10-07 23:38:20 -07:00
|
|
|
#include <Elementary.h>
|
2013-04-25 22:13:00 -07:00
|
|
|
|
2008-10-07 23:38:20 -07:00
|
|
|
#include "elm_priv.h"
|
2012-07-31 15:05:43 -07:00
|
|
|
#include "elm_widget_hover.h"
|
2008-10-07 23:38:20 -07:00
|
|
|
|
edje/elm: Rename _internal_ to _part_ (EO)
In Edje and Elementary, we have part objects, which are what is returned
by the interface efl_part(). Those objects can't be of an opaque type as
this doesn't work nicely with strongly typed languages such as C++ or
C#. In JS, Lua, C the types are weak and mostly runtime-based so it
doesn't matter much.
As a consequence, the documentation and the types need to look nice in
this EO API. Thus, we remove the abusive term "internal" and explicitly
call all those classes "part" something.
Eventually we want the types to be declared in the EO file so bindings
(C#, C++, ...) can generate the proper access methods, returning the
best possible types.
Note that right now a few of those part types are used in the legacy API
but don't actually need to be exposed externally.
This is kind of a mega commit that does all the renaming at once, but
it's really just a big sed operation. The power of good IDEs :)
Ref T5315
Ref T5306
2017-09-12 21:29:25 -07:00
|
|
|
#include "elm_hover_part.eo.h"
|
2016-05-24 04:40:18 -07:00
|
|
|
#include "elm_part_helper.h"
|
|
|
|
|
2014-06-03 03:35:28 -07:00
|
|
|
#define MY_CLASS ELM_HOVER_CLASS
|
2017-07-27 23:35:10 -07:00
|
|
|
#define MY_CLASS_PFX elm_hover
|
2012-11-25 22:32:53 -08:00
|
|
|
|
2013-11-07 03:44:22 -08:00
|
|
|
#define MY_CLASS_NAME "Elm_Hover"
|
|
|
|
#define MY_CLASS_NAME_LEGACY "elm_hover"
|
2010-10-19 13:20:28 -07:00
|
|
|
|
2016-06-02 17:20:16 -07:00
|
|
|
#define ELM_HOVER_PARTS_FOREACH \
|
|
|
|
for (unsigned int i = 0; i < sizeof(sd->subs) / sizeof(sd->subs[0]); i++)
|
2012-05-03 15:42:49 -07:00
|
|
|
|
|
|
|
#define _HOV_LEFT (&(sd->subs[0]))
|
|
|
|
#define _HOV_TOP_LEFT (&(sd->subs[1]))
|
|
|
|
#define _HOV_TOP (&(sd->subs[2]))
|
|
|
|
#define _HOV_TOP_RIGHT (&(sd->subs[2]))
|
|
|
|
#define _HOV_RIGHT (&(sd->subs[4]))
|
|
|
|
#define _HOV_BOTTOM_RIGHT (&(sd->subs[5]))
|
|
|
|
#define _HOV_BOTTOM (&(sd->subs[6]))
|
|
|
|
#define _HOV_BOTTOM_LEFT (&(sd->subs[7]))
|
|
|
|
#define _HOV_MIDDLE (&(sd->subs[8]))
|
|
|
|
|
2012-07-31 15:05:43 -07:00
|
|
|
const Elm_Layout_Part_Alias_Description _content_aliases[] =
|
2012-05-03 15:42:49 -07:00
|
|
|
{
|
|
|
|
{"left", "elm.swallow.slot.left"},
|
|
|
|
{"top-left", "elm.swallow.slot.top-left"},
|
|
|
|
{"top", "elm.swallow.slot.top"},
|
|
|
|
{"top-right", "elm.swallow.slot.top-right"},
|
|
|
|
{"right", "elm.swallow.slot.right"},
|
|
|
|
{"bottom-right", "elm.swallow.slot.bottom-right"},
|
|
|
|
{"bottom", "elm.swallow.slot.bottom"},
|
|
|
|
{"bottom-left", "elm.swallow.slot.bottom-left"},
|
|
|
|
{"middle", "elm.swallow.slot.middle"},
|
|
|
|
{NULL, NULL}
|
2010-10-19 13:20:28 -07:00
|
|
|
};
|
|
|
|
|
2017-07-20 20:14:44 -07:00
|
|
|
const Elm_Layout_Part_Alias_Description _content_aliases_main_menu_submenu[] =
|
|
|
|
{
|
|
|
|
{"bottom", "elm.swallow.slot.bottom"},
|
|
|
|
{NULL, NULL}
|
|
|
|
};
|
|
|
|
|
2013-09-21 03:20:52 -07:00
|
|
|
#define ELM_PRIV_HOVER_SIGNALS(cmd) \
|
|
|
|
cmd(SIG_CLICKED, "clicked", "") \
|
2013-09-21 03:28:04 -07:00
|
|
|
cmd(SIG_DISMISSED, "dismissed", "") \
|
2013-09-21 03:20:52 -07:00
|
|
|
cmd(SIG_SMART_LOCATION_CHANGED, "smart,changed", "")
|
|
|
|
|
|
|
|
ELM_PRIV_HOVER_SIGNALS(ELM_PRIV_STATIC_VARIABLE_DECLARE);
|
|
|
|
|
2012-05-03 15:42:49 -07:00
|
|
|
static const Evas_Smart_Cb_Description _smart_callbacks[] = {
|
2013-09-21 03:20:52 -07:00
|
|
|
ELM_PRIV_HOVER_SIGNALS(ELM_PRIV_SMART_CALLBACKS_DESC)
|
2014-02-05 23:18:57 -08:00
|
|
|
{SIG_LAYOUT_FOCUSED, ""}, /**< handled by elm_layout */
|
|
|
|
{SIG_LAYOUT_UNFOCUSED, ""}, /**< handled by elm_layout */
|
2012-05-03 15:42:49 -07:00
|
|
|
{NULL, NULL}
|
2010-10-19 13:20:28 -07:00
|
|
|
};
|
2013-10-18 10:20:34 -07:00
|
|
|
#undef ELM_PRIV_HOVER_SIGNALS
|
2008-10-07 23:38:20 -07:00
|
|
|
|
2012-05-03 15:44:56 -07:00
|
|
|
static void
|
|
|
|
_parent_move_cb(void *data,
|
2014-01-06 06:30:02 -08:00
|
|
|
Evas *e EINA_UNUSED,
|
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
void *event_info EINA_UNUSED)
|
2012-05-03 15:44:56 -07:00
|
|
|
{
|
|
|
|
elm_layout_sizing_eval(data);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_parent_resize_cb(void *data,
|
2014-01-06 06:30:02 -08:00
|
|
|
Evas *e EINA_UNUSED,
|
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
void *event_info EINA_UNUSED)
|
2012-05-03 15:44:56 -07:00
|
|
|
{
|
|
|
|
elm_layout_sizing_eval(data);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2014-01-06 06:30:02 -08:00
|
|
|
_parent_show_cb(void *data EINA_UNUSED,
|
|
|
|
Evas *e EINA_UNUSED,
|
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
void *event_info EINA_UNUSED)
|
2012-05-03 15:44:56 -07:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_parent_hide_cb(void *data,
|
2014-01-06 06:30:02 -08:00
|
|
|
Evas *e EINA_UNUSED,
|
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
void *event_info EINA_UNUSED)
|
2012-05-03 15:44:56 -07:00
|
|
|
{
|
|
|
|
evas_object_hide(data);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_parent_del_cb(void *data,
|
2014-01-06 06:30:02 -08:00
|
|
|
Evas *e EINA_UNUSED,
|
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
void *event_info EINA_UNUSED)
|
2012-05-03 15:44:56 -07:00
|
|
|
{
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-05-02 12:25:56 -07:00
|
|
|
static void
|
2014-03-17 07:48:52 -07:00
|
|
|
_elm_hover_left_space_calc(Elm_Hover_Data *sd,
|
2012-05-03 15:42:49 -07:00
|
|
|
Evas_Coord *spc_l,
|
|
|
|
Evas_Coord *spc_t,
|
|
|
|
Evas_Coord *spc_r,
|
|
|
|
Evas_Coord *spc_b)
|
2010-10-19 13:20:28 -07:00
|
|
|
{
|
|
|
|
Evas_Coord x = 0, y = 0, w = 0, h = 0, x2 = 0, y2 = 0, w2 = 0, h2 = 0;
|
|
|
|
|
2014-04-01 01:29:36 -07:00
|
|
|
if (sd->parent)
|
|
|
|
{
|
|
|
|
evas_object_geometry_get(sd->parent, &x, &y, &w, &h);
|
2016-08-15 06:44:41 -07:00
|
|
|
if (efl_isa(sd->parent, EFL_UI_WIN_CLASS))
|
2014-04-01 01:29:36 -07:00
|
|
|
{
|
|
|
|
x = 0;
|
|
|
|
y = 0;
|
|
|
|
}
|
|
|
|
}
|
2012-05-03 15:42:49 -07:00
|
|
|
if (sd->target) evas_object_geometry_get(sd->target, &x2, &y2, &w2, &h2);
|
2010-10-19 13:20:28 -07:00
|
|
|
|
|
|
|
*spc_l = x2 - x;
|
|
|
|
*spc_r = (x + w) - (x2 + w2);
|
2012-05-03 15:42:49 -07:00
|
|
|
if (*spc_l < 0) *spc_l = 0;
|
|
|
|
if (*spc_r < 0) *spc_r = 0;
|
2010-10-19 13:20:28 -07:00
|
|
|
|
|
|
|
*spc_t = y2 - y;
|
|
|
|
*spc_b = (y + h) - (y2 + h2);
|
2012-05-03 15:42:49 -07:00
|
|
|
if (*spc_t < 0) *spc_t = 0;
|
|
|
|
if (*spc_b < 0) *spc_b = 0;
|
2012-05-02 18:19:05 -07:00
|
|
|
}
|
|
|
|
|
2012-05-03 15:42:49 -07:00
|
|
|
static Content_Info *
|
2014-03-17 07:48:52 -07:00
|
|
|
_elm_hover_smart_content_location_get(Elm_Hover_Data *sd,
|
2012-05-03 15:42:49 -07:00
|
|
|
Evas_Coord spc_l,
|
|
|
|
Evas_Coord spc_t,
|
|
|
|
Evas_Coord spc_r,
|
|
|
|
Evas_Coord spc_b)
|
2010-10-19 13:20:28 -07:00
|
|
|
{
|
|
|
|
Evas_Coord c_w = 0, c_h = 0, mid_w, mid_h;
|
|
|
|
int max;
|
|
|
|
|
2017-09-18 00:22:01 -07:00
|
|
|
evas_object_size_hint_combined_min_get(sd->smt_sub->obj, &c_w, &c_h);
|
2010-10-19 13:20:28 -07:00
|
|
|
mid_w = c_w / 2;
|
|
|
|
mid_h = c_h / 2;
|
|
|
|
|
2012-05-03 15:42:49 -07:00
|
|
|
if (spc_l > spc_r) goto left;
|
2010-10-19 13:20:28 -07:00
|
|
|
|
|
|
|
max = MAX(spc_t, spc_r);
|
|
|
|
max = MAX(max, spc_b);
|
|
|
|
|
|
|
|
if (max == spc_t)
|
|
|
|
{
|
2012-05-03 15:42:49 -07:00
|
|
|
if (mid_w > spc_l) return _HOV_TOP_RIGHT;
|
2010-10-19 13:20:28 -07:00
|
|
|
|
|
|
|
return _HOV_TOP;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (max == spc_r)
|
|
|
|
{
|
2012-05-03 15:42:49 -07:00
|
|
|
if (mid_h > spc_t) return _HOV_BOTTOM_RIGHT;
|
2010-10-19 13:20:28 -07:00
|
|
|
else if (mid_h > spc_b)
|
|
|
|
return _HOV_TOP_RIGHT;
|
|
|
|
|
|
|
|
return _HOV_RIGHT;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (mid_h > spc_l)
|
|
|
|
return _HOV_BOTTOM_RIGHT;
|
|
|
|
|
|
|
|
return _HOV_BOTTOM;
|
|
|
|
|
|
|
|
left:
|
|
|
|
max = MAX(spc_t, spc_l);
|
|
|
|
max = MAX(max, spc_b);
|
|
|
|
|
|
|
|
if (max == spc_t)
|
|
|
|
{
|
2012-05-03 15:42:49 -07:00
|
|
|
if (mid_w > spc_r) return _HOV_TOP_LEFT;
|
2010-10-19 13:20:28 -07:00
|
|
|
|
|
|
|
return _HOV_TOP;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (max == spc_l)
|
|
|
|
{
|
2012-05-03 15:42:49 -07:00
|
|
|
if (mid_h > spc_t) return _HOV_BOTTOM_LEFT;
|
2010-10-19 13:20:28 -07:00
|
|
|
else if (mid_h > spc_b)
|
|
|
|
return _HOV_TOP_LEFT;
|
|
|
|
|
|
|
|
return _HOV_LEFT;
|
|
|
|
}
|
|
|
|
|
2012-05-03 15:42:49 -07:00
|
|
|
if (mid_h > spc_r) return _HOV_BOTTOM_LEFT;
|
2010-10-19 13:20:28 -07:00
|
|
|
|
|
|
|
return _HOV_BOTTOM;
|
2008-11-15 05:58:50 -08:00
|
|
|
}
|
|
|
|
|
2008-10-07 23:38:20 -07:00
|
|
|
static void
|
2012-05-03 15:42:49 -07:00
|
|
|
_elm_hover_smt_sub_re_eval(Evas_Object *obj)
|
2008-10-07 23:38:20 -07:00
|
|
|
{
|
2012-05-03 15:42:49 -07:00
|
|
|
Evas_Coord spc_l, spc_r, spc_t, spc_b;
|
|
|
|
Content_Info *prev;
|
2010-10-19 13:20:28 -07:00
|
|
|
Evas_Object *sub;
|
2012-05-03 15:42:49 -07:00
|
|
|
char buf[1024];
|
2012-05-02 09:59:30 -07:00
|
|
|
|
2012-05-03 15:42:49 -07:00
|
|
|
ELM_HOVER_DATA_GET(obj, sd);
|
2012-05-02 09:59:30 -07:00
|
|
|
|
2012-05-03 15:42:49 -07:00
|
|
|
if (!sd->smt_sub) return;
|
|
|
|
prev = sd->smt_sub;
|
|
|
|
|
|
|
|
_elm_hover_left_space_calc(sd, &spc_l, &spc_t, &spc_r, &spc_b);
|
|
|
|
|
|
|
|
sub = sd->smt_sub->obj;
|
|
|
|
|
|
|
|
sd->smt_sub =
|
|
|
|
_elm_hover_smart_content_location_get(sd, spc_l, spc_t, spc_r, spc_b);
|
|
|
|
|
|
|
|
sd->smt_sub->obj = sub;
|
|
|
|
|
|
|
|
if (sd->smt_sub != prev)
|
2016-08-22 15:40:39 -07:00
|
|
|
efl_event_callback_legacy_call
|
2016-03-02 04:10:48 -08:00
|
|
|
(obj, ELM_HOVER_EVENT_SMART_CHANGED, (void *)sd->smt_sub->swallow);
|
2012-05-03 15:42:49 -07:00
|
|
|
|
2017-06-13 03:41:15 -07:00
|
|
|
if (efl_ui_mirrored_get(obj))
|
2012-05-02 18:19:05 -07:00
|
|
|
{
|
2012-05-03 15:42:49 -07:00
|
|
|
if (sd->smt_sub == _HOV_BOTTOM_LEFT) sd->smt_sub = _HOV_BOTTOM_RIGHT;
|
|
|
|
else if (sd->smt_sub == _HOV_BOTTOM_RIGHT)
|
|
|
|
sd->smt_sub = _HOV_BOTTOM_LEFT;
|
|
|
|
else if (sd->smt_sub == _HOV_RIGHT)
|
|
|
|
sd->smt_sub = _HOV_LEFT;
|
|
|
|
else if (sd->smt_sub == _HOV_LEFT)
|
|
|
|
sd->smt_sub = _HOV_RIGHT;
|
|
|
|
else if (sd->smt_sub == _HOV_TOP_RIGHT)
|
|
|
|
sd->smt_sub = _HOV_TOP_LEFT;
|
|
|
|
else if (sd->smt_sub == _HOV_TOP_LEFT)
|
|
|
|
sd->smt_sub = _HOV_TOP_RIGHT;
|
2008-10-07 23:38:20 -07:00
|
|
|
}
|
2012-05-03 15:42:49 -07:00
|
|
|
|
|
|
|
snprintf(buf, sizeof(buf), "elm.swallow.slot.%s", sd->smt_sub->swallow);
|
|
|
|
elm_layout_content_set(obj, buf, sd->smt_sub->obj);
|
2009-07-06 23:46:51 -07:00
|
|
|
}
|
2008-10-07 23:38:20 -07:00
|
|
|
|
|
|
|
static void
|
2008-11-15 05:58:50 -08:00
|
|
|
_hov_show_do(Evas_Object *obj)
|
2008-10-07 23:38:20 -07:00
|
|
|
{
|
2012-05-03 15:42:49 -07:00
|
|
|
ELM_HOVER_DATA_GET(obj, sd);
|
2010-10-19 13:20:28 -07:00
|
|
|
|
2012-05-03 15:42:49 -07:00
|
|
|
elm_layout_signal_emit(obj, "elm,action,show", "elm");
|
2010-10-19 13:20:28 -07:00
|
|
|
|
|
|
|
ELM_HOVER_PARTS_FOREACH
|
2012-05-03 15:42:49 -07:00
|
|
|
{
|
|
|
|
char buf[1024];
|
2012-05-02 09:59:30 -07:00
|
|
|
|
2012-05-03 15:42:49 -07:00
|
|
|
if (sd->subs[i].obj)
|
|
|
|
{
|
|
|
|
snprintf
|
|
|
|
(buf, sizeof(buf), "elm,action,slot,%s,show",
|
|
|
|
sd->subs[i].swallow);
|
|
|
|
|
|
|
|
elm_layout_signal_emit(obj, buf, "elm");
|
|
|
|
}
|
|
|
|
}
|
2008-11-15 05:58:50 -08:00
|
|
|
}
|
|
|
|
|
2018-11-19 20:56:37 -08:00
|
|
|
EOLIAN static Efl_Ui_Theme_Apply_Result
|
2018-01-07 20:55:35 -08:00
|
|
|
_elm_hover_efl_ui_widget_theme_apply(Eo *obj, Elm_Hover_Data *sd)
|
2008-11-15 05:58:50 -08:00
|
|
|
{
|
2018-11-19 20:56:37 -08:00
|
|
|
Efl_Ui_Theme_Apply_Result int_ret = EFL_UI_THEME_APPLY_RESULT_FAIL;
|
2017-10-23 22:03:46 -07:00
|
|
|
int_ret = efl_ui_widget_theme_apply(efl_super(obj, MY_CLASS));
|
2018-11-19 20:56:37 -08:00
|
|
|
if (!int_ret) return EFL_UI_THEME_APPLY_RESULT_FAIL;
|
2012-05-03 15:42:49 -07:00
|
|
|
|
|
|
|
if (sd->smt_sub) _elm_hover_smt_sub_re_eval(obj);
|
|
|
|
|
|
|
|
elm_layout_sizing_eval(obj);
|
|
|
|
|
|
|
|
if (evas_object_visible_get(obj)) _hov_show_do(obj);
|
|
|
|
|
theme: return enum from elm_widget_style_set instead of bool
Summary:
if trying to apply incorrect theme, widget apply default theme and return TRUE.
so there is no way to check it really apply correct theme.
To resolve this problem, _elm_theme_set return three type enum
* related history : 4ca3ef45146e05908a13d1010909abeba9693ad6
* elm_object_style_set is public api, so I didn't change it.
* typedef name [ Theme_Apply ] is temporarily, please suggest better one.
@fix
Reviewers: singh.amitesh, herb, Hermet, cedric, jpeg, raster
Subscribers: cedric, jpeg
Differential Revision: https://phab.enlightenment.org/D4073
2016-06-30 23:09:42 -07:00
|
|
|
return int_ret;
|
2008-11-15 05:58:50 -08:00
|
|
|
}
|
|
|
|
|
2014-03-17 07:48:52 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_hover_elm_layout_sizing_eval(Eo *obj, Elm_Hover_Data *sd)
|
2008-11-15 05:58:50 -08:00
|
|
|
{
|
2012-05-03 15:42:49 -07:00
|
|
|
Evas_Coord ofs_x, x = 0, y = 0, w = 0, h = 0, x2 = 0,
|
|
|
|
y2 = 0, w2 = 0, h2 = 0;
|
|
|
|
|
|
|
|
|
2012-05-03 15:44:56 -07:00
|
|
|
if (sd->on_del) return;
|
|
|
|
|
2014-04-01 01:29:36 -07:00
|
|
|
if (sd->parent)
|
|
|
|
{
|
|
|
|
evas_object_geometry_get(sd->parent, &x, &y, &w, &h);
|
2016-08-15 06:44:41 -07:00
|
|
|
if (efl_isa(sd->parent, EFL_UI_WIN_CLASS))
|
2014-04-01 01:29:36 -07:00
|
|
|
{
|
2016-11-28 01:26:39 -08:00
|
|
|
if (efl_canvas_object_is_frame_object_get(obj))
|
2017-09-14 20:14:32 -07:00
|
|
|
evas_object_geometry_get(obj, &x, &y, NULL, NULL);
|
2016-11-28 01:26:39 -08:00
|
|
|
else
|
|
|
|
{
|
|
|
|
x = 0;
|
|
|
|
y = 0;
|
|
|
|
}
|
2014-04-01 01:29:36 -07:00
|
|
|
}
|
|
|
|
}
|
2012-05-03 15:42:49 -07:00
|
|
|
evas_object_geometry_get(obj, &x2, &y2, &w2, &h2);
|
|
|
|
|
2017-06-13 03:41:15 -07:00
|
|
|
if (efl_ui_mirrored_get(obj)) ofs_x = w - (x2 - x) - w2;
|
2012-05-03 15:42:49 -07:00
|
|
|
else ofs_x = x2 - x;
|
|
|
|
|
2016-11-28 01:26:39 -08:00
|
|
|
if (y < 0)
|
|
|
|
h += (-y);
|
|
|
|
|
2013-10-05 01:14:35 -07:00
|
|
|
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
|
2012-05-03 15:42:49 -07:00
|
|
|
evas_object_size_hint_min_set(sd->offset, ofs_x, y2 - y);
|
|
|
|
evas_object_size_hint_min_set(sd->size, w2, h2);
|
2018-11-21 07:30:29 -08:00
|
|
|
evas_object_geometry_set(wd->resize_obj, x, y, w, h);
|
2008-11-15 05:58:50 -08:00
|
|
|
}
|
|
|
|
|
2012-05-02 18:19:05 -07:00
|
|
|
static void
|
2012-05-03 15:42:49 -07:00
|
|
|
_on_smt_sub_changed(void *data,
|
2014-01-06 06:30:02 -08:00
|
|
|
Evas *e EINA_UNUSED,
|
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
void *event_info EINA_UNUSED)
|
2008-10-07 23:38:20 -07:00
|
|
|
{
|
2012-05-03 15:42:49 -07:00
|
|
|
_elm_hover_smt_sub_re_eval(data);
|
2012-05-02 09:59:30 -07:00
|
|
|
}
|
|
|
|
|
2014-03-17 07:48:52 -07:00
|
|
|
EOLIAN static Eina_Bool
|
2018-01-07 20:55:35 -08:00
|
|
|
_elm_hover_efl_ui_widget_widget_sub_object_add(Eo *obj, Elm_Hover_Data *sd, Evas_Object *sobj)
|
2012-05-02 09:59:30 -07:00
|
|
|
{
|
2014-04-03 08:13:46 -07:00
|
|
|
Eina_Bool int_ret = EINA_FALSE;
|
2012-05-03 15:42:49 -07:00
|
|
|
|
2014-03-17 07:48:52 -07:00
|
|
|
if (evas_object_data_get(sobj, "elm-parent") == obj) return EINA_TRUE;
|
2013-01-03 01:52:57 -08:00
|
|
|
|
2017-08-23 04:41:37 -07:00
|
|
|
int_ret = elm_widget_sub_object_add(efl_super(obj, MY_CLASS), sobj);
|
2014-03-17 07:48:52 -07:00
|
|
|
if (!int_ret) return EINA_FALSE;
|
2012-05-03 15:42:49 -07:00
|
|
|
|
|
|
|
if (sd->smt_sub && sd->smt_sub->obj == sobj)
|
|
|
|
evas_object_event_callback_add
|
|
|
|
(sobj, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _on_smt_sub_changed, obj);
|
|
|
|
|
2014-03-17 07:48:52 -07:00
|
|
|
return EINA_TRUE;
|
2012-05-03 15:42:49 -07:00
|
|
|
}
|
|
|
|
|
2014-03-17 07:48:52 -07:00
|
|
|
EOLIAN static Eina_Bool
|
2018-01-07 20:55:35 -08:00
|
|
|
_elm_hover_efl_ui_widget_widget_sub_object_del(Eo *obj, Elm_Hover_Data *sd, Evas_Object *sobj)
|
2012-05-03 15:42:49 -07:00
|
|
|
{
|
2014-04-03 08:13:46 -07:00
|
|
|
Eina_Bool int_ret = EINA_FALSE;
|
2012-05-03 15:42:49 -07:00
|
|
|
|
2017-08-23 04:41:37 -07:00
|
|
|
int_ret = elm_widget_sub_object_del(efl_super(obj, MY_CLASS), sobj);
|
2014-03-17 07:48:52 -07:00
|
|
|
if (!int_ret) return EINA_FALSE;
|
2012-05-03 15:42:49 -07:00
|
|
|
|
|
|
|
if (sd->smt_sub && sd->smt_sub->obj == sobj)
|
|
|
|
{
|
|
|
|
evas_object_event_callback_del_full
|
|
|
|
(sd->smt_sub->obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
|
|
|
|
_on_smt_sub_changed, obj);
|
|
|
|
}
|
|
|
|
else
|
2008-10-24 19:11:06 -07:00
|
|
|
{
|
2012-05-03 15:42:49 -07:00
|
|
|
ELM_HOVER_PARTS_FOREACH
|
|
|
|
{
|
|
|
|
if (sd->subs[i].obj == sobj)
|
|
|
|
{
|
|
|
|
sd->subs[i].obj = NULL;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2008-10-24 19:11:06 -07:00
|
|
|
}
|
2010-10-19 13:20:28 -07:00
|
|
|
|
2014-03-17 07:48:52 -07:00
|
|
|
return EINA_TRUE;
|
2012-05-03 15:42:49 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2014-03-17 07:48:52 -07:00
|
|
|
_elm_hover_subs_del(Elm_Hover_Data *sd)
|
2012-05-03 15:42:49 -07:00
|
|
|
{
|
2010-10-19 13:20:28 -07:00
|
|
|
ELM_HOVER_PARTS_FOREACH
|
2014-01-21 17:38:55 -08:00
|
|
|
ELM_SAFE_FREE(sd->subs[i].obj, evas_object_del);
|
2016-01-04 15:21:44 -08:00
|
|
|
sd->smt_sub = NULL;
|
2012-05-03 15:42:49 -07:00
|
|
|
}
|
|
|
|
|
2016-05-24 04:40:18 -07:00
|
|
|
static Eina_Bool
|
2016-06-02 20:01:35 -07:00
|
|
|
_elm_hover_content_set(Eo *obj, Elm_Hover_Data *sd, const char *swallow, Evas_Object *content)
|
2012-05-03 15:42:49 -07:00
|
|
|
{
|
2012-11-25 22:32:53 -08:00
|
|
|
Eina_Bool int_ret;
|
2012-05-03 15:42:49 -07:00
|
|
|
|
2014-03-17 07:48:52 -07:00
|
|
|
if (!swallow) return EINA_FALSE;
|
2012-05-03 15:42:49 -07:00
|
|
|
|
|
|
|
if (!strcmp(swallow, "smart"))
|
2008-10-09 01:10:20 -07:00
|
|
|
{
|
2012-05-03 15:42:49 -07:00
|
|
|
if (sd->smt_sub) /* already under 'smart' mode */
|
|
|
|
{
|
|
|
|
if (sd->smt_sub->obj != content)
|
|
|
|
{
|
|
|
|
evas_object_del(sd->smt_sub->obj);
|
|
|
|
sd->smt_sub = _HOV_LEFT;
|
|
|
|
sd->smt_sub->obj = content;
|
|
|
|
}
|
elementary - entry, genlist, gengrid, image, icon, hover, frame, diskselector, index, layout, label, conform, flip, flipselector - removed white spaces
SVN revision: 58252
2011-04-01 04:32:33 -07:00
|
|
|
|
2012-05-03 15:42:49 -07:00
|
|
|
if (!content)
|
|
|
|
{
|
|
|
|
sd->smt_sub->obj = NULL;
|
|
|
|
sd->smt_sub = NULL;
|
|
|
|
}
|
|
|
|
else _elm_hover_smt_sub_re_eval(obj);
|
|
|
|
|
|
|
|
goto end;
|
|
|
|
}
|
|
|
|
else /* switch from pristine spots to 'smart' */
|
elementary - entry, genlist, gengrid, image, icon, hover, frame, diskselector, index, layout, label, conform, flip, flipselector - removed white spaces
SVN revision: 58252
2011-04-01 04:32:33 -07:00
|
|
|
{
|
2012-05-03 15:42:49 -07:00
|
|
|
_elm_hover_subs_del(sd);
|
|
|
|
sd->smt_sub = _HOV_LEFT;
|
|
|
|
sd->smt_sub->obj = content;
|
|
|
|
|
|
|
|
_elm_hover_smt_sub_re_eval(obj);
|
|
|
|
|
|
|
|
goto end;
|
elementary - entry, genlist, gengrid, image, icon, hover, frame, diskselector, index, layout, label, conform, flip, flipselector - removed white spaces
SVN revision: 58252
2011-04-01 04:32:33 -07:00
|
|
|
}
|
2008-10-09 01:10:20 -07:00
|
|
|
}
|
2012-05-03 15:42:49 -07:00
|
|
|
|
2016-08-15 06:44:41 -07:00
|
|
|
int_ret = efl_content_set(efl_part(efl_super(obj, MY_CLASS), swallow), content);
|
2014-03-17 07:48:52 -07:00
|
|
|
if (!int_ret) return EINA_FALSE;
|
2012-05-03 15:42:49 -07:00
|
|
|
|
2017-09-20 02:05:03 -07:00
|
|
|
if (!strncmp(swallow, "elm.swallow.slot.", sizeof("elm.swallow.slot")))
|
|
|
|
swallow += sizeof("elm.swallow.slot");
|
2012-05-03 15:42:49 -07:00
|
|
|
|
|
|
|
ELM_HOVER_PARTS_FOREACH
|
|
|
|
{
|
|
|
|
if (!strcmp(swallow, sd->subs[i].swallow))
|
|
|
|
{
|
|
|
|
sd->subs[i].obj = content;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
end:
|
|
|
|
elm_layout_sizing_eval(obj);
|
2014-03-17 07:48:52 -07:00
|
|
|
return EINA_TRUE;
|
2008-10-07 23:38:20 -07:00
|
|
|
}
|
|
|
|
|
2016-05-24 04:40:18 -07:00
|
|
|
static Evas_Object*
|
|
|
|
_elm_hover_content_get(Eo *obj, Elm_Hover_Data *sd, const char *swallow)
|
2012-05-02 09:59:30 -07:00
|
|
|
{
|
2016-05-24 04:40:18 -07:00
|
|
|
if (!swallow) return NULL;
|
2012-05-03 15:42:49 -07:00
|
|
|
|
|
|
|
if (!strcmp(swallow, "smart"))
|
2016-08-15 06:44:41 -07:00
|
|
|
return efl_content_get(efl_part(efl_super(obj, MY_CLASS), sd->smt_sub->swallow));
|
2012-11-25 22:32:53 -08:00
|
|
|
else
|
2016-08-15 06:44:41 -07:00
|
|
|
return efl_content_get(efl_part(efl_super(obj, MY_CLASS), swallow));
|
2012-05-03 15:42:49 -07:00
|
|
|
}
|
|
|
|
|
2016-05-24 04:40:18 -07:00
|
|
|
static Evas_Object*
|
|
|
|
_elm_hover_content_unset(Eo *obj, Elm_Hover_Data *sd, const char *swallow)
|
2012-05-03 15:42:49 -07:00
|
|
|
{
|
2014-03-17 07:48:52 -07:00
|
|
|
if (!swallow) return NULL;
|
2012-05-03 15:42:49 -07:00
|
|
|
|
|
|
|
if (!strcmp(swallow, "smart"))
|
2016-08-15 06:44:41 -07:00
|
|
|
return efl_content_unset(efl_part(efl_super(obj, MY_CLASS), sd->smt_sub->swallow));
|
2012-11-25 22:32:53 -08:00
|
|
|
else
|
2016-08-15 06:44:41 -07:00
|
|
|
return efl_content_unset(efl_part(efl_super(obj, MY_CLASS), swallow));
|
2012-05-02 09:59:30 -07:00
|
|
|
}
|
|
|
|
|
2012-05-02 18:19:05 -07:00
|
|
|
static void
|
2012-05-03 15:42:49 -07:00
|
|
|
_target_del_cb(void *data,
|
2014-01-06 06:30:02 -08:00
|
|
|
Evas *e EINA_UNUSED,
|
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
void *event_info EINA_UNUSED)
|
2008-10-08 08:21:14 -07:00
|
|
|
{
|
2012-05-03 15:42:49 -07:00
|
|
|
ELM_HOVER_DATA_GET(data, sd);
|
|
|
|
|
|
|
|
sd->target = NULL;
|
|
|
|
}
|
2012-05-02 09:59:30 -07:00
|
|
|
|
2012-05-03 15:42:49 -07:00
|
|
|
static void
|
|
|
|
_target_move_cb(void *data,
|
2014-01-06 06:30:02 -08:00
|
|
|
Evas *e EINA_UNUSED,
|
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
void *event_info EINA_UNUSED)
|
2012-05-03 15:42:49 -07:00
|
|
|
{
|
|
|
|
elm_layout_sizing_eval(data);
|
|
|
|
_elm_hover_smt_sub_re_eval(data);
|
2008-10-08 08:21:14 -07:00
|
|
|
}
|
|
|
|
|
2015-10-04 06:38:52 -07:00
|
|
|
static void
|
|
|
|
_hide_signals_emit(Evas_Object *obj)
|
|
|
|
{
|
|
|
|
ELM_HOVER_DATA_GET(obj, sd);
|
|
|
|
|
|
|
|
elm_layout_signal_emit(obj, "elm,action,hide", "elm");
|
|
|
|
|
|
|
|
ELM_HOVER_PARTS_FOREACH
|
|
|
|
{
|
|
|
|
char buf[1024];
|
|
|
|
|
|
|
|
if (sd->subs[i].obj)
|
|
|
|
{
|
|
|
|
snprintf(buf, sizeof(buf), "elm,action,slot,%s,hide",
|
|
|
|
sd->subs[i].swallow);
|
|
|
|
elm_layout_signal_emit(obj, buf, "elm");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_hov_hide_cb(void *data,
|
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
const char *emission EINA_UNUSED,
|
|
|
|
const char *source EINA_UNUSED)
|
|
|
|
{
|
|
|
|
const char *dismissstr;
|
|
|
|
|
2015-11-09 12:23:18 -08:00
|
|
|
dismissstr = elm_layout_data_get(data, "dismiss");
|
2015-10-04 06:38:52 -07:00
|
|
|
|
|
|
|
if (dismissstr && !strcmp(dismissstr, "on"))
|
|
|
|
{
|
|
|
|
evas_object_hide(data);
|
2016-08-22 15:40:39 -07:00
|
|
|
efl_event_callback_legacy_call(data, ELM_HOVER_EVENT_DISMISSED, NULL);
|
2015-10-04 06:38:52 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-10-19 13:20:28 -07:00
|
|
|
static void
|
2012-05-03 15:42:49 -07:00
|
|
|
_hov_dismiss_cb(void *data,
|
2014-01-06 06:30:02 -08:00
|
|
|
Evas_Object *obj EINA_UNUSED,
|
|
|
|
const char *emission EINA_UNUSED,
|
|
|
|
const char *source EINA_UNUSED)
|
2010-10-19 13:20:28 -07:00
|
|
|
{
|
2015-10-04 06:38:52 -07:00
|
|
|
const char *dismissstr;
|
|
|
|
|
2015-11-09 12:23:18 -08:00
|
|
|
dismissstr = elm_layout_data_get(data, "dismiss");
|
2015-10-04 06:38:52 -07:00
|
|
|
|
|
|
|
if (dismissstr && !strcmp(dismissstr, "on"))
|
|
|
|
{
|
|
|
|
_hide_signals_emit(data);
|
2016-08-22 15:40:39 -07:00
|
|
|
efl_event_callback_legacy_call
|
2016-06-10 01:29:40 -07:00
|
|
|
(data, EFL_UI_EVENT_CLICKED, NULL);
|
2015-10-04 06:38:52 -07:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
evas_object_hide(data);
|
2016-08-22 15:40:39 -07:00
|
|
|
efl_event_callback_legacy_call
|
2016-06-10 01:29:40 -07:00
|
|
|
(data, EFL_UI_EVENT_CLICKED, NULL);
|
2016-08-22 15:40:39 -07:00
|
|
|
efl_event_callback_legacy_call(data, ELM_HOVER_EVENT_DISMISSED, NULL);
|
2015-10-04 06:38:52 -07:00
|
|
|
} // for backward compatibility
|
2012-05-02 09:59:30 -07:00
|
|
|
}
|
2010-10-19 13:20:28 -07:00
|
|
|
|
2014-03-17 07:48:52 -07:00
|
|
|
EOLIAN static void
|
2016-06-17 01:26:08 -07:00
|
|
|
_elm_hover_efl_canvas_group_group_add(Eo *obj, Elm_Hover_Data *sd)
|
2012-05-02 18:19:05 -07:00
|
|
|
{
|
2016-08-15 06:44:41 -07:00
|
|
|
efl_canvas_group_add(efl_super(obj, MY_CLASS));
|
2013-09-24 21:33:39 -07:00
|
|
|
elm_widget_sub_object_parent_add(obj);
|
2013-08-26 22:19:19 -07:00
|
|
|
|
2016-06-02 17:20:16 -07:00
|
|
|
ELM_HOVER_PARTS_FOREACH
|
|
|
|
sd->subs[i].swallow = _content_aliases[i].alias;
|
2012-05-03 15:42:49 -07:00
|
|
|
|
2013-03-01 18:04:31 -08:00
|
|
|
if (!elm_layout_theme_set(obj, "hover", "base", elm_widget_style_get(obj)))
|
2013-12-25 20:03:55 -08:00
|
|
|
CRI("Failed to set layout!");
|
2013-03-01 18:04:31 -08:00
|
|
|
|
2012-05-03 15:42:49 -07:00
|
|
|
elm_layout_signal_callback_add
|
2013-10-05 05:35:27 -07:00
|
|
|
(obj, "elm,action,dismiss", "*", _hov_dismiss_cb, obj);
|
2015-10-04 06:38:52 -07:00
|
|
|
elm_layout_signal_callback_add
|
|
|
|
(obj, "elm,action,hide,finished", "elm", _hov_hide_cb, obj);
|
2012-05-03 15:42:49 -07:00
|
|
|
|
2016-06-02 17:20:16 -07:00
|
|
|
sd->offset = evas_object_rectangle_add(evas_object_evas_get(obj));
|
|
|
|
evas_object_pass_events_set(sd->offset, EINA_TRUE);
|
|
|
|
evas_object_color_set(sd->offset, 0, 0, 0, 0);
|
2012-05-03 15:42:49 -07:00
|
|
|
|
2016-06-02 17:20:16 -07:00
|
|
|
sd->size = evas_object_rectangle_add(evas_object_evas_get(obj));
|
|
|
|
evas_object_pass_events_set(sd->size, EINA_TRUE);
|
|
|
|
evas_object_color_set(sd->size, 0, 0, 0, 0);
|
2012-05-03 15:42:49 -07:00
|
|
|
|
2016-06-02 17:20:16 -07:00
|
|
|
elm_layout_content_set(obj, "elm.swallow.offset", sd->offset);
|
|
|
|
elm_layout_content_set(obj, "elm.swallow.size", sd->size);
|
2012-05-03 15:42:49 -07:00
|
|
|
|
2014-02-26 18:38:47 -08:00
|
|
|
elm_widget_can_focus_set(obj, EINA_FALSE);
|
2008-10-07 23:38:20 -07:00
|
|
|
}
|
|
|
|
|
2014-03-17 07:48:52 -07:00
|
|
|
EOLIAN static void
|
2016-06-17 01:26:08 -07:00
|
|
|
_elm_hover_efl_canvas_group_group_del(Eo *obj, Elm_Hover_Data *sd)
|
2010-04-26 22:43:54 -07:00
|
|
|
{
|
2012-05-03 15:44:56 -07:00
|
|
|
|
|
|
|
sd->on_del = EINA_TRUE;
|
|
|
|
|
2012-05-03 15:42:49 -07:00
|
|
|
if (evas_object_visible_get(obj))
|
2013-09-21 03:28:04 -07:00
|
|
|
{
|
2016-08-22 15:40:39 -07:00
|
|
|
efl_event_callback_legacy_call
|
2016-06-10 01:29:40 -07:00
|
|
|
(obj, EFL_UI_EVENT_CLICKED, NULL);
|
2016-08-22 15:40:39 -07:00
|
|
|
efl_event_callback_legacy_call(obj, ELM_HOVER_EVENT_DISMISSED, NULL);
|
2013-09-21 03:28:04 -07:00
|
|
|
}
|
2010-04-26 22:43:54 -07:00
|
|
|
|
2012-05-03 15:42:49 -07:00
|
|
|
elm_hover_target_set(obj, NULL);
|
2012-05-03 15:44:56 -07:00
|
|
|
|
|
|
|
_elm_hover_parent_detach(obj);
|
|
|
|
sd->parent = NULL;
|
2012-05-02 12:25:56 -07:00
|
|
|
|
2016-08-15 06:44:41 -07:00
|
|
|
efl_canvas_group_del(efl_super(obj, MY_CLASS));
|
2012-05-03 15:42:49 -07:00
|
|
|
}
|
2012-05-02 09:59:30 -07:00
|
|
|
|
2014-03-17 07:48:52 -07:00
|
|
|
EOLIAN static void
|
2018-04-05 01:47:26 -07:00
|
|
|
_elm_hover_efl_gfx_entity_position_set(Eo *obj, Elm_Hover_Data *_pd EINA_UNUSED, Eina_Position2D pos)
|
2012-05-02 18:19:05 -07:00
|
|
|
{
|
2017-09-14 20:14:32 -07:00
|
|
|
if (_evas_object_intercept_call(obj, EVAS_OBJECT_INTERCEPT_CB_MOVE, 0, pos.x, pos.y))
|
2016-10-10 20:39:05 -07:00
|
|
|
return;
|
|
|
|
|
2018-04-05 01:47:26 -07:00
|
|
|
efl_gfx_entity_position_set(efl_super(obj, MY_CLASS), pos);
|
2012-05-03 15:42:49 -07:00
|
|
|
|
|
|
|
elm_layout_sizing_eval(obj);
|
2010-04-26 22:43:54 -07:00
|
|
|
}
|
|
|
|
|
2014-03-17 07:48:52 -07:00
|
|
|
EOLIAN static void
|
2018-04-05 01:47:26 -07:00
|
|
|
_elm_hover_efl_gfx_entity_size_set(Eo *obj, Elm_Hover_Data *_pd EINA_UNUSED, Eina_Size2D sz)
|
2010-04-26 22:43:54 -07:00
|
|
|
{
|
2017-09-15 02:37:25 -07:00
|
|
|
if (_evas_object_intercept_call(obj, EVAS_OBJECT_INTERCEPT_CB_RESIZE, 0, sz.w, sz.h))
|
evas/elm: Remove function group_resize
This is an override of efl_gfx_size_set. Same as before, the
order of operations matter so it is possible that a corner
case will break. In particular, legacy code was:
- intercept
- smart resize (do stuff), super, super, super
- evas object resize
The new code is more like:
- intercept
- super, super, super, evas object resize
- do stuff
But unfortunately this broke elm_widget (read: all widgets) as
the internal resize was done before the object resize. So,
inside the resize event cb, the resize_obj size would not match
the smart object size. >_<
2016-10-11 00:54:31 -07:00
|
|
|
return;
|
|
|
|
|
2018-04-05 01:47:26 -07:00
|
|
|
efl_gfx_entity_size_set(efl_super(obj, MY_CLASS), sz);
|
2010-04-26 22:43:54 -07:00
|
|
|
|
2012-05-03 15:42:49 -07:00
|
|
|
elm_layout_sizing_eval(obj);
|
2010-04-26 22:43:54 -07:00
|
|
|
}
|
2010-04-12 01:12:02 -07:00
|
|
|
|
2014-03-17 07:48:52 -07:00
|
|
|
EOLIAN static void
|
2018-04-05 01:47:26 -07:00
|
|
|
_elm_hover_efl_gfx_entity_visible_set(Eo *obj, Elm_Hover_Data *pd EINA_UNUSED, Eina_Bool vis)
|
2010-10-19 13:20:28 -07:00
|
|
|
{
|
2016-10-10 02:59:42 -07:00
|
|
|
if (_evas_object_intercept_call(obj, EVAS_OBJECT_INTERCEPT_CB_VISIBLE, 0, vis))
|
|
|
|
return;
|
2012-05-02 09:59:30 -07:00
|
|
|
|
2018-04-05 01:47:26 -07:00
|
|
|
efl_gfx_entity_visible_set(efl_super(obj, MY_CLASS), vis);
|
2012-05-03 15:42:49 -07:00
|
|
|
|
2018-02-15 05:53:27 -08:00
|
|
|
if (vis) _hov_show_do(obj);
|
2016-10-10 02:59:42 -07:00
|
|
|
else
|
|
|
|
{
|
|
|
|
// for backward compatibility
|
|
|
|
const char *dismissstr = elm_layout_data_get(obj, "dismiss");
|
2012-05-03 15:42:49 -07:00
|
|
|
|
2016-10-10 02:59:42 -07:00
|
|
|
if (!eina_streq(dismissstr, "on"))
|
|
|
|
_hide_signals_emit(obj);
|
|
|
|
}
|
2012-05-02 09:59:30 -07:00
|
|
|
}
|
2010-10-19 13:20:28 -07:00
|
|
|
|
2017-07-27 23:35:10 -07:00
|
|
|
static const Elm_Layout_Part_Alias_Description*
|
|
|
|
_elm_hover_content_aliases_get(Eo *obj, void *_pd EINA_UNUSED)
|
2012-07-18 14:03:39 -07:00
|
|
|
{
|
2017-07-20 20:14:44 -07:00
|
|
|
const char *style = elm_widget_style_get(obj);
|
|
|
|
|
|
|
|
// main_menu_submenu only has a single slot "bottom"
|
|
|
|
if (style && strstr(style, "main_menu_submenu"))
|
|
|
|
return _content_aliases_main_menu_submenu;
|
2014-03-17 07:48:52 -07:00
|
|
|
return _content_aliases;
|
2010-12-09 10:04:19 -08:00
|
|
|
}
|
|
|
|
|
2012-05-03 15:42:49 -07:00
|
|
|
EAPI Evas_Object *
|
|
|
|
elm_hover_add(Evas_Object *parent)
|
2012-01-09 00:37:29 -08:00
|
|
|
{
|
2012-05-03 15:42:49 -07:00
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
|
2017-11-06 21:00:43 -08:00
|
|
|
return elm_legacy_add(MY_CLASS, parent);
|
2012-11-25 22:32:53 -08:00
|
|
|
}
|
2012-01-09 00:37:29 -08:00
|
|
|
|
2015-05-19 05:34:07 -07:00
|
|
|
EOLIAN static Eo *
|
2018-02-15 05:53:27 -08:00
|
|
|
_elm_hover_efl_object_constructor(Eo *obj, Elm_Hover_Data *pd EINA_UNUSED)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2016-08-15 06:44:41 -07:00
|
|
|
obj = efl_constructor(efl_super(obj, MY_CLASS));
|
2016-06-20 21:26:15 -07:00
|
|
|
efl_canvas_object_type_set(obj, MY_CLASS_NAME_LEGACY);
|
2016-06-16 22:12:02 -07:00
|
|
|
evas_object_smart_callbacks_descriptions_set(obj, _smart_callbacks);
|
2018-04-03 04:27:30 -07:00
|
|
|
efl_access_object_role_set(obj, EFL_ACCESS_ROLE_POPUP_MENU);
|
2018-10-22 04:39:06 -07:00
|
|
|
legacy_child_focus_handle(obj);
|
2015-05-19 05:34:07 -07:00
|
|
|
|
|
|
|
return obj;
|
2012-05-03 15:42:49 -07:00
|
|
|
}
|
2012-01-09 00:37:29 -08:00
|
|
|
|
2014-03-17 07:48:52 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_hover_target_set(Eo *obj, Elm_Hover_Data *sd, Evas_Object *target)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2012-01-09 00:37:29 -08:00
|
|
|
|
2012-05-03 15:42:49 -07:00
|
|
|
if (sd->target)
|
2012-05-02 18:19:05 -07:00
|
|
|
{
|
2012-05-03 15:42:49 -07:00
|
|
|
evas_object_event_callback_del_full
|
|
|
|
(sd->target, EVAS_CALLBACK_DEL, _target_del_cb, obj);
|
|
|
|
evas_object_event_callback_del_full
|
|
|
|
(sd->target, EVAS_CALLBACK_MOVE, _target_move_cb, obj);
|
2017-01-12 16:32:02 -08:00
|
|
|
evas_object_event_callback_del_full
|
|
|
|
(sd->target, EVAS_CALLBACK_RESIZE, _target_move_cb, obj);
|
2012-05-03 15:42:49 -07:00
|
|
|
elm_widget_hover_object_set(sd->target, NULL);
|
2012-05-02 18:19:05 -07:00
|
|
|
}
|
2012-05-02 09:59:30 -07:00
|
|
|
|
2012-05-03 15:42:49 -07:00
|
|
|
sd->target = target;
|
|
|
|
if (sd->target)
|
2012-05-02 18:19:05 -07:00
|
|
|
{
|
2012-05-03 15:42:49 -07:00
|
|
|
evas_object_event_callback_add
|
|
|
|
(sd->target, EVAS_CALLBACK_DEL, _target_del_cb, obj);
|
|
|
|
evas_object_event_callback_add
|
|
|
|
(sd->target, EVAS_CALLBACK_MOVE, _target_move_cb, obj);
|
2017-01-12 16:32:02 -08:00
|
|
|
evas_object_event_callback_add
|
|
|
|
(sd->target, EVAS_CALLBACK_RESIZE, _target_move_cb, obj);
|
2012-05-03 15:42:49 -07:00
|
|
|
elm_widget_hover_object_set(target, obj);
|
|
|
|
elm_layout_sizing_eval(obj);
|
2012-05-02 18:19:05 -07:00
|
|
|
}
|
2012-01-09 00:37:29 -08:00
|
|
|
|
2016-12-20 08:28:36 -08:00
|
|
|
}
|
2012-01-09 00:37:29 -08:00
|
|
|
EAPI void
|
2012-05-03 15:42:49 -07:00
|
|
|
elm_hover_parent_set(Evas_Object *obj,
|
|
|
|
Evas_Object *parent)
|
2012-01-09 00:37:29 -08:00
|
|
|
{
|
2012-05-03 15:42:49 -07:00
|
|
|
ELM_HOVER_CHECK(obj);
|
2017-10-23 22:03:46 -07:00
|
|
|
efl_ui_widget_parent_set(obj, parent);
|
2012-11-25 22:32:53 -08:00
|
|
|
}
|
|
|
|
|
2014-03-17 07:48:52 -07:00
|
|
|
EOLIAN static void
|
2018-01-07 20:55:35 -08:00
|
|
|
_elm_hover_efl_ui_widget_widget_parent_set(Eo *obj, Elm_Hover_Data *sd, Evas_Object *parent)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2012-05-03 15:44:56 -07:00
|
|
|
_elm_hover_parent_detach(obj);
|
2012-01-09 00:37:29 -08:00
|
|
|
|
2012-05-03 15:42:49 -07:00
|
|
|
sd->parent = parent;
|
|
|
|
if (sd->parent)
|
2012-05-02 09:59:30 -07:00
|
|
|
{
|
2012-05-03 15:42:49 -07:00
|
|
|
evas_object_event_callback_add
|
|
|
|
(sd->parent, EVAS_CALLBACK_MOVE, _parent_move_cb, obj);
|
|
|
|
evas_object_event_callback_add
|
|
|
|
(sd->parent, EVAS_CALLBACK_RESIZE, _parent_resize_cb, obj);
|
|
|
|
evas_object_event_callback_add
|
|
|
|
(sd->parent, EVAS_CALLBACK_SHOW, _parent_show_cb, obj);
|
|
|
|
evas_object_event_callback_add
|
|
|
|
(sd->parent, EVAS_CALLBACK_HIDE, _parent_hide_cb, obj);
|
|
|
|
evas_object_event_callback_add
|
|
|
|
(sd->parent, EVAS_CALLBACK_DEL, _parent_del_cb, obj);
|
2012-05-02 09:59:30 -07:00
|
|
|
}
|
2012-01-09 00:37:29 -08:00
|
|
|
|
2012-05-03 15:42:49 -07:00
|
|
|
elm_layout_sizing_eval(obj);
|
2010-06-16 13:58:09 -07:00
|
|
|
}
|
|
|
|
|
2014-03-17 07:48:52 -07:00
|
|
|
EOLIAN static Evas_Object*
|
2018-04-17 11:09:44 -07:00
|
|
|
_elm_hover_target_get(const Eo *obj EINA_UNUSED, Elm_Hover_Data *sd)
|
2010-10-14 11:54:42 -07:00
|
|
|
{
|
2014-03-17 07:48:52 -07:00
|
|
|
return sd->target;
|
2012-05-03 15:42:49 -07:00
|
|
|
}
|
2012-05-02 18:19:05 -07:00
|
|
|
|
2012-05-03 15:42:49 -07:00
|
|
|
EAPI Evas_Object *
|
|
|
|
elm_hover_parent_get(const Evas_Object *obj)
|
|
|
|
{
|
|
|
|
ELM_HOVER_CHECK(obj) NULL;
|
2017-10-23 22:03:46 -07:00
|
|
|
return efl_ui_widget_parent_get((Eo *) obj);
|
2012-11-25 22:32:53 -08:00
|
|
|
}
|
2010-10-19 13:20:28 -07:00
|
|
|
|
2014-03-17 07:48:52 -07:00
|
|
|
EOLIAN static Evas_Object*
|
2018-04-17 11:09:44 -07:00
|
|
|
_elm_hover_efl_ui_widget_widget_parent_get(const Eo *obj EINA_UNUSED, Elm_Hover_Data *sd)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2014-03-17 07:48:52 -07:00
|
|
|
return sd->parent;
|
2010-10-14 11:54:42 -07:00
|
|
|
}
|
|
|
|
|
2014-03-17 07:48:52 -07:00
|
|
|
EOLIAN static const char*
|
2015-06-25 04:21:00 -07:00
|
|
|
_elm_hover_best_content_location_get(const Eo *obj EINA_UNUSED, Elm_Hover_Data *sd, Elm_Hover_Axis pref_axis)
|
2010-06-16 13:58:09 -07:00
|
|
|
{
|
2012-05-03 15:42:49 -07:00
|
|
|
Evas_Coord spc_l, spc_r, spc_t, spc_b;
|
2010-10-19 13:20:28 -07:00
|
|
|
|
2012-05-03 15:42:49 -07:00
|
|
|
_elm_hover_left_space_calc(sd, &spc_l, &spc_t, &spc_r, &spc_b);
|
|
|
|
|
|
|
|
if (pref_axis == ELM_HOVER_AXIS_HORIZONTAL)
|
|
|
|
{
|
2014-03-17 07:48:52 -07:00
|
|
|
if (spc_l < spc_r) return (_HOV_RIGHT)->swallow;
|
|
|
|
else return (_HOV_LEFT)->swallow;
|
2012-05-03 15:42:49 -07:00
|
|
|
}
|
|
|
|
else if (pref_axis == ELM_HOVER_AXIS_VERTICAL)
|
2010-10-19 13:20:28 -07:00
|
|
|
{
|
2017-07-20 20:14:44 -07:00
|
|
|
if (spc_t <= spc_b) return (_HOV_BOTTOM)->swallow;
|
2014-03-17 07:48:52 -07:00
|
|
|
else return (_HOV_TOP)->swallow;
|
2010-10-19 13:20:28 -07:00
|
|
|
}
|
|
|
|
|
2012-05-03 15:42:49 -07:00
|
|
|
if (spc_l < spc_r)
|
2010-06-16 13:58:09 -07:00
|
|
|
{
|
2012-11-25 22:32:53 -08:00
|
|
|
if (spc_t > spc_r)
|
2014-03-17 07:48:52 -07:00
|
|
|
return (_HOV_TOP)->swallow;
|
2012-05-03 15:42:49 -07:00
|
|
|
else if (spc_b > spc_r)
|
2014-03-17 07:48:52 -07:00
|
|
|
return (_HOV_BOTTOM)->swallow;
|
2012-11-25 22:32:53 -08:00
|
|
|
else
|
2014-03-17 07:48:52 -07:00
|
|
|
return (_HOV_RIGHT)->swallow;
|
2010-06-16 13:58:09 -07:00
|
|
|
}
|
2010-10-19 13:20:28 -07:00
|
|
|
|
2012-11-25 22:32:53 -08:00
|
|
|
if (spc_t > spc_r)
|
2014-03-17 07:48:52 -07:00
|
|
|
return (_HOV_TOP)->swallow;
|
2012-05-03 15:42:49 -07:00
|
|
|
else if (spc_b > spc_r)
|
2014-03-17 07:48:52 -07:00
|
|
|
return (_HOV_BOTTOM)->swallow;
|
2012-11-25 22:32:53 -08:00
|
|
|
else
|
2014-03-17 07:48:52 -07:00
|
|
|
return (_HOV_LEFT)->swallow;
|
2012-05-03 15:42:49 -07:00
|
|
|
|
2014-03-17 07:48:52 -07:00
|
|
|
return NULL;
|
2012-11-25 22:32:53 -08:00
|
|
|
}
|
2012-05-03 15:42:49 -07:00
|
|
|
|
2014-03-17 07:48:52 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_hover_dismiss(Eo *obj, Elm_Hover_Data *_pd EINA_UNUSED)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2015-10-12 13:22:26 -07:00
|
|
|
const char *dismissstr;
|
|
|
|
|
2015-11-09 12:23:18 -08:00
|
|
|
dismissstr = elm_layout_data_get(obj, "dismiss");
|
2015-10-12 13:22:26 -07:00
|
|
|
|
|
|
|
if (!dismissstr || strcmp(dismissstr, "on"))
|
|
|
|
elm_layout_signal_emit(obj, "elm,action,dismiss", ""); // XXX: for compat
|
2013-10-05 05:35:27 -07:00
|
|
|
elm_layout_signal_emit(obj, "elm,action,dismiss", "elm");
|
2008-10-07 23:38:20 -07:00
|
|
|
}
|
2012-11-25 22:32:53 -08:00
|
|
|
|
2014-03-17 07:48:52 -07:00
|
|
|
EOLIAN static void
|
2016-08-10 07:23:04 -07:00
|
|
|
_elm_hover_class_constructor(Efl_Class *klass)
|
2014-03-17 07:48:52 -07:00
|
|
|
{
|
2013-11-07 03:44:22 -08:00
|
|
|
evas_smart_legacy_type_register(MY_CLASS_NAME_LEGACY, klass);
|
2012-11-25 22:32:53 -08:00
|
|
|
}
|
|
|
|
|
2015-12-15 04:30:52 -08:00
|
|
|
static Eina_Bool
|
|
|
|
_action_dismiss(Evas_Object *obj, const char *params EINA_UNUSED)
|
|
|
|
{
|
2016-03-02 04:10:48 -08:00
|
|
|
elm_obj_hover_dismiss(obj);
|
2015-12-15 04:30:52 -08:00
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
2017-11-15 18:55:06 -08:00
|
|
|
EOLIAN const Efl_Access_Action_Data *
|
2018-04-17 11:09:44 -07:00
|
|
|
_elm_hover_efl_access_widget_action_elm_actions_get(const Eo *obj EINA_UNUSED, Elm_Hover_Data *pd EINA_UNUSED)
|
2015-12-15 04:30:52 -08:00
|
|
|
{
|
2017-11-15 18:55:06 -08:00
|
|
|
static Efl_Access_Action_Data atspi_actions[] = {
|
2015-12-15 04:30:52 -08:00
|
|
|
{ "dismiss", NULL, NULL, _action_dismiss},
|
|
|
|
{ NULL, NULL, NULL, NULL}
|
|
|
|
};
|
|
|
|
return &atspi_actions[0];
|
|
|
|
}
|
|
|
|
|
2017-11-23 23:50:01 -08:00
|
|
|
EOLIAN static Efl_Access_State_Set
|
2018-04-03 04:27:30 -07:00
|
|
|
_elm_hover_efl_access_object_state_set_get(const Eo *obj, Elm_Hover_Data *pd EINA_UNUSED)
|
2017-11-23 23:50:01 -08:00
|
|
|
{
|
|
|
|
Efl_Access_State_Set states;
|
2018-04-03 04:27:30 -07:00
|
|
|
states = efl_access_object_state_set_get(efl_super(obj, MY_CLASS));
|
2017-11-23 23:50:01 -08:00
|
|
|
|
|
|
|
STATE_TYPE_SET(states, EFL_ACCESS_STATE_MODAL);
|
|
|
|
return states;
|
|
|
|
}
|
|
|
|
|
2016-05-24 04:40:18 -07:00
|
|
|
/* Efl.Part begin */
|
|
|
|
|
2017-09-19 04:02:26 -07:00
|
|
|
ELM_PART_OVERRIDE(elm_hover, ELM_HOVER, Elm_Hover_Data)
|
|
|
|
ELM_PART_OVERRIDE_CONTENT_SET(elm_hover, ELM_HOVER, Elm_Hover_Data)
|
|
|
|
ELM_PART_OVERRIDE_CONTENT_GET(elm_hover, ELM_HOVER, Elm_Hover_Data)
|
|
|
|
ELM_PART_OVERRIDE_CONTENT_UNSET(elm_hover, ELM_HOVER, Elm_Hover_Data)
|
edje/elm: Rename _internal_ to _part_ (EO)
In Edje and Elementary, we have part objects, which are what is returned
by the interface efl_part(). Those objects can't be of an opaque type as
this doesn't work nicely with strongly typed languages such as C++ or
C#. In JS, Lua, C the types are weak and mostly runtime-based so it
doesn't matter much.
As a consequence, the documentation and the types need to look nice in
this EO API. Thus, we remove the abusive term "internal" and explicitly
call all those classes "part" something.
Eventually we want the types to be declared in the EO file so bindings
(C#, C++, ...) can generate the proper access methods, returning the
best possible types.
Note that right now a few of those part types are used in the legacy API
but don't actually need to be exposed externally.
This is kind of a mega commit that does all the renaming at once, but
it's really just a big sed operation. The power of good IDEs :)
Ref T5315
Ref T5306
2017-09-12 21:29:25 -07:00
|
|
|
#include "elm_hover_part.eo.c"
|
2016-05-24 04:40:18 -07:00
|
|
|
|
|
|
|
/* Efl.Part end */
|
|
|
|
|
2017-05-18 01:52:17 -07:00
|
|
|
/* Internal EO APIs and hidden overrides */
|
|
|
|
|
2017-08-07 19:48:31 -07:00
|
|
|
// ELM_LAYOUT_CONTENT_ALIASES_IMPLEMENT(MY_CLASS_PFX) is overridden with an if()
|
|
|
|
// ELM_LAYOUT_CONTENT_ALIASES_OPS(MY_CLASS_PFX) somehow doesn't compile!?
|
2017-07-27 23:35:10 -07:00
|
|
|
|
2017-05-18 01:52:17 -07:00
|
|
|
#define ELM_HOVER_EXTRA_OPS \
|
2017-07-27 23:35:10 -07:00
|
|
|
EFL_CANVAS_GROUP_ADD_DEL_OPS(elm_hover), \
|
2017-08-07 00:13:38 -07:00
|
|
|
ELM_LAYOUT_SIZING_EVAL_OPS(elm_hover), \
|
2017-07-27 23:35:10 -07:00
|
|
|
_ELM_LAYOUT_ALIASES_OPS(elm_hover, content)
|
2017-05-18 01:52:17 -07:00
|
|
|
|
2014-03-17 07:48:52 -07:00
|
|
|
#include "elm_hover.eo.c"
|