2013-04-25 22:13:00 -07:00
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
# include "elementary_config.h"
|
|
|
|
#endif
|
|
|
|
|
2011-06-26 10:36:18 -07:00
|
|
|
#include <Elementary.h>
|
2013-04-25 22:13:00 -07:00
|
|
|
|
2011-06-26 10:36:18 -07:00
|
|
|
#include "elm_priv.h"
|
2012-07-31 15:05:17 -07:00
|
|
|
#include "elm_widget_route.h"
|
2011-06-26 10:36:18 -07:00
|
|
|
|
2014-06-03 03:35:28 -07:00
|
|
|
#define MY_CLASS ELM_ROUTE_CLASS
|
2012-11-25 22:32:53 -08:00
|
|
|
|
2013-11-07 03:44:22 -08:00
|
|
|
#define MY_CLASS_NAME "Elm_Route"
|
|
|
|
#define MY_CLASS_NAME_LEGACY "elm_route"
|
2011-06-26 10:36:18 -07:00
|
|
|
|
|
|
|
static void
|
2012-05-16 12:50:04 -07:00
|
|
|
_clear_route(Evas_Object *obj)
|
2011-06-26 10:36:18 -07:00
|
|
|
{
|
2012-05-16 12:50:04 -07:00
|
|
|
Segment *segment;
|
2011-06-26 10:36:18 -07:00
|
|
|
|
2012-05-16 12:50:04 -07:00
|
|
|
ELM_ROUTE_DATA_GET(obj, sd);
|
2011-06-26 10:36:18 -07:00
|
|
|
|
2012-05-16 12:50:04 -07:00
|
|
|
#ifdef ELM_EMAP
|
|
|
|
sd->lon_min = EMAP_LON_MAX;
|
|
|
|
sd->lon_max = EMAP_LON_MIN;
|
|
|
|
sd->lat_min = EMAP_LAT_MAX;
|
|
|
|
sd->lat_max = EMAP_LAT_MIN;
|
|
|
|
#endif
|
2011-06-26 10:36:18 -07:00
|
|
|
|
2013-03-08 20:23:42 -08:00
|
|
|
EINA_LIST_FREE(sd->segments, segment)
|
2012-05-16 12:50:04 -07:00
|
|
|
{
|
|
|
|
evas_object_del(segment->obj);
|
|
|
|
free(segment);
|
|
|
|
}
|
2011-06-26 10:36:18 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_sizing_eval(Evas_Object *obj)
|
|
|
|
{
|
|
|
|
Eina_List *l;
|
|
|
|
Segment *segment;
|
|
|
|
Evas_Coord x, y, w, h;
|
|
|
|
Evas_Coord start_x, start_y, end_x, end_y;
|
|
|
|
|
2012-05-16 12:50:04 -07:00
|
|
|
ELM_ROUTE_DATA_GET(obj, sd);
|
|
|
|
|
2011-06-26 10:36:18 -07:00
|
|
|
evas_object_geometry_get(obj, &x, &y, &w, &h);
|
|
|
|
|
2012-10-01 00:36:27 -07:00
|
|
|
EINA_LIST_FOREACH(sd->segments, l, segment)
|
2011-06-26 19:55:52 -07:00
|
|
|
{
|
2012-05-16 12:50:04 -07:00
|
|
|
if (sd->must_calc_segments || segment->must_calc)
|
2011-06-26 19:55:52 -07:00
|
|
|
{
|
2011-06-26 10:36:18 -07:00
|
|
|
#ifdef ELM_EMAP
|
2012-05-16 12:50:04 -07:00
|
|
|
segment->start_x =
|
|
|
|
(emap_route_node_lon_get(segment->node_start) - sd->lon_min)
|
|
|
|
/ (float)(sd->lon_max - sd->lon_min);
|
|
|
|
segment->start_y =
|
|
|
|
1 - (emap_route_node_lat_get(segment->node_start)
|
|
|
|
- sd->lat_min) / (float)(sd->lat_max - sd->lat_min);
|
|
|
|
segment->end_x =
|
|
|
|
(emap_route_node_lon_get(segment->node_end) - sd->lon_min)
|
|
|
|
/ (float)(sd->lon_max - sd->lon_min);
|
|
|
|
segment->end_y =
|
|
|
|
1 - (emap_route_node_lat_get(segment->node_end)
|
|
|
|
- sd->lat_min) / (float)(sd->lat_max - sd->lat_min);
|
2011-06-26 10:36:18 -07:00
|
|
|
#endif
|
2011-06-26 19:55:52 -07:00
|
|
|
segment->must_calc = EINA_FALSE;
|
|
|
|
}
|
2011-06-26 10:36:18 -07:00
|
|
|
|
2012-05-16 12:50:04 -07:00
|
|
|
start_x = x + (int)(segment->start_x * w);
|
|
|
|
start_y = y + (int)(segment->start_y * h);
|
|
|
|
end_x = x + (int)(segment->end_x * w);
|
|
|
|
end_y = y + (int)(segment->end_y * h);
|
|
|
|
|
2011-06-26 19:55:52 -07:00
|
|
|
evas_object_line_xy_set(segment->obj, start_x, start_y, end_x, end_y);
|
|
|
|
}
|
2011-06-26 10:36:18 -07:00
|
|
|
|
2012-05-16 12:50:04 -07:00
|
|
|
sd->must_calc_segments = EINA_FALSE;
|
2011-06-26 10:36:18 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2014-01-06 06:30:02 -08:00
|
|
|
_move_resize_cb(void *data EINA_UNUSED,
|
|
|
|
Evas *e EINA_UNUSED,
|
2012-05-16 12:50:04 -07:00
|
|
|
Evas_Object *obj,
|
2014-01-06 06:30:02 -08:00
|
|
|
void *event_info EINA_UNUSED)
|
2011-06-26 10:36:18 -07:00
|
|
|
{
|
2012-05-16 12:50:04 -07:00
|
|
|
_sizing_eval(obj);
|
|
|
|
}
|
2011-06-26 10:36:18 -07:00
|
|
|
|
2017-08-09 00:13:06 -07:00
|
|
|
EOLIAN static Efl_Ui_Theme_Apply
|
2018-01-07 20:55:35 -08:00
|
|
|
_elm_route_efl_ui_widget_theme_apply(Eo *obj, Elm_Route_Data *sd EINA_UNUSED)
|
2012-05-16 12:50:04 -07:00
|
|
|
{
|
2017-08-09 00:13:06 -07:00
|
|
|
Efl_Ui_Theme_Apply int_ret = EFL_UI_THEME_APPLY_FAILED;
|
2017-10-23 22:03:46 -07:00
|
|
|
int_ret = efl_ui_widget_theme_apply(efl_super(obj, MY_CLASS));
|
2017-08-09 00:13:06 -07:00
|
|
|
if (!int_ret) return EFL_UI_THEME_APPLY_FAILED;
|
2011-06-26 10:36:18 -07:00
|
|
|
|
2012-05-16 12:50:04 -07:00
|
|
|
//TODO
|
|
|
|
|
|
|
|
_sizing_eval(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;
|
2011-06-26 10:36:18 -07:00
|
|
|
}
|
|
|
|
|
2011-06-26 20:03:16 -07:00
|
|
|
#ifdef ELM_EMAP
|
2011-06-26 10:36:18 -07:00
|
|
|
static void
|
2012-05-16 12:50:04 -07:00
|
|
|
_update_lon_lat_min_max(Evas_Object *obj,
|
|
|
|
double lon,
|
|
|
|
double lat)
|
2011-06-26 10:36:18 -07:00
|
|
|
{
|
2012-05-16 12:50:04 -07:00
|
|
|
ELM_ROUTE_DATA_GET(obj, sd);
|
2011-06-26 10:36:18 -07:00
|
|
|
|
2012-05-16 12:50:04 -07:00
|
|
|
if (sd->lon_min > lon)
|
2011-06-26 19:55:52 -07:00
|
|
|
{
|
2012-05-16 12:50:04 -07:00
|
|
|
sd->lon_min = lon;
|
|
|
|
sd->must_calc_segments = EINA_TRUE;
|
2011-06-26 19:55:52 -07:00
|
|
|
}
|
2012-05-16 12:50:04 -07:00
|
|
|
if (sd->lat_min > lat)
|
2011-06-26 19:55:52 -07:00
|
|
|
{
|
2012-05-16 12:50:04 -07:00
|
|
|
sd->lat_min = lat;
|
|
|
|
sd->must_calc_segments = EINA_TRUE;
|
2011-06-26 19:55:52 -07:00
|
|
|
}
|
2011-06-26 10:36:18 -07:00
|
|
|
|
2012-05-16 12:50:04 -07:00
|
|
|
if (sd->lon_max < lon)
|
2011-06-26 19:55:52 -07:00
|
|
|
{
|
2012-05-16 12:50:04 -07:00
|
|
|
sd->lon_max = lon;
|
|
|
|
sd->must_calc_segments = EINA_TRUE;
|
2011-06-26 19:55:52 -07:00
|
|
|
}
|
2012-05-16 12:50:04 -07:00
|
|
|
if (sd->lat_max < lat)
|
2011-06-26 19:55:52 -07:00
|
|
|
{
|
2012-05-16 12:50:04 -07:00
|
|
|
sd->lat_max = lat;
|
|
|
|
sd->must_calc_segments = EINA_TRUE;
|
2011-06-26 19:55:52 -07:00
|
|
|
}
|
2011-06-26 10:36:18 -07:00
|
|
|
}
|
2012-05-16 12:50:04 -07:00
|
|
|
|
2011-06-26 20:03:16 -07:00
|
|
|
#endif
|
2011-06-26 10:36:18 -07:00
|
|
|
|
2014-03-26 01:19:34 -07:00
|
|
|
EOLIAN static void
|
2016-06-17 01:26:08 -07:00
|
|
|
_elm_route_efl_canvas_group_group_add(Eo *obj, Elm_Route_Data *priv)
|
2012-05-16 12:50:04 -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);
|
2012-05-16 12:50:04 -07:00
|
|
|
elm_widget_can_focus_set(obj, EINA_FALSE);
|
|
|
|
|
|
|
|
evas_object_event_callback_add
|
|
|
|
(obj, EVAS_CALLBACK_MOVE, _move_resize_cb, obj);
|
|
|
|
evas_object_event_callback_add
|
|
|
|
(obj, EVAS_CALLBACK_RESIZE, _move_resize_cb, obj);
|
|
|
|
|
|
|
|
#ifdef ELM_EMAP
|
|
|
|
priv->lon_min = EMAP_LON_MAX;
|
|
|
|
priv->lon_max = EMAP_LON_MIN;
|
|
|
|
priv->lat_min = EMAP_LAT_MAX;
|
|
|
|
priv->lat_max = EMAP_LAT_MIN;
|
2012-11-25 22:32:53 -08:00
|
|
|
#else
|
|
|
|
(void)priv;
|
2012-05-16 12:50:04 -07:00
|
|
|
#endif
|
|
|
|
|
|
|
|
_sizing_eval(obj);
|
|
|
|
}
|
|
|
|
|
2014-03-26 01:19:34 -07:00
|
|
|
EOLIAN static void
|
2016-06-17 01:26:08 -07:00
|
|
|
_elm_route_efl_canvas_group_group_del(Eo *obj, Elm_Route_Data *_pd EINA_UNUSED)
|
2012-05-16 12:50:04 -07:00
|
|
|
{
|
|
|
|
_clear_route(obj);
|
|
|
|
|
2016-08-15 06:44:41 -07:00
|
|
|
efl_canvas_group_del(efl_super(obj, MY_CLASS));
|
2012-05-16 12:50:04 -07:00
|
|
|
}
|
|
|
|
|
2011-06-26 10:36:18 -07:00
|
|
|
/**
|
|
|
|
* Add a new route to the parent
|
|
|
|
*
|
|
|
|
* @param parent The parent object
|
|
|
|
* @return The new object or NULL if it cannot be created
|
|
|
|
*
|
2016-03-16 08:05:31 -07:00
|
|
|
* @ingroup Elm_Route
|
2011-06-26 10:36:18 -07:00
|
|
|
*/
|
|
|
|
EAPI Evas_Object *
|
|
|
|
elm_route_add(Evas_Object *parent)
|
|
|
|
{
|
2012-05-16 12:50:04 -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);
|
2011-06-26 10:36:18 -07:00
|
|
|
}
|
|
|
|
|
2015-05-19 05:34:07 -07:00
|
|
|
EOLIAN static Eo *
|
2016-08-10 07:23:04 -07:00
|
|
|
_elm_route_efl_object_constructor(Eo *obj, Elm_Route_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);
|
2015-05-19 05:34:07 -07:00
|
|
|
|
|
|
|
return obj;
|
2012-11-25 22:32:53 -08:00
|
|
|
}
|
|
|
|
|
2014-03-26 01:19:34 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_route_emap_set(Eo *obj, Elm_Route_Data *sd, void *_emap)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
|
|
|
#ifdef ELM_EMAP
|
|
|
|
EMap_Route *emap = _emap;
|
|
|
|
|
2011-06-26 10:36:18 -07:00
|
|
|
EMap_Route_Node *node, *node_prev = NULL;
|
|
|
|
Evas_Object *o;
|
|
|
|
Eina_List *l;
|
|
|
|
|
2012-05-16 12:50:04 -07:00
|
|
|
sd->emap = emap;
|
2011-06-26 10:36:18 -07:00
|
|
|
|
|
|
|
_clear_route(obj);
|
|
|
|
|
2012-10-01 00:36:27 -07:00
|
|
|
EINA_LIST_FOREACH(emap_route_nodes_get(sd->emap), l, node)
|
2011-06-26 19:55:52 -07:00
|
|
|
{
|
2011-06-29 18:35:41 -07:00
|
|
|
if (node_prev)
|
2011-06-26 19:55:52 -07:00
|
|
|
{
|
|
|
|
Segment *segment = calloc(1, sizeof(Segment));
|
2012-05-16 12:50:04 -07:00
|
|
|
|
2011-06-26 19:55:52 -07:00
|
|
|
segment->node_start = node_prev;
|
|
|
|
segment->node_end = node;
|
|
|
|
|
|
|
|
o = evas_object_line_add(evas_object_evas_get(obj));
|
|
|
|
segment->obj = o;
|
|
|
|
evas_object_smart_member_add(o, obj);
|
|
|
|
|
|
|
|
segment->must_calc = EINA_TRUE;
|
|
|
|
|
2012-05-16 12:50:04 -07:00
|
|
|
_update_lon_lat_min_max
|
|
|
|
(obj, emap_route_node_lon_get(node_prev),
|
|
|
|
emap_route_node_lat_get(node_prev));
|
|
|
|
_update_lon_lat_min_max
|
|
|
|
(obj, emap_route_node_lon_get(node),
|
|
|
|
emap_route_node_lat_get(node));
|
2011-06-26 19:55:52 -07:00
|
|
|
|
2012-05-16 12:50:04 -07:00
|
|
|
sd->segments = eina_list_append(sd->segments, segment);
|
2011-06-26 19:55:52 -07:00
|
|
|
}
|
2012-05-16 12:50:04 -07:00
|
|
|
|
2011-06-26 19:55:52 -07:00
|
|
|
node_prev = node;
|
|
|
|
}
|
2011-06-26 10:36:18 -07:00
|
|
|
|
|
|
|
_sizing_eval(obj);
|
2012-11-25 22:32:53 -08:00
|
|
|
#else
|
|
|
|
(void)obj;
|
2014-03-26 01:19:34 -07:00
|
|
|
(void)sd;
|
2012-11-25 22:32:53 -08:00
|
|
|
(void)_emap;
|
2011-06-26 10:36:18 -07:00
|
|
|
#endif
|
2012-11-25 22:32:53 -08:00
|
|
|
}
|
2011-06-26 10:36:18 -07:00
|
|
|
|
2014-03-26 01:19:34 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_route_longitude_min_max_get(Eo *obj EINA_UNUSED, Elm_Route_Data *sd, double *min, double *max)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2012-05-16 12:50:04 -07:00
|
|
|
if (min) *min = sd->lon_min;
|
|
|
|
if (max) *max = sd->lon_max;
|
2011-06-26 10:36:18 -07:00
|
|
|
}
|
|
|
|
|
2014-03-26 01:19:34 -07:00
|
|
|
EOLIAN static void
|
|
|
|
_elm_route_latitude_min_max_get(Eo *obj EINA_UNUSED, Elm_Route_Data *sd, double *min, double *max)
|
2012-11-25 22:32:53 -08:00
|
|
|
{
|
2012-05-16 12:50:04 -07:00
|
|
|
if (min) *min = sd->lat_min;
|
|
|
|
if (max) *max = sd->lat_max;
|
2012-02-23 21:48:27 -08:00
|
|
|
}
|
2012-11-25 22:32:53 -08:00
|
|
|
|
2014-03-26 01:19:34 -07:00
|
|
|
EOLIAN static void
|
2016-08-10 07:23:04 -07:00
|
|
|
_elm_route_class_constructor(Efl_Class *klass)
|
2012-11-25 22:32:53 -08: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
|
|
|
}
|
2014-03-26 01:19:34 -07:00
|
|
|
|
2017-05-18 01:52:17 -07:00
|
|
|
/* Internal EO APIs and hidden overrides */
|
|
|
|
|
|
|
|
#define ELM_ROUTE_EXTRA_OPS \
|
|
|
|
EFL_CANVAS_GROUP_ADD_DEL_OPS(elm_route)
|
|
|
|
|
2014-03-26 01:19:34 -07:00
|
|
|
#include "elm_route.eo.c"
|