/** * champlain_map_source_chain_push: * @source_chain: a #ChamplainMapSourceChain * @map_source: the #ChamplainMapSource to be pushed into the chain * * Pushes a map source into the chain. * * Since: 0.6 */ void champlain_map_source_chain_push (ChamplainMapSourceChain *source_chain, ChamplainMapSource *map_source) { ChamplainMapSourceChainPrivate *priv = source_chain->priv; gboolean is_cache = FALSE; if (CHAMPLAIN_IS_TILE_CACHE(map_source)) is_cache = TRUE; else g_return_if_fail (CHAMPLAIN_IS_TILE_SOURCE(map_source)); g_object_ref_sink (map_source); if (!priv->stack_top) { ChamplainMapSource *chain_next_source = champlain_map_source_get_next_source (CHAMPLAIN_MAP_SOURCE(source_chain)); /* tile source has to be last */ g_return_if_fail (!is_cache); priv->stack_top = map_source; priv->stack_bottom = map_source; if (chain_next_source) champlain_map_source_set_next_source (priv->stack_bottom, chain_next_source); } else { if (g_signal_handler_is_connected (priv->stack_top, priv->sig_handler_id)) g_signal_handler_disconnect (priv->stack_top, priv->sig_handler_id); champlain_map_source_set_next_source (map_source, priv->stack_top); priv->stack_top = map_source; if (is_cache) { ChamplainTileCache *tile_cache = CHAMPLAIN_TILE_CACHE(map_source); assign_cache_of_next_source_sequence (source_chain, priv->stack_top, tile_cache); } } priv->sig_handler_id = g_signal_connect (priv->stack_top, "reload-tiles", G_CALLBACK (reload_tiles_cb), source_chain); }
static void assign_cache_of_next_source_sequence (ChamplainMapSourceChain *source_chain, ChamplainMapSource *start_map_source, ChamplainTileCache *tile_cache) { ChamplainMapSource *map_source = start_map_source; ChamplainMapSource *chain_next_source = champlain_map_source_get_next_source (CHAMPLAIN_MAP_SOURCE (source_chain)); do { map_source = champlain_map_source_get_next_source (map_source); } while (CHAMPLAIN_IS_TILE_CACHE (map_source)); while (CHAMPLAIN_IS_TILE_SOURCE (map_source) && map_source != chain_next_source) { champlain_tile_source_set_cache (CHAMPLAIN_TILE_SOURCE (map_source), tile_cache); map_source = champlain_map_source_get_next_source (map_source); } }
/** * champlain_map_source_chain_push: * @source_chain: a #ChamplainMapSourceChain * @map_source: the #ChamplainMapSource to be pushed into the chain * * Pushes a map source into the chain. * * Since: 0.6 */ void champlain_map_source_chain_push (ChamplainMapSourceChain *source_chain, ChamplainMapSource *map_source) { ChamplainMapSourceChainPrivate *priv = source_chain->priv; gboolean is_cache = FALSE; if (CHAMPLAIN_IS_TILE_CACHE (map_source)) is_cache = TRUE; else g_return_if_fail (CHAMPLAIN_IS_TILE_SOURCE (map_source)); g_object_ref_sink (map_source); if (!priv->stack_top) { ChamplainMapSource *chain_next_source = champlain_map_source_get_next_source (CHAMPLAIN_MAP_SOURCE (source_chain)); /* tile source has to be last */ g_return_if_fail (!is_cache); priv->stack_top = map_source; priv->stack_bottom = map_source; if (chain_next_source) champlain_map_source_set_next_source (priv->stack_bottom, chain_next_source); } else { champlain_map_source_set_next_source (map_source, priv->stack_top); priv->stack_top = map_source; if (is_cache) { ChamplainTileCache *tile_cache = CHAMPLAIN_TILE_CACHE (map_source); assign_cache_of_next_source_sequence (source_chain, priv->stack_top, tile_cache); } } }