From dd3ef9d2f0d6246cff2d448c6f055ea17c932565 Mon Sep 17 00:00:00 2001 From: martin-s Date: Fri, 6 Mar 2009 12:44:56 +0000 Subject: [PATCH] Add:Core:Code to highlight object at view on map git-svn-id: https://navit.svn.sourceforge.net/svnroot/navit/trunk@2083 ffa7fe5e-494d-0410-b361-a75ebd5db220 --- navit/navit/graphics.c | 104 +++++++++++++++++++++++++++++++- navit/navit/graphics.h | 20 +++--- navit/navit/gui/internal/gui_internal.c | 22 +++++-- navit/navit/item_def.h | 3 + 4 files changed, 134 insertions(+), 15 deletions(-) diff --git a/navit/navit/graphics.c b/navit/navit/graphics.c index c374f53..37f7b84 100644 --- a/navit/navit/graphics.c +++ b/navit/navit/graphics.c @@ -67,6 +67,7 @@ struct graphics struct attr **attrs; struct callback_list *cbl; struct point_rect r; + GList *selection; }; struct display_context @@ -99,6 +100,8 @@ struct displaylist { static void draw_circle(struct point *pnt, int diameter, int scale, int start, int len, struct point *res, int *pos, int dir); +static void graphics_process_selection(struct graphics *gra, struct displaylist *dl); + void graphics_set_rect(struct graphics *gra, struct point_rect *pr) { @@ -672,7 +675,7 @@ static void display_add(struct displaylist *displaylist, struct item *item, int h=g_hash_table_new_full(displayitem_hash, displayitem_equal, g_free, NULL); g_hash_table_insert(displaylist->dl, GINT_TO_POINTER(item->type), h); } - g_hash_table_replace(h, di, NULL); + g_hash_table_replace(h, di, di); } @@ -1663,6 +1666,7 @@ do_draw(struct displaylist *displaylist, int cancel) event_remove_idle(displaylist->idle_ev); displaylist->idle_ev=NULL; displaylist->busy=0; + graphics_process_selection(displaylist->dc.gra, displaylist); if (! cancel) graphics_displaylist_draw(displaylist->dc.gra, displaylist, displaylist->dc.trans, displaylist->layout, 1); map_rect_destroy(displaylist->mr); @@ -1956,3 +1960,101 @@ int graphics_displayitem_within_dist(struct displaylist *displaylist, struct dis } return within_dist_polygon(p, pa, count, dist); } + + +static enum item_type +graphics_selection_type(enum item_type type) +{ + if (type < type_line) + return type_selected_point; + if (type < type_area) + return type_selected_line; + return type_selected_area; + +} + + +static void +graphics_process_selection_item(struct displaylist *dl, struct item *item) +{ + struct displayitem di,*di_res; + GHashTable *h; + + di.item=*item; + di.label=NULL; + di.displayed=0; + di.count=0; + h=g_hash_table_lookup(dl->dl, GINT_TO_POINTER(di.item.type)); + if (h) { + di_res=g_hash_table_lookup(h, &di); + if (di_res) { + di.item.type=graphics_selection_type(di.item.type); + display_add(dl, &di.item, di_res->count, di_res->c, NULL); + } + } +} + +void +graphics_add_selection(struct graphics *gra, struct item *item, struct displaylist *dl) +{ + struct item *item_dup=g_new(struct item, 1); + *item_dup=*item; + gra->selection=g_list_append(gra->selection, item_dup); + if (dl) + graphics_process_selection_item(dl, item_dup); +} + +void +graphics_remove_selection(struct graphics *gra, struct item *item, struct displaylist *dl) +{ + GList *curr; + int found; + + for (;;) { + curr=gra->selection; + found=0; + while (curr) { + struct item *sitem=curr->data; + if (item_is_equal(*item,*sitem)) { + if (dl) { + struct displayitem di; + GHashTable *h; + di.item=*sitem; + di.label=NULL; + di.displayed=0; + di.count=0; + di.item.type=graphics_selection_type(di.item.type); + h=g_hash_table_lookup(dl->dl, GINT_TO_POINTER(di.item.type)); + if (h) + g_hash_table_remove(h, &di); + } + g_free(sitem); + gra->selection=g_list_remove(gra->selection, curr->data); + found=1; + break; + } + } + if (!found) + return; + } +} + +void +graphics_clear_selection(struct graphics *gra, struct displaylist *dl) +{ + while (gra->selection) + graphics_remove_selection(gra, (struct item *)gra->selection->data, dl); +} + +static void +graphics_process_selection(struct graphics *gra, struct displaylist *dl) +{ + GList *curr; + + curr=gra->selection; + while (curr) { + struct item *item=curr->data; + graphics_process_selection_item(dl, item); + curr=g_list_next(curr); + } +} diff --git a/navit/navit/graphics.h b/navit/navit/graphics.h index 8e245b0..00e1c42 100644 --- a/navit/navit/graphics.h +++ b/navit/navit/graphics.h @@ -108,6 +108,7 @@ enum attr_type; enum draw_mode_num; struct attr; struct attr_iter; +struct callback; struct color; struct displayitem; struct displaylist; @@ -117,13 +118,12 @@ struct graphics_font; struct graphics_gc; struct graphics_image; struct item; +struct itemgra; struct layout; struct point; +struct point_rect; struct transformation; -struct callback; -struct itemgra; void graphics_set_rect(struct graphics *gra, struct point_rect *pr); -void graphics_resize(struct graphics *gra, int w, int h); struct graphics *graphics_new(struct attr *parent, struct attr **attrs); int graphics_get_attr(struct graphics *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter); struct graphics *graphics_overlay_new(struct graphics *parent, struct point *p, int w, int h, int alpha, int wraparound); @@ -132,15 +132,15 @@ void *graphics_get_data(struct graphics *this_, char *type); void graphics_add_callback(struct graphics *this_, struct callback *cb); void graphics_remove_callback(struct graphics *this_, struct callback *cb); struct graphics_font *graphics_font_new(struct graphics *gra, int size, int flags); -void graphics_font_destroy_all(struct graphics *gra); +void graphics_font_destroy_all(struct graphics *gra); struct graphics_gc *graphics_gc_new(struct graphics *gra); void graphics_gc_destroy(struct graphics_gc *gc); void graphics_gc_set_foreground(struct graphics_gc *gc, struct color *c); void graphics_gc_set_background(struct graphics_gc *gc, struct color *c); void graphics_gc_set_linewidth(struct graphics_gc *gc, int width); void graphics_gc_set_dashes(struct graphics_gc *gc, int width, int offset, unsigned char dash_list[], int n); -struct graphics_image * graphics_image_new_scaled(struct graphics *gra, char *path, int w, int h); -struct graphics_image * graphics_image_new_scaled_rotated(struct graphics *gra, char *path, int w, int h, int rotate); +struct graphics_image *graphics_image_new_scaled(struct graphics *gra, char *path, int w, int h); +struct graphics_image *graphics_image_new_scaled_rotated(struct graphics *gra, char *path, int w, int h, int rotate); struct graphics_image *graphics_image_new(struct graphics *gra, char *path); void graphics_image_free(struct graphics *gra, struct graphics_image *img); void graphics_draw_restore(struct graphics *this_, struct point *p, int w, int h); @@ -148,16 +148,15 @@ void graphics_draw_mode(struct graphics *this_, enum draw_mode_num mode); void graphics_draw_lines(struct graphics *this_, struct graphics_gc *gc, struct point *p, int count); void graphics_draw_circle(struct graphics *this_, struct graphics_gc *gc, struct point *p, int r); void graphics_draw_rectangle(struct graphics *this_, struct graphics_gc *gc, struct point *p, int w, int h); +void graphics_draw_rectangle_rounded(struct graphics *this_, struct graphics_gc *gc, struct point *plu, int w, int h, int r, int fill); void graphics_draw_text(struct graphics *this_, struct graphics_gc *gc1, struct graphics_gc *gc2, struct graphics_font *font, char *text, struct point *p, int dx, int dy); void graphics_get_text_bbox(struct graphics *this_, struct graphics_font *font, char *text, int dx, int dy, struct point *ret, int estimate); void graphics_overlay_disable(struct graphics *this_, int disable); void graphics_draw_image(struct graphics *this_, struct graphics_gc *gc, struct point *p, struct graphics_image *img); int graphics_draw_drag(struct graphics *this_, struct point *p); void graphics_background_gc(struct graphics *this_, struct graphics_gc *gc); -int graphics_ready(struct graphics *this_); -void graphics_displaylist_draw(struct graphics *gra, struct displaylist *displaylist, struct transformation *trans, struct layout *l, int callback); -void graphics_displaylist_move(struct displaylist *displaylist, int dx, int dy); void graphics_draw_itemgra(struct graphics *gra, struct itemgra *itm, struct transformation *t); +void graphics_displaylist_draw(struct graphics *gra, struct displaylist *displaylist, struct transformation *trans, struct layout *l, int callback); void graphics_draw(struct graphics *gra, struct displaylist *displaylist, GList *mapsets, struct transformation *trans, struct layout *l, int async, struct callback *cb); int graphics_draw_cancel(struct graphics *gra, struct displaylist *displaylist); struct displaylist_handle *graphics_displaylist_open(struct displaylist *displaylist); @@ -167,6 +166,9 @@ struct displaylist *graphics_displaylist_new(void); struct item *graphics_displayitem_get_item(struct displayitem *di); char *graphics_displayitem_get_label(struct displayitem *di); int graphics_displayitem_within_dist(struct displaylist *displaylist, struct displayitem *di, struct point *p, int dist); +void graphics_add_selection(struct graphics *gra, struct item *item, struct displaylist *dl); +void graphics_remove_selection(struct graphics *gra, struct item *item, struct displaylist *dl); +void graphics_clear_selection(struct graphics *gra, struct displaylist *dl); /* end of prototypes */ #ifdef __cplusplus } diff --git a/navit/navit/gui/internal/gui_internal.c b/navit/navit/gui/internal/gui_internal.c index 03d722a..212d861 100644 --- a/navit/navit/gui/internal/gui_internal.c +++ b/navit/navit/gui/internal/gui_internal.c @@ -111,6 +111,7 @@ struct widget { char *speech; struct pcoord c; struct item item; + int selection_id; int state; struct point p; int wmin,hmin; @@ -1945,6 +1946,11 @@ 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); + if (highlight) { + graphics_clear_selection(this->gra, NULL); + graphics_add_selection(this->gra, &w->item, NULL); + } navit_set_center(this->nav, &w->c); gui_internal_prune_menu(this, NULL); } @@ -2317,6 +2323,7 @@ gui_internal_search_idle(struct gui_priv *this, char *wm_name, struct widget *se char *text=NULL,*name=NULL; struct search_list_result *res; struct widget *wc; + struct item *item=NULL; GList *l; res=search_list_get_result(this->sl); @@ -2327,14 +2334,17 @@ gui_internal_search_idle(struct gui_priv *this, char *wm_name, struct widget *se if (! strcmp(wm_name,"Country")) { name=res->country->name; + item=&res->country->item; text=g_strdup_printf("%s", res->country->name); } if (! strcmp(wm_name,"Town")) { name=res->town->name; + item=&res->town->item; text=g_strdup(name); } if (! strcmp(wm_name,"Street")) { name=res->street->name; + item=&res->street->item; text=g_strdup_printf("%s %s", res->town->name, res->street->name); } #if 0 @@ -2350,7 +2360,9 @@ gui_internal_search_idle(struct gui_priv *this, char *wm_name, struct widget *se wc->name=g_strdup(name); if (res->c) wc->c=*res->c; - wc->item.id_lo=res->id; + wc->selection_id=res->id; + if (item) + wc->item=*item; gui_internal_widget_pack(this, search_list); l=g_list_last(this->root.children); graphics_draw_mode(this->gra, draw_mode_begin); @@ -2699,9 +2711,9 @@ gui_internal_search_street(struct gui_priv *this, struct widget *widget, void *d static void gui_internal_search_street_in_town(struct gui_priv *this, struct widget *widget, void *data) { - dbg(0,"id %d\n", widget->item.id_lo); + dbg(0,"id %d\n", widget->selection_id); search_list_select(this->sl, attr_town_name, 0, 0); - search_list_select(this->sl, attr_town_name, widget->item.id_lo, 1); + search_list_select(this->sl, attr_town_name, widget->selection_id, 1); gui_internal_search(this,_("Street"),"Street",0); } @@ -2719,9 +2731,9 @@ static void gui_internal_search_town_in_country(struct gui_priv *this, struct widget *widget) { struct search_list_common *slc; - dbg(0,"id %d\n", widget->item.id_lo); + dbg(0,"id %d\n", widget->selection_id); search_list_select(this->sl, attr_country_all, 0, 0); - slc=search_list_select(this->sl, attr_country_all, widget->item.id_lo, 1); + slc=search_list_select(this->sl, attr_country_all, widget->selection_id, 1); if (slc) { g_free(this->country_iso2); this->country_iso2=((struct search_list_country *)slc)->iso2; diff --git a/navit/navit/item_def.h b/navit/navit/item_def.h index 977920b..05d17fb 100644 --- a/navit/navit/item_def.h +++ b/navit/navit/item_def.h @@ -302,6 +302,7 @@ ITEM(poi_tennis) ITEM(house_number) ITEM(route_start) ITEM(route_end) +ITEM(selected_point) /* Line */ ITEM2(0x80000000,line) ITEM2(0x80000001,line_unspecified) @@ -420,6 +421,7 @@ ITEM(street_turn_restriction_no) ITEM(street_turn_restriction_only) ITEM(border_city) ITEM(border_county) +ITEM(selected_line) /* Area */ ITEM2(0xc0000000,area) ITEM2(0xc0000001,area_unspecified) @@ -515,4 +517,5 @@ ITEM(poly_street_3) ITEM(poly_wetland) ITEM(poly_aeroway_runway) ITEM(map_information) +ITEM(selected_area) ITEM2(0xffffffff,last) -- 2.7.4