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 |
/* |
/* |
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 |
|
|
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; |
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 |
|
|
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 |
} |
} |
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; |
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, |
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; |
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) |
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 |
} |
} |
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 |
|
|
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"); |
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: |
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: |
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); |
1765 |
printf("Creating new map state\n"); |
printf("Creating new map state\n"); |
1766 |
map->state = g_new0(map_state_t, 1); |
map->state = g_new0(map_state_t, 1); |
1767 |
map->state->zoom = 0.25; |
map->state->zoom = 0.25; |
1768 |
|
map->state->detail = 1.0; |
1769 |
} |
} |
1770 |
|
|
1771 |
map->state->refcount++; |
map->state->refcount++; |
1982 |
|
|
1983 |
switch(item.object.type) { |
switch(item.object.type) { |
1984 |
case NODE: |
case NODE: |
1985 |
printf("request to delete node #%ld\n", item.object.node->id); |
printf("request to delete node #" ITEM_ID_FORMAT "\n", |
1986 |
|
item.object.node->id); |
1987 |
|
|
1988 |
/* 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. */ |
1989 |
/* we cannot delete this as this would also delete the way */ |
/* we cannot delete this as this would also delete the way */ |
2044 |
break; |
break; |
2045 |
|
|
2046 |
case WAY: |
case WAY: |
2047 |
printf("request to delete way #%ld\n", item.object.way->id); |
printf("request to delete way #" ITEM_ID_FORMAT "\n", item.object.way->id); |
2048 |
map_way_delete(appdata, item.object.way); |
map_way_delete(appdata, item.object.way); |
2049 |
break; |
break; |
2050 |
|
|
2355 |
} |
} |
2356 |
|
|
2357 |
way_t *way = map->selected.object.way; |
way_t *way = map->selected.object.way; |
2358 |
printf("hiding way #%ld\n", way->id); |
printf("hiding way #" ITEM_ID_FORMAT "\n", way->id); |
2359 |
|
|
2360 |
map_item_deselect(appdata); |
map_item_deselect(appdata); |
2361 |
way->flags |= OSM_FLAG_HIDDEN; |
way->flags |= OSM_FLAG_HIDDEN; |
2381 |
gtk_widget_set_sensitive(appdata->menu_item_map_show_all, FALSE); |
gtk_widget_set_sensitive(appdata->menu_item_map_show_all, FALSE); |
2382 |
} |
} |
2383 |
|
|
2384 |
|
static void map_detail_change(map_t *map, float detail) { |
2385 |
|
appdata_t *appdata = map->appdata; |
2386 |
|
|
2387 |
|
/* deselecting anything allows us not to care about automatic deselection */ |
2388 |
|
/* as well as items becoming invisible by the detail change */ |
2389 |
|
map_item_deselect(appdata); |
2390 |
|
|
2391 |
|
map->state->detail = detail; |
2392 |
|
printf("changing detail factor to %f\n", map->state->detail); |
2393 |
|
|
2394 |
|
banner_busy_start(appdata, 1, "Redrawing..."); |
2395 |
|
map_clear(appdata, MAP_LAYER_OBJECTS_ONLY); |
2396 |
|
map_paint(appdata); |
2397 |
|
banner_busy_stop(appdata); |
2398 |
|
} |
2399 |
|
|
2400 |
|
#define DETAIL_STEP 1.5 |
2401 |
|
|
2402 |
|
void map_detail_increase(map_t *map) { |
2403 |
|
if(!map) return; |
2404 |
|
map_detail_change(map, map->state->detail * DETAIL_STEP); |
2405 |
|
} |
2406 |
|
|
2407 |
|
void map_detail_decrease(map_t *map) { |
2408 |
|
if(!map) return; |
2409 |
|
map_detail_change(map, map->state->detail / DETAIL_STEP); |
2410 |
|
} |
2411 |
|
|
2412 |
|
void map_detail_normal(map_t *map) { |
2413 |
|
if(!map) return; |
2414 |
|
map_detail_change(map, 1.0); |
2415 |
|
} |
2416 |
|
|
2417 |
// vim:et:ts=8:sw=2:sts=2:ai |
// vim:et:ts=8:sw=2:sts=2:ai |