diff --git a/plugins/search.cpp b/plugins/search.cpp index 8d0805947..dbf3ade3f 100644 --- a/plugins/search.cpp +++ b/plugins/search.cpp @@ -91,7 +91,15 @@ public: return false; if (!can_init(screen)) + { + if (is_valid()) + { + clear_search(); + reset_all(); + } + return false; + } if (!is_valid()) { @@ -296,6 +304,11 @@ protected: return true; } + virtual bool force_in_search(size_t index) + { + return false; + } + // The actual sort virtual void do_search() { @@ -316,6 +329,12 @@ protected: string search_string_l = toLower(search_string); for (size_t i = 0; i < saved_list1.size(); i++ ) { + if (force_in_search(i)) + { + add_to_filtered_list(i); + continue; + } + if (!is_valid_for_search(i)) continue; @@ -383,15 +402,7 @@ protected: { auto list = getLayerList(screen); if (!list->active) - { - if (this->is_valid()) - { - this->clear_search(); - this->reset_all(); - } - return false; - } return true; } @@ -655,6 +666,10 @@ template V generic_search_hook ::module; template<> IMPLEMENT_VMETHOD_INTERPOSE(module##_hook, feed); \ template<> IMPLEMENT_VMETHOD_INTERPOSE(module##_hook, render) +#define IMPLEMENT_HOOKS_PRIO(screen, module, prio) \ + typedef generic_search_hook module##_hook; \ + template<> IMPLEMENT_VMETHOD_INTERPOSE_PRIO(module##_hook, feed, 100); \ + template<> IMPLEMENT_VMETHOD_INTERPOSE_PRIO(module##_hook, render, 100) // // END: Generic Search functionality @@ -799,7 +814,8 @@ IMPLEMENT_HOOKS(df::viewscreen_petst, pets_search); // // START: Stocks screen search // -class stocks_search : public search_generic +typedef search_generic stocks_search_base; +class stocks_search : public stocks_search_base { public: @@ -833,7 +849,7 @@ public: return false; } - return search_generic::process_input(input); + return stocks_search_base::process_input(input); } virtual void do_post_input_feed() @@ -883,7 +899,8 @@ IMPLEMENT_HOOKS(df::viewscreen_storesst, stocks_search); // // START: Unit screen search // -class unitlist_search : public search_twocolumn_modifiable +typedef search_twocolumn_modifiable unitlist_search_base; +class unitlist_search : public unitlist_search_base { public: void render() const @@ -894,7 +911,7 @@ public: private: void do_post_init() { - search_twocolumn_modifiable::do_post_init(); + unitlist_search_base::do_post_init(); read_only = true; } @@ -969,8 +986,8 @@ private: } }; -typedef generic_search_hook unitlist_search_hook; -template<> IMPLEMENT_VMETHOD_INTERPOSE_PRIO(unitlist_search_hook, feed, 100); +typedef generic_search_hook unitlist_search_hook; +template<> IMPLEMENT_VMETHOD_INTERPOSE_PRIO(unitlist_search_hook, feed, 100); template<> IMPLEMENT_VMETHOD_INTERPOSE_PRIO(unitlist_search_hook, render, 100); // // END: Unit screen search @@ -1143,7 +1160,8 @@ IMPLEMENT_HOOKS(df::viewscreen_layer_stockpilest, stockpile_search); // // START: Military screen search // -class military_search : public layered_search +typedef layered_search military_search_base; +class military_search : public military_search_base { public: @@ -1167,7 +1185,7 @@ public: if (screen->page != df::viewscreen_layer_militaryst::Positions) return false; - return layered_search::can_init(screen); + return military_search_base::can_init(screen); } vector *get_primary_list() @@ -1197,7 +1215,7 @@ public: } }; -IMPLEMENT_HOOKS(df::viewscreen_layer_militaryst, military_search); +IMPLEMENT_HOOKS_PRIO(df::viewscreen_layer_militaryst, military_search, 100); // // END: Military screen search @@ -1209,8 +1227,8 @@ IMPLEMENT_HOOKS(df::viewscreen_layer_militaryst, military_search); // static map< df::building_type, vector > room_quality_names; static int32_t room_value_bounds[] = {1, 100, 250, 500, 1000, 1500, 2500, 10000}; - -class roomlist_search : public search_twocolumn_modifiable +typedef search_twocolumn_modifiable roomlist_search_base; +class roomlist_search : public roomlist_search_base { public: void render() const @@ -1221,7 +1239,7 @@ public: private: void do_post_init() { - search_twocolumn_modifiable::do_post_init(); + roomlist_search_base::do_post_init(); read_only = true; } @@ -1292,7 +1310,7 @@ IMPLEMENT_HOOKS(df::viewscreen_buildinglistst, roomlist_search); // // START: Announcement list search // -class annoucnement_search : public search_generic +class annoucnement_search : public search_generic { public: void render() const @@ -1331,8 +1349,8 @@ IMPLEMENT_HOOKS(df::viewscreen_announcelistst, annoucnement_search); // START: Nobles search list // typedef df::viewscreen_layer_noblelistst::T_candidates T_candidates; - -class nobles_search : public layered_search +typedef layered_search nobles_search_base; +class nobles_search : public nobles_search_base { public: @@ -1349,12 +1367,17 @@ public: print_search_option(2, 23); } + bool force_in_search(size_t index) + { + return index == 0; // Leave Vacant + } + bool can_init(df::viewscreen_layer_noblelistst *screen) { if (screen->mode != df::viewscreen_layer_noblelistst::Appoint) return false; - return layered_search::can_init(screen); + return nobles_search_base::can_init(screen); } vector *get_primary_list() @@ -1419,7 +1442,8 @@ void get_job_details(string &desc, df::job *job) desc += "suspended."; } -class joblist_search : public search_twocolumn_modifiable +typedef search_twocolumn_modifiable joblist_search_base; +class joblist_search : public joblist_search_base { public: void render() const @@ -1430,7 +1454,7 @@ public: private: void do_post_init() { - search_twocolumn_modifiable::do_post_init(); + joblist_search_base::do_post_init(); read_only = true; } @@ -1479,19 +1503,15 @@ IMPLEMENT_HOOKS(df::viewscreen_joblistst, joblist_search); // using df::global::ui; -class burrow_search : public search_twocolumn_modifiable +typedef search_twocolumn_modifiable burrow_search_base; +class burrow_search : public burrow_search_base { public: bool can_init(df::viewscreen_dwarfmodest *screen) { if (ui->main.mode == df::ui_sidebar_mode::Burrows && ui->burrows.in_add_units_mode) { - return search_twocolumn_modifiable::can_init(screen); - } - else if (is_valid()) - { - clear_search(); - reset_all(); + return burrow_search_base::can_init(screen); } return false;