2 # include "elementary_config.h"
5 #include <Elementary.h>
8 #include "elm_widget_route.h"
10 #define MY_CLASS ELM_ROUTE_CLASS
12 #define MY_CLASS_NAME "Elm_Route"
13 #define MY_CLASS_NAME_LEGACY "elm_route"
16 _clear_route(Evas_Object *obj)
20 ELM_ROUTE_DATA_GET(obj, sd);
23 sd->lon_min = EMAP_LON_MAX;
24 sd->lon_max = EMAP_LON_MIN;
25 sd->lat_min = EMAP_LAT_MAX;
26 sd->lat_max = EMAP_LAT_MIN;
29 EINA_LIST_FREE(sd->segments, segment)
31 evas_object_del(segment->obj);
37 _sizing_eval(Evas_Object *obj)
41 Evas_Coord x, y, w, h;
42 Evas_Coord start_x, start_y, end_x, end_y;
44 ELM_ROUTE_DATA_GET(obj, sd);
46 evas_object_geometry_get(obj, &x, &y, &w, &h);
48 EINA_LIST_FOREACH(sd->segments, l, segment)
50 if (sd->must_calc_segments || segment->must_calc)
54 (emap_route_node_lon_get(segment->node_start) - sd->lon_min)
55 / (float)(sd->lon_max - sd->lon_min);
57 1 - (emap_route_node_lat_get(segment->node_start)
58 - sd->lat_min) / (float)(sd->lat_max - sd->lat_min);
60 (emap_route_node_lon_get(segment->node_end) - sd->lon_min)
61 / (float)(sd->lon_max - sd->lon_min);
63 1 - (emap_route_node_lat_get(segment->node_end)
64 - sd->lat_min) / (float)(sd->lat_max - sd->lat_min);
66 segment->must_calc = EINA_FALSE;
69 start_x = x + (int)(segment->start_x * w);
70 start_y = y + (int)(segment->start_y * h);
71 end_x = x + (int)(segment->end_x * w);
72 end_y = y + (int)(segment->end_y * h);
74 evas_object_line_xy_set(segment->obj, start_x, start_y, end_x, end_y);
77 sd->must_calc_segments = EINA_FALSE;
81 _move_resize_cb(void *data EINA_UNUSED,
84 void *event_info EINA_UNUSED)
89 EOLIAN static Eina_Bool
90 _elm_route_elm_widget_theme_apply(Eo *obj, Elm_Route_Data *sd EINA_UNUSED)
92 Eina_Bool int_ret = EINA_FALSE;
93 eo_do_super(obj, MY_CLASS, int_ret = elm_obj_widget_theme_apply());
94 if (!int_ret) return EINA_FALSE;
105 _update_lon_lat_min_max(Evas_Object *obj,
109 ELM_ROUTE_DATA_GET(obj, sd);
111 if (sd->lon_min > lon)
114 sd->must_calc_segments = EINA_TRUE;
116 if (sd->lat_min > lat)
119 sd->must_calc_segments = EINA_TRUE;
122 if (sd->lon_max < lon)
125 sd->must_calc_segments = EINA_TRUE;
127 if (sd->lat_max < lat)
130 sd->must_calc_segments = EINA_TRUE;
137 _elm_route_evas_object_smart_add(Eo *obj, Elm_Route_Data *priv)
140 eo_do_super(obj, MY_CLASS, evas_obj_smart_add());
141 elm_widget_sub_object_parent_add(obj);
142 elm_widget_can_focus_set(obj, EINA_FALSE);
144 evas_object_event_callback_add
145 (obj, EVAS_CALLBACK_MOVE, _move_resize_cb, obj);
146 evas_object_event_callback_add
147 (obj, EVAS_CALLBACK_RESIZE, _move_resize_cb, obj);
150 priv->lon_min = EMAP_LON_MAX;
151 priv->lon_max = EMAP_LON_MIN;
152 priv->lat_min = EMAP_LAT_MAX;
153 priv->lat_max = EMAP_LAT_MIN;
162 _elm_route_evas_object_smart_del(Eo *obj, Elm_Route_Data *_pd EINA_UNUSED)
166 eo_do_super(obj, MY_CLASS, evas_obj_smart_del());
170 * Add a new route to the parent
172 * @param parent The parent object
173 * @return The new object or NULL if it cannot be created
178 elm_route_add(Evas_Object *parent)
180 EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
181 Evas_Object *obj = eo_add(MY_CLASS, parent);
186 _elm_route_eo_base_constructor(Eo *obj, Elm_Route_Data *_pd EINA_UNUSED)
188 eo_do_super(obj, MY_CLASS, eo_constructor());
190 evas_obj_type_set(MY_CLASS_NAME_LEGACY));
194 _elm_route_emap_set(Eo *obj, Elm_Route_Data *sd, void *_emap)
197 EMap_Route *emap = _emap;
199 EMap_Route_Node *node, *node_prev = NULL;
207 EINA_LIST_FOREACH(emap_route_nodes_get(sd->emap), l, node)
211 Segment *segment = calloc(1, sizeof(Segment));
213 segment->node_start = node_prev;
214 segment->node_end = node;
216 o = evas_object_line_add(evas_object_evas_get(obj));
218 evas_object_smart_member_add(o, obj);
220 segment->must_calc = EINA_TRUE;
222 _update_lon_lat_min_max
223 (obj, emap_route_node_lon_get(node_prev),
224 emap_route_node_lat_get(node_prev));
225 _update_lon_lat_min_max
226 (obj, emap_route_node_lon_get(node),
227 emap_route_node_lat_get(node));
229 sd->segments = eina_list_append(sd->segments, segment);
244 _elm_route_longitude_min_max_get(Eo *obj EINA_UNUSED, Elm_Route_Data *sd, double *min, double *max)
246 if (min) *min = sd->lon_min;
247 if (max) *max = sd->lon_max;
251 _elm_route_latitude_min_max_get(Eo *obj EINA_UNUSED, Elm_Route_Data *sd, double *min, double *max)
253 if (min) *min = sd->lat_min;
254 if (max) *max = sd->lat_max;
258 _elm_route_class_constructor(Eo_Class *klass)
260 evas_smart_legacy_type_register(MY_CLASS_NAME_LEGACY, klass);
263 #include "elm_route.eo.c"