Avoided copying and destroying temporary units when displaying them in dialogs.

This commit is contained in:
Guillaume Melquiond 2010-08-07 08:44:31 +00:00
parent 5881d1b6ec
commit 0fc601d657
3 changed files with 27 additions and 18 deletions

View File

@ -882,29 +882,36 @@ void unit_preview_pane::draw_contents()
}
}
units_list_preview_pane::units_list_preview_pane(const unit &u, TYPE type, bool on_left_side) :
units_list_preview_pane::units_list_preview_pane(const unit *u, TYPE type, bool on_left_side) :
unit_preview_pane(NULL, type, on_left_side),
units_(&unit_store_),
unit_store_(1, u)
units_(1, u)
{
}
units_list_preview_pane::units_list_preview_pane(const std::vector<const unit *> &units,
const gui::filter_textbox* filter, TYPE type, bool on_left_side) :
unit_preview_pane(filter, type, on_left_side),
units_(units)
{
}
units_list_preview_pane::units_list_preview_pane(const std::vector<unit> &units,
const gui::filter_textbox* filter, TYPE type, bool on_left_side) :
unit_preview_pane(filter, type, on_left_side),
units_(&units),
unit_store_()
units_(units.size())
{
for (unsigned i = 0; i < units.size(); ++i)
units_[i] = &units[i];
}
size_t units_list_preview_pane::size() const
{
return (units_!=NULL) ? units_->size() : 0;
return units_.size();
}
const unit_preview_pane::details units_list_preview_pane::get_details() const
{
const unit& u = (*units_)[index_];
const unit &u = *units_[index_];
details det;
det.image = u.still_image();
@ -943,7 +950,7 @@ const unit_preview_pane::details units_list_preview_pane::get_details() const
void units_list_preview_pane::process_event()
{
if (details_button_.pressed() && index_ >= 0 && index_ < int(size())) {
show_unit_description((*units_)[index_]);
show_unit_description(*units_[index_]);
}
}

View File

@ -119,18 +119,20 @@ private:
class units_list_preview_pane : public dialogs::unit_preview_pane
{
public:
units_list_preview_pane(const unit &u, TYPE type = SHOW_ALL, bool left_side = true);
units_list_preview_pane(
const std::vector<unit>& units, const gui::filter_textbox* filter=NULL,
TYPE type=SHOW_ALL, bool left_side=true);
units_list_preview_pane(const unit *u, TYPE type = SHOW_ALL, bool left_side = true);
units_list_preview_pane(const std::vector<const unit *> &units,
const gui::filter_textbox *filter = NULL,
TYPE type = SHOW_ALL, bool left_side = true);
units_list_preview_pane(const std::vector<unit> &units,
const gui::filter_textbox *filter = NULL,
TYPE type = SHOW_ALL, bool left_side = true);
private:
size_t size() const;
const details get_details() const;
void process_event();
const std::vector<unit>* units_;
std::vector<unit> unit_store_;
std::vector<const unit *> units_;
};

View File

@ -800,8 +800,8 @@ int mouse_handler::show_attack_dialog(const map_location& attacker_loc, const ma
if (bc_vector.empty())
{
dialogs::units_list_preview_pane attacker_preview(*attacker, dialogs::unit_preview_pane::SHOW_BASIC, true);
dialogs::units_list_preview_pane defender_preview(*defender, dialogs::unit_preview_pane::SHOW_BASIC, false);
dialogs::units_list_preview_pane attacker_preview(&*attacker, dialogs::unit_preview_pane::SHOW_BASIC, true);
dialogs::units_list_preview_pane defender_preview(&*defender, dialogs::unit_preview_pane::SHOW_BASIC, false);
std::vector<gui::preview_pane*> preview_panes;
preview_panes.push_back(&attacker_preview);
preview_panes.push_back(&defender_preview);
@ -880,8 +880,8 @@ int mouse_handler::show_attack_dialog(const map_location& attacker_loc, const ma
int res = 0;
{
dialogs::units_list_preview_pane attacker_preview(*attacker, dialogs::unit_preview_pane::SHOW_BASIC, true);
dialogs::units_list_preview_pane defender_preview(*defender, dialogs::unit_preview_pane::SHOW_BASIC, false);
dialogs::units_list_preview_pane attacker_preview(&*attacker, dialogs::unit_preview_pane::SHOW_BASIC, true);
dialogs::units_list_preview_pane defender_preview(&*defender, dialogs::unit_preview_pane::SHOW_BASIC, false);
std::vector<gui::preview_pane*> preview_panes;
preview_panes.push_back(&attacker_preview);
preview_panes.push_back(&defender_preview);