1 #ifndef ELM_WIDGET_MAP_H 2 #define ELM_WIDGET_MAP_H 3 4 #include "Elementary.h" 5 6 /* DO NOT USE THIS HEADER UNLESS YOU ARE PREPARED FOR BREAKING OF YOUR 7 * CODE. THIS IS ELEMENTARY'S INTERNAL WIDGET API (for now) AND IS NOT 8 * FINAL. CALL elm_widget_api_check(ELM_INTERNAL_API_VERSION) TO CHECK 9 * IT AT RUNTIME. 10 */ 11 12 /** 13 * @addtogroup Widget 14 * @{ 15 * 16 * @section elm-map-class The Elementary Map Class 17 * 18 * Elementary, besides having the @ref Map widget, exposes its 19 * foundation -- the Elementary Map Class -- in order to create 20 * other widgets which are a map with some more logic on top. 21 */ 22 23 /** 24 * Base widget smart data extended with map instance data. 25 */ 26 typedef struct _Elm_Map_Data Elm_Map_Data; 27 28 typedef struct _Elm_Map_Name_List Elm_Map_Name_List; 29 typedef Eina_Stringshare *(*Elm_Map_Module_Source_Name_Func)(void); 30 typedef int (*Elm_Map_Module_Tile_Zoom_Min_Func)(void); 31 typedef int (*Elm_Map_Module_Tile_Zoom_Max_Func)(void); 32 typedef char *(*Elm_Map_Module_Tile_Url_Func)(const Evas_Object *, 33 int, 34 int, 35 int); 36 typedef Eina_Bool (*Elm_Map_Module_Tile_Geo_to_Coord_Func)(const Evas_Object *, 37 int, 38 double, 39 double, 40 int, 41 int *, 42 int *); 43 typedef Eina_Bool (*Elm_Map_Module_Tile_Coord_to_Geo_Func)(const Evas_Object *, 44 int, 45 int, 46 int, 47 int, 48 double *, 49 double *); 50 typedef double (*Elm_Map_Module_Tile_Scale_Func)(const Evas_Object *, 51 double, 52 double, 53 int); 54 typedef Evas_Object *(*Elm_Map_Module_Tile_Copyright_Func)(Evas_Object *); 55 typedef char *(*Elm_Map_Module_Route_Url_Func)(const Evas_Object *, 56 const char *, 57 int, 58 double, 59 double, 60 double, 61 double); 62 typedef void (*Elm_Map_Module_Route_Parse_Func)(Elm_Map_Route *); 63 typedef char *(*Elm_Map_Module_Name_Url_Func)(const Evas_Object *, 64 int, 65 const char *, 66 double, 67 double); 68 typedef void (*Elm_Map_Module_Name_Parse_Func)(Elm_Map_Name *n); 69 typedef void (*Elm_Map_Module_Name_List_Parse_Func)(Elm_Map_Name_List *nl); 70 71 typedef struct _Source_Tile Source_Tile; 72 // FIXME: Currently tile size must be 256*256 73 // and the map size is pow(2.0, z) * (tile size) 74 struct _Source_Tile 75 { 76 Eina_Stringshare *name; 77 int zoom_min; 78 int zoom_max; 79 Elm_Map_Module_Tile_Url_Func url_cb; 80 Elm_Map_Module_Tile_Geo_to_Coord_Func geo_to_coord; 81 Elm_Map_Module_Tile_Coord_to_Geo_Func coord_to_geo; 82 Elm_Map_Module_Tile_Scale_Func scale_cb; 83 Elm_Map_Module_Tile_Copyright_Func copyright_cb; 84 }; 85 86 typedef struct _Source_Route Source_Route; 87 struct _Source_Route 88 { 89 Eina_Stringshare *name; 90 Elm_Map_Module_Route_Url_Func url_cb; 91 Elm_Map_Module_Route_Parse_Func route_parse_cb; 92 }; 93 94 typedef struct _Source_Name Source_Name; 95 struct _Source_Name 96 { 97 Eina_Stringshare *name; 98 Elm_Map_Module_Name_Url_Func url_cb; 99 Elm_Map_Module_Name_Parse_Func name_parse_cb; 100 Elm_Map_Module_Name_List_Parse_Func name_list_parse_cb; 101 }; 102 103 typedef struct _Path Path; 104 typedef struct _Color Color; 105 typedef struct _Region Region; 106 typedef struct _Grid Grid; 107 typedef struct _Grid_Item Grid_Item; 108 typedef struct _Overlay_Default Overlay_Default; 109 typedef struct _Overlay_Class Overlay_Class; 110 typedef struct _Overlay_Group Overlay_Group; 111 typedef struct _Overlay_Bubble Overlay_Bubble; 112 typedef struct _Overlay_Route Overlay_Route; 113 typedef struct _Overlay_Line Overlay_Line; 114 typedef struct _Overlay_Polygon Overlay_Polygon; 115 typedef struct _Overlay_Circle Overlay_Circle; 116 typedef struct _Overlay_Scale Overlay_Scale; 117 typedef struct _Path_Node Path_Node; 118 typedef struct _Path_Waypoint Path_Waypoint; 119 typedef struct _Route_Dump Route_Dump; 120 typedef struct _Name_Dump Name_Dump; 121 typedef struct _Calc_Job Calc_Job; 122 123 enum _Route_Xml_Attribute 124 { 125 ROUTE_XML_NONE, 126 ROUTE_XML_DISTANCE, 127 ROUTE_XML_DESCRIPTION, 128 ROUTE_XML_COORDINATES, 129 ROUTE_XML_LAST 130 } Route_Xml_Attibute; 131 132 enum _Name_Xml_Attribute 133 { 134 NAME_XML_NONE, 135 NAME_XML_NAME, 136 NAME_XML_LON, 137 NAME_XML_LAT, 138 NAME_XML_LAST 139 } Name_Xml_Attibute; 140 141 enum _Track_Xml_Attribute 142 { 143 TRACK_XML_NONE, 144 TRACK_XML_COORDINATES, 145 TRACK_XML_LAST 146 } Track_Xml_Attibute; 147 148 struct _Path 149 { 150 Evas_Coord x, y; 151 }; 152 153 struct _Region 154 { 155 double lon, lat; 156 }; 157 158 struct _Color 159 { 160 int r, g, b, a; 161 }; 162 163 struct _Overlay_Group 164 { 165 Elm_Map_Data *wsd; 166 double lon, lat; 167 Elm_Map_Overlay *overlay; // virtual group type overlay 168 Elm_Map_Overlay *klass; // class overlay for this virtual group 169 Overlay_Default *ovl; // rendered overlay 170 Eina_List *members; 171 Eina_Bool in : 1; 172 Eina_Bool boss : 1; 173 }; 174 175 struct _Overlay_Default 176 { 177 Elm_Map_Data *wsd; 178 Evas_Coord w, h; 179 180 double lon, lat; 181 Evas_Coord x, y; 182 183 // Display priority is content > icon > clas_obj > clas_icon > layout 184 Evas_Object *content; 185 Evas_Object *icon; 186 187 Color c; 188 // if clas_content or icon exists, do not inherit from class 189 Evas_Object *clas_content; // Duplicated from class content 190 Evas_Object *clas_icon; // Duplicated from class icon 191 Evas_Object *layout; 192 }; 193 194 struct _Overlay_Class 195 { 196 Elm_Map_Data *wsd; 197 Eina_List *members; 198 int zoom_max; 199 Evas_Object *content; 200 Evas_Object *icon; 201 }; 202 203 struct _Overlay_Bubble 204 { 205 Elm_Map_Data *wsd; 206 Evas_Object *pobj; 207 Evas_Object *obj, *sc, *bx; 208 double lon, lat; 209 Evas_Coord x, y, w, h; 210 }; 211 212 struct _Overlay_Route 213 { 214 Elm_Map_Data *wsd; 215 216 Evas_Object *obj; 217 Eina_List *paths; 218 Eina_List *nodes; 219 }; 220 221 struct _Overlay_Line 222 { 223 Elm_Map_Data *wsd; 224 double flon, flat, tlon, tlat; 225 Evas_Object *obj; 226 }; 227 228 struct _Overlay_Polygon 229 { 230 Elm_Map_Data *wsd; 231 Eina_List *regions; // list of Regions 232 Evas_Object *obj; 233 }; 234 235 struct _Overlay_Circle 236 { 237 Elm_Map_Data *wsd; 238 double lon, lat; 239 double radius; // Initial pixel in initial view 240 double ratio; // initial-radius/map-size 241 Evas_Object *obj; 242 }; 243 244 struct _Overlay_Scale 245 { 246 Elm_Map_Data *wsd; 247 Evas_Coord x, y; 248 Evas_Coord w, h; 249 Evas_Object *obj; 250 }; 251 252 struct _Elm_Map_Overlay 253 { 254 Elm_Map_Data *wsd; 255 256 Evas_Coord zoom_min; 257 Color c; 258 void *data; // user set data 259 260 Elm_Map_Overlay_Type type; 261 void *ovl; // Overlay Data for each type 262 263 Elm_Map_Overlay_Get_Cb cb; 264 void *cb_data; 265 266 Elm_Map_Overlay_Del_Cb del_cb; 267 void *del_cb_data; 268 269 // These are not used if overlay type is class or group 270 Overlay_Group *grp; 271 272 Eina_Bool visible : 1; 273 Eina_Bool paused : 1; 274 Eina_Bool hide : 1; 275 }; 276 277 struct _Elm_Map_Route 278 { 279 Elm_Map_Data *wsd; 280 281 char *fname; 282 Elm_Map_Route_Type type; 283 Elm_Map_Route_Method method; 284 double flon, flat, tlon, tlat; 285 Elm_Map_Route_Cb cb; 286 void *data; 287 Ecore_File_Download_Job *job; 288 289 Eina_List *nodes; 290 Eina_List *waypoint; 291 struct 292 { 293 int node_count; 294 int waypoint_count; 295 const char *nodes; 296 const char *waypoints; 297 double distance; /* unit : km */ 298 } info; 299 300 Path_Node *n; 301 Path_Waypoint *w; 302 }; 303 304 struct _Path_Node 305 { 306 Elm_Map_Data *wsd; 307 308 int idx; 309 struct 310 { 311 double lon, lat; 312 char *address; 313 } pos; 314 }; 315 316 struct _Path_Waypoint 317 { 318 Elm_Map_Data *wsd; 319 320 const char *point; 321 }; 322 323 struct _Elm_Map_Name 324 { 325 Elm_Map_Data *wsd; 326 327 int method; 328 char *address; 329 double lon, lat; 330 331 char *fname; 332 Ecore_File_Download_Job *job; 333 Elm_Map_Name_Cb cb; 334 void *data; 335 }; 336 337 struct _Elm_Map_Name_List 338 { 339 Elm_Map_Data *wsd; 340 341 Eina_List *names; 342 double lon, lat; 343 344 char *fname; 345 Ecore_File_Download_Job *job; 346 Elm_Map_Name_List_Cb cb; 347 void *data; 348 }; 349 350 struct _Route_Dump 351 { 352 int id; 353 char *fname; 354 double distance; 355 char *description; 356 char *coordinates; 357 }; 358 359 struct _Name_Dump 360 { 361 int id; 362 char *address; 363 double lon; 364 double lat; 365 }; 366 367 struct _Grid_Item 368 { 369 Grid *g; 370 371 Elm_Map_Data *wsd; 372 Evas_Object *img; 373 const char *file; 374 const char *url; 375 int x, y; // Tile coordinate 376 377 Ecore_File_Download_Job *job; 378 379 Eina_Bool file_have : 1; 380 }; 381 382 struct _Grid 383 { 384 Elm_Map_Data *wsd; 385 int zoom; /* zoom level tiles want for optimal 386 * display (1, 2, 4, 8) */ 387 int tw, th; // size of grid in tiles 388 Eina_Matrixsparse *grid; 389 }; 390 391 struct _Calc_Job 392 { 393 double zoom; 394 void (*zoom_mode_set)(Elm_Map_Data *sd, double zoom); 395 396 Eina_Bool bring_in : 1; 397 double lon, lat; 398 void (*region_show_bring_in)(Elm_Map_Data *sd, double lon, 399 double lat, Eina_Bool bring_in); 400 401 Eina_List *overlays; 402 void (*overlays_show)(Elm_Map_Data *sd, Eina_List *overlays); 403 }; 404 405 struct _Elm_Map_Data 406 { 407 Evas_Object *hit_rect; 408 Evas_Object *pan_obj; 409 Evas_Object *g_layer; 410 Evas_Object *obj; // The object itself 411 412 /* Tiles are below this and overlays are on top */ 413 Evas_Object *sep_maps_overlays; 414 Evas_Map *map; 415 416 Eina_Array *src_mods; 417 418 Source_Tile *src_tile; 419 Eina_List *src_tiles; 420 const char **src_tile_names; 421 422 Source_Route *src_route; 423 Eina_List *src_routes; 424 const char **src_route_names; 425 426 Source_Name *src_name; 427 Eina_List *src_names; 428 const char **src_name_names; 429 430 Eina_List *grids; 431 432 int zoom_min, zoom_max; 433 int tsize; 434 int id; 435 int zoom; 436 437 double zoom_detail; 438 struct 439 { 440 int w, h; // Current pixel width, heigth of a grid 441 int tile; // Current pixel size of a grid item 442 } size; 443 444 Efl_Ui_Zoom_Mode mode; 445 446 struct 447 { 448 double zoom; 449 double zoom_diff; 450 double lon, lat; 451 double lon_diff, lat_diff; 452 int zoom_cnt; 453 int region_cnt; 454 } ani; 455 456 Ecore_Timer *zoom_timer; 457 Ecore_Timer *loaded_timer; 458 459 int try_num; 460 int finish_num; 461 int download_num; 462 463 Eina_List *download_list; 464 Ecore_Idler *download_idler; 465 Eina_Hash *ua; 466 const char *user_agent; 467 468 Evas_Coord pan_x, pan_y; 469 470 Ecore_Timer *scr_timer; 471 Ecore_Timer *long_timer; 472 Evas_Event_Mouse_Down ev; 473 474 double pinch_zoom; 475 struct 476 { 477 Evas_Coord cx, cy; 478 double a, d; 479 } rotate; 480 481 Eina_List *routes; 482 Eina_List *track; 483 Eina_List *names; 484 485 Eina_List *overlays; 486 Eina_List *group_overlays; 487 Eina_List *all_overlays; 488 489 Eina_Bool wheel_disabled : 1; 490 Eina_Bool on_hold : 1; 491 Eina_Bool paused : 1; 492 Eina_Bool zoom_animator : 1; 493 494 Calc_Job calc_job; 495 Evas_Object *copyright; 496 }; 497 498 typedef struct _Elm_Map_Pan_Data Elm_Map_Pan_Data; 499 struct _Elm_Map_Pan_Data 500 { 501 Evas_Object *wobj; 502 Elm_Map_Data *wsd; 503 }; 504 505 /** 506 * @} 507 */ 508 509 #define ELM_MAP_DATA_GET(o, sd) \ 510 Elm_Map_Data * sd = efl_data_scope_get(o, ELM_MAP_CLASS) 511 512 #define ELM_MAP_PAN_DATA_GET(o, sd) \ 513 Elm_Map_Pan_Data * sd = efl_data_scope_get(o, ELM_MAP_PAN_CLASS) 514 515 #define ELM_MAP_DATA_GET_OR_RETURN(o, ptr) \ 516 ELM_MAP_DATA_GET(o, ptr); \ 517 if (EINA_UNLIKELY(!ptr)) \ 518 { \ 519 ERR("No widget data for object %p (%s)", \ 520 o, evas_object_type_get(o)); \ 521 return; \ 522 } 523 524 #define ELM_MAP_DATA_GET_OR_RETURN_VAL(o, ptr, val) \ 525 ELM_MAP_DATA_GET(o, ptr); \ 526 if (EINA_UNLIKELY(!ptr)) \ 527 { \ 528 ERR("No widget data for object %p (%s)", \ 529 o, evas_object_type_get(o)); \ 530 return val; \ 531 } 532 533 #define ELM_MAP_CHECK(obj) \ 534 if (EINA_UNLIKELY(!efl_isa((obj), ELM_MAP_CLASS))) \ 535 return 536 537 #endif 538