X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=navit%2Fpopup.c;h=eda64be3e16d3aeca23612a800d1c0230945ad1e;hb=refs%2Fheads%2Fmaemo;hp=0a694de5c3c3bbb9e48aec3882a38881942b7937;hpb=75b210f0da605dd72b8cba62c60caea4d04b9a11;p=navit-package diff --git a/navit/popup.c b/navit/popup.c index 0a694de..eda64be 100644 --- a/navit/popup.c +++ b/navit/popup.c @@ -61,6 +61,44 @@ popup_set_no_passing(struct popup_item *item, void *param) #endif static void +popup_traffic_distortion(struct item *item, char *attr) +{ + FILE *map=fopen("distortion.txt","a"); + struct coord c; + struct map_rect *mr; + fprintf(map,"type=traffic_distortion %s\n",attr); + mr=map_rect_new(item->map,NULL); + item=map_rect_get_item_byid(mr, item->id_hi, item->id_lo); + while (item_coord_get(item, &c, 1)) { + fprintf(map,"0x%x 0x%x\n",c.x,c.y); + } + fclose(map); +} + +static void +popup_traffic_distortion_blocked(struct item *item) +{ + dbg(0,"item=%p\n",item); + popup_traffic_distortion(item, "maxspeed=0"); +} + +static void +popup_traffic_distortion_speed(struct item *item, int maxspeed) +{ + char buffer[256]; + sprintf(buffer,"maxspeed=%d",maxspeed); + popup_traffic_distortion(item,buffer); +} + +static void +popup_traffic_distortion_delay(struct item *item, int delay) +{ + char buffer[256]; + sprintf(buffer,"delay=%d",delay*600); + popup_traffic_distortion(item,buffer); +} + +static void popup_set_destination(struct navit *nav, struct pcoord *pc) { struct coord c; @@ -72,7 +110,7 @@ popup_set_destination(struct navit *nav, struct pcoord *pc) transform_to_geo(transform_get_projection(navit_get_trans(nav)), &c, &g); coord_format(g.lat,g.lng,DEGREES_MINUTES_SECONDS,buffer_geo,sizeof(buffer_geo)); sprintf(buffer,"Map Point %s", buffer_geo); - navit_set_destination(nav, pc, buffer); + navit_set_destination(nav, pc, buffer, 1); } static void @@ -97,7 +135,7 @@ extern void *vehicle; static void popup_set_position(struct navit *nav, struct pcoord *pc) { - dbg(0,"%p %p\n", nav, pc); + dbg(1,"%p %p\n", nav, pc); navit_set_position(nav, pc); } @@ -124,13 +162,33 @@ popup_break_crossing(struct display_list *l) static void * popup_printf_cb(void *menu, enum menu_type type, struct callback *cb, const char *fmt, ...) { - gchar *str; + gchar *str,*us; + int usc=0; va_list ap; void *ret; va_start(ap, fmt); str=g_strdup_vprintf(fmt, ap); dbg(0,"%s\n", str); + us=str; + while (*us) { + if (*us == '_') + usc++; + us++; + } + if (usc) { + gchar *str2=g_malloc(strlen(str)+usc+1); + gchar *us2=str2; + us=str; + while (*us) { + if (*us == '_') + *us2++=*us; + *us2++=*us++; + } + *us2='\0'; + g_free(str); + str=str2; + } ret=menu_add(menu, str, type, cb); va_end(ap); g_free(str); @@ -187,23 +245,27 @@ static void popup_show_item(struct navit *nav, void *popup, struct displayitem *di) { struct map_rect *mr; - void *menu, *menu_map, *menu_item; + void *menu, *menu_map, *menu_item, *menu_dist; char *label; - struct item *item; + struct item *item,*diitem; + int count; label=graphics_displayitem_get_label(di); - item=graphics_displayitem_get_item(di); + diitem=graphics_displayitem_get_item(di); + count=graphics_displayitem_get_coord_count(di); + + dbg_assert(diitem); if (label) - menu=popup_printf(popup, menu_type_submenu, "%s '%s'", item_to_name(item->type), label); + menu=popup_printf(popup, menu_type_submenu, "%s '%s' (%d coords)", item_to_name(diitem->type), label, count); else - menu=popup_printf(popup, menu_type_submenu, "%s", item_to_name(item->type)); + menu=popup_printf(popup, menu_type_submenu, "%s (%d coords)", item_to_name(diitem->type), count); menu_item=popup_printf(menu, menu_type_submenu, "Item"); - popup_printf(menu_item, menu_type_menu, "type: 0x%x", item->type); - popup_printf(menu_item, menu_type_menu, "id: 0x%x 0x%x", item->id_hi, item->id_lo); - if (item->map) { - mr=map_rect_new(item->map,NULL); - item=map_rect_get_item_byid(mr, item->id_hi, item->id_lo); + popup_printf(menu_item, menu_type_menu, "type: 0x%x", diitem->type); + popup_printf(menu_item, menu_type_menu, "id: 0x%x 0x%x", diitem->id_hi, diitem->id_lo); + if (diitem->map) { + mr=map_rect_new(diitem->map,NULL); + item=map_rect_get_item_byid(mr, diitem->id_hi, diitem->id_lo); dbg(1,"item=%p\n", item); if (item) { popup_show_attrs(item->map, menu_item, item); @@ -226,6 +288,21 @@ popup_show_item(struct navit *nav, void *popup, struct displayitem *di) } else { popup_printf(menu, menu_type_menu, "(No map)"); } + if (item_get_default_flags(diitem->type)) { + int speeds[]={5,10,20,30,40,50,60,70,80,90,100}; + int delays[]={1,2,3,5,10,15,20,30,45,60,75,90,120,150,180,240,300}; + int i; + menu_dist=popup_printf(menu, menu_type_submenu, "Traffic distortion"); + popup_printf_cb(menu_dist, menu_type_menu, callback_new_1(callback_cast(popup_traffic_distortion_blocked), diitem), "Blocked"); + menu_item=popup_printf(menu_dist, menu_type_submenu,"Max speed"); + for (i = 0 ; i < sizeof(speeds)/sizeof(int); i++) { + popup_printf_cb(menu_item, menu_type_menu, callback_new_2(callback_cast(popup_traffic_distortion_speed), diitem, speeds[i]), "%d km/h",speeds[i]); + } + menu_item=popup_printf(menu_dist, menu_type_submenu,"Delay"); + for (i = 0 ; i < sizeof(delays)/sizeof(int); i++) { + popup_printf_cb(menu_item, menu_type_menu, callback_new_2(callback_cast(popup_traffic_distortion_delay), diitem, delays[i]*600), "%d min",delays[i]); + } + } } static void @@ -238,7 +315,7 @@ popup_display(struct navit *nav, void *popup, struct point *p) display=navit_get_displaylist(nav); dlh=graphics_displaylist_open(display); while ((di=graphics_displaylist_next(dlh))) { - if (graphics_displayitem_within_dist(di, p, 5)) { + if (graphics_displayitem_within_dist(display, di, p, 5)) { popup_show_item(nav, popup, di); } } @@ -265,7 +342,7 @@ popup(struct navit *nav, int button, struct point *p) coord_format(g.lat,g.lng,DEGREES_MINUTES_SECONDS,buffer,sizeof(buffer)); popup_printf(men, menu_type_menu, "%s", buffer); popup_printf(men, menu_type_menu, "%f %f", g.lat, g.lng); - dbg(0,"%p %p\n", nav, &c); + dbg(1,"%p %p\n", nav, &c); c.pro = transform_get_projection(navit_get_trans(nav)); c.x = co.x; c.y = co.y;