Parent Directory | Revision Log
Initial import
1 | harbaum | 1 | /* |
2 | * Copyright (C) 2008 Till Harbaum <till@harbaum.org>. | ||
3 | * | ||
4 | * This file is part of OSM2Go. | ||
5 | * | ||
6 | * OSM2Go is free software: you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation, either version 3 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * OSM2Go is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with OSM2Go. If not, see <http://www.gnu.org/licenses/>. | ||
18 | */ | ||
19 | |||
20 | #include "appdata.h" | ||
21 | |||
22 | /* create a new item for the cursor */ | ||
23 | void map_hl_cursor_draw(map_t *map, gint x, gint y, gboolean is_world, | ||
24 | gint radius) { | ||
25 | if(map->cursor) | ||
26 | canvas_item_destroy(map->cursor); | ||
27 | |||
28 | gint wx, wy; | ||
29 | if(!is_world) canvas_window2world(map->canvas, x, y, &wx, &wy); | ||
30 | else { wx = x; wy = y; } | ||
31 | |||
32 | map->cursor = canvas_circle_new(map, CANVAS_GROUP_DRAW, wx, wy, | ||
33 | radius, 0, map->style->highlight.node_color, NO_COLOR); | ||
34 | } | ||
35 | |||
36 | /* special highlight for segments. use when cutting ways */ | ||
37 | void map_hl_segment_draw(map_t *map, gint width, | ||
38 | gint x0, gint y0, gint x1, gint y1) { | ||
39 | canvas_points_t *points = canvas_points_new(2); | ||
40 | |||
41 | points->coords[0] = x0; points->coords[1] = y0; | ||
42 | points->coords[2] = x1; points->coords[3] = y1; | ||
43 | |||
44 | map->cursor = canvas_polyline_new(map, CANVAS_GROUP_DRAW, | ||
45 | points, width, map->style->highlight.node_color); | ||
46 | canvas_points_free(points); | ||
47 | } | ||
48 | |||
49 | void map_hl_cursor_clear(map_t *map) { | ||
50 | if(map->cursor) { | ||
51 | canvas_item_destroy(map->cursor); | ||
52 | map->cursor = NULL; | ||
53 | } | ||
54 | } | ||
55 | |||
56 | /* create a new item used for touched node */ | ||
57 | void map_hl_touchnode_draw(map_t *map, node_t *node) { | ||
58 | if(map->touchnode) | ||
59 | canvas_item_destroy(map->touchnode); | ||
60 | |||
61 | map->touchnode = | ||
62 | canvas_circle_new(map, CANVAS_GROUP_DRAW, node->lpos.x, node->lpos.y, | ||
63 | 2*map->style->node.radius, 0, | ||
64 | map->style->highlight.touch_color, NO_COLOR); | ||
65 | |||
66 | canvas_item_set_user_data(map->touchnode, node); | ||
67 | } | ||
68 | |||
69 | node_t *map_hl_touchnode_get_node(map_t *map) { | ||
70 | if(!map->touchnode) return NULL; | ||
71 | return (node_t*)canvas_item_get_user_data(map->touchnode); | ||
72 | } | ||
73 | |||
74 | void map_hl_touchnode_clear(map_t *map) { | ||
75 | if(map->touchnode) { | ||
76 | canvas_item_destroy(map->touchnode); | ||
77 | map->touchnode = NULL; | ||
78 | } | ||
79 | } | ||
80 | |||
81 | /* called whenever a highlight item is to be destroyed */ | ||
82 | gint map_hl_item_destroy_event(GtkWidget *widget, gpointer data) { | ||
83 | map_item_t *map_item = (map_item_t*)data; | ||
84 | |||
85 | // printf("destroying highlight map_item @ %p\n", map_item); | ||
86 | g_free(map_item); | ||
87 | return FALSE; | ||
88 | } | ||
89 | |||
90 | void map_hl_remove(appdata_t *appdata) { | ||
91 | map_t *map = appdata->map; | ||
92 | |||
93 | if(!map->highlight) return; | ||
94 | |||
95 | printf("removing highlight\n"); | ||
96 | |||
97 | map_highlight_t *hl = map->highlight; | ||
98 | while(hl) { | ||
99 | map_highlight_t *next = hl->next; | ||
100 | canvas_item_destroy(hl->item); | ||
101 | g_free(hl); | ||
102 | |||
103 | hl = next; | ||
104 | } | ||
105 | |||
106 | map->highlight = NULL; | ||
107 | } | ||
108 | |||
109 | gboolean map_hl_item_is_highlighted(map_t *map, map_item_t *item) { | ||
110 | map_highlight_t *hl = map->highlight; | ||
111 | while(hl) { | ||
112 | map_item_t *hl_item = canvas_item_get_user_data(hl->item); | ||
113 | |||
114 | if(hl_item) { | ||
115 | if((hl_item->type == item->type) && | ||
116 | (hl_item->ptr == item->ptr)) | ||
117 | return TRUE; | ||
118 | } | ||
119 | |||
120 | hl = hl->next; | ||
121 | } | ||
122 | |||
123 | return FALSE; | ||
124 | } | ||
125 | |||
126 | canvas_item_t *map_hl_circle_new(map_t *map, canvas_group_t group, | ||
127 | map_item_t *map_item, | ||
128 | gint x, gint y, gint radius, canvas_color_t color) { | ||
129 | |||
130 | /* attach highlight object */ | ||
131 | map_highlight_t **hl = &map->highlight; | ||
132 | while(*hl) hl = &((*hl)->next); | ||
133 | *hl = g_new0(map_highlight_t, 1); | ||
134 | |||
135 | map_item->item = (*hl)->item = | ||
136 | canvas_circle_new(map, group, x, y, radius, 0, color, NO_COLOR); | ||
137 | |||
138 | canvas_item_set_user_data((*hl)->item, map_item); | ||
139 | |||
140 | canvas_item_destroy_connect((*hl)->item, | ||
141 | G_CALLBACK(map_hl_item_destroy_event), map_item); | ||
142 | |||
143 | return (*hl)->item; | ||
144 | } | ||
145 | |||
146 | canvas_item_t *map_hl_polygon_new(map_t *map, canvas_group_t group, map_item_t *map_item, | ||
147 | canvas_points_t *points, canvas_color_t color) { | ||
148 | |||
149 | /* attach highlight object */ | ||
150 | map_highlight_t **hl = &map->highlight; | ||
151 | while(*hl) hl = &((*hl)->next); | ||
152 | *hl = g_new0(map_highlight_t, 1); | ||
153 | |||
154 | map_item->item = (*hl)->item = | ||
155 | canvas_polygon_new(map, group, points, 0, 0, color); | ||
156 | |||
157 | canvas_item_set_user_data((*hl)->item, map_item); | ||
158 | |||
159 | canvas_item_destroy_connect((*hl)->item, | ||
160 | G_CALLBACK(map_hl_item_destroy_event), map_item); | ||
161 | |||
162 | return (*hl)->item; | ||
163 | } | ||
164 | |||
165 | canvas_item_t *map_hl_polyline_new(map_t *map, canvas_group_t group, map_item_t *map_item, | ||
166 | canvas_points_t *points, gint width, canvas_color_t color) { | ||
167 | |||
168 | /* attach highlight object */ | ||
169 | map_highlight_t **hl = &map->highlight; | ||
170 | while(*hl) hl = &((*hl)->next); | ||
171 | *hl = g_new0(map_highlight_t, 1); | ||
172 | |||
173 | map_item->item = (*hl)->item = | ||
174 | canvas_polyline_new(map, group, points, width, color); | ||
175 | |||
176 | canvas_item_set_user_data((*hl)->item, map_item); | ||
177 | |||
178 | canvas_item_destroy_connect((*hl)->item, | ||
179 | G_CALLBACK(map_hl_item_destroy_event), map_item); | ||
180 | |||
181 | return (*hl)->item; | ||
182 | } |