static void do_resolve_rects(const config& cfg, config& resolved_config, config* resol_cfg = nullptr) { // recursively resolve children for(const config::any_child& value : cfg.all_children_range()) { config& childcfg = resolved_config.add_child(value.key); do_resolve_rects(value.cfg, childcfg, value.key == "resolution" ? &childcfg : resol_cfg); } // copy all key/values resolved_config.merge_attributes(cfg); // override default reference rect with "ref" parameter if any if(!cfg["ref"].empty()) { if(resol_cfg == nullptr) { ERR_DP << "Use of ref= outside a [resolution] block" << std::endl; } else { // DBG_DP << ">> Looking for " << cfg["ref"] << "\n"; const config& ref = find_ref(cfg["ref"], *resol_cfg); if(ref["id"].empty()) { ERR_DP << "Reference to non-existent rect id \"" << cfg["ref"] << "\"" << std::endl; } else if(ref["rect"].empty()) { ERR_DP << "Reference to id \"" << cfg["ref"] << "\" which does not have a \"rect\"\n"; } else { ref_rect = read_rect(ref); } } } // resolve the rect value to absolute coordinates if(!cfg["rect"].empty()) { resolved_config["rect"] = resolve_rect(cfg["rect"]); } }
theme::theme(const config& cfg, const SDL_Rect& screen) : theme_reset_event_("theme_reset") , cur_theme() , cfg_() , panels_() , labels_() , menus_() , actions_() , context_() , status_() , main_map_() , mini_map_() , unit_image_() , palette_() , border_() { do_resolve_rects(expand_partialresolution(cfg), cfg_); set_resolution(screen); }
static void do_resolve_rects(const config& cfg, config& resolved_config, config* resol_cfg = NULL) { // recursively resolve children for(config::all_children_iterator i = cfg.ordered_begin(); i != cfg.ordered_end(); ++i) { const config::all_children_iterator::value_type& value = *i; config& childcfg = resolved_config.add_child(value.first); do_resolve_rects(*value.second, childcfg, (value.first == "resolution") ? &childcfg : resol_cfg); } // copy all key/values for(string_map::const_iterator j = cfg.values.begin(); j != cfg.values.end(); ++j) { resolved_config.values[j->first] = j->second; } // override default reference rect with "ref" parameter if any if (!cfg["ref"].empty()) { if (resol_cfg == NULL) { ERR_DP << "Use of ref= outside a [resolution] block\n"; } else { //DBG_DP << ">> Looking for " << cfg["ref"] << "\n"; const config ref = find_ref (cfg["ref"], *resol_cfg); if (ref["id"].empty()) { ERR_DP << "Reference to non-existent rect id \"" << cfg["ref"] << "\"\n"; } else if (ref["rect"].empty()) { ERR_DP << "Reference to id \"" << cfg["ref"] << "\" which does not have a \"rect\"\n"; } else { ref_rect = read_rect(ref); } } } // resolve the rect value to absolute coordinates if (!cfg["rect"].empty()) { resolved_config.values["rect"] = resolve_rect(cfg["rect"]); } }