Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #define GETTEXT_DOMAIN "wesnoth-lib"
00017
00018 #include "gui/dialogs/unit_attack.hpp"
00019
00020 #include "gui/widgets/image.hpp"
00021 #ifdef GUI2_EXPERIMENTAL_LISTBOX
00022 #include "gui/widgets/list.hpp"
00023 #else
00024 #include "gui/widgets/listbox.hpp"
00025 #endif
00026 #include "gui/widgets/settings.hpp"
00027 #include "gui/widgets/window.hpp"
00028 #include "unit.hpp"
00029
00030 namespace gui2 {
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057 REGISTER_DIALOG(unit_attack)
00058
00059 tunit_attack::tunit_attack(
00060 const unit_map::iterator& attacker_itor
00061 , const unit_map::iterator& defender_itor
00062 , const std::vector<battle_context>& weapons
00063 , const int best_weapon)
00064 : selected_weapon_(-1)
00065 , attacker_itor_(attacker_itor)
00066 , defender_itor_(defender_itor)
00067 , weapons_(weapons)
00068 , best_weapon_(best_weapon)
00069 {
00070 }
00071
00072 template<class T>
00073 static void set_label(
00074 twindow& window
00075 , const std::string& id
00076 , const std::string& label)
00077 {
00078 T* widget = find_widget<T>(&window, id, false, false);
00079 if(widget) {
00080 widget->set_label(label);
00081 }
00082 }
00083
00084 static void set_attacker_info(twindow& w, unit& u)
00085 {
00086 set_label<timage>(w, "attacker_portrait", u.absolute_image());
00087 set_label<timage>(w, "attacker_icon", u.absolute_image());
00088 set_label<tcontrol>(w, "attacker_name", u.name());
00089 }
00090
00091 static void set_defender_info(twindow& w, unit& u)
00092 {
00093 set_label<timage>(w, "defender_portrait", u.absolute_image());
00094 set_label<timage>(w, "defender_icon", u.absolute_image());
00095 set_label<tcontrol>(w, "defender_name", u.name());
00096 }
00097
00098 static void set_weapon_info(twindow& window
00099 , const std::vector<battle_context>& weapons
00100 , const int best_weapon)
00101 {
00102 tlistbox& weapon_list =
00103 find_widget<tlistbox>(&window, "weapon_list", false);
00104 window.keyboard_capture(&weapon_list);
00105
00106 const config empty;
00107 attack_type no_weapon(empty);
00108
00109 foreach(const battle_context& weapon, weapons) {
00110 const battle_context_unit_stats& attacker =
00111 weapon.get_attacker_stats();
00112
00113 const battle_context_unit_stats& defender =
00114 weapon.get_defender_stats();
00115
00116 const attack_type& attacker_weapon = attack_type(*attacker.weapon);
00117 const attack_type& defender_weapon = attack_type(
00118 defender.weapon ? *defender.weapon : no_weapon);
00119
00120 std::map<std::string, string_map> data;
00121 string_map item;
00122
00123 item["label"] = attacker_weapon.name();
00124 data.insert(std::make_pair("attacker_weapon", item));
00125
00126 item["label"] = defender_weapon.name();
00127 data.insert(std::make_pair("defender_weapon", item));
00128
00129 weapon_list.add_row(data);
00130
00131 }
00132
00133 assert(best_weapon < static_cast<int>(weapon_list.get_item_count()));
00134 weapon_list.select_row(best_weapon);
00135 }
00136
00137 void tunit_attack::pre_show(CVideo& , twindow& window)
00138 {
00139 set_attacker_info(window, *attacker_itor_);
00140 set_defender_info(window, *defender_itor_);
00141
00142 selected_weapon_ = -1;
00143 set_weapon_info(window, weapons_, best_weapon_);
00144 }
00145
00146 void tunit_attack::post_show(twindow& window)
00147 {
00148 if(get_retval() == twindow::OK) {
00149 selected_weapon_ = find_widget<tlistbox>(&window, "weapon_list", false)
00150 .get_selected_row();
00151 }
00152 }
00153
00154 }
00155