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

Reply via email to