add clickable overlay to title screen
parent
b7357204e6
commit
ad7de34d3f
@ -0,0 +1,80 @@
|
||||
#include "df/viewscreen_titlest.h"
|
||||
|
||||
#include "modules/Gui.h"
|
||||
|
||||
#include "PluginManager.h"
|
||||
#include "VTableInterpose.h"
|
||||
#include "uicommon.h"
|
||||
|
||||
using namespace DFHack;
|
||||
|
||||
DFHACK_PLUGIN("overlay");
|
||||
DFHACK_PLUGIN_IS_ENABLED(is_enabled);
|
||||
REQUIRE_GLOBAL(enabler);
|
||||
REQUIRE_GLOBAL(gps);
|
||||
|
||||
static const std::string button_text = "[ DFHack Launcher ]";
|
||||
static bool clicked = false;
|
||||
|
||||
static bool handle_click() {
|
||||
int32_t x, y;
|
||||
if (!enabler->tracking_on || !enabler->mouse_lbut || clicked ||
|
||||
!Gui::getMousePos(x, y))
|
||||
return false;
|
||||
if (y == gps->dimy - 1 && x >= 1 && (size_t)x <= button_text.size()) {
|
||||
clicked = true;
|
||||
Core::getInstance().setHotkeyCmd("gui/launcher");
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static void draw_widgets() {
|
||||
int x = 1;
|
||||
int y = gps->dimy - 1;
|
||||
OutputString(COLOR_GREEN, x, y, button_text);
|
||||
}
|
||||
|
||||
struct title_hook : df::viewscreen_titlest {
|
||||
typedef df::viewscreen_titlest interpose_base;
|
||||
|
||||
DEFINE_VMETHOD_INTERPOSE(void, feed, (set<df::interface_key> *input)) {
|
||||
if (!handle_click())
|
||||
INTERPOSE_NEXT(feed)(input);
|
||||
}
|
||||
DEFINE_VMETHOD_INTERPOSE(void, render, ()) {
|
||||
INTERPOSE_NEXT(render)();
|
||||
draw_widgets();
|
||||
}
|
||||
};
|
||||
IMPLEMENT_VMETHOD_INTERPOSE(title_hook, feed);
|
||||
IMPLEMENT_VMETHOD_INTERPOSE(title_hook, render);
|
||||
|
||||
DFhackCExport command_result plugin_onstatechange(color_ostream &,
|
||||
state_change_event evt) {
|
||||
if (evt == SC_VIEWSCREEN_CHANGED) {
|
||||
clicked = false;
|
||||
}
|
||||
return CR_OK;
|
||||
}
|
||||
|
||||
DFhackCExport command_result plugin_enable(color_ostream &, bool enable) {
|
||||
if (is_enabled == enable)
|
||||
return CR_OK;
|
||||
if (enable != is_enabled) {
|
||||
if (!INTERPOSE_HOOK(title_hook, feed).apply(enable) ||
|
||||
!INTERPOSE_HOOK(title_hook, render).apply(enable))
|
||||
return CR_FAILURE;
|
||||
|
||||
is_enabled = enable;
|
||||
}
|
||||
return CR_OK;
|
||||
}
|
||||
|
||||
DFhackCExport command_result plugin_init(color_ostream &out, std::vector <PluginCommand> &) {
|
||||
return plugin_enable(out, true);
|
||||
}
|
||||
|
||||
DFhackCExport command_result plugin_shutdown(color_ostream &out) {
|
||||
return plugin_enable(out, false);
|
||||
}
|
Loading…
Reference in New Issue