Add:Core:Code to highlight object at view on map
authormartin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220>
Fri, 6 Mar 2009 12:44:56 +0000 (12:44 +0000)
committermartin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220>
Fri, 6 Mar 2009 12:44:56 +0000 (12:44 +0000)
git-svn-id: https://navit.svn.sourceforge.net/svnroot/navit/trunk@2083 ffa7fe5e-494d-0410-b361-a75ebd5db220

navit/navit/graphics.c
navit/navit/graphics.h
navit/navit/gui/internal/gui_internal.c
navit/navit/item_def.h

index c374f53..37f7b84 100644 (file)
@@ -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);
+       }
+}
index 8e245b0..00e1c42 100644 (file)
@@ -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
 }
index 03d722a..212d861 100644 (file)
@@ -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;
index 977920b..05d17fb 100644 (file)
@@ -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)