elm_map: use emap

SVN revision: 60684
This commit is contained in:
Jonathan Atton 2011-06-25 14:30:10 +00:00
parent 8cf97b3ef8
commit 6b88bee7e5
6 changed files with 86 additions and 139 deletions

View File

@ -420,6 +420,36 @@ if test "x$want_elementary_eweather" = "xyes" -a "x$have_elementary_eweather" =
fi
AC_SUBST(ELM_EWEATHER_DEF)
ELM_EMAP_DEF="#undef"
have_elementary_emap="no"
want_elementary_emap="auto"
AC_ARG_ENABLE([emap],
[AC_HELP_STRING([--disable-emap], [disable emap support. @<:@default=detect@:>@])],
[want_elementary_emap=$enableval], [])
if test "x$want_elementary_emap" != "xno"; then
PKG_CHECK_MODULES([ELEMENTARY_EMAP],
[
emap
],
[
AC_DEFINE(HAVE_ELEMENTARY_EMAP, 1, [EMap support for Elementary])
have_elementary_emap="yes"
ELM_EMAP_DEF="#define"
requirement_elm="emap ${requirement_elm}"
],
[have_elementary_emap="no"]
)
else
have_elementary_emap="no"
fi
if test "x$want_elementary_emap" = "xyes" -a "x$have_elementary_emap" = "xno"; then
AC_MSG_ERROR([Emap support requested, but no emap found by pkg-config.])
fi
AC_SUBST(ELM_EMAP_DEF)
ELM_ETHUMB_DEF="#undef"
have_elementary_ethumb="no"
want_elementary_ethumb="auto"
@ -559,6 +589,7 @@ echo " Features:"
echo " EDBus..................: ${have_elementary_edbus}"
echo " EFreet.................: ${have_elementary_efreet}"
echo " EWeather...............: ${have_elementary_eweather}"
echo " EMap...................: ${have_elementary_emap}"
echo " Ethumb.................: ${have_elementary_ethumb}"
echo " Quick Launch...........: ${have_fork}"
echo " eio....................: ${have_eio}"

View File

@ -59,7 +59,12 @@ my_map_gpx_fileselector_done(void *data, Evas_Object *obj __UNUSED__, void *even
if (selected)
{
printf("Selected file: %s\n", selected);
track = elm_map_track_add(data, selected);
#ifdef HAVE_ELEMENTARY_EMAP
EMap_Route *emap = emap_route_gpx_new(selected);
track = elm_map_track_add(data, emap);
#else
printf("libEMap is required !\n");
#endif
}
evas_object_del(fs_win);
}

View File

@ -98,6 +98,10 @@ Pants
@ELM_ALLOCA_H_DEF@ ELM_ALLOCA_H
@ELM_LIBINTL_H_DEF@ ELM_LIBINTL_H
#ifdef HAVE_CONFIG_H
# include "elementary_config.h"
#endif
/* Standard headers for standard system calls etc. */
#include <stdio.h>
#include <stdlib.h>
@ -164,6 +168,10 @@ Pants
# include <Ethumb_Client.h>
#endif
#ifdef HAVE_ELEMENTARY_EMAP
# include <EMap.h>
#endif
#ifdef EAPI
# undef EAPI
#endif
@ -4161,7 +4169,9 @@ EAPI Elm_Genlist_Item *elm_genlist_item_sorted_insert(Evas_Object *obj, const El
EAPI void elm_map_rotate_get(const Evas_Object *obj, double *degree, Evas_Coord *cx, Evas_Coord *cy) EINA_ARG_NONNULL(1, 2, 3, 4);
EAPI void elm_map_wheel_disabled_set(Evas_Object *obj, Eina_Bool disabled) EINA_ARG_NONNULL(1);
EAPI Eina_Bool elm_map_wheel_disabled_get(const Evas_Object *obj) EINA_ARG_NONNULL(1);
EAPI Elm_Map_Track *elm_map_track_add(Evas_Object *obj, const char *gpx_file) EINA_ARG_NONNULL(1);
#ifdef HAVE_ELEMENTARY_EMAP
EAPI Elm_Map_Track *elm_map_track_add(Evas_Object *obj, EMap_Route *emap) EINA_ARG_NONNULL(1);
#endif
EAPI void elm_map_track_remove(Elm_Map_Track *track) EINA_ARG_NONNULL(1);
EAPI void elm_map_track_color_set(Elm_Map_Track *track, int r, int g , int b, int a) EINA_ARG_NONNULL(1);
EAPI void elm_map_track_color_get(const Elm_Map_Track *track, int *r, int *g , int *b, int *a) EINA_ARG_NONNULL(1);

View File

@ -21,6 +21,7 @@ AM_CPPFLAGS = \
@ELEMENTARY_EDBUS_CFLAGS@ \
@ELEMENTARY_EFREET_CFLAGS@ \
@ELEMENTARY_ETHUMB_CFLAGS@ \
@ELEMENTARY_EMAP_CFLAGS@ \
@EVIL_CFLAGS@ \
@EFL_PTHREAD_CFLAGS@
@ -130,6 +131,7 @@ libelementary_la_LIBADD = \
@ELEMENTARY_EDBUS_LIBS@ \
@ELEMENTARY_EFREET_LIBS@ \
@ELEMENTARY_ETHUMB_LIBS@ \
@ELEMENTARY_EMAP_LIBS@ \
@EVIL_LIBS@ \
@EFL_PTHREAD_LIBS@
libelementary_la_LDFLAGS = \

View File

@ -608,6 +608,10 @@ elm_quicklaunch_init(int argc,
eet_init();
ecore_init();
#ifdef HAVE_ELEMENTARY_EMAP
emap_init();
#endif
ecore_app_args_set(argc, (const char **)argv);
memset(_elm_policies, 0, sizeof(_elm_policies));
@ -745,6 +749,11 @@ elm_quicklaunch_shutdown(void)
_elm_unneed_e_dbus();
_elm_unneed_ethumb();
ecore_file_shutdown();
#ifdef HAVE_ELEMENTARY_EMAP
emap_shutdown();
#endif
ecore_shutdown();
eet_shutdown();

View File

@ -291,22 +291,13 @@ struct _Elm_Map_Track
{
Widget_Data *wd;
Path_Node *n;
Path_Waypoint *w;
#ifdef HAVE_ELEMENTARY_EMAP
EMap_Route *emap;
#endif
int x, y;
double flon, flat, tlon, tlat;
Eina_List *nodes, *path;
Eina_List *waypoint;
struct {
int node_count;
int waypoint_count;
const char *nodes;
const char *waypoints;
double distance; /* unit : km */
} info;
struct {
int r;
@ -840,15 +831,15 @@ obj_rotate_zoom(void *data, Evas_Object *obj)
static void
track_place(Evas_Object *obj, Grid *g __UNUSED__, Evas_Coord px, Evas_Coord py, Evas_Coord ox __UNUSED__, Evas_Coord oy __UNUSED__, Evas_Coord ow, Evas_Coord oh)
{
#ifdef HAVE_ELEMENTARY_EMAP
ELM_CHECK_WIDTYPE(obj, widtype);
Widget_Data *wd = elm_widget_data_get(obj);
Eina_List *lr, *lp, *ln;
Path_Node *n;
EMap_Route_Node *n;
Evas_Object *p;
Elm_Map_Track *t;
int nodes;
int x, y, rx, ry;
double a;
if (!wd) return;
Evas_Coord size = pow(2.0, wd->zoom)*wd->tsize;
@ -861,35 +852,29 @@ track_place(Evas_Object *obj, Grid *g __UNUSED__, Evas_Coord px, Evas_Coord py,
}
evas_object_geometry_get(wd->rect, &rx, &ry, NULL, NULL);
nodes = eina_list_count(t->nodes);
nodes = eina_list_count(emap_route_nodes_get(t->emap));
EINA_LIST_FOREACH(t->nodes, ln, n)
int i = 0;
EINA_LIST_FOREACH(emap_route_nodes_get(t->emap), ln, n)
{
if (t->inbound)
{
elm_map_utils_convert_geo_into_coord(wd->obj, n->pos.lon, n->pos.lat, size, &x, &y);
elm_map_utils_convert_geo_into_coord(wd->obj, emap_route_node_lon_get(n), emap_route_node_lat_get(n), size, &x, &y);
if ((x >= px - ow) && (x <= (px + ow*2)) &&
(y >= py - oh) && (y <= (py + oh*2)))
{
x = x - px + rx;
y = y - py + ry;
p = eina_list_nth(t->path, n->idx);
a = (double)(y - t->y) / (double)(x - t->x);
if ((abs(a) >= 1) || (t->x == x))
{
evas_object_polygon_point_add(p, t->x - 3, t->y);
evas_object_polygon_point_add(p, t->x + 3, t->y);
evas_object_polygon_point_add(p, x + 3, y);
evas_object_polygon_point_add(p, x - 3, y);
}
else
{
evas_object_polygon_point_add(p, t->x, t->y - 3);
evas_object_polygon_point_add(p, t->x, t->y + 3);
evas_object_polygon_point_add(p, x, y + 3);
evas_object_polygon_point_add(p, x, y - 3);
}
p = eina_list_nth(t->path, i);
if(!p)
{
p = evas_object_line_add(evas_object_evas_get(t->wd->obj));
evas_object_smart_member_add(p, t->wd->pan_smart);
t->path = eina_list_append(t->path, p);
}
evas_object_line_xy_set(p, t->x, t->y, x, y);
evas_object_color_set(p, t->color.r, t->color.g, t->color.b, t->color.a);
evas_object_raise(p);
@ -902,7 +887,7 @@ track_place(Evas_Object *obj, Grid *g __UNUSED__, Evas_Coord px, Evas_Coord py,
}
else
{
elm_map_utils_convert_geo_into_coord(wd->obj, n->pos.lon, n->pos.lat, size, &x, &y);
elm_map_utils_convert_geo_into_coord(wd->obj, emap_route_node_lon_get(n), emap_route_node_lat_get(n), size, &x, &y);
if ((x >= px - ow) && (x <= (px + ow*2)) &&
(y >= py - oh) && (y <= (py + oh*2)))
{
@ -912,9 +897,11 @@ track_place(Evas_Object *obj, Grid *g __UNUSED__, Evas_Coord px, Evas_Coord py,
}
else t->inbound = EINA_FALSE;
}
i++;
}
t->inbound = EINA_FALSE;
}
#endif
}
static void
route_place(Evas_Object *obj, Grid *g __UNUSED__, Evas_Coord px, Evas_Coord py, Evas_Coord ox __UNUSED__, Evas_Coord oy __UNUSED__, Evas_Coord ow, Evas_Coord oh)
@ -3211,66 +3198,6 @@ _utils_convert_name(const Evas_Object *obj, int method, char *address, double lo
}
static Eina_Bool
cb_dump_track_attr(void *data, const char *key, const char *value)
{
Track_Dump *dump = data;
Evas_Object *path;
double d;
if (!dump) return EINA_FALSE;
if (!strcmp(GPX_LON, key))
{
sscanf(value, "%lf", &d);
dump->lon = d;
}
else if (!strcmp(GPX_LAT, key))
{
sscanf(value, "%lf", &d);
dump->lat = d;
}
if ((dump->lon) && (dump->lat))
{
Path_Node *n = ELM_NEW(Path_Node);
if (n)
{
n->wd = dump->track->wd;
n->pos.lon = dump->lon;
n->pos.lat = dump->lat;
n->idx = dump->idx++;
INF("[%d] %lf:%lf", n->idx, dump->lon, dump->lat);
n->pos.address = NULL;
dump->track->nodes = eina_list_append(dump->track->nodes, n);
path = evas_object_polygon_add(evas_object_evas_get(dump->track->wd->obj));
evas_object_smart_member_add(path, dump->track->wd->pan_smart);
dump->track->path = eina_list_append(dump->track->path, path);
dump->lon = 0.0;
dump->lat = 0.0;
}
}
return EINA_TRUE;
}
static Eina_Bool
cb_track_dump(void *data, Eina_Simple_XML_Type type, const char *content, unsigned offset __UNUSED__, unsigned length __UNUSED__)
{
Track_Dump *d = data;
if (!d) return EINA_FALSE;
if (type == EINA_SIMPLE_XML_OPEN)
{
if (!strncmp(GPX_COORDINATES, content, strlen(GPX_COORDINATES)))
{
const char *tags = eina_simple_xml_tag_attributes_find(content, length);
eina_simple_xml_attributes_parse(tags, length - (tags - content), cb_dump_track_attr, d);
}
}
return EINA_TRUE;
}
static int idnum = 1;
/**
@ -5042,6 +4969,7 @@ elm_map_route_add(Evas_Object *obj,
return route;
}
/**
* Remove a route from the map
*
@ -5329,18 +5257,19 @@ elm_map_wheel_disabled_get(const Evas_Object *obj)
return wd->wheel_disabled;
}
#ifdef HAVE_ELEMENTARY_EMAP
/**
* Add a track on the map
*
* @param obj The map object
* @param gpx_file the name of the gpx file
* @param emap the emap object
*
* @return The Track object
*
* @ingroup Map
*/
EAPI Elm_Map_Track *
elm_map_track_add(Evas_Object *obj, const char *gpx_file)
elm_map_track_add(Evas_Object *obj, EMap_Route *emap)
{
ELM_CHECK_WIDTYPE(obj, widtype) NULL;
Widget_Data *wd = elm_widget_data_get(obj);
@ -5356,52 +5285,13 @@ elm_map_track_add(Evas_Object *obj, const char *gpx_file)
track->color.g = 0;
track->color.b = 255;
track->color.a = 255;
Track_Dump dump = {track, 0, 0.0, 0.0};
if (!wd->gpx_file) wd->gpx_file = eina_stringshare_add(gpx_file);
else eina_stringshare_replace(&wd->gpx_file, gpx_file);
f = fopen(gpx_file, "rb");
if (f)
{
long sz;
fseek(f, 0, SEEK_END);
sz = ftell(f);
if (sz > 0)
{
char *buf;
fseek(f, 0, SEEK_SET);
buf = malloc(sz);
if (buf)
{
if (fread(buf, 1, sz, f))
{
eina_simple_xml_parse(buf, sz, EINA_TRUE, cb_track_dump, &dump);
free(buf);
}
}
}
fclose(f);
}
else
{
ERR("can't open the file %s", gpx_file);
return NULL;
}
DBG("[Done] Load GPX file %s", gpx_file);
track->emap = emap;
wd->track = eina_list_append(wd->track, track);
if (wd->grids)
{
Evas_Coord ox, oy, ow, oh;
evas_object_geometry_get(wd->obj, &ox, &oy, &ow, &oh);
track_place(wd->obj, eina_list_data_get(wd->grids), wd->pan_x, wd->pan_y, ox, oy, ow, oh);
}
return track;
}
#endif
/**
* Remove a track from the map