Diff of /trunk/src/map.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 156 by harbaum, Wed Apr 1 12:47:35 2009 UTC revision 173 by harbaum, Sat May 2 21:36:51 2009 UTC
# Line 59  static void map_statusbar(map_t *map, ma Line 59  static void map_statusbar(map_t *map, ma
59    if(id == ID_ILLEGAL)    if(id == ID_ILLEGAL)
60      str = g_strdup_printf(_("Unknown item"));      str = g_strdup_printf(_("Unknown item"));
61    else {    else {
62      str = g_strdup_printf("%s #%ld", item_str, id);      str = g_strdup_printf("%s #" ITEM_ID_FORMAT, item_str, id);
63    
64      /* add some tags ... */      /* add some tags ... */
65      /*      /*
# Line 167  static void map_node_select(appdata_t *a Line 167  static void map_node_select(appdata_t *a
167      gint h = gdk_pixbuf_get_height(map_item->object.node->icon_buf);      gint h = gdk_pixbuf_get_height(map_item->object.node->icon_buf);
168      /* icons are technically square, so a radius slightly bigger */      /* icons are technically square, so a radius slightly bigger */
169      /* than sqrt(2)*MAX(w,h) should fit nicely */      /* than sqrt(2)*MAX(w,h) should fit nicely */
170      radius =  0.75 * map->style->icon.scale * ((w>h)?w:h);      radius = 0.75 * map->style->icon.scale * ((w>h)?w:h);
171    }    }
172    
173      radius *= map->state->detail;
174    map_hl_circle_new(map, CANVAS_GROUP_NODES_HL, new_map_item,    map_hl_circle_new(map, CANVAS_GROUP_NODES_HL, new_map_item,
175                      x, y, radius, map->style->highlight.color);                      x, y, radius, map->style->highlight.color);
176    
# Line 198  void map_way_select(appdata_t *appdata, Line 199  void map_way_select(appdata_t *appdata,
199    map_statusbar(map, map_item);    map_statusbar(map, map_item);
200    icon_bar_map_item_selected(appdata, map_item, TRUE);    icon_bar_map_item_selected(appdata, map_item, TRUE);
201    gtk_widget_set_sensitive(appdata->menu_item_map_hide_sel, TRUE);    gtk_widget_set_sensitive(appdata->menu_item_map_hide_sel, TRUE);
202    
203    gint arrow_width = (map_item->object.way->draw.flags & OSM_DRAW_FLAG_BG)?    gint arrow_width = ((map_item->object.way->draw.flags & OSM_DRAW_FLAG_BG)?
204      map->style->highlight.width + map_item->object.way->draw.bg.width/2:                        map->style->highlight.width + map_item->object.way->draw.bg.width/2:
205      map->style->highlight.width + map_item->object.way->draw.width/2;                        map->style->highlight.width + map_item->object.way->draw.width/2)
206        * map->state->detail;
207    
208    node_chain_t *node_chain = map_item->object.way->node_chain;    node_chain_t *node_chain = map_item->object.way->node_chain;
209    node_t *last = NULL;    node_t *last = NULL;
# Line 259  void map_way_select(appdata_t *appdata, Line 261  void map_way_select(appdata_t *appdata,
261        gint y = node_chain->node->lpos.y;        gint y = node_chain->node->lpos.y;
262    
263        map_hl_circle_new(map, CANVAS_GROUP_NODES_IHL, new_map_item,        map_hl_circle_new(map, CANVAS_GROUP_NODES_IHL, new_map_item,
264                          x, y, map->style->node.radius,                          x, y, map->style->node.radius * map->state->detail,
265                          map->style->highlight.node_color);                          map->style->highlight.node_color);
266      }      }
267    
# Line 287  void map_way_select(appdata_t *appdata, Line 289  void map_way_select(appdata_t *appdata,
289      new_map_item->highlight = TRUE;      new_map_item->highlight = TRUE;
290    
291      map_hl_polyline_new(map, CANVAS_GROUP_WAYS_HL, new_map_item, points,      map_hl_polyline_new(map, CANVAS_GROUP_WAYS_HL, new_map_item, points,
292                  (map_item->object.way->draw.flags & OSM_DRAW_FLAG_BG)?                   ((map_item->object.way->draw.flags & OSM_DRAW_FLAG_BG)?
293                  2*map->style->highlight.width + map_item->object.way->draw.bg.width:                   2*map->style->highlight.width + map_item->object.way->draw.bg.width:
294                  2*map->style->highlight.width + map_item->object.way->draw.width,                   2*map->style->highlight.width + map_item->object.way->draw.width)
295                  map->style->highlight.color);                  * map->state->detail, map->style->highlight.color);
296    
297      canvas_points_free(points);      canvas_points_free(points);
298    }    }
299  }  }
# Line 299  void map_way_select(appdata_t *appdata, Line 301  void map_way_select(appdata_t *appdata,
301  void map_relation_select(appdata_t *appdata, relation_t *relation) {  void map_relation_select(appdata_t *appdata, relation_t *relation) {
302    map_t *map = appdata->map;    map_t *map = appdata->map;
303    
304    printf("highlighting relation %ld\n", relation->id);    printf("highlighting relation "ITEM_ID_FORMAT"\n", relation->id);
305    
306    g_assert(!map->highlight);    g_assert(!map->highlight);
307    map_highlight_t **hl = &map->highlight;    map_highlight_t **hl = &map->highlight;
# Line 322  void map_relation_select(appdata_t *appd Line 324  void map_relation_select(appdata_t *appd
324    
325      case NODE: {      case NODE: {
326        node_t *node = member->object.node;        node_t *node = member->object.node;
327        printf("  -> node %ld\n", node->id);        printf("  -> node "ITEM_ID_FORMAT"\n", node->id);
328    
329        item = canvas_circle_new(map->canvas, CANVAS_GROUP_NODES_HL,        item = canvas_circle_new(map->canvas, CANVAS_GROUP_NODES_HL,
330                          node->lpos.x, node->lpos.y,                          node->lpos.x, node->lpos.y,
# Line 472  static canvas_item_t *map_node_new(map_t Line 474  static canvas_item_t *map_node_new(map_t
474    else    else
475      map_item->item = canvas_image_new(map->canvas, CANVAS_GROUP_NODES,      map_item->item = canvas_image_new(map->canvas, CANVAS_GROUP_NODES,
476        node->icon_buf,        node->icon_buf,
477        node->lpos.x - map->style->icon.scale/2 *        node->lpos.x - map->style->icon.scale/2 * map->state->detail *
478                        gdk_pixbuf_get_width(node->icon_buf),                        gdk_pixbuf_get_width(node->icon_buf),
479        node->lpos.y - map->style->icon.scale/2 *        node->lpos.y - map->style->icon.scale/2 * map->state->detail *
480                        gdk_pixbuf_get_height(node->icon_buf),                        gdk_pixbuf_get_height(node->icon_buf),
481                map->style->icon.scale,map->style->icon.scale);                        map->state->detail * map->style->icon.scale,
482                          map->state->detail * map->style->icon.scale);
483    
484    canvas_item_set_zoom_max(map_item->item, node->zoom_max);    canvas_item_set_zoom_max(map_item->item,
485                               node->zoom_max / (2 * map->state->detail));
486    
487    /* attach map_item to nodes map_item_chain */    /* attach map_item to nodes map_item_chain */
488    map_item_chain_t **chain = &node->map_item_chain;    map_item_chain_t **chain = &node->map_item_chain;
# Line 540  static canvas_item_t *map_way_new(map_t Line 544  static canvas_item_t *map_way_new(map_t
544      map_item->item = canvas_polyline_new(map->canvas, group, points, width, color);      map_item->item = canvas_polyline_new(map->canvas, group, points, width, color);
545    }    }
546    
547    canvas_item_set_zoom_max(map_item->item, way->draw.zoom_max);    canvas_item_set_zoom_max(map_item->item,
548                               way->draw.zoom_max / (2 * map->state->detail));
549    
550    /* a ways outline itself is never dashed */    /* a ways outline itself is never dashed */
551    if (group != CANVAS_GROUP_WAYS_OL)    if (group != CANVAS_GROUP_WAYS_OL)
# Line 590  void map_way_draw(map_t *map, way_t *way Line 595  void map_way_draw(map_t *map, way_t *way
595      }      }
596    
597      /* draw way */      /* draw way */
598        float width = way->draw.width * map->state->detail;
599    
600      if(way->draw.flags & OSM_DRAW_FLAG_AREA) {      if(way->draw.flags & OSM_DRAW_FLAG_AREA) {
601        map_way_new(map, CANVAS_GROUP_POLYGONS, way, points,        map_way_new(map, CANVAS_GROUP_POLYGONS, way, points,
602                    way->draw.width, way->draw.color, way->draw.area.color);                    width, way->draw.color, way->draw.area.color);
603      } else {      } else {
604    
605        if(way->draw.flags & OSM_DRAW_FLAG_BG) {        if(way->draw.flags & OSM_DRAW_FLAG_BG) {
606          map_way_new(map, CANVAS_GROUP_WAYS_INT, way, points,          map_way_new(map, CANVAS_GROUP_WAYS_INT, way, points,
607                      way->draw.width, way->draw.color, NO_COLOR);                      width, way->draw.color, NO_COLOR);
608    
609          map_way_new(map, CANVAS_GROUP_WAYS_OL, way, points,          map_way_new(map, CANVAS_GROUP_WAYS_OL, way, points,
610                      way->draw.bg.width, way->draw.bg.color, NO_COLOR);                      way->draw.bg.width * map->state->detail,
611                        way->draw.bg.color, NO_COLOR);
612    
613        } else        } else
614          map_way_new(map, CANVAS_GROUP_WAYS, way, points,          map_way_new(map, CANVAS_GROUP_WAYS, way, points,
615                      way->draw.width, way->draw.color, NO_COLOR);                      width, way->draw.color, NO_COLOR);
616      }      }
617      canvas_points_free(points);      canvas_points_free(points);
618    }    }
# Line 617  void map_node_draw(map_t *map, node_t *n Line 625  void map_node_draw(map_t *map, node_t *n
625    
626    if(!node->ways)    if(!node->ways)
627      map_node_new(map, node,      map_node_new(map, node,
628                   map->style->node.radius,                   map->style->node.radius * map->state->detail,
629                   map->style->node.border_radius,                   map->style->node.border_radius * map->state->detail,
630                   map->style->node.fill_color,                   map->style->node.fill_color,
631                   map->style->node.color);                   map->style->node.color);
632    
633    else if(map->style->node.show_untagged || osm_node_has_tag(node))    else if(map->style->node.show_untagged || osm_node_has_tag(node))
634      map_node_new(map, node,      map_node_new(map, node,
635                   map->style->node.radius, 0,                   map->style->node.radius * map->state->detail, 0,
636                   map->style->node.color, 0);                   map->style->node.color, 0);
637  }  }
638    
# Line 882  map_item_t *map_item_at(map_t *map, gint Line 890  map_item_t *map_item_at(map_t *map, gint
890    
891    switch(map_item->object.type) {    switch(map_item->object.type) {
892    case NODE:    case NODE:
893      printf("  item is node #%ld\n", map_item->object.node->id);      printf("  item is node #"ITEM_ID_FORMAT"\n", map_item->object.node->id);
894      break;      break;
895    case WAY:    case WAY:
896      printf("  item is way #%ld\n", map_item->object.way->id);      printf("  item is way #"ITEM_ID_FORMAT"\n", map_item->object.way->id);
897      break;      break;
898    default:    default:
899      printf("  unknown item\n");      printf("  unknown item\n");
# Line 911  map_item_t *map_real_item_at(map_t *map, Line 919  map_item_t *map_real_item_at(map_t *map,
919        parent = map_item->object.node->map_item_chain->map_item;        parent = map_item->object.node->map_item_chain->map_item;
920    
921      if(parent)      if(parent)
922        printf("  using parent item node #%ld\n", parent->object.node->id);        printf("  using parent item node #" ITEM_ID_FORMAT "\n",
923                 parent->object.node->id);
924      break;      break;
925    
926    case WAY:    case WAY:
# Line 919  map_item_t *map_real_item_at(map_t *map, Line 928  map_item_t *map_real_item_at(map_t *map,
928        parent = map_item->object.way->map_item_chain->map_item;        parent = map_item->object.way->map_item_chain->map_item;
929    
930      if(parent)      if(parent)
931        printf("  using parent item way #%ld\n", parent->object.way->id);        printf("  using parent item way #" ITEM_ID_FORMAT "\n",
932                 parent->object.way->id);
933      break;      break;
934    
935    default:    default:
# Line 1286  void map_highlight_refresh(appdata_t *ap Line 1296  void map_highlight_refresh(appdata_t *ap
1296  }  }
1297    
1298  void map_way_delete(appdata_t *appdata, way_t *way) {  void map_way_delete(appdata_t *appdata, way_t *way) {
1299    printf("deleting way #%ld from map and osm\n", way->id);    printf("deleting way #" ITEM_ID_FORMAT " from map and osm\n", way->id);
1300    
1301    /* remove it visually from the screen */    /* remove it visually from the screen */
1302    map_item_chain_destroy(&way->map_item_chain);    map_item_chain_destroy(&way->map_item_chain);
# Line 1738  gboolean map_key_press_event(appdata_t * Line 1748  gboolean map_key_press_event(appdata_t *
1748    return FALSE;    return FALSE;
1749  }  }
1750    
1751    void map_state_reset(map_state_t *state) {
1752      if(!state) return;
1753    
1754      state->zoom = 0.25;
1755      state->detail = 1.0;
1756    
1757      /* todo: try to scroll to center of screen */
1758      state->scroll_offset.x = 0;
1759      state->scroll_offset.y = 0;
1760    }
1761    
1762    map_state_t *map_state_new(void) {
1763      map_state_t *state = g_new0(map_state_t, 1);
1764      map_state_reset(state);
1765      return state;
1766    }
1767    
1768  GtkWidget *map_new(appdata_t *appdata) {  GtkWidget *map_new(appdata_t *appdata) {
1769    map_t *map = appdata->map = g_new0(map_t, 1);    map_t *map = appdata->map = g_new0(map_t, 1);
1770    
# Line 1753  GtkWidget *map_new(appdata_t *appdata) { Line 1780  GtkWidget *map_new(appdata_t *appdata) {
1780      map->state = appdata->project->map_state;      map->state = appdata->project->map_state;
1781    } else {    } else {
1782      printf("Creating new map state\n");      printf("Creating new map state\n");
1783      map->state = g_new0(map_state_t, 1);      map->state = map_state_new();
     map->state->zoom = 0.25;  
1784    }    }
1785    
1786    map->state->refcount++;    map->state->refcount++;
# Line 1971  void map_delete_selected(appdata_t *appd Line 1997  void map_delete_selected(appdata_t *appd
1997    
1998    switch(item.object.type) {    switch(item.object.type) {
1999    case NODE:    case NODE:
2000      printf("request to delete node #%ld\n", item.object.node->id);      printf("request to delete node #" ITEM_ID_FORMAT "\n",
2001               item.object.node->id);
2002    
2003      /* check if this node is part of a way with two nodes only. */      /* check if this node is part of a way with two nodes only. */
2004      /* we cannot delete this as this would also delete the way */      /* we cannot delete this as this would also delete the way */
# Line 2032  void map_delete_selected(appdata_t *appd Line 2059  void map_delete_selected(appdata_t *appd
2059      break;      break;
2060    
2061    case WAY:    case WAY:
2062      printf("request to delete way #%ld\n", item.object.way->id);      printf("request to delete way #" ITEM_ID_FORMAT "\n", item.object.way->id);
2063      map_way_delete(appdata, item.object.way);      map_way_delete(appdata, item.object.way);
2064      break;      break;
2065    
# Line 2343  void map_hide_selected(appdata_t *appdat Line 2370  void map_hide_selected(appdata_t *appdat
2370    }    }
2371    
2372    way_t *way = map->selected.object.way;    way_t *way = map->selected.object.way;
2373    printf("hiding way #%ld\n", way->id);    printf("hiding way #" ITEM_ID_FORMAT "\n", way->id);
2374    
2375    map_item_deselect(appdata);    map_item_deselect(appdata);
2376    way->flags |= OSM_FLAG_HIDDEN;    way->flags |= OSM_FLAG_HIDDEN;
# Line 2369  void map_show_all(appdata_t *appdata) { Line 2396  void map_show_all(appdata_t *appdata) {
2396    gtk_widget_set_sensitive(appdata->menu_item_map_show_all, FALSE);    gtk_widget_set_sensitive(appdata->menu_item_map_show_all, FALSE);
2397  }  }
2398    
2399    static void map_detail_change(map_t *map, float detail) {
2400      appdata_t *appdata = map->appdata;
2401    
2402      /* deselecting anything allows us not to care about automatic deselection */
2403      /* as well as items becoming invisible by the detail change */
2404      map_item_deselect(appdata);
2405    
2406      map->state->detail = detail;
2407      printf("changing detail factor to %f\n", map->state->detail);
2408    
2409      banner_busy_start(appdata, 1, "Redrawing...");
2410      map_clear(appdata, MAP_LAYER_OBJECTS_ONLY);
2411      map_paint(appdata);
2412      banner_busy_stop(appdata);
2413    }
2414    
2415    #define DETAIL_STEP 1.5
2416    
2417    void map_detail_increase(map_t *map) {
2418      if(!map) return;
2419      map_detail_change(map, map->state->detail * DETAIL_STEP);
2420    }
2421    
2422    void map_detail_decrease(map_t *map) {
2423      if(!map) return;
2424      map_detail_change(map, map->state->detail / DETAIL_STEP);
2425    }
2426    
2427    void map_detail_normal(map_t *map) {
2428      if(!map) return;
2429      map_detail_change(map, 1.0);
2430    }
2431    
2432  // vim:et:ts=8:sw=2:sts=2:ai  // vim:et:ts=8:sw=2:sts=2:ai

Legend:
Removed from v.156  
changed lines
  Added in v.173