Revert "Campaign filtering begone!"

This reverts commit c7f2d7a22b.
This commit is contained in:
Charles Dang 2019-11-04 18:13:51 +11:00
parent a01f8ba01c
commit ab79fc672d
3 changed files with 70 additions and 4 deletions

View file

@ -195,6 +195,23 @@
[grid]
[row]
grow_factor = 0
[column]
grow_factor = 1
border = "all"
border_size = 5
horizontal_grow = true
[text_box]
id = "filter_box"
definition = "default"
{FILTER_TEXT_BOX_HINT}
[/text_box]
[/column]
[/row]
[row]
grow_factor = 1

View file

@ -24,6 +24,7 @@
#include "gui/widgets/multimenu_button.hpp"
#include "gui/widgets/scroll_label.hpp"
#include "gui/widgets/settings.hpp"
#include "gui/widgets/text_box.hpp"
#include "gui/widgets/toggle_button.hpp"
#include "gui/widgets/tree_view.hpp"
#include "gui/widgets/tree_view_node.hpp"
@ -155,11 +156,36 @@ void campaign_selection::sort_campaigns(window& window, campaign_selection::CAMP
tree.clear();
}
for(const auto& campaign : levels) {
add_campaign_to_tree(window, campaign->data());
boost::dynamic_bitset<> show_items;
show_items.resize(levels.size(), true);
if(!last_search_words_.empty()) {
for(unsigned i = 0; i < levels.size(); ++i) {
bool found = false;
for(const auto& word : last_search_words_) {
found = translation::ci_search(levels[i]->name(), word);
if(!found) {
break;
}
}
show_items[i] = found;
}
}
if(!was_selected.empty()) {
bool exists_in_filtered_result = false;
for(unsigned i = 0; i < levels.size(); ++i) {
if(show_items[i]) {
add_campaign_to_tree(window, levels[i]->data());
if (!exists_in_filtered_result) {
exists_in_filtered_result = levels[i]->id() == was_selected;
}
}
}
if(!was_selected.empty() && exists_in_filtered_result) {
find_widget<tree_view_node>(&window, was_selected, false).select_node();
} else {
campaign_selected(window);
@ -201,8 +227,25 @@ void campaign_selection::toggle_sorting_selection(window& window, CAMPAIGN_ORDER
sort_campaigns(window, current_sorting_, currently_sorted_asc_);
}
void campaign_selection::filter_text_changed(text_box_base* textbox, const std::string& text)
{
const std::vector<std::string> words = utils::split(text, ' ');
if(words == last_search_words_) {
return;
}
last_search_words_ = words;
window& window = *textbox->get_window();
sort_campaigns(window, current_sorting_, currently_sorted_asc_);
}
void campaign_selection::pre_show(window& window)
{
text_box* filter = find_widget<text_box>(&window, "filter_box", false, true);
filter->set_text_changed_callback(
std::bind(&campaign_selection::filter_text_changed, this, _1, _2));
/***** Setup campaign tree. *****/
tree_view& tree = find_widget<tree_view>(&window, "campaign_tree", false);
@ -218,7 +261,8 @@ void campaign_selection::pre_show(window& window)
connect_signal_notify_modified(sort_time,
std::bind(&campaign_selection::toggle_sorting_selection, this, std::ref(window), DATE));
window.keyboard_capture(&tree);
window.keyboard_capture(filter);
window.add_to_keyboard_chain(&tree);
/***** Setup campaign details. *****/
multi_page& pages = find_widget<multi_page>(&window, "campaign_details", false);

View file

@ -15,6 +15,7 @@
#pragma once
#include "gui/dialogs/modal_dialog.hpp"
#include "gui/widgets/text_box_base.hpp"
#include "game_initialization/create_engine.hpp"
@ -74,6 +75,8 @@ private:
void mod_toggled(window& window);
void filter_text_changed(text_box_base* textbox, const std::string &text);
ng::create_engine& engine_;
/** The chosen campaign. */
@ -89,6 +92,8 @@ private:
CAMPAIGN_ORDER current_sorting_;
bool currently_sorted_asc_;
std::vector<std::string> last_search_words_;
};
} // namespace dialogs