From 2b7699f3ef14ac3b6ad26767569231063069a608 Mon Sep 17 00:00:00 2001 From: Vlad Drozdov Date: Mon, 7 Jan 2019 08:26:46 +0800 Subject: [PATCH] Campaign selection filter : search by separate words and filter focuse by default --- src/gettext_boost.cpp | 2 +- src/gui/dialogs/campaign_selection.cpp | 37 ++++++++++++++++++++------ src/gui/dialogs/campaign_selection.hpp | 2 +- 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/src/gettext_boost.cpp b/src/gettext_boost.cpp index e6a35af745c9..bd4a60f2713f 100644 --- a/src/gettext_boost.cpp +++ b/src/gettext_boost.cpp @@ -536,7 +536,7 @@ bool ci_search(const std::string& s1, const std::string& s2) std::string ls2 = bl::to_lower(s2, locale); return std::search(ls1.begin(), ls1.end(), - ls2.begin(), ls2.end()) != ls1.end(); + ls2.begin(), ls2.end()) != ls1.end(); } } diff --git a/src/gui/dialogs/campaign_selection.cpp b/src/gui/dialogs/campaign_selection.cpp index 68665fc3b860..d4fe4d8c7135 100644 --- a/src/gui/dialogs/campaign_selection.cpp +++ b/src/gui/dialogs/campaign_selection.cpp @@ -151,18 +151,36 @@ void campaign_selection::sort_campaigns(window& window, campaign_selection::CAMP // Remember which campaign was selected... std::string was_selected; - if (!tree.empty()) { + if(!tree.empty()) { was_selected = tree.selected_item()->id(); tree.clear(); } + 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; + } + } + bool exists_in_filtered_result = false; - for(const auto& level : levels) { - if (translation::ci_search(level->name(), last_search_text_)) { - add_campaign_to_tree(window, level->data()); + 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 = level->id() == was_selected; + exists_in_filtered_result = levels[i]->id() == was_selected; } } } @@ -211,11 +229,13 @@ void campaign_selection::toggle_sorting_selection(window& window, CAMPAIGN_ORDER void campaign_selection::filter_text_changed(text_box_base* textbox, const std::string& text) { - if (text == last_search_text_) { + const std::vector words = utils::split(text, ' '); + + if(words == last_search_words_) { return; } - last_search_text_ = text; + last_search_words_ = words; window& window = *textbox->get_window(); sort_campaigns(window, current_sorting_, currently_sorted_asc_); } @@ -240,7 +260,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(&window, "campaign_details", false); diff --git a/src/gui/dialogs/campaign_selection.hpp b/src/gui/dialogs/campaign_selection.hpp index 50dd1e773bbc..d5f7ade59e52 100644 --- a/src/gui/dialogs/campaign_selection.hpp +++ b/src/gui/dialogs/campaign_selection.hpp @@ -93,7 +93,7 @@ class campaign_selection : public modal_dialog bool currently_sorted_asc_; - std::string last_search_text_; + std::vector last_search_words_; }; } // namespace dialogs