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:
parent
f438163d9a
commit
b4dd617f54
5 changed files with 257 additions and 60 deletions
|
@ -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]
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Add table
Reference in a new issue