Track state of gui hooks

Also fix a bug in drawborder() and expand color-dfhack-text to test
multiple hooks
develop
lethosor 2015-11-14 13:03:38 -05:00
parent fff9072b07
commit fcfffd1cb6
3 changed files with 72 additions and 29 deletions

@ -44,6 +44,7 @@ namespace DFHack {
class Callback {
T_func *func;
T_hook *hook;
bool enabled;
public:
Callback(T_hook *hook, T_func *func) : hook(hook), func(func)
{ }
@ -58,9 +59,12 @@ namespace DFHack {
hook->add(func);
else
hook->remove(func);
enabled = enable;
}
inline void enable() { apply(true); }
inline void disable() { apply(false); }
inline bool is_enabled() { return enabled; }
inline void toggle() { apply(!enabled); }
};
};
}

@ -220,7 +220,7 @@ bool Screen::drawBorder(const std::string &title)
for (int y = 0; y < dim.y; y++)
{
doSetTile(border, 0, y, false);
doSetTile(border, dim.x - 1, dim.y + y, false);
doSetTile(border, dim.x - 1, y, false);
}
paintString(signature, dim.x-8, dim.y-1, "DFHack");

@ -10,6 +10,7 @@ using namespace DFHack;
DFHACK_PLUGIN("color-dfhack-text");
DFHACK_PLUGIN_IS_ENABLED(is_enabled);
REQUIRE_GLOBAL(gps);
struct {
bool flicker;
@ -29,21 +30,49 @@ void color_text_tile(const Screen::Pen &pen, int x, int y, bool map)
return color_text_hook.next()(pen2, x, y, map);
}
void aaaaa_set_tile(const Screen::Pen &pen, int x, int y, bool map);
GUI_HOOK_CALLBACK(Screen::Hooks::set_tile, aaaaa_set_tile_hook, aaaaa_set_tile);
void aaaaa_set_tile(const Screen::Pen &pen, int x, int y, bool map)
{
Screen::Pen pen2 = pen;
if ((pen.ch >= 'A' && pen.ch <= 'Z') || (pen.ch >= '0' && pen.ch <= '9'))
pen2.ch = 'A';
else if (pen.ch >= 'a' && pen.ch <= 'z')
pen2.ch = 'a';
aaaaa_set_tile_hook.next()(pen2, x, y, map);
}
void shift_set_tile(const Screen::Pen &pen, int x, int y, bool map);
GUI_HOOK_CALLBACK(Screen::Hooks::set_tile, shift_set_tile_hook, shift_set_tile);
void shift_set_tile(const Screen::Pen &pen, int x, int y, bool map)
{
x = (x + 1) % gps->dimx;
shift_set_tile_hook.next()(pen, x, y, map);
}
DFhackCExport command_result plugin_enable (color_ostream &out, bool enable)
{
color_text_hook.apply(enable);
if (!enable)
{
shift_set_tile_hook.disable();
aaaaa_set_tile_hook.disable();
}
is_enabled = enable;
return CR_OK;
}
command_result color(color_ostream &out, std::vector<std::string> &params)
{
plugin_enable(out, true);
std::string p0 = toLower(params[0]);
#define CHECK_COLOR(color_name) else if (p0 == toLower(std::string(#color_name))) \
{ config.flicker = false; config.color = COLOR_##color_name % 8; }
if (params.empty())
return CR_OK;
return plugin_enable(out, true);
for (auto it = params.begin(); it != params.end(); ++it)
{
std::string p = toLower(*it);
if (!p.size())
continue;
#define CHECK_COLOR(color_name) else if (p == toLower(std::string(#color_name))) \
{ config.flicker = false; config.color = COLOR_##color_name % 8; plugin_enable(out, true); }
CHECK_COLOR(RED)
CHECK_COLOR(GREEN)
CHECK_COLOR(BLUE)
@ -55,19 +84,29 @@ command_result color(color_ostream &out, std::vector<std::string> &params)
CHECK_COLOR(GREY)
CHECK_COLOR(BLACK)
#undef CHECK_COLOR
else if (p0 == "flicker")
else if (p == "flicker")
{
config.flicker = true;
plugin_enable(out, true);
}
else if (p0 == "disable")
else if (p.size() >= 3 && p.substr(0, 3) == "aaa")
{
aaaaa_set_tile_hook.toggle();
}
else if (p == "shift")
{
shift_set_tile_hook.toggle();
}
else if (p == "disable")
{
plugin_enable(out, false);
}
else if (p0 != "enable")
else if (p != "enable")
{
out.printerr("Unrecognized option: %s\n", p0.c_str());
out.printerr("Unrecognized option: %s\n", p.c_str());
return CR_WRONG_USAGE;
}
}
return CR_OK;
}
@ -75,7 +114,7 @@ DFhackCExport command_result plugin_init (color_ostream &out, std::vector <Plugi
{
commands.push_back(PluginCommand(
"color-dfhack-text",
"color <color>|flicker|enable|disable",
"color <color>|flicker|enable|disable|shift|aaaaa",
color,
false
));