00001 /* $Id: leader_list.cpp 53860 2012-04-08 16:14:19Z ai0867 $ */ 00002 /* 00003 Copyright (C) 2007 - 2012 00004 Part of the Battle for Wesnoth Project http://www.wesnoth.org 00005 00006 This program is free software; you can redistribute it and/or modify 00007 it under the terms of the GNU General Public License 2 00008 the Free Software Foundation; either version 2 of the License, or 00009 (at your option) any later version. 00010 This program is distributed in the hope that it will be useful, 00011 but WITHOUT ANY WARRANTY. 00012 00013 See the COPYING file for more details. 00014 */ 00015 00016 /** 00017 * @file 00018 * Manage the selection of a leader, and select his/her gender. 00019 */ 00020 00021 #include "global.hpp" 00022 00023 #include "gettext.hpp" 00024 #include "leader_list.hpp" 00025 #include "wml_separators.hpp" 00026 #include "widgets/combo.hpp" 00027 00028 const std::string leader_list_manager::random_enemy_picture("units/random-dice.png"); 00029 00030 leader_list_manager::leader_list_manager(const std::vector<const config *> &side_list, 00031 gui::combo* leader_combo , gui::combo* gender_combo): 00032 leaders_(), 00033 genders_(), 00034 gender_ids_(), 00035 side_list_(side_list), 00036 leader_combo_(leader_combo), 00037 gender_combo_(gender_combo), 00038 color_(0) 00039 { 00040 } 00041 00042 void leader_list_manager::set_leader_combo(gui::combo* combo) 00043 { 00044 int selected = leader_combo_ != NULL ? leader_combo_->selected() : 0; 00045 leader_combo_ = combo; 00046 00047 if(leader_combo_ != NULL) { 00048 if(leaders_.empty()) { 00049 update_leader_list(0); 00050 } else { 00051 populate_leader_combo(selected); 00052 } 00053 } 00054 } 00055 00056 void leader_list_manager::set_gender_combo(gui::combo* combo) 00057 { 00058 gender_combo_ = combo; 00059 00060 if(gender_combo_ != NULL) { 00061 if(!leaders_.empty()) { 00062 update_gender_list(get_leader()); 00063 } 00064 } 00065 } 00066 00067 void leader_list_manager::update_leader_list(int side_index) 00068 { 00069 const config& side = *side_list_[side_index]; 00070 00071 leaders_.clear(); 00072 00073 if (side["random_faction"].to_bool()) { 00074 if(leader_combo_ != NULL) { 00075 std::vector<std::string> dummy; 00076 dummy.push_back(utils::unicode_em_dash); 00077 leader_combo_->enable(false); 00078 leader_combo_->set_items(dummy); 00079 leader_combo_->set_selected(0); 00080 } 00081 return; 00082 } else { 00083 if(leader_combo_ != NULL) 00084 leader_combo_->enable(true); 00085 if(gender_combo_ != NULL) 00086 gender_combo_->enable(true); 00087 } 00088 00089 if(!side["leader"].empty()) { 00090 leaders_ = utils::split(side["leader"]); 00091 } 00092 00093 const std::string default_leader = side["type"]; 00094 const std::string random_leader = "random"; 00095 size_t default_index = 0; 00096 00097 std::vector<std::string>::const_iterator itor; 00098 00099 for (itor = leaders_.begin(); itor != leaders_.end(); ++itor) { 00100 if (*itor == default_leader) { 00101 break; 00102 } 00103 default_index++; 00104 } 00105 00106 if (default_index == leaders_.size()) { 00107 leaders_.push_back(default_leader); 00108 } 00109 00110 if (default_leader != random_leader) { 00111 leaders_.push_back(random_leader); 00112 } 00113 00114 populate_leader_combo(default_index); 00115 } 00116 00117 void leader_list_manager::update_gender_list(const std::string& leader) 00118 { 00119 int gender_index = gender_combo_ != NULL ? gender_combo_->selected() : 0; 00120 genders_.clear(); 00121 gender_ids_.clear(); 00122 if (leader == "random" || leader == "-" || leader == "?") { 00123 // Assume random/unknown leader/faction == unknown gender 00124 gender_ids_.push_back("null"); 00125 genders_.push_back(utils::unicode_em_dash); 00126 if (gender_combo_ != NULL) { 00127 gender_combo_->enable(false); 00128 gender_combo_->set_items(genders_); 00129 gender_combo_->set_selected(0); 00130 } 00131 return; 00132 } 00133 00134 const unit_type *utp = unit_types.find(leader); 00135 if (utp) { 00136 const unit_type &ut = *utp; 00137 const std::vector<unit_race::GENDER> genders = ut.genders(); 00138 if ( (genders.size() < 2) && (gender_combo_ != NULL) ) { 00139 gender_combo_->enable(false); 00140 } else { 00141 gender_ids_.push_back("random"); 00142 genders_.push_back(IMAGE_PREFIX + random_enemy_picture + COLUMN_SEPARATOR + _("gender^Random")); 00143 if (gender_combo_ != NULL) gender_combo_->enable(true); 00144 } 00145 for (std::vector<unit_race::GENDER>::const_iterator i=genders.begin(); i != genders.end(); ++i) { 00146 const unit_type& utg = ut.get_gender_unit_type(*i); 00147 00148 // Make the internationalized titles for each gender, along with the WML ids 00149 if (*i == unit_race::FEMALE) { 00150 gender_ids_.push_back("female"); 00151 genders_.push_back(IMAGE_PREFIX + utg.image() + get_RC_suffix(utg.flag_rgb()) + 00152 COLUMN_SEPARATOR + _("Female ♀")); 00153 } else { 00154 gender_ids_.push_back("male"); 00155 genders_.push_back(IMAGE_PREFIX + utg.image() + get_RC_suffix(utg.flag_rgb()) + 00156 COLUMN_SEPARATOR + _("Male ♂")); 00157 } 00158 } 00159 if (gender_combo_ != NULL) { 00160 gender_combo_->set_items(genders_); 00161 assert(!genders_.empty()); 00162 gender_index %= genders_.size(); 00163 gender_combo_->set_selected(gender_index); 00164 } 00165 } else { 00166 gender_ids_.push_back("random"); 00167 genders_.push_back(IMAGE_PREFIX + random_enemy_picture + COLUMN_SEPARATOR + _("Random")); 00168 if (gender_combo_ != NULL) { 00169 gender_combo_->enable(false); 00170 gender_combo_->set_items(genders_); 00171 gender_combo_->set_selected(0); 00172 } 00173 } 00174 } 00175 00176 void leader_list_manager::populate_leader_combo(int selected_index) { 00177 std::vector<std::string>::const_iterator itor; 00178 std::vector<std::string> leader_strings; 00179 for(itor = leaders_.begin(); itor != leaders_.end(); ++itor) { 00180 00181 const unit_type *utp = unit_types.find(*itor); 00182 if (utp) { 00183 std::string gender; 00184 if (gender_combo_ != NULL && !genders_.empty() && size_t(gender_combo_->selected()) < genders_.size()) { 00185 gender = gender_ids_[gender_combo_->selected()]; 00186 } 00187 const unit_type& ut = utp->get_gender_unit_type(gender); 00188 leader_strings.push_back(IMAGE_PREFIX + ut.image() + get_RC_suffix(ut.flag_rgb()) + COLUMN_SEPARATOR + ut.type_name()); 00189 00190 } else { 00191 if(*itor == "random") { 00192 leader_strings.push_back(IMAGE_PREFIX + random_enemy_picture + COLUMN_SEPARATOR + _("Random")); 00193 } else { 00194 leader_strings.push_back("?"); 00195 } 00196 } 00197 } 00198 00199 if(leader_combo_ != NULL) { 00200 leader_combo_->set_items(leader_strings); 00201 leader_combo_->set_selected(selected_index); 00202 } 00203 } 00204 00205 void leader_list_manager::set_leader(const std::string& leader) 00206 { 00207 if(leader_combo_ == NULL) 00208 return; 00209 00210 int leader_index = 0; 00211 for(std::vector<std::string>::const_iterator itor = leaders_.begin(); 00212 itor != leaders_.end(); ++itor) { 00213 if(leader == *itor) { 00214 leader_combo_->set_selected(leader_index); 00215 return; 00216 } 00217 ++leader_index; 00218 } 00219 } 00220 00221 void leader_list_manager::set_gender(const std::string& gender) 00222 { 00223 if(gender_combo_ == NULL) 00224 return; 00225 00226 int gender_index = 0; 00227 for(std::vector<std::string>::const_iterator itor = gender_ids_.begin(); 00228 itor != gender_ids_.end(); ++itor) { 00229 if(gender == *itor) { 00230 gender_combo_->set_selected(gender_index); 00231 return; 00232 } 00233 ++gender_index; 00234 } 00235 } 00236 00237 std::string leader_list_manager::get_leader() const 00238 { 00239 if(leader_combo_ == NULL) 00240 return _("?"); 00241 00242 if(leaders_.empty()) 00243 return "random"; 00244 00245 if(size_t(leader_combo_->selected()) >= leaders_.size()) 00246 return _("?"); 00247 00248 return leaders_[leader_combo_->selected()]; 00249 } 00250 00251 std::string leader_list_manager::get_gender() const 00252 { 00253 if(gender_combo_ == NULL || genders_.empty() || size_t(gender_combo_->selected()) >= genders_.size()) 00254 return "null"; 00255 return gender_ids_[gender_combo_->selected()]; 00256 } 00257 00258 #ifdef LOW_MEM 00259 std::string leader_list_manager::get_RC_suffix(const std::string& /*unit_color*/) const { 00260 return ""; 00261 } 00262 #else 00263 std::string leader_list_manager::get_RC_suffix(const std::string& unit_color) const { 00264 return "~RC("+unit_color+">"+lexical_cast<std::string>(color_+1) +")"; 00265 } 00266 #endif
| Generated by doxygen 1.7.1 on Fri May 25 2012 01:03:03 for The Battle for Wesnoth | Gna! | Forum | Wiki | CIA | devdocs |