Fix:Core:Made zoom_to_route work better
authormartin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220>
Wed, 4 Feb 2009 15:29:36 +0000 (15:29 +0000)
committermartin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220>
Wed, 4 Feb 2009 15:29:36 +0000 (15:29 +0000)
git-svn-id: https://navit.svn.sourceforge.net/svnroot/navit/trunk@2005 ffa7fe5e-494d-0410-b361-a75ebd5db220

navit/navit/gui/internal/gui_internal.c
navit/navit/item_def.h
navit/navit/navigation.c
navit/navit/navit.c
navit/navit/route.c
navit/navit/vehicle/demo/vehicle_demo.c

index ed3cf79..9e465b2 100644 (file)
@@ -222,6 +222,7 @@ struct gui_priv {
        struct callback_list *cbl;
        int flags;
        int cols;
+       struct attr osd_configuration;
 };
 
 
@@ -1194,6 +1195,7 @@ gui_internal_top_bar(struct gui_priv *this)
        64:Show time
        128:Show help
        256:Use background for menu headline
+       512:Set osd_configuration and zoom to route when setting position
 */
 
        w=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|(this->flags & 1 ? 0:flags_fill));
@@ -1537,6 +1539,10 @@ gui_internal_cmd_set_destination(struct gui_priv *this, struct widget *wm, void
        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);
+       if (this->flags & 512) {
+               navit_set_attr(this->nav, &this->osd_configuration);
+               navit_zoom_to_route(this->nav);
+       }       
        gui_internal_prune_menu(this, NULL);
 }
 
@@ -3567,6 +3573,8 @@ static struct gui_priv * gui_internal_new(struct navit *nav, struct gui_methods
              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;
        this->data.priv=this;
        this->data.gui=&gui_internal_methods_ext;
        this->data.widget=&gui_internal_widget_methods;
index d09f2ce..e3f0e7c 100644 (file)
@@ -300,6 +300,8 @@ ITEM(poi_climbing)
 ITEM(poi_motor_sport)
 ITEM(poi_tennis)
 ITEM(house_number)
+ITEM(route_start)
+ITEM(route_end)
 /* Line */
 ITEM2(0x80000000,line)
 ITEM2(0x80000001,line_unspecified)
index 750d3d3..8301812 100644 (file)
@@ -1628,6 +1628,8 @@ navigation_update(struct navigation *this_, int mode)
                return;
        dbg(1,"enter\n");
        while ((ritem=map_rect_get_item(mr))) {
+               if (ritem->type != type_street_route)
+                       continue;
                if (first && item_attr_get(ritem, attr_street_item, &street_item)) {
                        first=0;
                        if (!item_attr_get(ritem, attr_direction, &street_direction))
index 383c234..25546fd 100644 (file)
@@ -1330,26 +1330,30 @@ void
 navit_zoom_to_route(struct navit *this_)
 {
        struct map *map;
-       struct map_rect *mr;
+       struct map_rect *mr=NULL;
        struct item *item;
        struct coord c,*ct;
        struct coord_rect r;
        int count=0,scale=16;
        if (! this_->route)
                return;
+       dbg(0,"enter\n");
        map=route_get_map(this_->route);
-       if (! map)
-               return;
-       mr=map_rect_new(map, NULL);
-       if (! mr)
-               return;
-       while ((item=map_rect_get_item(mr))) {
-               while (item_coord_get(item, &c, 1)) {
-                       if (!count) 
-                               r.lu=r.rl=c;
-                       else
-                               coord_rect_extend(&r, &c);      
-                       count++;
+       dbg(0,"map=%p\n",map);
+       if (map)
+               mr=map_rect_new(map, NULL);
+       dbg(0,"mr=%p\n",mr);
+       if (mr) {
+               while ((item=map_rect_get_item(mr))) {
+                       dbg(0,"item=%s\n", item_to_name(item->type));
+                       while (item_coord_get(item, &c, 1)) {
+                               dbg(0,"coord\n");
+                               if (!count) 
+                                       r.lu=r.rl=c;
+                               else
+                                       coord_rect_extend(&r, &c);      
+                               count++;
+                       }
                }
        }
        if (! count)
index b02f9a9..7aac9a7 100644 (file)
@@ -2069,6 +2069,8 @@ rm_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr)
        struct map_rect_priv *mr = priv_data;
        struct route_path_segment *seg=mr->seg;
        struct route *route=mr->mpriv->route;
+       if (mr->item.type != type_street_route)
+               return 0;
        attr->type=attr_type;
        switch (attr_type) {
                case attr_any:
@@ -2129,6 +2131,16 @@ rm_coord_get(void *priv_data, struct coord *c, int count)
        struct route *r = mr->mpriv->route;
        enum projection pro = route_projection(r);
 
+       if (mr->item.type == type_route_start || mr->item.type == type_route_end) {
+               if (! count || mr->last_coord)
+                       return 0;
+               mr->last_coord=1;
+               if (mr->item.type == type_route_start)
+                       c[0]=r->pos->c;
+               else
+                       c[0]=r->dst->c;
+               return 1;
+       }
        if (! seg)
                return 0;
        for (i=0; i < count; i++) {
@@ -2321,14 +2333,19 @@ rm_rect_new(struct map_priv *priv, struct map_selection *sel)
                return NULL;
        if (! route_get_dst(priv->route))
                return NULL;
+#if 0
        if (! priv->route->path2)
                return NULL;
+#endif
        mr=g_new0(struct map_rect_priv, 1);
        mr->mpriv = priv;
        mr->item.priv_data = mr;
-       mr->item.type = type_street_route;
+       mr->item.type = type_none;
        mr->item.meth = &methods_route_item;
-       mr->seg_next=priv->route->path2->path;
+       if (priv->route->path2)
+               mr->seg_next=priv->route->path2->path;
+       else
+               mr->seg_next=NULL;
        return mr;
 }
 
@@ -2457,10 +2474,24 @@ rm_get_item(struct map_rect_priv *mr)
 {
        dbg(1,"enter\n", mr->pos);
 
-       mr->seg=mr->seg_next;
-       if (! mr->seg)
+       switch (mr->item.type) {
+       case type_none:
+               mr->item.type=type_route_start;
+               if (mr->mpriv->route->pos) 
+                       break;
+       default:
+               mr->item.type=type_street_route;
+               mr->seg=mr->seg_next;
+               if (mr->seg) {
+                       mr->seg_next=mr->seg->next;
+                       break;
+               }
+               mr->item.type=type_route_end;
+               if (mr->mpriv->route->dst)
+                       break;
+       case type_route_end:
                return NULL;
-       mr->seg_next=mr->seg->next;
+       }
        mr->last_coord = 0;
        mr->item.id_lo++;
        rm_attr_rewind(mr);
index e922a0b..76d5634 100644 (file)
@@ -110,7 +110,9 @@ vehicle_demo_timer(struct vehicle_priv *priv)
        if (route_map)
                mr=map_rect_new(route_map, NULL);
        if (mr) 
-               item=map_rect_get_item(mr);     
+               item=map_rect_get_item(mr);
+       if (item && item->type == type_route_start)
+               item=map_rect_get_item(mr);
        if (item && item_coord_get(item, &pos, 1)) {
                priv->position_set=0;
                dbg(1, "current pos=0x%x,0x%x\n", pos.x, pos.y);