Commit 191394a29db4da0ee4bb3c1121d4bd28d711ff16
- Diff rendering mode:
- inline
- side by side
champlain/champlain-map-source-chain.c
(59 / 20)
|   | |||
| 43 | 43 | struct _ChamplainMapSourceChainPrivate | |
| 44 | 44 | { | |
| 45 | 45 | ChamplainMapSource *stack_top; | |
| 46 | ChamplainMapSource *stack_bottom; | ||
| 46 | 47 | gulong sig_handler_id; | |
| 47 | 48 | }; | |
| 48 | 49 | ||
| … | … | ||
| 56 | 56 | static guint get_tile_size (ChamplainMapSource *map_source); | |
| 57 | 57 | ||
| 58 | 58 | static void fill_tile (ChamplainMapSource *map_source, ChamplainTile *tile); | |
| 59 | static void on_set_next_source (ChamplainMapSource *map_source, | ||
| 60 | ChamplainMapSource *old_next_source, | ||
| 61 | ChamplainMapSource *new_next_source); | ||
| 59 | 62 | ||
| 60 | 63 | static void | |
| 61 | 64 | champlain_map_source_chain_dispose (GObject *object) | |
| … | … | ||
| 99 | 99 | map_source_class->get_tile_size = get_tile_size; | |
| 100 | 100 | ||
| 101 | 101 | map_source_class->fill_tile = fill_tile; | |
| 102 | map_source_class->on_set_next_source = on_set_next_source; | ||
| 102 | 103 | } | |
| 103 | 104 | ||
| 104 | 105 | static void | |
| … | … | ||
| 107 | 107 | { | |
| 108 | 108 | ChamplainMapSourceChainPrivate *priv = GET_PRIVATE(source_chain); | |
| 109 | 109 | priv->stack_top = NULL; | |
| 110 | priv->sig_handler_id = 0; | ||
| 110 | priv->stack_bottom = NULL; | ||
| 111 | 111 | } | |
| 112 | 112 | ||
| 113 | 113 | /** | |
| … | … | ||
| 119 | 119 | * | |
| 120 | 120 | * Since: 0.6 | |
| 121 | 121 | */ | |
| 122 | ChamplainMapSourceChain* champlain_map_source_chain_new (void) | ||
| 122 | ChamplainMapSourceChain* | ||
| 123 | champlain_map_source_chain_new (void) | ||
| 123 | 124 | { | |
| 124 | 125 | return g_object_new (CHAMPLAIN_TYPE_MAP_SOURCE_CHAIN, NULL); | |
| 125 | 126 | } | |
| … | … | ||
| 209 | 209 | return champlain_map_source_get_tile_size (priv->stack_top); | |
| 210 | 210 | } | |
| 211 | 211 | ||
| 212 | static void fill_tile (ChamplainMapSource *map_source, | ||
| 213 | ChamplainTile *tile) | ||
| 212 | static void | ||
| 213 | fill_tile (ChamplainMapSource *map_source, | ||
| 214 | ChamplainTile *tile) | ||
| 214 | 215 | { | |
| 215 | 216 | ChamplainMapSourceChain *source_chain = CHAMPLAIN_MAP_SOURCE_CHAIN (map_source); | |
| 216 | 217 | g_return_if_fail (source_chain); | |
| … | … | ||
| 222 | 222 | champlain_map_source_fill_tile (priv->stack_top, tile); | |
| 223 | 223 | } | |
| 224 | 224 | ||
| 225 | static void assign_cache_of_next_source_sequence (ChamplainMapSource *start_map_source, ChamplainTileCache *tile_cache) | ||
| 225 | static void | ||
| 226 | on_set_next_source (ChamplainMapSource *map_source, | ||
| 227 | ChamplainMapSource *old_next_source, | ||
| 228 | ChamplainMapSource *new_next_source) | ||
| 226 | 229 | { | |
| 230 | ChamplainMapSourceChain *source_chain = CHAMPLAIN_MAP_SOURCE_CHAIN (map_source); | ||
| 231 | ChamplainMapSourceChainPrivate *priv = GET_PRIVATE(source_chain); | ||
| 232 | |||
| 233 | g_return_if_fail (source_chain); | ||
| 234 | |||
| 235 | if (priv->stack_bottom) | ||
| 236 | champlain_map_source_set_next_source (priv->stack_bottom, new_next_source); | ||
| 237 | } | ||
| 238 | |||
| 239 | static void | ||
| 240 | assign_cache_of_next_source_sequence (ChamplainMapSourceChain *source_chain, | ||
| 241 | ChamplainMapSource *start_map_source, | ||
| 242 | ChamplainTileCache *tile_cache) | ||
| 243 | { | ||
| 227 | 244 | ChamplainMapSource *map_source = start_map_source; | |
| 228 | ChamplainTileSource *tile_source; | ||
| 245 | ChamplainMapSource *chain_next_source = champlain_map_source_get_next_source (CHAMPLAIN_MAP_SOURCE(source_chain)); | ||
| 229 | 246 | ||
| 230 | 247 | do | |
| 231 | 248 | { | |
| … | … | ||
| 250 | 250 | } | |
| 251 | 251 | while (CHAMPLAIN_IS_TILE_CACHE(map_source)); | |
| 252 | 252 | ||
| 253 | tile_source = CHAMPLAIN_TILE_SOURCE(map_source); | ||
| 254 | while (tile_source) | ||
| 253 | while (CHAMPLAIN_IS_TILE_SOURCE(map_source) && map_source != chain_next_source) | ||
| 255 | 254 | { | |
| 256 | champlain_tile_source_set_cache (tile_source, tile_cache); | ||
| 255 | champlain_tile_source_set_cache (CHAMPLAIN_TILE_SOURCE(map_source), tile_cache); | ||
| 257 | 256 | map_source = champlain_map_source_get_next_source (map_source); | |
| 258 | tile_source = CHAMPLAIN_TILE_SOURCE(map_source); | ||
| 259 | 257 | } | |
| 260 | 258 | } | |
| 261 | 259 | ||
| 262 | static | ||
| 263 | void reload_tiles_cb (ChamplainMapSource *map_source, ChamplainMapSourceChain *source_chain) | ||
| 260 | static void | ||
| 261 | reload_tiles_cb (ChamplainMapSource *map_source, ChamplainMapSourceChain *source_chain) | ||
| 264 | 262 | { | |
| 265 | 263 | /* propagate the signal from the chain that is inside champlain_map_source_chain */ | |
| 266 | 264 | g_signal_emit_by_name (source_chain, "reload-tiles", NULL); | |
| … | … | ||
| 273 | 273 | * | |
| 274 | 274 | * Since: 0.6 | |
| 275 | 275 | */ | |
| 276 | void champlain_map_source_chain_push (ChamplainMapSourceChain *source_chain, ChamplainMapSource *map_source) | ||
| 276 | void | ||
| 277 | champlain_map_source_chain_push (ChamplainMapSourceChain *source_chain, ChamplainMapSource *map_source) | ||
| 277 | 278 | { | |
| 278 | 279 | ChamplainMapSourceChainPrivate *priv = GET_PRIVATE(source_chain); | |
| 279 | 280 | gboolean is_cache = FALSE; | |
| … | … | ||
| 288 | 288 | ||
| 289 | 289 | if (!priv->stack_top) | |
| 290 | 290 | { | |
| 291 | ChamplainMapSource *chain_next_source = champlain_map_source_get_next_source (CHAMPLAIN_MAP_SOURCE(source_chain)); | ||
| 292 | |||
| 291 | 293 | /* tile source has to be last */ | |
| 292 | 294 | g_return_if_fail (!is_cache); | |
| 295 | |||
| 293 | 296 | priv->stack_top = map_source; | |
| 297 | priv->stack_bottom = map_source; | ||
| 298 | if (chain_next_source) | ||
| 299 | champlain_map_source_set_next_source (priv->stack_bottom, chain_next_source); | ||
| 294 | 300 | } | |
| 295 | 301 | else | |
| 296 | 302 | { | |
| … | … | ||
| 309 | 309 | if (is_cache) | |
| 310 | 310 | { | |
| 311 | 311 | ChamplainTileCache *tile_cache = CHAMPLAIN_TILE_CACHE(map_source); | |
| 312 | assign_cache_of_next_source_sequence (priv->stack_top, tile_cache); | ||
| 312 | assign_cache_of_next_source_sequence (source_chain, priv->stack_top, tile_cache); | ||
| 313 | 313 | } | |
| 314 | 314 | } | |
| 315 | 315 | ||
| … | … | ||
| 325 | 325 | * | |
| 326 | 326 | * Since: 0.6 | |
| 327 | 327 | */ | |
| 328 | void champlain_map_source_chain_pop (ChamplainMapSourceChain *source_chain) | ||
| 328 | void | ||
| 329 | champlain_map_source_chain_pop (ChamplainMapSourceChain *source_chain) | ||
| 329 | 330 | { | |
| 330 | 331 | ChamplainMapSourceChainPrivate *priv = GET_PRIVATE(source_chain); | |
| 331 | 332 | ChamplainMapSource *old_stack_top = priv->stack_top; | |
| 333 | ChamplainMapSource *next_source = champlain_map_source_get_next_source (priv->stack_top); | ||
| 332 | 334 | ||
| 333 | 335 | g_return_if_fail (priv->stack_top); | |
| 334 | 336 | ||
| … | … | ||
| 339 | 339 | ||
| 340 | 340 | if (CHAMPLAIN_IS_TILE_CACHE(priv->stack_top)) | |
| 341 | 341 | { | |
| 342 | ChamplainMapSource *map_source = champlain_map_source_get_next_source (priv->stack_top); | ||
| 343 | 342 | ChamplainTileCache *tile_cache = NULL; | |
| 344 | 343 | ||
| 345 | if (CHAMPLAIN_IS_TILE_CACHE(map_source)) | ||
| 346 | tile_cache = CHAMPLAIN_TILE_CACHE(map_source); | ||
| 344 | if (CHAMPLAIN_IS_TILE_CACHE(next_source)) | ||
| 345 | tile_cache = CHAMPLAIN_TILE_CACHE(next_source); | ||
| 347 | 346 | ||
| 348 | assign_cache_of_next_source_sequence (priv->stack_top, tile_cache); | ||
| 347 | /* _push() guarantees that the last source is tile_source so we can be | ||
| 348 | sure that the next map source is still within the chain */ | ||
| 349 | assign_cache_of_next_source_sequence (source_chain, priv->stack_top, tile_cache); | ||
| 349 | 350 | } | |
| 350 | 351 | ||
| 351 | priv->stack_top = champlain_map_source_get_next_source (priv->stack_top); | ||
| 352 | if (next_source == champlain_map_source_get_next_source (CHAMPLAIN_MAP_SOURCE(source_chain))) | ||
| 353 | { | ||
| 354 | priv->stack_top = NULL; | ||
| 355 | priv->stack_bottom = NULL; | ||
| 356 | } | ||
| 357 | else | ||
| 358 | priv->stack_top = next_source; | ||
| 359 | |||
| 352 | 360 | if (priv->stack_top) | |
| 353 | 361 | { | |
| 354 | 362 | priv->sig_handler_id = g_signal_connect (priv->stack_top, "reload-tiles", |
champlain/champlain-map-source.c
(26 / 9)
|   | |||
| 83 | 83 | }; | |
| 84 | 84 | ||
| 85 | 85 | static void reload_tiles_cb (ChamplainMapSource *orig, ChamplainMapSource *self); | |
| 86 | static void on_set_next_source (ChamplainMapSource *map_source, | ||
| 87 | ChamplainMapSource *old_next_source, | ||
| 88 | ChamplainMapSource *new_next_source); | ||
| 86 | 89 | ||
| 87 | 90 | static void | |
| 88 | 91 | champlain_map_source_get_property (GObject *object, | |
| … | … | ||
| 176 | 176 | klass->get_projection = NULL; | |
| 177 | 177 | ||
| 178 | 178 | klass->fill_tile = NULL; | |
| 179 | klass->on_set_next_source = on_set_next_source; | ||
| 179 | 180 | ||
| 180 | 181 | /** | |
| 181 | 182 | * ChamplainMapSource:next-source: | |
| … | … | ||
| 242 | 242 | g_signal_emit_by_name (self, "reload-tiles", NULL); | |
| 243 | 243 | } | |
| 244 | 244 | ||
| 245 | static void | ||
| 246 | on_set_next_source (ChamplainMapSource *map_source, | ||
| 247 | ChamplainMapSource *old_next_source, | ||
| 248 | ChamplainMapSource *new_next_source) | ||
| 249 | { | ||
| 250 | ChamplainMapSourcePrivate *priv = GET_PRIVATE(map_source); | ||
| 251 | if (old_next_source) | ||
| 252 | { | ||
| 253 | if (g_signal_handler_is_connected (old_next_source, priv->sig_handler_id)) | ||
| 254 | g_signal_handler_disconnect (old_next_source, priv->sig_handler_id); | ||
| 255 | } | ||
| 256 | |||
| 257 | if (new_next_source) | ||
| 258 | { | ||
| 259 | priv->sig_handler_id = g_signal_connect (new_next_source, "reload-tiles", | ||
| 260 | G_CALLBACK (reload_tiles_cb), map_source); | ||
| 261 | } | ||
| 262 | } | ||
| 263 | |||
| 245 | 264 | /** | |
| 246 | 265 | * champlain_map_source_set_next_source: | |
| 247 | 266 | * @map_source: a #ChamplainMapSource | |
| … | … | ||
| 278 | 278 | ||
| 279 | 279 | ChamplainMapSourcePrivate *priv = GET_PRIVATE(map_source); | |
| 280 | 280 | ||
| 281 | CHAMPLAIN_MAP_SOURCE_GET_CLASS (map_source)->on_set_next_source (map_source, priv->next_source, next_source); | ||
| 282 | |||
| 281 | 283 | if (priv->next_source != NULL) | |
| 282 | { | ||
| 283 | if (g_signal_handler_is_connected (priv->next_source, priv->sig_handler_id)) | ||
| 284 | g_signal_handler_disconnect (priv->next_source, priv->sig_handler_id); | ||
| 284 | g_object_unref (priv->next_source); | ||
| 285 | 285 | ||
| 286 | g_object_unref (priv->next_source); | ||
| 287 | } | ||
| 288 | |||
| 289 | 286 | if (next_source) | |
| 290 | 287 | { | |
| 291 | 288 | g_return_if_fail (CHAMPLAIN_IS_MAP_SOURCE (next_source)); | |
| 292 | 289 | ||
| 293 | 290 | g_object_ref_sink (next_source); | |
| 294 | |||
| 295 | priv->sig_handler_id = g_signal_connect (next_source, "reload-tiles", | ||
| 296 | G_CALLBACK (reload_tiles_cb), map_source); | ||
| 297 | 291 | } | |
| 298 | 292 | ||
| 299 | 293 | priv->next_source = next_source; |
champlain/champlain-map-source.h
(4 / 0)
|   | |||
| 63 | 63 | ||
| 64 | 64 | void (*fill_tile) (ChamplainMapSource *map_source, | |
| 65 | 65 | ChamplainTile *tile); | |
| 66 | |||
| 67 | void (*on_set_next_source) (ChamplainMapSource *map_source, | ||
| 68 | ChamplainMapSource *next_source, | ||
| 69 | ChamplainMapSource *new_next_source); | ||
| 66 | 70 | }; | |
| 67 | 71 | ||
| 68 | 72 | GType champlain_map_source_get_type (void); |
Comments
Add your comment
Please log in to comment



Add a new comment:
Login or create an account to post a comment