diff options
Diffstat (limited to 'navit/gui/internal/gui_internal_command.c')
| -rw-r--r-- | navit/gui/internal/gui_internal_command.c | 125 |
1 files changed, 89 insertions, 36 deletions
diff --git a/navit/gui/internal/gui_internal_command.c b/navit/gui/internal/gui_internal_command.c index 98a736fb8..d26bd677d 100644 --- a/navit/gui/internal/gui_internal_command.c +++ b/navit/gui/internal/gui_internal_command.c @@ -294,6 +294,8 @@ gui_internal_cmd_enter_coord(struct gui_priv *this, char *function, struct attr if (this->keyboard) gui_internal_widget_append(w, gui_internal_keyboard(this, VKBD_DEGREE)); + else + gui_internal_keyboard_show_native(this, w, VKBD_DEGREE, NULL); gui_internal_menu_render(this); } @@ -444,13 +446,21 @@ gui_internal_cmd2_setting_layout(struct gui_priv *this, char *function, struct a navit_attr_iter_destroy(iter); gui_internal_menu_render(this); } + +/* + * @brief Displays Route Height Profile + * + * displays a heightprofile if a route is active and + * some heightinfo is provided by means of a map + * + * the name of the file providing the heightlines must + * comply with *.heightlines.bin + * + */ static void gui_internal_cmd2_route_height_profile(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { - - struct widget * menu, *box; - struct map * map=NULL; struct map_rect * mr=NULL; struct route * route; @@ -458,17 +468,18 @@ gui_internal_cmd2_route_height_profile(struct gui_priv *this, char *function, st struct mapset *ms; struct mapset_handle *msh; int x,i,first=1,dist=0; + int diagram_points_count = 0; struct coord c,last,res; struct coord_rect rbbox,dbbox; struct map_selection sel; struct heightline *heightline,*heightlines=NULL; struct diagram_point *min,*diagram_point,*diagram_points=NULL; + struct point p[2]; sel.next=NULL; sel.order=18; sel.range.min=type_height_line_1; sel.range.max=type_height_line_3; - menu=gui_internal_menu(this,_("Height Profile")); box = gui_internal_box_new(this, gravity_left_top| orientation_vertical | flags_fill | flags_expand); gui_internal_widget_append(menu, box); @@ -489,11 +500,24 @@ gui_internal_cmd2_route_height_profile(struct gui_priv *this, char *function, st } } map_rect_destroy(mr); + mr = NULL; ms=navit_get_mapset(this->nav); if (!first && ms) { + int heightmap_installed = FALSE; msh=mapset_open(ms); while ((map=mapset_next(msh, 1))) { - mr=map_rect_new(map, &sel); + struct attr name_attr; + if (map_get_attr(map, attr_name, &name_attr, NULL)){ + dbg(lvl_debug,"map name = %s\n",name_attr.u.str); + if (strstr(name_attr.u.str,".heightlines.bin")){ + dbg(lvl_info,"reading heightlines from map %s\n",name_attr.u.str); + mr=map_rect_new(map, &sel); + heightmap_installed = TRUE; + } + else { + dbg(lvl_debug,"ignoring map %s\n",name_attr.u.str); + } + } if (mr) { while((item = map_rect_get_item(mr))) { if (item->type >= sel.range.min && item->type <= sel.range.max) { @@ -505,9 +529,20 @@ gui_internal_cmd2_route_height_profile(struct gui_priv *this, char *function, st } } map_rect_destroy(mr); + mr = NULL; } } mapset_close(msh); + if (!heightmap_installed){ + char *text; + struct widget *w; + text=g_strdup_printf("%s",_("please install a map *.heightlines.bin to provide elevationdata")); + gui_internal_widget_append(box, w=gui_internal_label_new(this, text)); + w->flags=gravity_bottom_center|orientation_horizontal|flags_fill; + g_free(text); + gui_internal_menu_render(this); + return; + } } } map=NULL; @@ -537,7 +572,8 @@ gui_internal_cmd2_route_height_profile(struct gui_priv *this, char *function, st diagram_point->c.y=heightline->height; diagram_point->next=diagram_points; diagram_points=diagram_point; - dbg(lvl_info,"%d %d\n", diagram_point->c.x, diagram_point->c.y); + diagram_points_count ++; + dbg(lvl_debug,"%d %d\n", diagram_point->c.x, diagram_point->c.y); } } } @@ -548,18 +584,30 @@ gui_internal_cmd2_route_height_profile(struct gui_priv *this, char *function, st } last=c; } - } } - + while (heightlines){ + heightline=heightlines; + heightlines=heightlines->next; + g_free(heightline); + } if(mr) map_rect_destroy(mr); - gui_internal_menu_render(this); - - if(!diagram_points) + if(diagram_points_count < 2){ + char *text; + struct widget *w; + text=g_strdup_printf("%s",_("The route must cross at least 2 heightlines")); + gui_internal_widget_append(box, w=gui_internal_label_new(this, text)); + w->flags=gravity_bottom_center|orientation_horizontal|flags_fill; + g_free(text); + gui_internal_menu_render(this); + if(diagram_points) + g_free(diagram_points); return; + } + gui_internal_menu_render(this); first=1; diagram_point=diagram_points; while (diagram_point) { @@ -571,38 +619,42 @@ gui_internal_cmd2_route_height_profile(struct gui_priv *this, char *function, st coord_rect_extend(&dbbox, &diagram_point->c); diagram_point=diagram_point->next; } - dbg(lvl_info,"%d %d %d %d\n", dbbox.lu.x, dbbox.lu.y, dbbox.rl.x, dbbox.rl.y); + dbg(lvl_debug,"%d %d %d %d\n", dbbox.lu.x, dbbox.lu.y, dbbox.rl.x, dbbox.rl.y); if (dbbox.rl.x > dbbox.lu.x && dbbox.lu.x*100/(dbbox.rl.x-dbbox.lu.x) <= 25) dbbox.lu.x=0; if (dbbox.lu.y > dbbox.rl.y && dbbox.rl.y*100/(dbbox.lu.y-dbbox.rl.y) <= 25) dbbox.rl.y=0; - dbg(lvl_info,"%d,%d %dx%d\n", box->p.x, box->p.y, box->w, box->h); + dbg(lvl_debug,"%d,%d %dx%d\n", box->p.x, box->p.y, box->w, box->h); x=dbbox.lu.x; first=1; - for (;;) { - struct point p[2]; - min=NULL; - diagram_point=diagram_points; - while (diagram_point) { - if (diagram_point->c.x >= x && (!min || min->c.x > diagram_point->c.x)) - min=diagram_point; - diagram_point=diagram_point->next; + if (diagram_points_count > 1 && dbbox.rl.x != dbbox.lu.x && dbbox.lu.y != dbbox.rl.y){ + for (;;) { + min=NULL; + diagram_point=diagram_points; + while (diagram_point) { + if (diagram_point->c.x >= x && (!min || min->c.x > diagram_point->c.x)) + min=diagram_point; + diagram_point=diagram_point->next; + } + if (! min) + break; + p[1].x=(min->c.x-dbbox.lu.x)*(box->w-10)/(dbbox.rl.x-dbbox.lu.x)+box->p.x+5; + p[1].y=(box->h)-5-(min->c.y-dbbox.rl.y)*(box->h-10)/(dbbox.lu.y-dbbox.rl.y)+box->p.y; + dbg(lvl_debug,"%d,%d=%d,%d\n",min->c.x, min->c.y, p[1].x,p[1].y); + graphics_draw_circle(this->gra, this->foreground, &p[1], 2); + if (first) + first=0; + else + graphics_draw_lines(this->gra, this->foreground, p, 2); + p[0]=p[1]; + x=min->c.x+1; } - if (! min) - break; - p[1].x=(min->c.x-dbbox.lu.x)*(box->w-10)/(dbbox.rl.x-dbbox.lu.x)+box->p.x+5; - p[1].y=(min->c.y-dbbox.rl.y)*(box->h-10)/(dbbox.lu.y-dbbox.rl.y)+box->p.y+5; - dbg(lvl_info,"%d,%d=%d,%d\n",min->c.x, min->c.y, p[1].x,p[1].y); - graphics_draw_circle(this->gra, this->foreground, &p[1], 2); - if (first) - first=0; - else - graphics_draw_lines(this->gra, this->foreground, p, 2); - p[0]=p[1]; - x=min->c.x+1; } - - + while (diagram_points){ + diagram_point=diagram_points; + diagram_points=diagram_points->next; + g_free(diagram_point); + } } static void @@ -860,6 +912,8 @@ gui_internal_cmd_log(struct gui_priv *this) gui_internal_widget_append(w, wl); if (this->keyboard) gui_internal_widget_append(w, gui_internal_keyboard(this, VKBD_FLAG_2 | gui_internal_keyboard_init_mode(getenv("LANG")))); + else + gui_internal_keyboard_show_native(this, w, VKBD_FLAG_2 | gui_internal_keyboard_init_mode(getenv("LANG")), getenv("LANG")); gui_internal_menu_render(this); gui_internal_leave(this); } @@ -1075,7 +1129,6 @@ error: return; } - static void gui_internal_cmd_img(struct gui_priv * this, char *function, struct attr **in, struct attr ***out, int *valid) { |
