static Elm_Map_Marker *route_from, *route_to;
static Elm_Map_Route *route;
static Elm_Map_Name *name;
-static Elm_Map_Track *track;
+static Evas_Object *track;
static const char **source_names = NULL;
static Evas_Coord old_x, old_y;
static Evas_Coord old_d;
}
static void
-map_show_seoul(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+map_show_urmatt(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
{
Eina_Bool b = elm_map_paused_get(data);
elm_map_paused_set(data, EINA_TRUE);
elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_MANUAL);
- elm_map_geo_region_show(data, 126.977969, 37.566535);
- elm_map_zoom_set(data, 18);
+ elm_map_geo_region_show(data,7.325201, 48.526813);
+ elm_map_zoom_set(data, 12);
elm_map_paused_set(data, b);
}
static void
map_track_remove(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
{
- elm_map_track_remove(track);
+ elm_map_track_remove(data, track);
}
static void
menu = elm_menu_add(obj);
item = elm_menu_item_add(menu, NULL, NULL, "Source", NULL, NULL);
_populate(data, item);
- elm_menu_item_add(menu, NULL, NULL, "Show Seoul", map_show_seoul, data);
+ elm_menu_item_add(menu, NULL, NULL, "Show Urmatt", map_show_urmatt, data);
elm_menu_item_add(menu, NULL, NULL, "Bring Seoul", map_bring_seoul, data);
elm_menu_item_add(menu, NULL, NULL, "Paused Set", map_paused_set, data);
elm_menu_item_add(menu, NULL, NULL, "Paused Unset", map_paused_unset, data);
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);
#ifdef ELM_EMAP
- EAPI Elm_Map_Track *elm_map_track_add(Evas_Object *obj, EMap_Route *emap) EINA_ARG_NONNULL(1);
- EAPI EMap_Route *elm_map_track_emap_get(Elm_Map_Track *track) EINA_ARG_NONNULL(1);
+ EAPI Evas_Object *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);
+ EAPI void elm_map_track_remove(Evas_Object *obj, Evas_Object *route) EINA_ARG_NONNULL(1);
/* smart callbacks called:
* "clicked" - when image clicked
* "scroll,drag,stop" - dragging the contents around has stopped
*/
+ /* Route */
+ EAPI Evas_Object *elm_route_add(Evas_Object *parent);
+#ifdef ELM_EMAP
+ EAPI Eina_Bool elm_route_emap_set(Evas_Object *obj, EMap_Route *emap);
+#endif
+ EAPI double elm_route_lon_min_get(Evas_Object *obj);
+ EAPI double elm_route_lat_min_get(Evas_Object *obj);
+ EAPI double elm_route_lon_max_get(Evas_Object *obj);
+ EAPI double elm_route_lat_max_get(Evas_Object *obj);
+
+
/* panel */
typedef enum _Elm_Panel_Orient
{
elm_main.c \
elm_mapbuf.c \
elm_map.c \
+elm_route.c \
elm_menu.c \
elm_module.c \
elm_notify.c \
Ecore_Event_Handler *handler;
};
-struct _Elm_Map_Track
-{
- Widget_Data *wd;
-
-#ifdef ELM_EMAP
- EMap_Route *emap;
-#endif
-
- int x, y;
-
- Eina_List *nodes, *path;
-
- struct {
- int r;
- int g;
- int b;
- int a;
- } color;
-
- Eina_Bool inbound : 1;
-};
-
struct _Grid_Item
{
Widget_Data *wd;
ZOOM_METHOD_LAST
} Zoom_Mode;
-struct _Track_Dump
-{
- Elm_Map_Track *track;
- int idx;
- double lon;
- double lat;
-};
-
enum _Track_Xml_Attribute
{
TRACK_XML_NONE,
#ifdef ELM_EMAP
ELM_CHECK_WIDTYPE(obj, widtype);
Widget_Data *wd = elm_widget_data_get(obj);
- Eina_List *lr, *lp, *ln;
- EMap_Route_Node *n;
- Evas_Object *p;
- Elm_Map_Track *t;
- int nodes;
- int x, y, rx, ry;
+ Eina_List *l;
+ Evas_Object *route;
+ int xmin, xmax, ymin, ymax;
if (!wd) return;
Evas_Coord size = pow(2.0, wd->zoom)*wd->tsize;
- EINA_LIST_FOREACH(wd->track, lr, t)
+ EINA_LIST_FOREACH(wd->track, l, route)
{
- EINA_LIST_FOREACH(t->path, lp, p)
- {
- evas_object_polygon_points_clear(p);
- }
-
- evas_object_geometry_get(wd->rect, &rx, &ry, NULL, NULL);
- nodes = eina_list_count(emap_route_nodes_get(t->emap));
-
- 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, 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, 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);
- }
+ elm_map_utils_convert_geo_into_coord(wd->obj, elm_route_lon_min_get(route), elm_route_lat_max_get(route), size, &xmin, &ymin);
+ elm_map_utils_convert_geo_into_coord(wd->obj, elm_route_lon_max_get(route), elm_route_lat_min_get(route), size, &xmax, &ymax);
- 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);
- obj_rotate_zoom(obj, p);
- evas_object_show(p);
- t->x = x;
- t->y = y;
- }
- else t->inbound = EINA_FALSE;
- }
- else
- {
- 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)))
- {
- t->x = x - px + rx;
- t->y = y - py + ry;
- t->inbound = EINA_TRUE;
- }
- else t->inbound = EINA_FALSE;
- }
- i++;
- }
- t->inbound = EINA_FALSE;
+ if( !(xmin < px && xmax < px) && !(xmin > px+ow && xmax > px+ow))
+ {
+ if( !(ymin < py && ymax < py) && !(ymin > py+oh && ymax > py+oh))
+ {
+ //display the route
+ evas_object_move(route, xmin - px + ox, ymin - py + oy);
+ evas_object_resize(route, xmax - xmin, ymax - ymin);
+
+ evas_object_raise(route);
+ obj_rotate_zoom(obj, route);
+ evas_object_show(route);
+
+ continue;
+ }
+ }
+ //the route is not display
+ evas_object_hide(route);
}
#endif
}
Ecore_Event_Handler *h;
Elm_Map_Route *r;
Elm_Map_Name *na;
- Elm_Map_Track *t;
+ Evas_Object *route;
if (!wd) return;
EINA_LIST_FREE(wd->groups_clas, group_clas)
}
}
- EINA_LIST_FOREACH(wd->track, l, t)
+ EINA_LIST_FREE(wd->track, route)
{
- EINA_LIST_FREE(t->path, p)
- {
- evas_object_del(p);
- }
-
- EINA_LIST_FREE(t->nodes, n)
- {
- if (n->pos.address) eina_stringshare_del(n->pos.address);
- free(n);
- }
+ evas_object_del(route);
}
if (wd->map) evas_map_free(wd->map);
Evas_Coord rx, ry, rw, rh;
Evas_Object *p;
Elm_Map_Route *r;
- Elm_Map_Track *t;
+ Evas_Object *route;
int z = 0, zoom_changed = 0, started = 0;
if ((!wd) || (!wd->src) || (wd->zoom_animator)) return;
}
}
- EINA_LIST_FOREACH(wd->track, l, t)
+ EINA_LIST_FOREACH(wd->track, l, route)
{
- if (t)
- {
- EINA_LIST_FOREACH(t->path, l, p)
- {
- evas_object_polygon_points_clear(p);
- }
- }
+ evas_object_hide(route);
}
if (wd->mode != ELM_MAP_ZOOM_MODE_MANUAL)
* @param obj The map object
* @param emap the emap object
*
- * @return The Track object
+ * @return The Route object. This is a elm object of type Elm_Route
*
* @ingroup Map
*/
-EAPI Elm_Map_Track *
+EAPI Evas_Object *
elm_map_track_add(Evas_Object *obj, EMap_Route *emap)
{
ELM_CHECK_WIDTYPE(obj, widtype) NULL;
Widget_Data *wd = elm_widget_data_get(obj);
- FILE *f;
if (!wd) return EINA_FALSE;
- Elm_Map_Track *track = ELM_NEW(Elm_Map_Track);
- if (!track) return NULL;
- track->wd = wd;
- track->inbound = EINA_FALSE;
- track->color.r = 0;
- track->color.g = 0;
- track->color.b = 255;
- track->color.a = 255;
- track->emap = emap;
-
- wd->track = eina_list_append(wd->track, track);
+ Evas_Object *route = elm_route_add(obj);
+ elm_route_emap_set(route, emap);
+ wd->track = eina_list_append(wd->track, route);
- return track;
+ return route;
}
-
-EMap_Route
-*elm_map_track_emap_get(Elm_Map_Track *track)
-{
- return track->emap;
-}
#endif
/**
*/
EAPI void
-elm_map_track_remove(Elm_Map_Track *track)
+elm_map_track_remove(Evas_Object *obj, Evas_Object *route)
{
- EINA_SAFETY_ON_NULL_RETURN(track);
-
- Path_Node *n;
- Evas_Object *p;
-
- EINA_LIST_FREE(track->path, p)
- {
- evas_object_del(p);
- }
-
- EINA_LIST_FREE(track->nodes, n)
- {
- if (n->pos.address) eina_stringshare_del(n->pos.address);
- free(n);
- }
-}
+ ELM_CHECK_WIDTYPE(obj, widtype) ;
+ Widget_Data *wd = elm_widget_data_get(obj);
-/**
- * Set the option used for the background color
- *
- * @param track The track object
- * @param r
- * @param g
- * @param b
- * @param a
- *
- * This sets the color used for the track
- *
- * @ingroup Map
- */
-EAPI void
-elm_map_track_color_set(Elm_Map_Track *track, int r, int g , int b, int a)
-{
- EINA_SAFETY_ON_NULL_RETURN(track);
- track->color.r = r;
- track->color.g = g;
- track->color.b = b;
- track->color.a = a;
-}
+ if (!wd) return ;
-/**
- * Get the option used for the background color
- *
- * @param track The track object
- * @param r
- * @param g
- * @param b
- * @param a
- *
- * @ingroup Map
- */
-EAPI void
-elm_map_track_color_get(const Elm_Map_Track *track, int *r, int *g , int *b, int *a)
-{
- EINA_SAFETY_ON_NULL_RETURN(track);
- if (r) *r = track->color.r;
- if (g) *g = track->color.g;
- if (b) *b = track->color.b;
- if (a) *a = track->color.a;
+ wd->track = eina_list_remove(wd->track, route);
+ evas_object_del(route);
}
static char *
{
char buf[PATH_MAX];
snprintf(buf, sizeof(buf), "http://tile.openstreetmap.org/%d/%d/%d.png",
- zoom, x, y);
+ zoom, x, y);
return strdup(buf);
}
--- /dev/null
+#include <Elementary.h>
+#include "elm_priv.h"
+
+/**
+ * @defgroup Route MapRoute
+ *
+ * For displaying a route on the map widget
+ *
+ */
+
+typedef struct _Widget_Data Widget_Data;
+typedef struct Segment Segment;
+
+struct _Widget_Data
+{
+ Evas_Object *obj;
+#ifdef ELM_EMAP
+ EMap_Route *emap;
+#endif
+
+ double lon_min, lon_max;
+ double lat_min, lat_max;
+
+ Eina_List *segments; //list of *Segment
+
+ Eina_Bool must_calc_segments :1;
+};
+
+struct Segment
+{
+ Evas_Object *obj;
+
+#ifdef ELM_EMAP
+ EMap_Route_Node *node_start;
+ EMap_Route_Node *node_end;
+#endif
+
+ double start_x, start_y;
+ double end_x, end_y;
+
+ Eina_Bool must_calc :1;
+};
+
+static const char *widtype = NULL;
+static void _del_hook(Evas_Object *obj);
+static void _mirrored_set(Evas_Object *obj, Eina_Bool rtl);
+static void _theme_hook(Evas_Object *obj);
+static void _sizing_eval(Evas_Object *obj);
+static void _clear_route(Evas_Object *obj);
+static void _update_lon_lat_min_max(Evas_Object *obj, double lon, double lat);
+
+static void
+_del_hook(Evas_Object *obj)
+{
+ Evas_Object *segment;
+ Widget_Data *wd = elm_widget_data_get(obj);
+ if (!wd) return;
+
+ _clear_route(obj);
+
+ free(wd);
+}
+
+static void
+_resize_cb(void *data __UNUSED__ , Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
+{
+ _sizing_eval(obj);
+}
+
+static void
+_mirrored_set(Evas_Object *obj, Eina_Bool rtl)
+{
+ Widget_Data *wd = elm_widget_data_get(obj);
+ if (!wd) return;
+}
+
+static void
+_theme_hook(Evas_Object *obj)
+{
+ Widget_Data *wd = elm_widget_data_get(obj);
+ if (!wd) return;
+ //TODO
+ _sizing_eval(obj);
+}
+
+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;
+
+ Widget_Data *wd = elm_widget_data_get(obj);
+ evas_object_geometry_get(obj, &x, &y, &w, &h);
+
+ EINA_LIST_FOREACH(wd->segments, l, segment)
+ {
+ if(wd->must_calc_segments || segment->must_calc)
+ {
+
+#ifdef ELM_EMAP
+ segment->start_x = (emap_route_node_lon_get(segment->node_start)- wd->lon_min) / (float)(wd->lon_max - wd->lon_min);
+ segment->start_y = 1 - (emap_route_node_lat_get(segment->node_start) - wd->lat_min) / (float)(wd->lat_max - wd->lat_min);
+ segment->end_x = (emap_route_node_lon_get(segment->node_end) - wd->lon_min) / (float)(wd->lon_max - wd->lon_min);
+ segment->end_y = 1 - (emap_route_node_lat_get(segment->node_end) - wd->lat_min) / (float)(wd->lat_max - wd->lat_min);
+#endif
+ segment->must_calc = EINA_FALSE;
+ }
+
+ 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);
+ evas_object_line_xy_set(segment->obj, start_x, start_y, end_x, end_y);
+ }
+
+ wd->must_calc_segments = EINA_FALSE;
+}
+
+static void
+_clear_route(Evas_Object *obj)
+{
+ Segment *segment;
+ Widget_Data *wd = elm_widget_data_get(obj);
+ if (!wd) return;
+
+#ifdef ELM_EMAP
+ wd->lon_min = EMAP_LON_MAX;
+ wd->lon_max = EMAP_LON_MIN;
+ wd->lat_min = EMAP_LAT_MAX;
+ wd->lat_max = EMAP_LAT_MIN;
+#endif
+
+ EINA_LIST_FREE(wd->segments, segment)
+ {
+ evas_object_del(segment->obj);
+ free(segment);
+ }
+}
+
+static void
+_update_lon_lat_min_max(Evas_Object *obj, double lon, double lat)
+{
+ Widget_Data *wd = elm_widget_data_get(obj);
+
+ if(wd->lon_min > lon)
+ {
+ wd->lon_min = lon;
+ wd->must_calc_segments = EINA_TRUE;
+ }
+ if(wd->lat_min > lat)
+ {
+ wd->lat_min = lat;
+ wd->must_calc_segments = EINA_TRUE;
+ }
+
+ if(wd->lon_max < lon)
+ {
+ wd->lon_max = lon;
+ wd->must_calc_segments = EINA_TRUE;
+ }
+ if(wd->lat_max < lat)
+ {
+ wd->lat_max = lat;
+ wd->must_calc_segments = EINA_TRUE;
+ }
+}
+
+/**
+ * Add a new route to the parent
+ *
+ * @param parent The parent object
+ * @return The new object or NULL if it cannot be created
+ *
+ * @ingroup Route
+ */
+EAPI Evas_Object *
+elm_route_add(Evas_Object *parent)
+{
+ Evas_Object *obj;
+ Evas *e;
+ Widget_Data *wd;
+ Evas_Object *icon;
+
+ ELM_WIDGET_STANDARD_SETUP(wd, Widget_Data, parent, e, obj, NULL);
+
+ ELM_SET_WIDTYPE(widtype, "map_route");
+ elm_widget_type_set(obj, "map_route");
+ elm_widget_sub_object_add(parent, obj);
+ elm_widget_data_set(obj, wd);
+ elm_widget_del_hook_set(obj, _del_hook);
+ elm_widget_theme_hook_set(obj, _theme_hook);
+ elm_widget_can_focus_set(obj, EINA_FALSE);
+
+ evas_object_event_callback_add(obj, EVAS_CALLBACK_MOVE,
+ _resize_cb, obj);
+ evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE,
+ _resize_cb, obj);
+
+#ifdef ELM_EMAP
+ wd->lon_min = EMAP_LON_MAX;
+ wd->lon_max = EMAP_LON_MIN;
+ wd->lat_min = EMAP_LAT_MAX;
+ wd->lat_max = EMAP_LAT_MIN;
+#endif
+
+ _mirrored_set(obj, elm_widget_mirrored_get(obj));
+ _sizing_eval(obj);
+ return obj;
+}
+
+#ifdef ELM_EMAP
+/**
+ * Set the emap object which describes the route
+ *
+ * @param obj The photo object
+ * @param emap the route
+ *
+ * @return (1 = success, 0 = error)
+ *
+ * @ingroup Route
+ */
+EAPI Eina_Bool
+elm_route_emap_set(Evas_Object *obj, EMap_Route *emap)
+{
+ EMap_Route_Node *node, *node_prev = NULL;
+ Evas_Object *o;
+ Eina_List *l;
+
+ ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
+ Widget_Data *wd = elm_widget_data_get(obj);
+
+ if (!wd) return EINA_FALSE;
+ wd->emap = emap;
+
+ _clear_route(obj);
+
+ EINA_LIST_FOREACH(emap_route_nodes_get(wd->emap), l, node)
+ {
+ if(node_prev)
+ {
+ Segment *segment = calloc(1, sizeof(Segment));
+ 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);
+ evas_object_show(o);
+
+ segment->must_calc = EINA_TRUE;
+
+ _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));
+
+ wd->segments = eina_list_append(wd->segments, segment);
+ }
+ node_prev = node;
+ }
+
+ _sizing_eval(obj);
+}
+#endif
+
+EAPI double
+elm_route_lon_min_get(Evas_Object *obj)
+{
+ ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
+ Widget_Data *wd = elm_widget_data_get(obj);
+ return wd->lon_min;
+}
+
+EAPI double
+elm_route_lat_min_get(Evas_Object *obj)
+{
+ ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
+ Widget_Data *wd = elm_widget_data_get(obj);
+ return wd->lat_min;
+}
+
+EAPI double
+elm_route_lon_max_get(Evas_Object *obj)
+{
+ ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
+ Widget_Data *wd = elm_widget_data_get(obj);
+ return wd->lon_max;
+}
+
+EAPI double
+elm_route_lat_max_get(Evas_Object *obj)
+{
+ ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
+ Widget_Data *wd = elm_widget_data_get(obj);
+ return wd->lat_max;
+}
+
+/* vim:set ts=8 sw=3 sts=3 expandtab cino=>5n-2f0^-2{2(0W1st0 :*/