|
|
|
@ -10,6 +10,7 @@
|
|
|
|
|
#include "df/viewscreen_tradegoodsst.h"
|
|
|
|
|
#include "df/viewscreen_unitlistst.h"
|
|
|
|
|
#include "df/interface_key.h"
|
|
|
|
|
#include "df/interfacest.h"
|
|
|
|
|
|
|
|
|
|
using std::set;
|
|
|
|
|
using std::vector;
|
|
|
|
@ -19,6 +20,7 @@ using namespace DFHack;
|
|
|
|
|
using namespace df::enums;
|
|
|
|
|
|
|
|
|
|
using df::global::gps;
|
|
|
|
|
using df::global::gview;
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
Search Plugin
|
|
|
|
@ -39,6 +41,14 @@ void OutputString(int8_t color, int &x, int y, const std::string &text)
|
|
|
|
|
x += text.length();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static bool is_live_screen(const df::viewscreen *screen)
|
|
|
|
|
{
|
|
|
|
|
for (df::viewscreen *cur = &gview->view; cur; cur = cur->child)
|
|
|
|
|
if (cur == screen)
|
|
|
|
|
return true;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// START: Base Search functionality
|
|
|
|
|
//
|
|
|
|
@ -60,6 +70,15 @@ public:
|
|
|
|
|
track_secondary_values = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool reset_on_change()
|
|
|
|
|
{
|
|
|
|
|
if (valid && is_live_screen(viewscreen))
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
reset_all();
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// A new keystroke is received in a searchable screen
|
|
|
|
|
virtual bool process_input(set<df::interface_key> *input)
|
|
|
|
|
{
|
|
|
|
@ -206,12 +225,12 @@ protected:
|
|
|
|
|
bool list_has_been_sorted = (sort_list1->size() == reference_list.size()
|
|
|
|
|
&& *sort_list1 != reference_list);
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < saved_indexes.size(); i++)
|
|
|
|
|
for (size_t i = 0; i < saved_indexes.size(); i++)
|
|
|
|
|
{
|
|
|
|
|
int adjusted_item_index = i;
|
|
|
|
|
if (list_has_been_sorted)
|
|
|
|
|
{
|
|
|
|
|
for (int j = 0; j < sort_list1->size(); j++)
|
|
|
|
|
for (size_t j = 0; j < sort_list1->size(); j++)
|
|
|
|
|
{
|
|
|
|
|
if ((*sort_list1)[j] == reference_list[i])
|
|
|
|
|
{
|
|
|
|
@ -245,6 +264,9 @@ protected:
|
|
|
|
|
update_secondary_values();
|
|
|
|
|
*sort_list2 = saved_list2;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
saved_list1.clear();
|
|
|
|
|
saved_list2.clear();
|
|
|
|
|
}
|
|
|
|
|
store_reference_values();
|
|
|
|
|
search_string = "";
|
|
|
|
@ -278,7 +300,7 @@ protected:
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
string search_string_l = toLower(search_string);
|
|
|
|
|
for (int i = 0; i < saved_list1.size(); i++ )
|
|
|
|
|
for (size_t i = 0; i < saved_list1.size(); i++ )
|
|
|
|
|
{
|
|
|
|
|
T element = saved_list1[i];
|
|
|
|
|
string desc = toLower(get_element_description(element));
|
|
|
|
@ -307,8 +329,9 @@ protected:
|
|
|
|
|
// Display hotkey message
|
|
|
|
|
void print_search_option(int x, int y = -1) const
|
|
|
|
|
{
|
|
|
|
|
auto dim = Screen::getWindowSize();
|
|
|
|
|
if (y == -1)
|
|
|
|
|
y = gps->dimy - 2;
|
|
|
|
|
y = dim.y - 2;
|
|
|
|
|
|
|
|
|
|
OutputString((entry_mode) ? 4 : 12, x, y, string(1, select_key));
|
|
|
|
|
OutputString((entry_mode) ? 10 : 15, x, y, ": Search");
|
|
|
|
@ -346,7 +369,12 @@ struct search_hook : T
|
|
|
|
|
|
|
|
|
|
DEFINE_VMETHOD_INTERPOSE(void, feed, (set<df::interface_key> *input))
|
|
|
|
|
{
|
|
|
|
|
module.init(this);
|
|
|
|
|
if (!module.init(this))
|
|
|
|
|
{
|
|
|
|
|
INTERPOSE_NEXT(feed)(input);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!module.process_input(input))
|
|
|
|
|
{
|
|
|
|
|
INTERPOSE_NEXT(feed)(input);
|
|
|
|
@ -357,9 +385,10 @@ struct search_hook : T
|
|
|
|
|
|
|
|
|
|
DEFINE_VMETHOD_INTERPOSE(void, render, ())
|
|
|
|
|
{
|
|
|
|
|
module.init(this);
|
|
|
|
|
bool ok = module.init(this);
|
|
|
|
|
INTERPOSE_NEXT(render)();
|
|
|
|
|
module.render();
|
|
|
|
|
if (ok)
|
|
|
|
|
module.render();
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
@ -382,11 +411,12 @@ public:
|
|
|
|
|
virtual void render() const
|
|
|
|
|
{
|
|
|
|
|
if (!viewscreen->in_group_mode)
|
|
|
|
|
print_search_option(1);
|
|
|
|
|
print_search_option(2);
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
int x = 1;
|
|
|
|
|
OutputString(15, x, gps->dimy - 2, "Tab to enable Search");
|
|
|
|
|
auto dim = Screen::getWindowSize();
|
|
|
|
|
int x = 2, y = dim.y - 2;
|
|
|
|
|
OutputString(15, x, y, "Tab to enable Search");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -402,13 +432,18 @@ public:
|
|
|
|
|
search_parent::do_post_update_check();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
virtual void init(df::viewscreen_storesst *screen)
|
|
|
|
|
bool init(df::viewscreen_storesst *screen)
|
|
|
|
|
{
|
|
|
|
|
if (screen != viewscreen && !reset_on_change())
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
if (!valid)
|
|
|
|
|
{
|
|
|
|
|
viewscreen = screen;
|
|
|
|
|
search_parent::init(&screen->item_cursor, &screen->items);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -440,8 +475,8 @@ private:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
typedef search_hook<df::viewscreen_storesst, stocks_search> stocks_search_hook;
|
|
|
|
|
IMPLEMENT_VMETHOD_INTERPOSE(stocks_search_hook, feed);
|
|
|
|
|
IMPLEMENT_VMETHOD_INTERPOSE(stocks_search_hook, render);
|
|
|
|
|
template<> IMPLEMENT_VMETHOD_INTERPOSE(stocks_search_hook, feed);
|
|
|
|
|
template<> IMPLEMENT_VMETHOD_INTERPOSE(stocks_search_hook, render);
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// END: Stocks screen search
|
|
|
|
@ -461,28 +496,33 @@ public:
|
|
|
|
|
print_search_option(28);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
virtual void init(df::viewscreen_unitlistst *screen)
|
|
|
|
|
bool init(df::viewscreen_unitlistst *screen)
|
|
|
|
|
{
|
|
|
|
|
if (screen != viewscreen && !reset_on_change())
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
if (!valid)
|
|
|
|
|
{
|
|
|
|
|
viewscreen = screen;
|
|
|
|
|
search_parent::init(&screen->cursor_pos[viewscreen->page], &screen->units[viewscreen->page], &screen->jobs[viewscreen->page]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
virtual string get_element_description(df::unit *element) const
|
|
|
|
|
{
|
|
|
|
|
string desc = Translation::TranslateName(Units::getVisibleName(element), false);
|
|
|
|
|
if (viewscreen->page == 1)
|
|
|
|
|
desc += Units::getProfessionName(element); // Check animal type too
|
|
|
|
|
desc += ", " + Units::getProfessionName(element); // Check animal type too
|
|
|
|
|
|
|
|
|
|
return desc;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
virtual bool should_check_input(set<df::interface_key> *input)
|
|
|
|
|
{
|
|
|
|
|
if (input->count(interface_key::CURSOR_LEFT) || input->count(interface_key::CURSOR_RIGHT) || input->count(interface_key::CUSTOM_L))
|
|
|
|
|
if (input->count(interface_key::CURSOR_LEFT) || input->count(interface_key::CURSOR_RIGHT) ||
|
|
|
|
|
(!is_entry_mode() && input->count(interface_key::UNITVIEW_PRF_PROF)))
|
|
|
|
|
{
|
|
|
|
|
if (!is_entry_mode())
|
|
|
|
|
{
|
|
|
|
@ -502,8 +542,8 @@ private:
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
typedef search_hook<df::viewscreen_unitlistst, unitlist_search> unitlist_search_hook;
|
|
|
|
|
IMPLEMENT_VMETHOD_INTERPOSE_PRIO(unitlist_search_hook, feed, 100);
|
|
|
|
|
IMPLEMENT_VMETHOD_INTERPOSE_PRIO(unitlist_search_hook, render, 100);
|
|
|
|
|
template<> IMPLEMENT_VMETHOD_INTERPOSE_PRIO(unitlist_search_hook, feed, 100);
|
|
|
|
|
template<> IMPLEMENT_VMETHOD_INTERPOSE_PRIO(unitlist_search_hook, render, 100);
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// END: Unit screen search
|
|
|
|
@ -529,6 +569,29 @@ private:
|
|
|
|
|
{
|
|
|
|
|
return Items::getDescription(element, 0, true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
virtual bool should_check_input(set<df::interface_key> *input)
|
|
|
|
|
{
|
|
|
|
|
if (is_entry_mode())
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
if (input->count(interface_key::TRADE_TRADE) ||
|
|
|
|
|
input->count(interface_key::TRADE_OFFER) ||
|
|
|
|
|
input->count(interface_key::TRADE_SEIZE))
|
|
|
|
|
{
|
|
|
|
|
// Block the keys if were searching
|
|
|
|
|
if (!search_string.empty())
|
|
|
|
|
input->clear();
|
|
|
|
|
|
|
|
|
|
// Trying to trade, reset search
|
|
|
|
|
clear_search();
|
|
|
|
|
reset_all();
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -540,20 +603,25 @@ public:
|
|
|
|
|
print_search_option(2, 26);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
virtual void init(df::viewscreen_tradegoodsst *screen)
|
|
|
|
|
bool init(df::viewscreen_tradegoodsst *screen)
|
|
|
|
|
{
|
|
|
|
|
if (screen != viewscreen && !reset_on_change())
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
if (!valid)
|
|
|
|
|
{
|
|
|
|
|
viewscreen = screen;
|
|
|
|
|
search_parent::init(&screen->trader_cursor, &screen->trader_items, &screen->trader_selected, 'q');
|
|
|
|
|
track_secondary_values = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
typedef search_hook<df::viewscreen_tradegoodsst, trade_search_merc, int> trade_search_merc_hook;
|
|
|
|
|
IMPLEMENT_VMETHOD_INTERPOSE(trade_search_merc_hook, feed);
|
|
|
|
|
IMPLEMENT_VMETHOD_INTERPOSE(trade_search_merc_hook, render);
|
|
|
|
|
template<> IMPLEMENT_VMETHOD_INTERPOSE(trade_search_merc_hook, feed);
|
|
|
|
|
template<> IMPLEMENT_VMETHOD_INTERPOSE(trade_search_merc_hook, render);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class trade_search_fort : public trade_search_base
|
|
|
|
@ -564,20 +632,25 @@ public:
|
|
|
|
|
print_search_option(42, 26);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
virtual void init(df::viewscreen_tradegoodsst *screen)
|
|
|
|
|
bool init(df::viewscreen_tradegoodsst *screen)
|
|
|
|
|
{
|
|
|
|
|
if (screen != viewscreen && !reset_on_change())
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
if (!valid)
|
|
|
|
|
{
|
|
|
|
|
viewscreen = screen;
|
|
|
|
|
search_parent::init(&screen->broker_cursor, &screen->broker_items, &screen->broker_selected, 'w');
|
|
|
|
|
track_secondary_values = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
typedef search_hook<df::viewscreen_tradegoodsst, trade_search_fort, char> trade_search_fort_hook;
|
|
|
|
|
IMPLEMENT_VMETHOD_INTERPOSE(trade_search_fort_hook, feed);
|
|
|
|
|
IMPLEMENT_VMETHOD_INTERPOSE(trade_search_fort_hook, render);
|
|
|
|
|
template<> IMPLEMENT_VMETHOD_INTERPOSE(trade_search_fort_hook, feed);
|
|
|
|
|
template<> IMPLEMENT_VMETHOD_INTERPOSE(trade_search_fort_hook, render);
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// END: Trade screen search
|
|
|
|
@ -589,10 +662,15 @@ DFHACK_PLUGIN("search");
|
|
|
|
|
|
|
|
|
|
DFhackCExport command_result plugin_init ( color_ostream &out, vector <PluginCommand> &commands)
|
|
|
|
|
{
|
|
|
|
|
if (!gps || !INTERPOSE_HOOK(unitlist_search_hook, feed).apply() || !INTERPOSE_HOOK(unitlist_search_hook, render).apply()
|
|
|
|
|
|| !INTERPOSE_HOOK(trade_search_merc_hook, feed).apply() || !INTERPOSE_HOOK(trade_search_merc_hook, render).apply()
|
|
|
|
|
|| !INTERPOSE_HOOK(trade_search_fort_hook, feed).apply() || !INTERPOSE_HOOK(trade_search_fort_hook, render).apply()
|
|
|
|
|
|| !INTERPOSE_HOOK(stocks_search_hook, feed).apply() || !INTERPOSE_HOOK(stocks_search_hook, render).apply())
|
|
|
|
|
if (!gps || !gview ||
|
|
|
|
|
!INTERPOSE_HOOK(unitlist_search_hook, feed).apply() ||
|
|
|
|
|
!INTERPOSE_HOOK(unitlist_search_hook, render).apply() ||
|
|
|
|
|
!INTERPOSE_HOOK(trade_search_merc_hook, feed).apply() ||
|
|
|
|
|
!INTERPOSE_HOOK(trade_search_merc_hook, render).apply() ||
|
|
|
|
|
!INTERPOSE_HOOK(trade_search_fort_hook, feed).apply() ||
|
|
|
|
|
!INTERPOSE_HOOK(trade_search_fort_hook, render).apply() ||
|
|
|
|
|
!INTERPOSE_HOOK(stocks_search_hook, feed).apply() ||
|
|
|
|
|
!INTERPOSE_HOOK(stocks_search_hook, render).apply())
|
|
|
|
|
out.printerr("Could not insert Search hooks!\n");
|
|
|
|
|
|
|
|
|
|
return CR_OK;
|
|
|
|
@ -613,9 +691,17 @@ DFhackCExport command_result plugin_shutdown ( color_ostream &out )
|
|
|
|
|
|
|
|
|
|
DFhackCExport command_result plugin_onstatechange ( color_ostream &out, state_change_event event )
|
|
|
|
|
{
|
|
|
|
|
unitlist_search_hook::module.reset_all();
|
|
|
|
|
trade_search_merc_hook::module.reset_all();
|
|
|
|
|
trade_search_fort_hook::module.reset_all();
|
|
|
|
|
stocks_search_hook::module.reset_all();
|
|
|
|
|
switch (event) {
|
|
|
|
|
case SC_VIEWSCREEN_CHANGED:
|
|
|
|
|
unitlist_search_hook::module.reset_on_change();
|
|
|
|
|
trade_search_merc_hook::module.reset_on_change();
|
|
|
|
|
trade_search_fort_hook::module.reset_on_change();
|
|
|
|
|
stocks_search_hook::module.reset_on_change();
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return CR_OK;
|
|
|
|
|
}
|