GUI2 debug mode unit-create dialog:

Added male/female toggle buttons, name generation toggle, listbox. The
listbox should get filled with unit types now. Basically all the dialog
works except for a SDL issue with a toggle button which causes an
assertion failure before being displayed.
This commit is contained in:
Ignacio R. Morelle 2009-08-19 18:29:24 +00:00
parent f438163d9a
commit b4dd617f54
5 changed files with 257 additions and 60 deletions

View file

@ -38,18 +38,6 @@
[/label]
[/column]
[column]
[spacer]
definition = "default"
[/spacer]
[/column]
[column]
[spacer]
definition = "default"
[/spacer]
[/column]
[/row]
[row]
@ -57,41 +45,56 @@
[column]
grow_factor = 1
border = "all"
border_size = 5
horizontal_alignment = "left"
horizontal_grow = "true"
[grid]
[row]
grow_factor=0
[column]
border = "all"
border_size = 5
horizontal_alignment = "left"
[label]
definition = "default"
label= _ "Gender:"
[/label]
[label]
definition = "default"
label= _ "Gender:"
[/label]
[/column]
[column]
horizontal_alignment = "right"
[toggle_button]
id = "male_toggle"
definition = "default"
label= _ "Male"
[/toggle_button]
[/column]
[column]
horizontal_alignment = "right"
[toggle_button]
id = "female_toggle"
definition = "default"
label= _ "Female"
[/toggle_button]
[/column]
[/row]
[/grid]
[/column]
[/row]
[row]
grow_factor = 0
[column]
grow_factor = 1
border = "all"
border_size = 5
horizontal_alignment = "left"
horizontal_alignment = "right"
[toggle_button]
id = "male_toggle"
id = "namegen_toggle"
definition = "default"
label= _ "Male"
[/toggle_button]
[/column]
[column]
grow_factor = 1
border = "all"
border_size = 5
horizontal_alignment = "left"
[toggle_button]
id = "female_toggle"
definition = "default"
label= _ "Female"
label= _ "Generate name"
[/toggle_button]
[/column]
@ -181,17 +184,41 @@
[/listbox]
[/column]
[/row]
[row]
grow_factor = 0
[column]
[spacer]
definition = "default"
[/spacer]
[/column]
grow_factor = 0
[grid]
[row]
grow_factor=0
[column]
border = "all"
border_size = 5
horizontal_alignment = "left"
[button]
id = "ok"
definition = "default"
size_text = _ "OK"
label = _ "OK"
[/button]
[/column]
[column]
[spacer]
definition = "default"
[/spacer]
[column]
border = "all"
border_size = 5
horizontal_alignment = "right"
[button]
id = "cancel"
definition = "default"
size_text = _ "Cancel"
label = _ "Cancel"
[/button]
[/column]
[/row]
[/grid]
[/column]
[/row]
[/grid]

View file

@ -16,6 +16,8 @@
#include "gui/dialogs/unit_create.hpp"
#include "gui/auxiliary/log.hpp"
#include "gui/widgets/listbox.hpp"
#include "gui/widgets/toggle_button.hpp"
#include "gui/widgets/window.hpp"
@ -23,6 +25,21 @@ namespace gui2 {
/* TODO: wiki-doc me! */
size_t tunit_create::no_choice() const
{
return std::max(races_.size(), types_.size());
}
std::vector<std::string>::size_type tunit_create::list_size() const
{
return std::min(races_.size(), types_.size());
}
void tunit_create::set_list_choice(size_t choice)
{
choice_ = std::min(choice, list_size() - 1);
}
twindow* tunit_create::build_window(CVideo& video)
{
return build(video, get_id(UNIT_CREATE));
@ -30,11 +47,19 @@ twindow* tunit_create::build_window(CVideo& video)
void tunit_create::pre_show(CVideo& /*video*/, twindow& window)
{
ttoggle_button* male_toggle = dynamic_cast<ttoggle_button*>(window.find_widget("male_toggle", false));
ttoggle_button* female_toggle = dynamic_cast<ttoggle_button*>(window.find_widget("female_toggle", false));
ttoggle_button* male_toggle =
dynamic_cast<ttoggle_button*>(window.find_widget("male_toggle", false));
ttoggle_button* female_toggle =
dynamic_cast<ttoggle_button*>(window.find_widget("female_toggle", false));
ttoggle_button* namegen_toggle =
dynamic_cast<ttoggle_button*>(window.find_widget("namegen_toggle", false));
tlistbox* list =
dynamic_cast<tlistbox*>(window.find_widget("unit_type_list", false));
VALIDATE(male_toggle, missing_widget("male_toggle"));
VALIDATE(female_toggle, missing_widget("female_toggle"));
VALIDATE(namegen_toggle, missing_widget("namegen_toggle"));
VALIDATE(list, missing_widget("unit_type_list"));
if(gender_ == unit_race::FEMALE) {
female_toggle->set_value(true);
@ -44,6 +69,58 @@ void tunit_create::pre_show(CVideo& /*video*/, twindow& window)
female_toggle->set_value(false);
male_toggle->set_value(true);
}
namegen_toggle->set_value(generate_name_);
if(types_.empty() != true) {
// TODO: check at setter time instead/merge setters in one?
if(races_.size() != types_.size()) {
WRN_GUI_G << "tunit_create::pre_show(): more unit races than types, using minimum set\n";
}
for(std::vector<std::string>::size_type k = 0; k < list_size(); ++k) {
std::map<std::string, string_map> data;
string_map item;
item["label"] = types_[k];
data.insert(std::make_pair("unit_type", item));
item["label"] = races_[k];
data.insert(std::make_pair("race", item));
list->add_row(data);
}
}
}
void tunit_create::post_show(twindow& window)
{
if(get_retval() != twindow::OK) {
choice_ = no_choice();
return;
}
ttoggle_button* male_toggle =
dynamic_cast<ttoggle_button*>(window.find_widget("male_toggle", false));
ttoggle_button* female_toggle =
dynamic_cast<ttoggle_button*>(window.find_widget("female_toggle", false));
ttoggle_button* namegen_toggle =
dynamic_cast<ttoggle_button*>(window.find_widget("namegen_toggle", false));
tlistbox* list =
dynamic_cast<tlistbox*>(window.find_widget("unit_type_list", false));
assert(male_toggle);
assert(female_toggle);
assert(namegen_toggle);
assert(list);
if(list->get_selected_row() < 0) {
choice_ = no_choice();
return;
}
choice_ = static_cast<size_t>(list->get_selected_row());
gender_ = female_toggle->get_value() ? unit_race::FEMALE : unit_race::MALE;
generate_name_ = namegen_toggle->get_value();
}
}

View file

@ -18,26 +18,58 @@
#include "gui/dialogs/dialog.hpp"
#include "race.hpp"
#include <string>
#include <vector>
namespace gui2 {
class tunit_create : public tdialog
{
public:
tunit_create(unit_race::GENDER default_gender = unit_race::MALE) :
gender_(default_gender)
tunit_create() :
races_(),
types_(),
gender_(unit_race::MALE),
generate_name_(false),
choice_(0)
{}
unit_race::GENDER gender() const { return gender_; }
void set_gender(unit_race::GENDER gender) { gender_ = gender; }
bool generate_name() const { return generate_name_; }
void set_generate_name(bool generate_name) { generate_name_ = generate_name; }
/** Inserts a new race/unit-type pair into the list. */
void add_race_type_pair(const std::string& race, const std::string& type) {
races_.push_back(race);
types_.push_back(type);
}
/** Unit type choice from the user. */
size_t list_choice() const { return choice_; }
void set_list_choice(size_t choice);
/** Value used to indicate that the user did not choice an unit type. */
size_t no_choice() const;
private:
std::vector<std::string> races_;
std::vector<std::string> types_;
unit_race::GENDER gender_;
bool generate_name_;
size_t choice_;
/** Inherited from tdialog. */
twindow* build_window(CVideo& video);
/** Inherited from tdialog. */
void pre_show(CVideo& video, twindow& window);
/** Inherited from tdialog. */
void post_show(twindow& window);
std::vector<std::string>::size_type list_size() const;
};
}

View file

@ -1342,20 +1342,80 @@ private:
}
}
void menu_handler::create_unit_2(mouse_handler& mousehandler)
{
assert(gui_ != NULL);
static unit_race::GENDER gender = unit_race::MALE;
static bool generate_name = false;
static std::string last_choice = "";
std::vector<const unit_type*> unit_choices;
std::vector<std::string> type_ids;
size_t choice = 0;
gui2::tunit_create create_dlg;
create_dlg.set_gender(gender);
create_dlg.set_generate_name(generate_name);
for(unit_type_data::unit_type_map::const_iterator i = unit_type_data::types().begin(); i != unit_type_data::types().end(); ++i) {
assert(&(i->second) != NULL);
const race_map::const_iterator race_it = unit_type_data::types().races().find(i->second.race());
std::string race;
if(race_it != unit_type_data::types().races().end()) {
race = race_it->second.plural_name();
}
create_dlg.add_race_type_pair(race, i->second.type_name());
unit_choices.push_back(&(i->second));
type_ids.push_back(i->first);
if(i->first == last_choice) {
choice = unit_choices.size() - 1;
}
}
create_dlg.set_list_choice(choice);
create_dlg.show(gui_->video());
if((choice = create_dlg.list_choice()) == create_dlg.no_choice()) {
return;
}
assert(type_ids.size() >= choice);
last_choice = type_ids[choice];
gender = create_dlg.gender();
generate_name = create_dlg.generate_name();
const unit_type& ut = *unit_choices[choice];
// Do not try to set bad genders, may mess up l10n
// FIXME: is this actually necessary?
if(ut.genders().end() == std::find(ut.genders().begin(), ut.genders().end(), gender)) {
gender = ut.genders().front();
}
unit chosen(&units_, unit_choices[choice], 1, false, false, gender, "");
chosen.new_turn();
const map_location& loc = mousehandler.get_last_hex();
units_.replace(loc, chosen);
if(map_.is_village(loc)) {
int team = chosen.side() - 1; // translate to 0-based team number
get_village(loc, *gui_, teams_, team, units_);
}
gui_->invalidate(loc);
gui_->invalidate_unit();
}
void menu_handler::create_unit(mouse_handler& mousehandler)
{
if(gui2::new_widgets) {
assert(gui_ != NULL);
static unit_race::GENDER last_gender = unit_race::MALE;
gui2::tunit_create create_dlg;
create_dlg.set_gender(last_gender);
create_dlg.show(gui_->video());
last_gender = create_dlg.gender();
create_unit_2(mousehandler);
return;
}
std::vector<std::string> options;
static int last_selection = -1;
static bool random_gender = false;

View file

@ -73,6 +73,7 @@ public:
void unit_description(mouse_handler& mousehandler);
void rename_unit(mouse_handler& mousehandler);
void create_unit(mouse_handler& mousehandler);
void create_unit_2(mouse_handler& mousehandler); // TODO: replace create_unit when complete
void change_side(mouse_handler& mousehandler);
void label_terrain(mouse_handler& mousehandler, bool team_only);
void clear_labels();