X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=navit%2Fgui%2Finternal%2Fgui_internal.c;h=19052ebec731014acd60a1331048caeb814fc668;hb=7a5a709fd8e5ca28a25372b1bd8cf1dec32796fc;hp=b8ee7640ecd9a02e0bbde8094b4c928c8dcd3ee8;hpb=08ce6d11ed01aed7620e4641e3562bdae5c4b672;p=navit-package diff --git a/navit/gui/internal/gui_internal.c b/navit/gui/internal/gui_internal.c index b8ee764..19052eb 100644 --- a/navit/gui/internal/gui_internal.c +++ b/navit/gui/internal/gui_internal.c @@ -71,38 +71,11 @@ #include "xmlconfig.h" #include "util.h" -const char *menu_html= - "" - "Main menu" -#ifdef NOTYET - ""_n("Actions")"" -#else - ""_n("Actions")"" -#endif -#if 0 - ""_n("Show
Map")"" -#endif - ""_n("Settings")"" - ""_n("Tools")"" - ""_n("Route")"" - "" -#ifdef NOTYET - "Actions" - ""_n("Bookmarks")"" - "" - "" - "Town" - "Quit" - "Stop\nNavigation" - "" -#endif - "" -; - struct menu_data { struct widget *search_list; struct widget *keyboard; struct widget *button_bar; + struct widget *menu; int keyboard_mode; void (*redisplay)(struct gui_priv *priv, struct widget *widget, void *data); struct widget *redisplay_widget; @@ -153,8 +126,10 @@ struct widget { int wmin,hmin; int w,h; int textw,texth; + int font_idx; int bl,br,bt,bb,spx,spy; int border; + int packed; /** * The number of widgets to layout horizontally when doing * a orientation_horizontal_vertical layout @@ -239,6 +214,7 @@ struct route_data { //############################################################################################################## struct gui_priv { struct navit *nav; + struct attr self; struct window *win; struct graphics *gra; struct graphics_gc *background; @@ -251,7 +227,7 @@ struct gui_priv { int spacing; int font_size; int fullscreen; - struct graphics_font *font; + struct graphics_font *fonts[3]; int icon_xs, icon_s, icon_l; int pressed; struct widget *widgets; @@ -262,10 +238,11 @@ struct gui_priv { struct widget *highlighted_menu; int clickp_valid, vehicle_valid; struct pcoord clickp, vehiclep; - struct coord_geo clickp_geo; + struct attr *click_coord_geo, *position_coord_geo; struct search_list *sl; int ignore_button; int menu_on_map_click; + int signal_on_map_click; char *country_iso2; int speech; int keyboard; @@ -275,7 +252,7 @@ struct gui_priv { */ struct gui_config_settings config; struct event_idle *idle; - struct callback *motion_cb,*button_cb,*resize_cb,*keypress_cb,*idle_cb, *motion_timeout_callback; + struct callback *motion_cb,*button_cb,*resize_cb,*keypress_cb,*window_closed_cb,*idle_cb, *motion_timeout_callback; struct event_timeout *motion_timeout_event; struct point current; @@ -291,8 +268,9 @@ struct gui_priv { int cols; struct attr osd_configuration; int pitch; + int flags_town,flags_street,flags_house_number; /* html */ - + char *html_text; int html_depth; struct widget *html_container; int html_skip; @@ -409,8 +387,6 @@ static void gui_internal_apply_config(struct gui_priv *this); static struct widget* gui_internal_widget_table_new(struct gui_priv * this, enum flags flags, int buttons); static struct widget * gui_internal_widget_table_row_new(struct gui_priv * this, enum flags flags); static void gui_internal_table_render(struct gui_priv * this, struct widget * w); -static void gui_internal_cmd_tools(struct gui_priv * this, struct widget * w,void *); -static void gui_internal_cmd_route(struct gui_priv * this, struct widget * w,void *); static void gui_internal_table_pack(struct gui_priv * this, struct widget * w); static void gui_internal_table_button_next(struct gui_priv * this, struct widget * wm, void *data); static void gui_internal_table_button_prev(struct gui_priv * this, struct widget * wm, void *data); @@ -575,8 +551,9 @@ gui_internal_background_render(struct gui_priv *this, struct widget *w) graphics_draw_rectangle(this->gra, w->background, &pnt, w->w, w->h); } } + static struct widget * -gui_internal_label_new(struct gui_priv *this, char *text) +gui_internal_label_font_new(struct gui_priv *this, char *text, int font) { struct point p[4]; int w=0; @@ -584,9 +561,10 @@ gui_internal_label_new(struct gui_priv *this, char *text) struct widget *widget=g_new0(struct widget, 1); widget->type=widget_label; + widget->font_idx=font; if (text) { widget->text=g_strdup(text); - graphics_get_text_bbox(this->gra, this->font, text, 0x10000, 0x0, p, 0); + graphics_get_text_bbox(this->gra, this->fonts[font], text, 0x10000, 0x0, p, 0); w=p[2].x-p[0].x; h=p[0].y-p[2].y; } @@ -602,6 +580,12 @@ gui_internal_label_new(struct gui_priv *this, char *text) } static struct widget * +gui_internal_label_new(struct gui_priv *this, char *text) +{ + return gui_internal_label_font_new(this, text, 0); +} + +static struct widget * gui_internal_label_new_abbrev(struct gui_priv *this, char *text, int maxwidth) { struct widget *ret=NULL; @@ -659,10 +643,10 @@ gui_internal_label_render(struct gui_priv *this, struct widget *w) if (w->flags & gravity_right) { pnt.y+=w->h-this->spacing; pnt.x+=w->w-w->textw-this->spacing; - graphics_draw_text(this->gra, w->foreground, w->text_background, this->font, w->text, &pnt, 0x10000, 0x0); + graphics_draw_text(this->gra, w->foreground, w->text_background, this->fonts[w->font_idx], w->text, &pnt, 0x10000, 0x0); } else { pnt.y+=w->h-this->spacing; - graphics_draw_text(this->gra, w->foreground, w->text_background, this->font, w->text, &pnt, 0x10000, 0x0); + graphics_draw_text(this->gra, w->foreground, w->text_background, this->fonts[w->font_idx], w->text, &pnt, 0x10000, 0x0); } } } @@ -673,22 +657,28 @@ gui_internal_label_render(struct gui_priv *this, struct widget *w) * */ static struct widget * -gui_internal_text_new(struct gui_priv *this, char *text, enum flags flags) +gui_internal_text_font_new(struct gui_priv *this, char *text, int font, enum flags flags) { char *s=g_strdup(text),*s2,*tok; struct widget *ret=gui_internal_box_new(this, flags); s2=s; while ((tok=strtok(s2,"\n"))) { - gui_internal_widget_append(ret, gui_internal_label_new(this, tok)); + gui_internal_widget_append(ret, gui_internal_label_font_new(this, tok, font)); s2=NULL; } gui_internal_widget_pack(this,ret); return ret; } +static struct widget * +gui_internal_text_new(struct gui_priv *this, char *text, enum flags flags) +{ + return gui_internal_text_font_new(this, text, 0, flags); +} + static struct widget * -gui_internal_button_new_with_callback(struct gui_priv *this, char *text, struct graphics_image *image, enum flags flags, void(*func)(struct gui_priv *priv, struct widget *widget, void *data), void *data) +gui_internal_button_font_new_with_callback(struct gui_priv *this, char *text, int font, struct graphics_image *image, enum flags flags, void(*func)(struct gui_priv *priv, struct widget *widget, void *data), void *data) { struct widget *ret=NULL; ret=gui_internal_box_new(this, flags); @@ -696,7 +686,7 @@ gui_internal_button_new_with_callback(struct gui_priv *this, char *text, struct if (image) gui_internal_widget_append(ret, gui_internal_image_new(this, image)); if (text) - gui_internal_widget_append(ret, gui_internal_text_new(this, text, gravity_center|orientation_vertical)); + gui_internal_widget_append(ret, gui_internal_text_font_new(this, text, font, gravity_center|orientation_vertical)); ret->func=func; ret->data=data; if (func) { @@ -708,6 +698,12 @@ gui_internal_button_new_with_callback(struct gui_priv *this, char *text, struct } +static struct widget * +gui_internal_button_new_with_callback(struct gui_priv *this, char *text, struct graphics_image *image, enum flags flags, void(*func)(struct gui_priv *priv, struct widget *widget, void *data), void *data) +{ + return gui_internal_button_font_new_with_callback(this, text, 0, image, flags, func, data); +} + static int gui_internal_button_attr_update(struct gui_priv *this, struct widget *w) { @@ -921,6 +917,10 @@ static void gui_internal_box_render(struct gui_priv *this, struct widget *w) GList *l; gui_internal_background_render(this, w); +#if 0 + w->border=1; + w->foreground=this->foreground; +#endif #if 1 if (w->foreground && w->border) { struct point pnt[5]; @@ -955,7 +955,7 @@ static void gui_internal_box_render(struct gui_priv *this, struct widget *w) static void gui_internal_box_pack(struct gui_priv *this, struct widget *w) { struct widget *wc; - int x0,x=0,y=0,width=0,height=0,owidth=0,oheight=0,expand=0,count=0,rows=0,cols=w->cols ? w->cols : 0; + int x0,x=0,y=0,width=0,height=0,owidth=0,oheight=0,expand=0,expandd=1,count=0,rows=0,cols=w->cols ? w->cols : 0; GList *l; int orientation=w->flags & 0xffff0000; @@ -1006,10 +1006,10 @@ static void gui_internal_box_pack(struct gui_priv *this, struct widget *w) } owidth=width; if (expand && w->w) { - expand=100*(w->w-width+expand)/expand; + expandd=w->w-width+expand; owidth=w->w; - } else - expand=100; + } else + expandd=expand=1; break; case orientation_vertical: /** @@ -1035,10 +1035,10 @@ static void gui_internal_box_pack(struct gui_priv *this, struct widget *w) } oheight=height; if (expand && w->h) { - expand=100*(w->h-height+expand)/expand; + expandd=w->h-height+expand; oheight=w->h; - } else - expand=100; + } else + expandd=expand=1; break; case orientation_horizontal_vertical: /** @@ -1069,7 +1069,7 @@ static void gui_internal_box_pack(struct gui_priv *this, struct widget *w) height+=w->spy*(rows-1); owidth=width; oheight=height; - expand=100; + expandd=expand=1; break; default: /** @@ -1085,9 +1085,12 @@ static void gui_internal_box_pack(struct gui_priv *this, struct widget *w) if (! w->w && ! w->h) { w->w=w->bl+w->br+width; w->h=w->bt+w->bb+height; + w->packed=1; } +#if 0 if (expand < 100) expand=100; +#endif /** * At this stage the width and height of this @@ -1120,7 +1123,7 @@ static void gui_internal_box_pack(struct gui_priv *this, struct widget *w) if (wc->flags & flags_expand) { if (! wc->w) wc->w=1; - wc->w=wc->w*expand/100; + wc->w=wc->w*expandd/expand; } if (w->flags & gravity_top) wc->p.y=y; @@ -1137,12 +1140,12 @@ static void gui_internal_box_pack(struct gui_priv *this, struct widget *w) while (l) { wc=l->data; wc->p.y=y; - if (wc->flags & flags_fill) + if (wc->flags & flags_fill) wc->w=w->w; if (wc->flags & flags_expand) { if (! wc->h) wc->h=1; - wc->h=wc->h*expand/100; + wc->h=wc->h*expandd/expand; } if (w->flags & gravity_left) wc->p.x=x; @@ -1206,6 +1209,24 @@ static void gui_internal_box_pack(struct gui_priv *this, struct widget *w) } static void +gui_internal_widget_reset_pack(struct gui_priv *this, struct widget *w) +{ + struct widget *wc; + GList *l; + + l=w->children; + while (l) { + wc=l->data; + gui_internal_widget_reset_pack(this, wc); + l=g_list_next(l); + } + if (w->packed) { + w->w=0; + w->h=0; + } +} + +static void gui_internal_widget_append(struct widget *parent, struct widget *child) { if (! child) @@ -1382,6 +1403,21 @@ gui_internal_cmd_return(struct gui_priv *this, struct widget *wm, void *data) } static void +gui_internal_cmd2_back(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) +{ + graphics_draw_mode(this->gra, draw_mode_begin); + gui_internal_back(this, NULL, NULL); + graphics_draw_mode(this->gra, draw_mode_end); + gui_internal_check_exit(this); +} + +static void +gui_internal_cmd2_back_to_map(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) +{ + gui_internal_prune_menu(this, NULL); +} + +static void gui_internal_cmd_main_menu(struct gui_priv *this, struct widget *wm, void *data) { gui_internal_prune_menu(this, this->root.children->data); @@ -1406,6 +1442,8 @@ gui_internal_top_bar(struct gui_priv *this) 128:Show help 256:Use background for menu headline 512:Set osd_configuration and zoom to route when setting position + 1024:Don't show back button + 2048:No highlighting of keyboard */ w=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|(this->flags & 1 ? 0:flags_fill)); @@ -1570,7 +1608,7 @@ static void gui_internal_apply_config(struct gui_priv *this) { struct gui_config_settings * current_config=0; - dbg(0,"w=%d h=%d\n", this->root.w, this->root.h); + dbg(1,"w=%d h=%d\n", this->root.w, this->root.h); /** * Select default values from profile based on the screen. */ @@ -1676,7 +1714,11 @@ gui_internal_menu(struct gui_priv *this, const char *label) menu->h=this->root.h; menu->background=this->background; gui_internal_apply_config(this); - this->font=graphics_font_new(this->gra,this->font_size,1); + if (!this->fonts[0]) { + this->fonts[0]=graphics_font_new(this->gra,this->font_size,1); + this->fonts[1]=graphics_font_new(this->gra,this->font_size*66/100,1); + this->fonts[2]=graphics_font_new(this->gra,this->font_size*50/100,1); + } topbox->menu_data=g_new0(struct menu_data, 1); gui_internal_widget_append(topbox, menu); w=gui_internal_top_bar(this); @@ -1685,7 +1727,7 @@ gui_internal_menu(struct gui_priv *this, const char *label) w->spx=4*this->spacing; w->w=menu->w; gui_internal_widget_append(menu, w); - if (this->flags & 16) { + if (this->flags & 16 && (!this->flags & 1024)) { struct widget *wlb,*wb,*wm=w; wm->flags=gravity_center|orientation_vertical|flags_expand|flags_fill; w=gui_internal_box_new(this, gravity_center|orientation_horizontal|flags_expand|flags_fill); @@ -1714,6 +1756,12 @@ gui_internal_menu(struct gui_priv *this, const char *label) gui_internal_widget_append(topbox, menu); menu->background=NULL; } + gui_internal_widget_pack(this, topbox); + gui_internal_widget_reset_pack(this, topbox); + topbox->w=this->root.w; + topbox->h=this->root.h; + menu->w=this->root.w; + menu->h=this->root.h; return w; } @@ -1729,6 +1777,17 @@ gui_internal_menu_data(struct gui_priv *this) } static void +gui_internal_menu_reset_pack(struct gui_priv *this) +{ + GList *l; + struct widget *top_box; + + l=g_list_last(this->root.children); + top_box=l->data; + gui_internal_widget_reset_pack(this, top_box); +} + +static void gui_internal_menu_render(struct gui_priv *this) { GList *l; @@ -1744,9 +1803,9 @@ gui_internal_menu_render(struct gui_priv *this) static void gui_internal_cmd_set_destination(struct gui_priv *this, struct widget *wm, void *data) { - struct widget *w=wm->data; - dbg(0,"c=%d:0x%x,0x%x\n", w->c.pro, w->c.x, w->c.y); - navit_set_destination(this->nav, &w->c, w->name, 1); + char *name=data; + dbg(0,"c=%d:0x%x,0x%x\n", wm->c.pro, wm->c.x, wm->c.y); + navit_set_destination(this->nav, &wm->c, name, 1); if (this->flags & 512) { struct attr follow; follow.type=attr_follow; @@ -1761,8 +1820,7 @@ gui_internal_cmd_set_destination(struct gui_priv *this, struct widget *wm, void static void gui_internal_cmd_set_position(struct gui_priv *this, struct widget *wm, void *data) { - struct widget *w=wm->data; - navit_set_position(this->nav, &w->c); + navit_set_position(this->nav, &wm->c); gui_internal_prune_menu(this, NULL); } @@ -1804,15 +1862,16 @@ gui_internal_cmd_add_bookmark_changed(struct gui_priv *this, struct widget *wm, static struct widget * gui_internal_keyboard(struct gui_priv *this, int mode); static void -gui_internal_cmd_add_bookmark(struct gui_priv *this, struct widget *wm, void *data) +gui_internal_cmd_add_bookmark2(struct gui_priv *this, struct widget *wm, void *data) { - struct widget *w,*wb,*wk,*wl,*we,*wnext,*wp=wm->data; + struct widget *w,*wb,*wk,*wl,*we,*wnext; + char *name=data; wb=gui_internal_menu(this,_("Add Bookmark")); w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(wb, w); we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill); gui_internal_widget_append(w, we); - gui_internal_widget_append(we, wk=gui_internal_label_new(this, wp->name ? wp->name : wp->text)); + gui_internal_widget_append(we, wk=gui_internal_label_new(this, name)); wk->state |= STATE_EDIT|STATE_CLEAR; wk->background=this->background; wk->flags |= flags_expand|flags_fill; @@ -2060,10 +2119,17 @@ static void gui_internal_cmd_view_on_map(struct gui_priv *this, struct widget *wm, void *data) { struct widget *w=wm->data; - int highlight=(w->data == (void *)2 || w->data == (void *)3 || w->data == (void *)4); + int highlight=(w->data == (void *)2 || w->data == (void *)3 || w->data == (void *)5); if (highlight) { + enum item_type type; + if (w->item.type < type_line) + type=type_selected_point; + else if (w->item.type < type_area) + type=type_selected_point; + else + type=type_selected_area; graphics_clear_selection(this->gra, NULL); - graphics_add_selection(this->gra, &w->item, NULL); + graphics_add_selection(this->gra, &w->item, type, NULL); } navit_set_center(this->nav, &w->c, 1); gui_internal_prune_menu(this, NULL); @@ -2184,57 +2250,40 @@ gui_internal_cmd_view_in_browser(struct gui_priv *this, struct widget *wm, void } } -/* wm->data: 0 Nothing special - 1 Map Point - 2 Item - 3 Town - 4 County - 5 Street -*/ - - static void -gui_internal_cmd_position(struct gui_priv *this, struct widget *wm, void *data) +gui_internal_cmd_position_do(struct gui_priv *this, struct pcoord *pc_in, struct coord_geo *g_in, struct widget *wm, char *name, int flags) { struct widget *wb,*w,*wc,*wbc; struct coord_geo g; + struct pcoord pc; struct coord c; - char *coord,*name; - int display_attributes=(wm->data == (void *)2); - int display_view_on_map=(wm->data != (void *)1); - int display_items=(wm->data == (void *)1); - int display_streets=(wm->data == (void *)3); - int display_house_numbers=(wm->data == (void *)5); - if (wm->data == (void *)4) { - gui_internal_search_town_in_country(this, wm); + char *coord; + + if (pc_in) { + pc=*pc_in; + c.x=pc.x; + c.y=pc.y; + dbg(0,"x=0x%x y=0x%x\n", c.x, c.y); + transform_to_geo(pc.pro, &c, &g); + } else if (g_in) { + struct attr attr; + if (!navit_get_attr(this->nav, attr_projection, &attr, NULL)) + return; + g=*g_in; + pc.pro=attr.u.projection; + transform_from_geo(pc.pro, &g, &c); + pc.x=c.x; + pc.y=c.y; + } else return; - } -#if 0 - switch ((int)wm->data) { - case 0: -#endif - c.x=wm->c.x; - c.y=wm->c.y; - dbg(0,"x=0x%x y=0x%x\n", c.x, c.y); - transform_to_geo(wm->c.pro, &c, &g); -#if 0 - break; - case 1: - g=this->click; - break; - case 2: - g=this->vehicle; - break; - } -#endif - name=wm->name ? wm->name : wm->text; + wb=gui_internal_menu(this, name); w=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); gui_internal_widget_append(wb, w); - coord=coordinates(&wm->c, ' '); + coord=coordinates(&pc, ' '); gui_internal_widget_append(w, gui_internal_label_new(this, coord)); g_free(coord); - if (display_streets) { + if ((flags & 1) && wm) { gui_internal_widget_append(w, wc=gui_internal_button_new_with_callback(this, _("Streets"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, @@ -2242,7 +2291,7 @@ gui_internal_cmd_position(struct gui_priv *this, struct widget *wm, void *data) wc->item=wm->item; wc->selection_id=wm->selection_id; } - if (display_house_numbers) { + if ((flags & 2) && wm) { gui_internal_widget_append(w, wc=gui_internal_button_new_with_callback(this, _("House numbers"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, @@ -2250,7 +2299,7 @@ gui_internal_cmd_position(struct gui_priv *this, struct widget *wm, void *data) wc->item=wm->item; wc->selection_id=wm->selection_id; } - if (display_attributes) { + if ((flags & 4) && wm) { struct map_rect *mr; struct item *item; struct attr attr; @@ -2274,39 +2323,48 @@ gui_internal_cmd_position(struct gui_priv *this, struct widget *wm, void *data) } map_rect_destroy(mr); } - gui_internal_widget_append(w, - gui_internal_button_new_with_callback(this, _("Set as destination"), - image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, - gui_internal_cmd_set_destination, wm)); - gui_internal_widget_append(w, - gui_internal_button_new_with_callback(this, _("Set as position"), + if (flags & 8) { + gui_internal_widget_append(w, + wbc=gui_internal_button_new_with_callback(this, _("Set as destination"), + image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, + gui_internal_cmd_set_destination, g_strdup(name))); + wbc->data_free=g_free; + wbc->c=pc; + } + if (flags & 16) { + gui_internal_widget_append(w, + wbc=gui_internal_button_new_with_callback(this, _("Set as position"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_set_position, wm)); - gui_internal_widget_append(w, - wbc=gui_internal_button_new_with_callback(this, _("Add as bookmark"), - image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, - gui_internal_cmd_add_bookmark, wm)); - wbc->c=wm->c; - gui_internal_widget_append(w, - wbc=gui_internal_button_new_with_callback(this, _("POIs"), + wbc->c=pc; + } + if (flags & 32) { + gui_internal_widget_append(w, + wbc=gui_internal_button_new_with_callback(this, _("Add as bookmark"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, - gui_internal_cmd_pois, NULL)); - wbc->c=wm->c; + gui_internal_cmd_add_bookmark2, g_strdup(name))); + wbc->data_free=g_free; + wbc->c=pc; + } + if (flags & 64) { + gui_internal_widget_append(w, + wbc=gui_internal_button_new_with_callback(this, _("POIs"), + image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, + gui_internal_cmd_pois, NULL)); + wbc->c=pc; + } #if 0 gui_internal_widget_append(w, gui_internal_button_new(this, "Add to tour", image_new_o(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill)); - gui_internal_widget_append(w, - gui_internal_button_new(this, "Add as bookmark", - image_new_o(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill)); #endif - if (display_view_on_map) { + if (flags & 128) { gui_internal_widget_append(w, gui_internal_button_new_with_callback(this, _("View on map"), image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_view_on_map, wm)); } - if (display_items) { + if (flags & 256) { int dist=10; struct mapset *ms; struct mapset_handle *h; @@ -2362,31 +2420,108 @@ gui_internal_cmd_position(struct gui_priv *this, struct widget *wm, void *data) } mapset_close(h); } - gui_internal_menu_render(this); } + +/* wm->data: 0 Nothing special + 1 Map Point + 2 Item + 3 Town + 4 County + 5 Street + 6 House number +*/ + +static void +gui_internal_cmd_position(struct gui_priv *this, struct widget *wm, void *data) +{ + int flags; + switch ((int) wm->data) { + case 0: + flags=8|16|32|64|128|256; + break; + case 1: + flags=8|16|32|64|256; + break; + case 2: + flags=4|8|16|32|64; + break; + case 3: + flags=1|8|16|32|64|128; + flags &= this->flags_town; + break; + case 4: + gui_internal_search_town_in_country(this, wm); + return; + case 5: + flags=2|8|16|32|64|128; + flags &= this->flags_street; + break; + case 6: + flags=8|16|32|64|128; + flags &= this->flags_house_number; + break; + default: + return; + } + switch (flags) { + case 2: + gui_internal_search_house_number_in_street(this, wm, NULL); + return; + case 8: + gui_internal_cmd_set_destination(this, wm, NULL); + return; + } + gui_internal_cmd_position_do(this, &wm->c, NULL, wm, wm->name ? wm->name : wm->text, flags); +} + +static void +gui_internal_cmd2_position(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) +{ + char *name=_("Position"); + int flags=-1; + + dbg(1,"enter\n"); + if (!in || !in[0]) + return; + if (!ATTR_IS_COORD_GEO(in[0]->type)) + return; + if (in[1] && ATTR_IS_STRING(in[1]->type)) { + name=in[1]->u.str; + if (in[2] && ATTR_IS_INT(in[2]->type)) + flags=in[2]->u.num; + } + dbg(1,"flags=0x%x\n",flags); + gui_internal_cmd_position_do(this, NULL, in[0]->u.coord_geo, NULL, name, flags); +} + static void gui_internal_cmd_bookmarks(struct gui_priv *this, struct widget *wm, void *data) { struct attr attr,mattr; struct map_rect *mr=NULL; struct item *item; - char *label_full,*l,*prefix,*pos; - int len,plen,hassub; + char *label_full,*l,*prefix="",*pos; + int len,plen,hassub,found=0; struct widget *wb,*w,*wbm; GHashTable *hash; struct coord c; + char *text=_("Bookmarks"); + if (wm && wm->text) + text=wm->text; - - wb=gui_internal_menu(this, wm->text ? wm->text : _("Bookmarks")); + wb=gui_internal_menu(this, text); w=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); w->spy=this->spacing*3; gui_internal_widget_append(wb, w); - prefix=wm->prefix; - if (! prefix) - prefix=""; + if (data) + prefix=data; + else { + if (wm && wm->prefix) + prefix=wm->prefix; + } plen=strlen(prefix); if(navit_get_attr(this->nav, attr_bookmark_map, &mattr, NULL) && mattr.u.map && (mr=map_rect_new(mattr.u.map, NULL))) { @@ -2422,6 +2557,11 @@ gui_internal_cmd_bookmarks(struct gui_priv *this, struct widget *wm, void *data) wbm->prefix=g_malloc(len+2); strncpy(wbm->prefix, label_full, len+1); wbm->prefix[len+1]='\0'; + if (!l[0]) { + gui_internal_cmd_set_destination(this, wbm, wbm->name); + found=1; + break; + } } else { gui_internal_widget_destroy(this, wbm); } @@ -2432,7 +2572,20 @@ gui_internal_cmd_bookmarks(struct gui_priv *this, struct widget *wm, void *data) } g_hash_table_destroy(hash); } - gui_internal_menu_render(this); + if (found) + gui_internal_check_exit(this); + else + gui_internal_menu_render(this); +} + +static void +gui_internal_cmd2_bookmarks(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) +{ + char *str=NULL; + if (in && in[0] && ATTR_IS_STRING(in[0]->type)) { + str=in[0]->u.str; + } + gui_internal_cmd_bookmarks(this, NULL, str); } static void gui_internal_keypress_do(struct gui_priv *this, char *key) @@ -2500,10 +2653,67 @@ gui_internal_search_idle_end(struct gui_priv *this) } } +static char * +postal_str(struct search_list_result *res, int level) +{ + char *ret=NULL; + if (res->town->common.postal) + ret=res->town->common.postal; + if (res->town->common.postal_mask) + ret=res->town->common.postal_mask; + if (level == 1) + return ret; + if (res->street->common.postal) + ret=res->street->common.postal; + if (res->street->common.postal_mask) + ret=res->street->common.postal_mask; + if (level == 2) + return ret; + if (res->house_number->common.postal) + ret=res->house_number->common.postal; + if (res->house_number->common.postal_mask) + ret=res->house_number->common.postal_mask; + return ret; +} + +static char * +district_str(struct search_list_result *res, int level) +{ + char *ret=NULL; + if (res->town->common.district_name) + ret=res->town->common.district_name; + if (level == 1) + return ret; + if (res->street->common.district_name) + ret=res->street->common.district_name; + if (level == 2) + return ret; + if (res->house_number->common.district_name) + ret=res->house_number->common.district_name; + return ret; +} + +static char * +town_str(struct search_list_result *res, int level, int flags) +{ + char *town=res->town->common.town_name; + char *district=district_str(res, level); + char *postal=postal_str(res, level); + char *postal_sep=" "; + char *district_begin=" ("; + char *district_end=")"; + if (!postal) + postal_sep=postal=""; + if (!district || (flags & 1)) + district_begin=district_end=district=""; + + return g_strdup_printf("%s%s%s%s%s%s", postal, postal_sep, town, district_begin, district, district_end); +} + static void gui_internal_search_idle(struct gui_priv *this, char *wm_name, struct widget *search_list, void *param) { - char *text=NULL,*name=NULL; + char *text=NULL,*text2=NULL,*name=NULL; struct search_list_result *res; struct widget *wc; struct item *item=NULL; @@ -2518,7 +2728,7 @@ gui_internal_search_idle(struct gui_priv *this, char *wm_name, struct widget *se struct widget *wi=gui_internal_find_widget(menu, NULL, STATE_EDIT); if (! strcmp(wm_name,"Town")) - trunk_name = g_strrstr(res->town->name, wi->text); + trunk_name = g_strrstr(res->town->common.town_name, wi->text); if (! strcmp(wm_name,"Street")) trunk_name = g_strrstr(name=res->street->name, wi->text); @@ -2532,7 +2742,7 @@ gui_internal_search_idle(struct gui_priv *this, char *wm_name, struct widget *se possible_keys[len+1]='\0'; } - dbg(1,"%s %s possible_keys:%s \n", wi->text, res->town->name, possible_keys); + dbg(1,"%s %s possible_keys:%s \n", wi->text, res->town->common.town_name, possible_keys); } } @@ -2540,7 +2750,7 @@ gui_internal_search_idle(struct gui_priv *this, char *wm_name, struct widget *se gui_internal_search_idle_end(this); struct menu_data *md=gui_internal_menu_data(this); - if (md && md->keyboard) { + if (md && md->keyboard && !(this->flags & 2048)) { GList *lk=md->keyboard->children; graphics_draw_mode(this->gra, draw_mode_begin); while (lk) { @@ -2576,24 +2786,42 @@ gui_internal_search_idle(struct gui_priv *this, char *wm_name, struct widget *se text=g_strdup_printf("%s", res->country->name); } if (! strcmp(wm_name,"Town")) { - name=res->town->name; item=&res->town->common.item; - if (res->town->name && res->town->district) - text=g_strdup_printf("%s%s%s (%s)", res->town->common.postal_mask ? res->town->common.postal_mask : "", res->town->common.postal_mask ? " ":"", res->town->name, res->town->district); - else - text=g_strdup_printf("%s%s%s", res->town->common.postal ? res->town->common.postal_mask : "", res->town->common.postal_mask ? " ":"", res->town->name); + name=res->town->common.town_name; + text=town_str(res, 1, 0); } if (! strcmp(wm_name,"Street")) { name=res->street->name; item=&res->street->common.item; - text=g_strdup_printf("%s %s", res->town->name, res->street->name); + text=g_strdup(res->street->name); + text2=town_str(res, 2, 1); + } + if (! strcmp(wm_name,"House number")) { + name=res->house_number->house_number; + text=g_strdup_printf("%s %s", res->street->name, name); + text2=town_str(res, 3, 0); } dbg(1,"res->country->flag=%s\n", res->country->flag); + if (!text2) { gui_internal_widget_append(search_list, wc=gui_internal_button_new_with_callback(this, text, image_new_xs(this, res->country->flag), gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_position, param)); + } else { + struct widget *wb; + wc=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill); + gui_internal_widget_append(wc, gui_internal_image_new(this, image_new_xs(this, res->country->flag))); + wb=gui_internal_box_new(this, gravity_left_center|orientation_vertical|flags_fill); + gui_internal_widget_append(wb, gui_internal_label_new(this, text)); + gui_internal_widget_append(wb, gui_internal_label_font_new(this, text2, 1)); + gui_internal_widget_append(wc, wb); + wc->func=gui_internal_cmd_position; + wc->data=param; + wc->state |= STATE_SENSITIVE; + wc->speech=g_strdup(text); + gui_internal_widget_append(search_list, wc); + } wc->name=g_strdup(name); if (res->c) wc->c=*res->c; @@ -2606,6 +2834,7 @@ gui_internal_search_idle(struct gui_priv *this, char *wm_name, struct widget *se gui_internal_widget_render(this, l->data); graphics_draw_mode(this->gra, draw_mode_end); g_free(text); + g_free(text2); } static void @@ -2636,6 +2865,8 @@ gui_internal_search_changed(struct gui_priv *this, struct widget *wm, void *data param=(void *)4; if (! strcmp(wm->name,"Street")) param=(void *)5; + if (! strcmp(wm->name,"House number")) + param=(void *)6; dbg(0,"%s now '%s'\n", wm->name, wm->text); gui_internal_search_idle_end(this); @@ -2660,10 +2891,10 @@ gui_internal_search_changed(struct gui_priv *this, struct widget *wm, void *data } static struct widget * -gui_internal_keyboard_key_data(struct gui_priv *this, struct widget *wkbd, char *text, void(*func)(struct gui_priv *priv, struct widget *widget, void *data), void *data, void (*data_free)(void *data), int w, int h) +gui_internal_keyboard_key_data(struct gui_priv *this, struct widget *wkbd, char *text, int font, void(*func)(struct gui_priv *priv, struct widget *widget, void *data), void *data, void (*data_free)(void *data), int w, int h) { struct widget *wk; - gui_internal_widget_append(wkbd, wk=gui_internal_button_new_with_callback(this, text, + gui_internal_widget_append(wkbd, wk=gui_internal_button_font_new_with_callback(this, text, font, NULL, gravity_center|orientation_vertical, func, data)); wk->data_free=data_free; wk->background=this->background; @@ -2677,7 +2908,7 @@ gui_internal_keyboard_key_data(struct gui_priv *this, struct widget *wkbd, char static struct widget * gui_internal_keyboard_key(struct gui_priv *this, struct widget *wkbd, char *text, char *key, int w, int h) { - return gui_internal_keyboard_key_data(this, wkbd, text, gui_internal_cmd_keypress, g_strdup(key), g_free,w,h); + return gui_internal_keyboard_key_data(this, wkbd, text, 0, gui_internal_cmd_keypress, g_strdup(key), g_free,w,h); } static void gui_internal_keyboard_change(struct gui_priv *this, struct widget *key, void *data); @@ -2685,7 +2916,7 @@ static void gui_internal_keyboard_change(struct gui_priv *this, struct widget *k // Some macros that make the keyboard layout easier to visualise in // the source code. The macros are #undef'd after this function. #define KEY(x) gui_internal_keyboard_key(this, wkbd, (x), (x), max_w, max_h) -#define SPACER() gui_internal_keyboard_key_data(this, wkbd, "", NULL, NULL, NULL,max_w,max_h) +#define SPACER() gui_internal_keyboard_key_data(this, wkbd, "", 0, NULL, NULL, NULL,max_w,max_h) static struct widget * gui_internal_keyboard_do(struct gui_priv *this, struct widget *wkbdb, int mode) { @@ -2693,12 +2924,29 @@ gui_internal_keyboard_do(struct gui_priv *this, struct widget *wkbdb, int mode) struct menu_data *md=gui_internal_menu_data(this); int i, max_w=this->root.w, max_h=this->root.h; int render=0; + char *space="_"; + char *backspace="←"; + char *ucase="ABC"; + int ucase_font=2; + char *lcase="abc"; + int lcase_font=2; + char *numeric="123"; + int numeric_font=2; + char *umlauts_ucase="ÄÖÜ"; + int umlauts_ucase_font=2; + char *umlauts_lcase="äöü"; + int umlauts_lcase_font=2; + char *hide="▼"; + char *unhide="▲"; if (wkbdb) { this->current.x=-1; this->current.y=-1; gui_internal_highlight(this); - render=1; + if (md->keyboard_mode >= 1024) + render=2; + else + render=1; gui_internal_widget_children_destroy(this, wkbdb); } else wkbdb=gui_internal_box_new(this, gravity_center|orientation_horizontal_vertical|flags_fill); @@ -2717,42 +2965,46 @@ gui_internal_keyboard_do(struct gui_priv *this, struct widget *wkbdb, int mode) char text[]={'A'+i,'\0'}; KEY(text); } - gui_internal_keyboard_key(this, wkbd, "_"," ",max_w,max_h); + gui_internal_keyboard_key(this, wkbd, space," ",max_w,max_h); if (mode == 0) { KEY("-"); KEY("'"); - SPACER(); + wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h); + wk->datai=mode+1024; } else { - SPACER(); - wk=gui_internal_keyboard_key_data(this, wkbd, "a", gui_internal_keyboard_change, wkbd, NULL,max_w,max_h); + wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h); + wk->datai=mode+1024; + wk=gui_internal_keyboard_key_data(this, wkbd, lcase, lcase_font, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h); wk->datai=mode+8; - wk=gui_internal_keyboard_key_data(this, wkbd, "1", gui_internal_keyboard_change, wkbd, NULL,max_w,max_h); + wk=gui_internal_keyboard_key_data(this, wkbd, numeric, numeric_font, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h); wk->datai=mode+16; } - wk=gui_internal_keyboard_key_data(this, wkbd, "Ä",gui_internal_keyboard_change, wkbdb,NULL,max_w,max_h); + wk=gui_internal_keyboard_key_data(this, wkbd, umlauts_ucase, umlauts_ucase_font, gui_internal_keyboard_change, wkbdb,NULL,max_w,max_h); wk->datai=mode+24; - gui_internal_keyboard_key(this, wkbd, "<-","\b",max_w,max_h); + gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h); } if (mode >= 8 && mode < 16) { for (i = 0 ; i < 26 ; i++) { char text[]={'a'+i,'\0'}; KEY(text); } - gui_internal_keyboard_key(this, wkbd, "_"," ",max_w,max_h); + gui_internal_keyboard_key(this, wkbd, space," ",max_w,max_h); if (mode == 8) { KEY("-"); KEY("'"); - SPACER(); + wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h); + wk->datai=mode+1024; } else { - SPACER(); - wk=gui_internal_keyboard_key_data(this, wkbd, "A", gui_internal_keyboard_change, wkbd, NULL,max_w,max_h); + wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h); + wk->datai=mode+1024; + wk=gui_internal_keyboard_key_data(this, wkbd, ucase, ucase_font, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h); wk->datai=mode-8; - wk=gui_internal_keyboard_key_data(this, wkbd, "1", gui_internal_keyboard_change, wkbd, NULL,max_w,max_h); + wk=gui_internal_keyboard_key_data(this, wkbd, numeric, numeric_font, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h); wk->datai=mode+8; } - wk=gui_internal_keyboard_key_data(this, wkbd, "ä",gui_internal_keyboard_change,wkbdb,NULL,max_w,max_h); + wk=gui_internal_keyboard_key_data(this, wkbd, umlauts_lcase, umlauts_lcase_font, gui_internal_keyboard_change,wkbdb,NULL,max_w,max_h); wk->datai=mode+24; - gui_internal_keyboard_key(this, wkbd, "<-","\b",max_w,max_h); + gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h); } if (mode >= 16 && mode < 24) { for (i = 0 ; i < 10 ; i++) { @@ -2767,17 +3019,19 @@ gui_internal_keyboard_do(struct gui_priv *this, struct widget *wkbdb, int mode) if (mode == 16) { KEY("-"); KEY("'"); - SPACER(); + wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h); + wk->datai=mode+1024; } else { - SPACER(); - wk=gui_internal_keyboard_key_data(this, wkbd, "A", gui_internal_keyboard_change, wkbd, NULL,max_w,max_h); + wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h); + wk->datai=mode+1024; + wk=gui_internal_keyboard_key_data(this, wkbd, ucase, ucase_font, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h); wk->datai=mode-16; - wk=gui_internal_keyboard_key_data(this, wkbd, "a", gui_internal_keyboard_change, wkbd, NULL,max_w,max_h); + wk=gui_internal_keyboard_key_data(this, wkbd, lcase, lcase_font, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h); wk->datai=mode-8; } - wk=gui_internal_keyboard_key_data(this, wkbd, "Ä",gui_internal_keyboard_change,wkbdb,NULL,max_w,max_h); + wk=gui_internal_keyboard_key_data(this, wkbd, umlauts_ucase, umlauts_ucase_font, gui_internal_keyboard_change,wkbdb,NULL,max_w,max_h); wk->datai=mode+8; - gui_internal_keyboard_key(this, wkbd, "<-","\b",max_w,max_h); + gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h); } if (mode >= 24 && mode < 32) { KEY("Ä"); KEY("Ë"); KEY("Ï"); KEY("Ö"); KEY("Ü"); KEY("Æ"); KEY("Ø"); KEY("Å"); @@ -2785,10 +3039,10 @@ gui_internal_keyboard_do(struct gui_priv *this, struct widget *wkbdb, int mode) KEY("À"); KEY("È"); KEY("Ì"); KEY("Ò"); KEY("Ù"); KEY("Ś"); KEY("Ć"); KEY("Ź"); KEY("Â"); KEY("Ê"); KEY("Î"); KEY("Ô"); KEY("Û"); SPACER(); - wk=gui_internal_keyboard_key_data(this, wkbd, "A",gui_internal_keyboard_change,wkbdb,NULL,max_w,max_h); + wk=gui_internal_keyboard_key_data(this, wkbd, ucase, ucase_font, gui_internal_keyboard_change,wkbdb,NULL,max_w,max_h); wk->datai=mode-24; - gui_internal_keyboard_key(this, wkbd, "<-","\b",max_w,max_h); + gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h); } if (mode >= 32 && mode < 40) { KEY("ä"); KEY("ë"); KEY("ï"); KEY("ö"); KEY("ü"); KEY("æ"); KEY("ø"); KEY("å"); @@ -2796,15 +3050,61 @@ gui_internal_keyboard_do(struct gui_priv *this, struct widget *wkbdb, int mode) KEY("à"); KEY("è"); KEY("ì"); KEY("ò"); KEY("ù"); KEY("ś"); KEY("ć"); KEY("ź"); KEY("â"); KEY("ê"); KEY("î"); KEY("ô"); KEY("û"); KEY("ß"); - wk=gui_internal_keyboard_key_data(this, wkbd, "a",gui_internal_keyboard_change,wkbdb,NULL,max_w,max_h); + wk=gui_internal_keyboard_key_data(this, wkbd, lcase, lcase_font, gui_internal_keyboard_change,wkbdb,NULL,max_w,max_h); wk->datai=mode-24; - gui_internal_keyboard_key(this, wkbd, "<-","\b",max_w,max_h); + gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h); + } + if (mode >= 1024) { + char *text; + int font; + struct widget *wkl; + mode -= 1024; + if (mode >= 0 && mode < 8) { + text=ucase; + font=ucase_font; + } + if (mode >= 8 && mode < 16) { + text=lcase; + font=lcase_font; + } + if (mode >= 16 && mode < 24) { + text=numeric; + font=numeric_font; + } + if (mode >= 24 && mode < 32) { + text=umlauts_ucase; + font=umlauts_ucase_font; + } + if (mode >= 32 && mode < 40) { + text=umlauts_lcase; + font=umlauts_lcase_font; + } + wk=gui_internal_box_new(this, gravity_center|orientation_horizontal|flags_fill); + wk->func=gui_internal_keyboard_change; + wk->data=wkbdb; + wk->background=this->background; + wk->bl=max_w/2; + wk->br=0; + wk->bt=max_h/3; + wk->bb=0; + wk->datai=mode; + wk->state |= STATE_SENSITIVE; + gui_internal_widget_append(wk, wkl=gui_internal_label_new(this, unhide)); + wkl->background=NULL; + gui_internal_widget_append(wk, wkl=gui_internal_label_font_new(this, text,font)); + wkl->background=NULL; + gui_internal_widget_append(wkbd, wk); + if (render) + render=2; } gui_internal_widget_append(wkbdb, wkbd); - if (render) { + if (render == 1) { gui_internal_widget_pack(this, wkbdb); gui_internal_widget_render(this, wkbdb); + } else if (render == 2) { + gui_internal_menu_reset_pack(this); + gui_internal_menu_render(this); } return wkbdb; } @@ -2889,6 +3189,7 @@ gui_internal_search(struct gui_priv *this, char *what, char *type, int flags) { struct widget *wb,*wk,*w,*wr,*we,*wl,*wnext=NULL; char *country; + int keyboard_mode=2; gui_internal_search_list_new(this); wb=gui_internal_menu(this, what); w=gui_internal_box_new(this, gravity_center|orientation_vertical|flags_expand|flags_fill); @@ -2931,6 +3232,7 @@ gui_internal_search(struct gui_priv *this, char *what, char *type, int flags) gui_internal_widget_append(we, wb=gui_internal_image_new(this, image_new_xs(this, "gui_select_street"))); wb->state |= STATE_SENSITIVE; wb->func = gui_internal_back; + keyboard_mode=18; } gui_internal_widget_append(we, wk=gui_internal_label_new(this, NULL)); if (wnext) { @@ -2946,7 +3248,7 @@ gui_internal_search(struct gui_priv *this, char *what, char *type, int flags) wk->func = gui_internal_search_changed; wk->name=g_strdup(type); if (this->keyboard) - gui_internal_widget_append(w, gui_internal_keyboard(this,2)); + gui_internal_widget_append(w, gui_internal_keyboard(this,keyboard_mode)); gui_internal_menu_render(this); } @@ -3014,7 +3316,7 @@ gui_internal_search_country(struct gui_priv *this, struct widget *widget, void * } static void -gui_internal_cmd_town(struct gui_priv *this, struct widget *wm, void *data) +gui_internal_cmd2_town(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { if (this->sl) search_list_select(this->sl, attr_country_all, 0, 0); @@ -3022,7 +3324,7 @@ gui_internal_cmd_town(struct gui_priv *this, struct widget *wm, void *data) } static void -gui_internal_cmd_layout(struct gui_priv *this, struct widget *wm, void *data) +gui_internal_cmd2_setting_layout(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { struct attr attr; struct widget *w,*wb,*wl; @@ -3044,174 +3346,62 @@ gui_internal_cmd_layout(struct gui_priv *this, struct widget *wm, void *data) } static void -gui_internal_cmd_fullscreen(struct gui_priv *this, struct widget *wm, void *data) +gui_internal_cmd2_quit(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { - graphics_draw_mode(this->gra, draw_mode_end); - if (this->fullscreen != 2) - this->fullscreen=!this->fullscreen; - this->win->fullscreen(this->win, this->fullscreen != 0); - graphics_draw_mode(this->gra, draw_mode_begin); + struct attr navit; + navit.type=attr_navit; + navit.u.navit=this->nav; + navit_destroy(navit.u.navit); + config_remove_attr(config, &navit); + event_main_loop_quit(); } static void -gui_internal_cmd_2d(struct gui_priv *this, struct widget *wm, void *data) +gui_internal_window_closed(struct gui_priv *this) { - struct transformation *trans=navit_get_trans(this->nav); - transform_set_pitch(trans, 0); - this->redraw=1; - gui_internal_prune_menu(this, NULL); + gui_internal_cmd2_quit(this, NULL, NULL, NULL, NULL); } static void -gui_internal_cmd_3d(struct gui_priv *this, struct widget *wm, void *data) +gui_internal_cmd2_abort_navigation(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { - struct transformation *trans=navit_get_trans(this->nav); - transform_set_pitch(trans, this->pitch); - this->redraw=1; - gui_internal_prune_menu(this, NULL); + navit_set_destination(this->nav, NULL, NULL, 0); } + static void -gui_internal_cmd_display(struct gui_priv *this, struct widget *wm, void *data) +gui_internal_cmd2_setting_maps(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { - struct widget *w; - struct transformation *trans; + struct attr attr, on, off, description, type, data; + struct widget *w,*wb,*wma; + char *label; + struct attr_iter *iter; - w=gui_internal_menu(this, _("Display")); - gui_internal_widget_append(w, - gui_internal_button_new_with_callback(this, _("Layout"), - image_new_l(this, "gui_display"), gravity_center|orientation_vertical, - gui_internal_cmd_layout, NULL)); - if(this->fullscreen != 2) { - if (this->fullscreen) { - gui_internal_widget_append(w, - gui_internal_button_new_with_callback(this, _("Window Mode"), - image_new_l(this, "gui_leave_fullscreen"), gravity_center|orientation_vertical, - gui_internal_cmd_fullscreen, NULL)); + wb=gui_internal_menu(this, _("Maps")); + w=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); + w->spy=this->spacing*3; + gui_internal_widget_append(wb, w); + iter=navit_attr_iter_new(); + on.type=off.type=attr_active; + on.u.num=1; + off.u.num=0; + while(navit_get_attr(this->nav, attr_map, &attr, iter)) { + if (map_get_attr(attr.u.map, attr_description, &description, NULL)) { + label=g_strdup(description.u.str); } else { - gui_internal_widget_append(w, - gui_internal_button_new_with_callback(this, _("Fullscreen"), - image_new_l(this, "gui_fullscreen"), gravity_center|orientation_vertical, - gui_internal_cmd_fullscreen, NULL)); + if (!map_get_attr(attr.u.map, attr_type, &type, NULL)) + type.u.str=""; + if (!map_get_attr(attr.u.map, attr_data, &data, NULL)) + data.u.str=""; + label=g_strdup_printf("%s:%s", type.u.str, data.u.str); } + wma=gui_internal_button_map_attr_new(this, label, gravity_left_center|orientation_horizontal|flags_fill, + attr.u.map, &on, &off, 1); + gui_internal_widget_append(w, wma); + g_free(label); } - trans=navit_get_trans(this->nav); - if (transform_get_pitch(trans)) { - gui_internal_widget_append(w, - gui_internal_button_new_with_callback(this, _("2D"), - image_new_l(this, "gui_map"), gravity_center|orientation_vertical, - gui_internal_cmd_2d, NULL)); - - } else { - gui_internal_widget_append(w, - gui_internal_button_new_with_callback(this, _("3D"), - image_new_l(this, "gui_map"), gravity_center|orientation_vertical, - gui_internal_cmd_3d, NULL)); - } - gui_internal_menu_render(this); -} - -static void -gui_internal_cmd_quit(struct gui_priv *this, struct widget *wm, void *data) -{ - struct attr navit; - navit.type=attr_navit; - navit.u.navit=this->nav; - navit_destroy(navit.u.navit); - config_remove_attr(config, &navit); - event_main_loop_quit(); -} - -static void -gui_internal_cmd_abort_navigation(struct gui_priv *this, struct widget *wm, void *data) -{ - navit_set_destination(this->nav, NULL, NULL, 0); -} - - -static void -gui_internal_cmd_actions(struct gui_priv *this, struct widget *wm, void *data) -{ - struct widget *w,*wc; - char *coord; - - w=gui_internal_menu(this, _("Actions")); - gui_internal_widget_append(w, - gui_internal_button_new_with_callback(this, _("Bookmarks"), - image_new_l(this, "gui_bookmark"), gravity_center|orientation_vertical, - gui_internal_cmd_bookmarks, NULL)); - if (this->clickp_valid) { - coord=coordinates(&this->clickp, '\n'); - gui_internal_widget_append(w, - wc=gui_internal_button_new_with_callback(this, coord, - image_new_l(this, "gui_map"), gravity_center|orientation_vertical, - gui_internal_cmd_position, (void *)1)); - wc->name=g_strdup(_("Map Point")); - wc->c=this->clickp; - g_free(coord); - } - if (this->vehicle_valid) { - coord=coordinates(&this->vehiclep, '\n'); - gui_internal_widget_append(w, - wc=gui_internal_button_new_with_callback(this, coord, - image_new_l(this, "gui_vehicle"), gravity_center|orientation_vertical, - gui_internal_cmd_position, NULL)); - wc->name=g_strdup(_("Vehicle Position")); - wc->c=this->vehiclep; - g_free(coord); - } - gui_internal_widget_append(w, - gui_internal_button_new_with_callback(this, _("Town"), - image_new_l(this, "gui_town"), gravity_center|orientation_vertical, - gui_internal_cmd_town, NULL)); - gui_internal_widget_append(w, - gui_internal_button_new_with_callback(this, _("Quit"), - image_new_l(this, "gui_quit"), gravity_center|orientation_vertical, - gui_internal_cmd_quit, NULL)); - - if (navit_check_route(this->nav)) { - gui_internal_widget_append(w, - gui_internal_button_new_with_callback(this, _("Stop\nNavigation"), - image_new_l(this, "gui_stop"), gravity_center|orientation_vertical, - gui_internal_cmd_abort_navigation, NULL)); - } - gui_internal_menu_render(this); -} - -static void -gui_internal_cmd_maps(struct gui_priv *this, struct widget *wm, void *wdata) -{ - struct attr attr, on, off, description, type, data; - struct widget *w,*wb,*wma; - char *label; - struct attr_iter *iter; - - - wb=gui_internal_menu(this, _("Maps")); - w=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); - w->spy=this->spacing*3; - gui_internal_widget_append(wb, w); - iter=navit_attr_iter_new(); - on.type=off.type=attr_active; - on.u.num=1; - off.u.num=0; - while(navit_get_attr(this->nav, attr_map, &attr, iter)) { - if (map_get_attr(attr.u.map, attr_description, &description, NULL)) { - label=g_strdup(description.u.str); - } else { - if (!map_get_attr(attr.u.map, attr_type, &type, NULL)) - type.u.str=""; - if (!map_get_attr(attr.u.map, attr_data, &data, NULL)) - data.u.str=""; - label=g_strdup_printf("%s:%s", type.u.str, data.u.str); - } - wma=gui_internal_button_map_attr_new(this, label, gravity_left_center|orientation_horizontal|flags_fill, - attr.u.map, &on, &off, 1); - gui_internal_widget_append(w, wma); - g_free(label); - } - navit_attr_iter_destroy(iter); + navit_attr_iter_destroy(iter); gui_internal_menu_render(this); } @@ -3311,7 +3501,7 @@ save_vehicle_xml(struct vehicle *v) dbg(0,"enter\n"); printf("nav, attr_gui, &attr, NULL)) - command_evaluate(&attr, command); + if (command) + command_evaluate(&this->self, command); } @@ -3611,8 +3774,8 @@ static void gui_internal_html_href(struct gui_priv *this, struct widget *w, void *data) { if (w->command && w->command[0] == '#') { - dbg(0,"href=%s\n",w->command); - gui_internal_html_menu(this, menu_html, w->command+1); + dbg(1,"href=%s\n",w->command); + gui_internal_html_menu(this, this->html_text, w->command+1); } } @@ -3624,11 +3787,21 @@ gui_internal_html_start(void *dummy, const char *tag_name, const char **names, c int i; enum html_tag tag=html_tag_none; struct html *html=&this->html[this->html_depth]; - const char *src; + const char *src, *cond; + + if (!strcasecmp(tag_name,"text")) + return; html->command=NULL; html->name=NULL; html->href=NULL; html->skip=0; + cond=find_attr(names, values, "cond"); + + if (cond && !this->html_skip) { + if (!command_evaluate_to_boolean(&this->self, cond, NULL)) + html->skip=1; + } + for (i=0 ; i < sizeof(html_tag_map)/sizeof(struct html_tag_map); i++) { if (!strcasecmp(html_tag_map[i].tag_name, tag_name)) { tag=html_tag_map[i].tag; @@ -3636,15 +3809,12 @@ gui_internal_html_start(void *dummy, const char *tag_name, const char **names, c } } html->tag=tag; - if (!this->html_skip) { + if (!this->html_skip && !html->skip) { switch (tag) { case html_tag_a: html->name=find_attr_dup(names, values, "name"); if (html->name) { - if (this->html_anchor_found) - html->skip=1; - else - html->skip=this->html_anchor ? strcmp(html->name,this->html_anchor) : 0; + html->skip=this->html_anchor ? strcmp(html->name,this->html_anchor) : 0; if (!html->skip) this->html_anchor_found=1; } @@ -3668,11 +3838,13 @@ static void gui_internal_html_end(void *dummy, const char *tag_name, void *data, void *error) { struct gui_priv *this=data; - this->html_depth--; - struct html *html=&this->html[this->html_depth]; + struct html *html; struct html *parent=NULL; - + if (!strcasecmp(tag_name,"text")) + return; + this->html_depth--; + html=&this->html[this->html_depth]; if (this->html_depth > 0) parent=&this->html[this->html_depth-1]; @@ -3684,7 +3856,7 @@ gui_internal_html_end(void *dummy, const char *tag_name, void *data, void *error html->w->func=gui_internal_html_command; html->command=NULL; } - if (parent && parent->href) { + if (parent && parent->href && html->w) { html->w->state |= STATE_SENSITIVE; html->w->command=g_strdup(parent->href); html->w->func=gui_internal_html_href; @@ -3710,10 +3882,19 @@ gui_internal_html_text(void *dummy, const char *text, int len, void *data, void struct widget *w; int depth=this->html_depth-1; struct html *html=&this->html[depth]; - struct attr attr; + char *text_stripped; if (this->html_skip) return; + while (isspace(text[0])) { + text++; + len--; + } + while (len > 0 && isspace(text[len-1])) + len--; + text_stripped=g_malloc(len+1); + strncpy(text_stripped, text, len); + text_stripped[len]='\0'; if (html->tag == html_tag_html && depth > 2) { if (this->html[depth-1].tag == html_tag_script) { html=&this->html[depth-2]; @@ -3722,13 +3903,13 @@ gui_internal_html_text(void *dummy, const char *text, int len, void *data, void switch (html->tag) { case html_tag_a: if (html->name && len) { - this->html_container=gui_internal_menu(this, gettext(text)); + this->html_container=gui_internal_menu(this, gettext(text_stripped)); this->html_container->spx=this->spacing*10; } break; case html_tag_h1: if (!this->html_container) { - this->html_container=gui_internal_menu(this, gettext(text)); + this->html_container=gui_internal_menu(this, gettext(text_stripped)); this->html_container->spx=this->spacing*10; } break; @@ -3736,14 +3917,13 @@ gui_internal_html_text(void *dummy, const char *text, int len, void *data, void if (len) { w=gui_internal_box_new(this, gravity_center|orientation_vertical); gui_internal_widget_append(w, html->w); - gui_internal_widget_append(w, gui_internal_text_new(this, gettext(text), gravity_center|orientation_vertical)); + gui_internal_widget_append(w, gui_internal_text_new(this, gettext(text_stripped), gravity_center|orientation_vertical)); html->w=w; } break; case html_tag_script: - attr.type=attr_gui; - dbg(0,"execute %s\n",text); - gui_internal_evaluate(this,text); + dbg(1,"execute %s\n",text_stripped); + gui_internal_evaluate(this,text_stripped); break; default: break; @@ -3766,7 +3946,7 @@ gui_internal_html_menu(struct gui_priv *this, const char *document, char *anchor static void gui_internal_menu_root(struct gui_priv *this) { - gui_internal_html_menu(this, menu_html, "Main Menu"); + gui_internal_html_menu(this, this->html_text, "Main Menu"); } static void @@ -3794,22 +3974,30 @@ gui_internal_cmd_menu(struct gui_priv *this, struct point *p, int ignore) { struct transformation *trans; struct coord c; + struct coord_geo g; struct attr attr,attrp; dbg(1,"enter\n"); gui_internal_enter(this, ignore); trans=navit_get_trans(this->nav); + attr_free(this->click_coord_geo); + this->click_coord_geo=NULL; + attr_free(this->position_coord_geo); + this->position_coord_geo=NULL; if (p) { transform_reverse(trans, p, &c); - dbg(0,"x=0x%x y=0x%x\n", c.x, c.y); + dbg(1,"x=0x%x y=0x%x\n", c.x, c.y); this->clickp.pro=transform_get_projection(trans); this->clickp.x=c.x; this->clickp.y=c.y; - transform_to_geo(this->clickp.pro, &c, &this->clickp_geo); - this->clickp_valid=1; + transform_to_geo(this->clickp.pro, &c, &g); + attr.u.coord_geo=&g; + attr.type=attr_click_coord_geo; + this->click_coord_geo=attr_dup(&attr); } if (navit_get_attr(this->nav, attr_vehicle, &attr, NULL) && attr.u.vehicle && vehicle_get_attr(attr.u.vehicle, attr_position_coord_geo, &attrp, NULL)) { + this->position_coord_geo=attr_dup(&attrp); this->vehiclep.pro=transform_get_projection(trans); transform_from_geo(this->vehiclep.pro, attrp.u.coord_geo, &c); this->vehiclep.x=c.x; @@ -3909,19 +4097,87 @@ gui_internal_get_attr(struct gui_priv *this, enum attr_type type, struct attr *a case attr_active: attr->u.num=this->root.children != NULL; break; + case attr_click_coord_geo: + if (!this->click_coord_geo) + return 0; + *attr=*this->click_coord_geo; + break; case attr_position_coord_geo: - if (!this->clickp_valid) + if (!this->position_coord_geo) return 0; - attr->u.coord_geo=&this->clickp_geo; + *attr=*this->position_coord_geo; + break; + case attr_pitch: + attr->u.num=this->pitch; break; default: - dbg(0,"%s\n",attr_to_name(type)); return 0; } attr->type=type; return 1; } +static int +gui_internal_add_attr(struct gui_priv *this, struct attr *attr) +{ + switch (attr->type) { + case attr_xml_text: + g_free(this->html_text); + this->html_text=g_strdup(attr->u.str); + return 1; + default: + return 0; + } +} + +static int +gui_internal_set_attr(struct gui_priv *this, struct attr *attr) +{ + switch (attr->type) { + case attr_fullscreen: + if ((this->fullscreen > 0) != (attr->u.num > 0)) { + graphics_draw_mode(this->gra, draw_mode_end); + this->win->fullscreen(this->win, attr->u.num > 0); + graphics_draw_mode(this->gra, draw_mode_begin); + } + this->fullscreen=attr->u.num; + return 1; + default: + dbg(0,"%s\n",attr_to_name(attr->type)); + return 0; + } +} + +static void gui_internal_dbus_signal(struct gui_priv *this, struct point *p) +{ + struct displaylist_handle *dlh; + struct displaylist *display; + struct displayitem *di; + + display=navit_get_displaylist(this->nav); + dlh=graphics_displaylist_open(display); + while ((di=graphics_displaylist_next(dlh))) { + struct item *item=graphics_displayitem_get_item(di); + if (item_is_point(*item) && graphics_displayitem_get_displayed(di) && + graphics_displayitem_within_dist(display, di, p, 10)) { + struct map_rect *mr=map_rect_new(item->map, NULL); + struct item *itemo=map_rect_get_item_byid(mr, item->id_hi, item->id_lo); + struct attr attr; + if (item_attr_get(itemo, attr_data, &attr)) { + struct attr cb,*attr_list[2]; + int valid=0; + attr.type=attr_data; + attr_list[0]=&attr; + attr_list[1]=NULL; + if (navit_get_attr(this->nav, attr_callback_list, &cb, NULL)) + callback_list_call_attr_4(cb.u.callback_list, attr_command, "dbus_send_signal", attr_list, NULL, &valid); + } + map_rect_destroy(mr); + } + } + graphics_displaylist_close(dlh); +} + //############################################################################################################## //# Description: Function to handle mouse clicks and scroll wheel movement @@ -3937,6 +4193,7 @@ static void gui_internal_button(void *data, int pressed, int button, struct poin // if still on the map (not in the menu, yet): dbg(1,"children=%p ignore_button=%d\n",this->root.children,this->ignore_button); if (!this->root.children || this->ignore_button) { + this->ignore_button=0; // check whether the position of the mouse changed during press/release OR if it is the scrollwheel if (!navit_handle_button(this->nav, pressed, button, p, NULL)) { @@ -3944,8 +4201,16 @@ static void gui_internal_button(void *data, int pressed, int button, struct poin return; } dbg(1,"menu_on_map_click=%d\n",this->menu_on_map_click); - if (this->menu_on_map_click && button == 1) + if (button != 1) + return; + if (this->menu_on_map_click) { gui_internal_cmd_menu(this, p, 0); + return; + } + if (this->signal_on_map_click) { + gui_internal_dbus_signal(this, p); + return; + } return; } @@ -4213,6 +4478,8 @@ static int gui_internal_set_graphics(struct gui_priv *this, struct graphics *gra graphics_add_callback(gra, this->motion_cb); this->keypress_cb=callback_new_attr_1(callback_cast(gui_internal_keypress), attr_keypress, this); graphics_add_callback(gra, this->keypress_cb); + this->window_closed_cb=callback_new_attr_1(callback_cast(gui_internal_window_closed), attr_window_closed, this); + graphics_add_callback(gra, this->window_closed_cb); // set fullscreen if needed if (this->fullscreen) @@ -4243,6 +4510,8 @@ struct gui_methods gui_internal_methods = { NULL, gui_internal_disable_suspend, gui_internal_get_attr, + gui_internal_add_attr, + gui_internal_set_attr, }; static void @@ -4339,14 +4608,14 @@ static void gui_internal_cmd_write(struct gui_priv * this, char *function, struct attr **in, struct attr ***out, int *valid) { char *str=NULL,*str2=NULL; - dbg(0,"enter %s %p %p %p\n",function,in,out,valid); + dbg(1,"enter %s %p %p %p\n",function,in,out,valid); if (!in || !in[0]) return; - dbg(0,"%s\n",attr_to_name(in[0]->type)); - if (in[0]->type >= attr_type_string_begin && in[0]->type <= attr_type_string_end) { + dbg(1,"%s\n",attr_to_name(in[0]->type)); + if (ATTR_IS_STRING(in[0]->type)) { str=in[0]->u.str; } - if (in[0]->type >= attr_type_coord_geo_begin && in[0]->type <= attr_type_coord_geo_end) { + if (ATTR_IS_COORD_GEO(in[0]->type)) { str=str2=coordinates_geo(in[0]->u.coord_geo, '\n'); } if (str) { @@ -4357,131 +4626,6 @@ gui_internal_cmd_write(struct gui_priv * this, char *function, struct attr **in, g_free(str2); } -static struct command_table commands[] = { - {"actions",command_cast(gui_internal_cmd_actions)}, - {"fullscreen",command_cast(gui_internal_cmd_fullscreen)}, - {"get_data",command_cast(gui_internal_get_data)}, - {"log",command_cast(gui_internal_cmd_log)}, - {"menu",command_cast(gui_internal_cmd_menu2)}, - {"route",command_cast(gui_internal_cmd_route)}, - {"settings",command_cast(gui_internal_cmd_settings)}, - {"tools",command_cast(gui_internal_cmd_tools)}, - {"write",command_cast(gui_internal_cmd_write)}, -}; - - -//############################################################################################################## -//# Description: -//# Comment: -//# Authors: Martin Schaller (04/2008) -//############################################################################################################## -static struct gui_priv * gui_internal_new(struct navit *nav, struct gui_methods *meth, struct attr **attrs) -{ - struct gui_priv *this; - struct attr *attr; - *meth=gui_internal_methods; - this=g_new0(struct gui_priv, 1); - this->nav=nav; - if ((attr=attr_search(attrs, NULL, attr_menu_on_map_click))) - this->menu_on_map_click=attr->u.num; - else - this->menu_on_map_click=1; - if ((attr=attr_search(attrs, NULL, attr_callback_list))) { - command_add_table(attr->u.callback_list, commands, sizeof(commands)/sizeof(struct command_table), this); - } - - if( (attr=attr_search(attrs,NULL,attr_font_size))) - { - this->config.font_size=attr->u.num; - } - else - { - this->config.font_size=-1; - } - if( (attr=attr_search(attrs,NULL,attr_icon_xs))) - { - this->config.icon_xs=attr->u.num; - } - else - { - this->config.icon_xs=-1; - } - if( (attr=attr_search(attrs,NULL,attr_icon_l))) - { - this->config.icon_l=attr->u.num; - } - else - { - this->config.icon_l=-1; - } - if( (attr=attr_search(attrs,NULL,attr_icon_s))) - { - this->config.icon_s=attr->u.num; - } - else - { - this->config.icon_s=-1; - } - if( (attr=attr_search(attrs,NULL,attr_spacing))) - { - this->config.spacing=attr->u.num; - } - else - { - this->config.spacing=-1; - } - if( (attr=attr_search(attrs,NULL,attr_gui_speech))) - { - this->speech=attr->u.num; - } - if( (attr=attr_search(attrs,NULL,attr_keyboard))) - this->keyboard=attr->u.num; - else - this->keyboard=1; - - if( (attr=attr_search(attrs,NULL,attr_fullscreen))) - this->fullscreen=attr->u.num; - - if( (attr=attr_search(attrs,NULL,attr_flags))) - this->flags=attr->u.num; - if( (attr=attr_search(attrs,NULL,attr_background_color))) - this->background_color=*attr->u.color; - else - this->background_color=(struct color){0x0,0x0,0x0,0xffff}; - if( (attr=attr_search(attrs,NULL,attr_background_color2))) - this->background2_color=*attr->u.color; - else - this->background2_color=(struct color){0x4141,0x4141,0x4141,0xffff}; - if( (attr=attr_search(attrs,NULL,attr_text_color))) - this->text_foreground_color=*attr->u.color; - else - this->text_foreground_color=(struct color){0xffff,0xffff,0xffff,0xffff}; - if( (attr=attr_search(attrs,NULL,attr_columns))) - this->cols=attr->u.num; - if( (attr=attr_search(attrs,NULL,attr_osd_configuration))) - this->osd_configuration=*attr; - - if( (attr=attr_search(attrs,NULL,attr_pitch))) - this->pitch=attr->u.num; - else - this->pitch=20; - this->data.priv=this; - this->data.gui=&gui_internal_methods_ext; - this->data.widget=&gui_internal_widget_methods; - this->cbl=callback_list_new(); - - return this; -} - -//############################################################################################################## -//# Description: -//# Comment: -//# Authors: Martin Schaller (04/2008) -//############################################################################################################## -void plugin_init(void) -{ - plugin_register_gui_type("internal", gui_internal_new); -} /** * @brief Creates a new table widget. @@ -4910,7 +5054,7 @@ void gui_internal_table_render(struct gui_priv * this, struct widget * w) * @param v Unused */ static void -gui_internal_cmd_route_description(struct gui_priv * this, struct widget * wm,void *v) +gui_internal_cmd2_route_description(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { @@ -5033,7 +5177,8 @@ item_get_heightline(struct item *item) * @param wm The button that was pressed. * @param v Unused */ -static void gui_internal_cmd_route_height_profile(struct gui_priv * this, struct widget * wm,void *v) +static void +gui_internal_cmd2_route_height_profile(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { @@ -5188,33 +5333,8 @@ static void gui_internal_cmd_route_height_profile(struct gui_priv * this, struct } -/** - * @brief Displays Route information - * - * @li The name of the active vehicle - * @param wm The button that was pressed. - * @param v Unused - */ -void gui_internal_cmd_route(struct gui_priv * this, struct widget * wm,void *v) -{ - struct widget *w; - - graphics_draw_mode(this->gra, draw_mode_begin); - w=gui_internal_menu(this, _("Route")); - w->spx=this->spacing*10; - gui_internal_widget_append(w, gui_internal_button_new_with_callback(this, _("Description"), - image_new_l(this, "gui_actions"), gravity_center|orientation_vertical, - gui_internal_cmd_route_description, NULL)); - gui_internal_widget_append(w, gui_internal_button_new_with_callback(this, _("Height Profile"), - image_new_l(this, "gui_actions"), gravity_center|orientation_vertical, - gui_internal_cmd_route_height_profile, NULL)); - gui_internal_menu_render(this); - graphics_draw_mode(this->gra, draw_mode_end); - -} - static void -gui_internal_cmd_show_locale(struct gui_priv * this, struct widget * wm,void *v) +gui_internal_cmd2_locale(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { struct widget *menu,*wb,*w; char *text; @@ -5253,21 +5373,6 @@ gui_internal_cmd_show_locale(struct gui_priv * this, struct widget * wm,void *v) } -static void -gui_internal_cmd_tools(struct gui_priv * this, struct widget * wm,void *v) -{ - struct widget *w; - - graphics_draw_mode(this->gra, draw_mode_begin); - w=gui_internal_menu(this, _("Tools")); - w->spx=this->spacing*10; - gui_internal_widget_append(w, gui_internal_button_new_with_callback(this, _("Show Locale"), - image_new_l(this, "gui_actions"), gravity_center|orientation_vertical, - gui_internal_cmd_show_locale, NULL)); - gui_internal_menu_render(this); - graphics_draw_mode(this->gra, draw_mode_end); -} - /** * @brief handles the 'next page' table event. * A callback function that is invoked when the 'next page' button is pressed @@ -5450,3 +5555,159 @@ void gui_internal_populate_route_table(struct gui_priv * this, } } + +static struct command_table commands[] = { + {"abort_navigation",command_cast(gui_internal_cmd2_abort_navigation)}, + {"back",command_cast(gui_internal_cmd2_back)}, + {"back_to_map",command_cast(gui_internal_cmd2_back_to_map)}, + {"bookmarks",command_cast(gui_internal_cmd2_bookmarks)}, + {"get_data",command_cast(gui_internal_get_data)}, + {"locale",command_cast(gui_internal_cmd2_locale)}, + {"log",command_cast(gui_internal_cmd_log)}, + {"menu",command_cast(gui_internal_cmd_menu2)}, + {"position",command_cast(gui_internal_cmd2_position)}, + {"route_description",command_cast(gui_internal_cmd2_route_description)}, + {"route_height_profile",command_cast(gui_internal_cmd2_route_height_profile)}, + {"setting_layout",command_cast(gui_internal_cmd2_setting_layout)}, + {"setting_maps",command_cast(gui_internal_cmd2_setting_maps)}, + {"setting_rules",command_cast(gui_internal_cmd2_setting_rules)}, + {"setting_vehicle",command_cast(gui_internal_cmd2_setting_vehicle)}, + {"town",command_cast(gui_internal_cmd2_town)}, + {"quit",command_cast(gui_internal_cmd2_quit)}, + {"write",command_cast(gui_internal_cmd_write)}, +}; + + +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +static struct gui_priv * gui_internal_new(struct navit *nav, struct gui_methods *meth, struct attr **attrs, struct gui *gui) +{ + struct gui_priv *this; + struct attr *attr; + *meth=gui_internal_methods; + this=g_new0(struct gui_priv, 1); + this->nav=nav; + + this->self.type=attr_gui; + this->self.u.gui=gui; + + if ((attr=attr_search(attrs, NULL, attr_menu_on_map_click))) + this->menu_on_map_click=attr->u.num; + else + this->menu_on_map_click=1; + if ((attr=attr_search(attrs, NULL, attr_signal_on_map_click))) + this->signal_on_map_click=attr->u.num; + + if ((attr=attr_search(attrs, NULL, attr_callback_list))) { + command_add_table(attr->u.callback_list, commands, sizeof(commands)/sizeof(struct command_table), this); + } + + if( (attr=attr_search(attrs,NULL,attr_font_size))) + { + this->config.font_size=attr->u.num; + } + else + { + this->config.font_size=-1; + } + if( (attr=attr_search(attrs,NULL,attr_icon_xs))) + { + this->config.icon_xs=attr->u.num; + } + else + { + this->config.icon_xs=-1; + } + if( (attr=attr_search(attrs,NULL,attr_icon_l))) + { + this->config.icon_l=attr->u.num; + } + else + { + this->config.icon_l=-1; + } + if( (attr=attr_search(attrs,NULL,attr_icon_s))) + { + this->config.icon_s=attr->u.num; + } + else + { + this->config.icon_s=-1; + } + if( (attr=attr_search(attrs,NULL,attr_spacing))) + { + this->config.spacing=attr->u.num; + } + else + { + this->config.spacing=-1; + } + if( (attr=attr_search(attrs,NULL,attr_gui_speech))) + { + this->speech=attr->u.num; + } + if( (attr=attr_search(attrs,NULL,attr_keyboard))) + this->keyboard=attr->u.num; + else + this->keyboard=1; + + if( (attr=attr_search(attrs,NULL,attr_fullscreen))) + this->fullscreen=attr->u.num; + + if( (attr=attr_search(attrs,NULL,attr_flags))) + this->flags=attr->u.num; + if( (attr=attr_search(attrs,NULL,attr_background_color))) + this->background_color=*attr->u.color; + else + this->background_color=COLOR_BLACK; + if( (attr=attr_search(attrs,NULL,attr_background_color2))) + this->background2_color=*attr->u.color; + else + this->background2_color=(struct color){0x4141,0x4141,0x4141,0xffff}; + if( (attr=attr_search(attrs,NULL,attr_text_color))) + this->text_foreground_color=*attr->u.color; + else + this->text_foreground_color=COLOR_WHITE; + this->text_background_color=COLOR_BLACK; + if( (attr=attr_search(attrs,NULL,attr_columns))) + this->cols=attr->u.num; + if( (attr=attr_search(attrs,NULL,attr_osd_configuration))) + this->osd_configuration=*attr; + + if( (attr=attr_search(attrs,NULL,attr_pitch))) + this->pitch=attr->u.num; + else + this->pitch=20; + if( (attr=attr_search(attrs,NULL,attr_flags_town))) + this->flags_town=attr->u.num; + else + this->flags_town=-1; + if( (attr=attr_search(attrs,NULL,attr_flags_street))) + this->flags_street=attr->u.num; + else + this->flags_street=-1; + if( (attr=attr_search(attrs,NULL,attr_flags_house_number))) + this->flags_house_number=attr->u.num; + else + this->flags_house_number=-1; + this->data.priv=this; + this->data.gui=&gui_internal_methods_ext; + this->data.widget=&gui_internal_widget_methods; + this->cbl=callback_list_new(); + + return this; +} + +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +void plugin_init(void) +{ + plugin_register_gui_type("internal", gui_internal_new); +} +