leader_list.cpp

Go to the documentation of this file.
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
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines

Generated by doxygen 1.7.1 on Fri May 25 2012 01:03:03 for The Battle for Wesnoth
Gna! | Forum | Wiki | CIA | devdocs