Author: alink
Date: Tue May 27 20:08:11 2008
New Revision: 26889
URL: http://svn.gna.org/viewcvs/wesnoth?rev=26889&view=rev
Log:
Add a textbox filter to the Create Unit Dialog, allowing quick selection.
Also abstract the code of savegame's filter, and use it for this.
Modified:
trunk/src/construct_dialog.cpp
trunk/src/construct_dialog.hpp
trunk/src/dialogs.cpp
trunk/src/dialogs.hpp
trunk/src/menu_events.cpp
Modified: trunk/src/construct_dialog.cpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/construct_dialog.cpp?rev=26889&r1=26888&r2=26889&view=diff
==============================================================================
--- trunk/src/construct_dialog.cpp (original)
+++ trunk/src/construct_dialog.cpp Tue May 27 20:08:11 2008
@@ -850,6 +850,40 @@
video().blit_surface(location().x, location().y, surf_);
}
+int filter_textbox::get_index(int index) const {
+ // don't translate special values
+ if(index < 0) {
+ return index;
+ }
+ //we must add one to the index to ignore the header row, and
+ //then subtract one from the result to return the index not including
+ //the header row.
+ index++;
+
+ if (size_t(index) >= index_map_.size()) {
+ return -1; // bad index, cancel
+ }
+
+ return index_map_[index]-1;
+}
+
+void filter_textbox::handle_text_changed(const wide_string& text) {
+ filtered_items_.clear();
+ index_map_.clear();
+ const std::string t = utils::wstring_to_string(text);
+ for(size_t n = 0; n != to_filter_items_.size(); ++n) {
+ if(n == 0 || std::search(to_filter_items_[n].begin(),
to_filter_items_[n].end(),
+ t.begin(),
t.end(),
+
chars_equal_insensitive) != to_filter_items_[n].end())
+ {
+ filtered_items_.push_back(to_filter_items_[n]);
+ index_map_.push_back(n);
+ }
+ }
+
+ dialog_.set_menu_items(filtered_items_);
+}
+
int message_dialog::show(msecs minimum_lifetime)
{
prevent_misclick_until_ = SDL_GetTicks() + minimum_lifetime;
Modified: trunk/src/construct_dialog.hpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/construct_dialog.hpp?rev=26889&r1=26888&r2=26889&view=diff
==============================================================================
--- trunk/src/construct_dialog.hpp (original)
+++ trunk/src/construct_dialog.hpp Tue May 27 20:08:11 2008
@@ -115,6 +115,31 @@
void operator=(const dialog_textbox&);
label *label_;
+};
+
+class dialog;
+
+class filter_textbox : public gui::dialog_textbox {
+public:
+ filter_textbox(CVideo& video, const std::string& header,
+ const std::vector<std::string>& items, const
std::vector<std::string>& to_filter_items,
+ dialog& dialog, int width = 250)
+ : dialog_textbox(new label(video, header), video, width),
+ items_(items),
+ to_filter_items_(to_filter_items),
+ dialog_(dialog),
+ first_time_(true)
+ {
+ set_text("");
+ }
+
+ int get_index(int index) const;
+private:
+ std::vector<std::string> items_, to_filter_items_, filtered_items_;
+ std::vector<int> index_map_;
+ gui::dialog& dialog_;
+ bool first_time_;
+ virtual void handle_text_changed(const wide_string& text);
};
class dialog_button : public button {
Modified: trunk/src/dialogs.cpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/dialogs.cpp?rev=26889&r1=26888&r2=26889&view=diff
==============================================================================
--- trunk/src/dialogs.cpp (original)
+++ trunk/src/dialogs.cpp Tue May 27 20:08:11 2008
@@ -305,71 +305,22 @@
//! Class to handle deleting a saved game.
namespace {
-class load_game_filter_textbox : public gui::dialog_textbox {
+class delete_save : public gui::dialog_button_action
+{
public:
- load_game_filter_textbox(CVideo& video, const std::vector<std::string>&
items, gui::dialog& dialog)
- : gui::dialog_textbox(new gui::label(video, _("Filter: ")), video,
250),
- items_(items),
- dialog_(dialog),
- first_time_(true)
- {
- sorter_.set_alpha_sort(0).set_id_sort(1);
- set_text("");
- }
-
- int get_save_index(int index) const {
- //we must add one to the index to ignore the header row, and
- //then subtract one from the result to return the index not
including
- //the header row.
- ++index;
- if(size_t(index) >= index_map_.size()) {
- return -1;
- }
- return index_map_[index]-1;
- }
-private:
- std::vector<std::string> items_, filtered_items_;
- std::vector<int> index_map_;
- gui::dialog& dialog_;
- gui::menu::basic_sorter sorter_;
- bool first_time_;
- virtual void handle_text_changed(const wide_string& text) {
- filtered_items_.clear();
- index_map_.clear();
- const std::string t = utils::wstring_to_string(text);
- for(size_t n = 0; n != items_.size(); ++n) {
- if(n == 0 || std::search(items_[n].begin(),
items_[n].end(),
- t.begin(), t.end(),
chars_equal_insensitive) != items_[n].end()) {
- filtered_items_.push_back(items_[n]);
- index_map_.push_back(n);
- }
- }
-
- if(first_time_) {
- dialog_.set_menu(filtered_items_, &sorter_);
- first_time_ = false;
- } else {
- dialog_.set_menu_items(filtered_items_);
- }
- }
-};
-
-class delete_save : public gui::dialog_button_action
-{
-public:
- delete_save(display& disp, load_game_filter_textbox& filter,
std::vector<save_info>& saves, std::vector<config*>& save_summaries) :
disp_(disp), saves_(saves), summaries_(save_summaries), filter_(filter) {}
+ delete_save(display& disp, gui::filter_textbox& filter,
std::vector<save_info>& saves, std::vector<config*>& save_summaries) :
disp_(disp), saves_(saves), summaries_(save_summaries), filter_(filter) {}
private:
gui::dialog_button_action::RESULT button_pressed(int menu_selection);
display& disp_;
std::vector<save_info>& saves_;
std::vector<config*>& summaries_;
- load_game_filter_textbox& filter_;
+ gui::filter_textbox& filter_;
};
gui::dialog_button_action::RESULT delete_save::button_pressed(int
menu_selection)
{
- const size_t index = size_t(filter_.get_save_index(menu_selection));
+ const size_t index = size_t(filter_.get_index(menu_selection));
if(index < saves_.size()) {
// See if we should ask the user for deletion confirmation
@@ -411,7 +362,7 @@
{
public:
save_preview_pane(CVideo &video, const config& game_config, gamemap*
map,
- const std::vector<save_info>& info, const
std::vector<config*>& summaries, const load_game_filter_textbox& textbox)
+ const std::vector<save_info>& info, const
std::vector<config*>& summaries, const gui::filter_textbox& textbox)
: gui::preview_pane(video), game_config_(&game_config),
map_(map), info_(&info), summaries_(&summaries), index_(0), textbox_(textbox)
{
set_measurements(minimum<int>(200,video.getx()/4),
@@ -420,7 +371,7 @@
void draw_contents();
void set_selection(int index) {
- index_ = textbox_.get_save_index(index);
+ index_ = textbox_.get_index(index);
set_dirty();
}
@@ -433,7 +384,7 @@
const std::vector<config*>* summaries_;
int index_;
std::map<std::string,surface> map_cache_;
- const load_game_filter_textbox& textbox_;
+ const gui::filter_textbox& textbox_;
};
void save_preview_pane::draw_contents()
@@ -686,9 +637,6 @@
items.push_back(str.str());
}
- gui::menu::basic_sorter sorter;
- sorter.set_alpha_sort(0).set_id_sort(1);
-
gamemap map_obj(game_config, "");
@@ -696,9 +644,15 @@
_("Load Game"),
_("Choose the game to load"), gui::NULL_DIALOG);
lmenu.set_basic_behavior(gui::OK_CANCEL);
- load_game_filter_textbox* filter = new
load_game_filter_textbox(disp.video(), items, lmenu);
+
+ gui::menu::basic_sorter sorter;
+ sorter.set_alpha_sort(0).set_id_sort(1);
+ lmenu.set_menu(items, &sorter);
+
+ gui::filter_textbox* filter = new gui::filter_textbox(disp.video(),
_("Filter: "), items, items, lmenu);
+ lmenu.set_textbox(filter);
+
save_preview_pane
save_preview(disp.video(),game_config,&map_obj,games,summaries,*filter);
- lmenu.set_textbox(filter);
lmenu.add_pane(&save_preview);
// create an option for whether the replay should be shown or not
if(show_replay != NULL) {
@@ -734,7 +688,7 @@
if(res == -1)
return "";
- res = filter->get_save_index(res);
+ res = filter->get_index(res);
int option_index = 0;
if(show_replay != NULL) {
*show_replay = lmenu.option_checked(option_index++);
@@ -757,10 +711,12 @@
//! Show unit-stats in a side-pane to unit-list, recall-list, etc.
-unit_preview_pane::unit_preview_pane(game_display& disp, const gamemap* map,
TYPE type, bool on_left_side)
+unit_preview_pane::unit_preview_pane(game_display& disp, const gamemap* map,
+ const gui::filter_textbox* filter, TYPE type, bool on_left_side)
: gui::preview_pane(disp.video()),
disp_(disp), map_(map), index_(0),
-
details_button_(disp.video(),_("Profile"),gui::button::TYPE_PRESS,"lite_small",gui::button::MINIMUM_SPACE),
- left_(on_left_side), weapons_(type ==
SHOW_ALL)
+ details_button_(disp.video(),
_("Profile"),
+ gui::button::TYPE_PRESS,"lite_small",
gui::button::MINIMUM_SPACE),
+ filter_(filter), weapons_(type ==
SHOW_ALL), left_(on_left_side)
{
unsigned w = font::relative_size(weapons_ ? 200 : 190);
unsigned h = font::relative_size(weapons_ ? 370 : 140);
@@ -788,6 +744,9 @@
void unit_preview_pane::set_selection(int index)
{
index = minimum<int>(int(size()-1),index);
+ if (filter_) {
+ index = filter_->get_index(index);
+ }
if(index != index_ && index >= 0) {
index_ = index;
set_dirty();
@@ -919,15 +878,17 @@
}
}
-units_list_preview_pane::units_list_preview_pane(game_display& disp, const
gamemap* map, const unit& u, TYPE type, bool on_left_side)
- : unit_preview_pane(disp, map, type,
on_left_side),
+units_list_preview_pane::units_list_preview_pane(game_display& disp, const
gamemap* map,
+ const unit& u, TYPE type, bool on_left_side)
+ : unit_preview_pane(disp, map, NULL,
type, on_left_side),
units_(&unit_store_)
{
unit_store_.push_back(u);
}
-units_list_preview_pane::units_list_preview_pane(game_display& disp, const
gamemap* map, std::vector<unit>& units, TYPE type, bool on_left_side)
- : unit_preview_pane(disp, map, type,
on_left_side),
+units_list_preview_pane::units_list_preview_pane(game_display& disp, const
gamemap* map,
+ std::vector<unit>& units, const gui::filter_textbox* filter,
TYPE type, bool on_left_side)
+ : unit_preview_pane(disp, map, filter,
type, on_left_side),
units_(&units)
{}
@@ -936,7 +897,6 @@
return (units_!=NULL) ? units_->size() : 0;
}
-//unit_preview_pane::
const unit_preview_pane::details units_list_preview_pane::get_details() const
{
unit& u = (*units_)[index_];
@@ -979,8 +939,10 @@
}
}
-unit_types_preview_pane::unit_types_preview_pane(game_display& disp, const
gamemap* map, std::vector<const unit_type*>& unit_types, int side, TYPE type,
bool on_left_side)
- : unit_preview_pane(disp, map, type,
on_left_side),
+unit_types_preview_pane::unit_types_preview_pane(game_display& disp, const
gamemap* map,
+ std::vector<const unit_type*>&
unit_types, const gui::filter_textbox* filter,
+ int side, TYPE type, bool on_left_side)
+ : unit_preview_pane(disp, map, filter,
type, on_left_side),
unit_types_(&unit_types), side_(side)
{}
Modified: trunk/src/dialogs.hpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/dialogs.hpp?rev=26889&r1=26888&r2=26889&view=diff
==============================================================================
--- trunk/src/dialogs.hpp (original)
+++ trunk/src/dialogs.hpp Tue May 27 20:08:11 2008
@@ -82,7 +82,8 @@
std::vector<attack_type> attacks;
};
- unit_preview_pane(game_display &disp, const gamemap* map, TYPE
type=SHOW_ALL, bool left_side=true);
+ unit_preview_pane(game_display &disp, const gamemap* map, const
gui::filter_textbox* filter=NULL,
+ TYPE type=SHOW_ALL, bool left_side=true);
bool show_above() const;
bool left_side() const;
@@ -103,15 +104,19 @@
void draw_contents();
+ const gui::filter_textbox* filter_;
+ bool weapons_;
bool left_;
- bool weapons_;
};
class units_list_preview_pane : public dialogs::unit_preview_pane
{
public:
- units_list_preview_pane(game_display &disp, const gamemap* map, const
unit& u, TYPE type=SHOW_ALL, bool left_side=true);
- units_list_preview_pane(game_display &disp, const gamemap* map,
std::vector<unit>& units, TYPE type=SHOW_ALL, bool left_side=true);
+ units_list_preview_pane(game_display &disp, const gamemap* map,
+ const unit& u, TYPE type=SHOW_ALL, bool left_side=true);
+ units_list_preview_pane(game_display &disp, const gamemap* map,
+ std::vector<unit>& units, const gui::filter_textbox*
filter=NULL,
+ TYPE type=SHOW_ALL, bool left_side=true);
private:
size_t size() const;
@@ -126,7 +131,9 @@
class unit_types_preview_pane : public dialogs::unit_preview_pane
{
public:
- unit_types_preview_pane(game_display &disp, const gamemap* map,
std::vector<const unit_type*>& unit_types, int side = 1, TYPE type=SHOW_ALL,
bool left_side=true);
+ unit_types_preview_pane(game_display &disp, const gamemap* map,
+ std::vector<const unit_type*>& unit_types, const
gui::filter_textbox* filterbox=NULL,
+ int side = 1, TYPE type=SHOW_ALL, bool left_side=true);
private:
size_t size() const;
Modified: trunk/src/menu_events.cpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/menu_events.cpp?rev=26889&r1=26888&r2=26889&view=diff
==============================================================================
--- trunk/src/menu_events.cpp (original)
+++ trunk/src/menu_events.cpp Tue May 27 20:08:11 2008
@@ -1042,7 +1042,7 @@
int recruit_res = 0;
{
- dialogs::unit_types_preview_pane
unit_preview(*gui_,&map_,sample_units,team_num);
+ dialogs::unit_types_preview_pane
unit_preview(*gui_,&map_,sample_units,NULL,team_num);
std::vector<gui::preview_pane*> preview_panes;
preview_panes.push_back(&unit_preview);
@@ -1653,19 +1653,27 @@
int choice = 0;
{
+ gui::dialog umenu(*gui_, _("Create Unit (Debug!)"), "",
gui::OK_CANCEL);
+
gui::menu::basic_sorter sorter;
sorter.set_alpha_sort(0).set_alpha_sort(1);
-
- dialogs::unit_types_preview_pane unit_preview(*gui_,
&map_, unit_choices);
- gui::dialog umenu(*gui_, _("Create Unit (Debug!)"), "",
gui::OK_CANCEL);
umenu.set_menu(options, &sorter);
- umenu.add_pane(&unit_preview);
+
+ gui::filter_textbox* filter = new
gui::filter_textbox(gui_->video(),
+ _("Filter: "), options, options, umenu, 200);
+ umenu.set_textbox(filter);
+
//sort by race then by type name
umenu.get_menu().sort_by(1);
umenu.get_menu().sort_by(0);
umenu.get_menu().reset_selection();
+
+ dialogs::unit_types_preview_pane unit_preview(*gui_,
&map_, unit_choices, filter, 1, dialogs::unit_types_preview_pane::SHOW_ALL);
+ umenu.add_pane(&unit_preview);
unit_preview.set_selection(umenu.get_menu().selection());
+
choice = umenu.show();
+ choice = filter->get_index(choice);
}
if (size_t(choice) < unit_choices.size()) {
_______________________________________________
Wesnoth-commits mailing list
[email protected]
https://mail.gna.org/listinfo/wesnoth-commits