spicetools/overlay/windows/keypad.cpp

95 lines
2.9 KiB
C++

#include <games/io.h>
#include "keypad.h"
#include "misc/eamuse.h"
#include "util/logging.h"
namespace overlay::windows {
Keypad::Keypad(SpiceOverlay *overlay, size_t unit) : Window(overlay), unit(unit) {
this->title = "Keypad P" + to_string(unit + 1);
this->flags = ImGuiWindowFlags_NoResize
| ImGuiWindowFlags_NoCollapse
| ImGuiWindowFlags_AlwaysAutoResize;
switch (this->unit) {
case 0: {
this->toggle_button = games::OverlayButtons::ToggleVirtualKeypadP1;
this->init_pos = ImVec2(
26,
ImGui::GetIO().DisplaySize.y - 264);
break;
}
case 1: {
this->toggle_button = games::OverlayButtons::ToggleVirtualKeypadP2;
this->init_pos = ImVec2(
ImGui::GetIO().DisplaySize.x - 220,
ImGui::GetIO().DisplaySize.y - 264);
break;
}
}
}
Keypad::~Keypad() {
// reset overrides
eamuse_set_keypad_overrides_overlay(this->unit, 0);
}
void Keypad::build_content() {
// buttons
static const struct {
const char *text;
int flag;
} BUTTONS[] = {
{ "7", 1 << EAM_IO_KEYPAD_7 },
{ "8", 1 << EAM_IO_KEYPAD_8 },
{ "9", 1 << EAM_IO_KEYPAD_9 },
{ "4", 1 << EAM_IO_KEYPAD_4 },
{ "5", 1 << EAM_IO_KEYPAD_5 },
{ "6", 1 << EAM_IO_KEYPAD_6 },
{ "1", 1 << EAM_IO_KEYPAD_1 },
{ "2", 1 << EAM_IO_KEYPAD_2 },
{ "3", 1 << EAM_IO_KEYPAD_3 },
{ "0", 1 << EAM_IO_KEYPAD_0 },
{ "00", 1 << EAM_IO_KEYPAD_00 },
{ ".", 1 << EAM_IO_KEYPAD_DECIMAL },
{ "Insert Card", 1 << EAM_IO_INSERT },
};
// reset overrides
eamuse_set_keypad_overrides_overlay(this->unit, 0);
// build grid
for (size_t i = 0; i < std::size(BUTTONS); i++) {
auto &button = BUTTONS[i];
// push id and alignment
ImGui::PushID(4096 + i);
ImGui::PushStyleVar(ImGuiStyleVar_SelectableTextAlign, ImVec2(0.5f, 0.5f));
// add selectable (fill last line)
if (i == std::size(BUTTONS) - 1) {
ImGui::Selectable(button.text, false, 0, ImVec2(112, 32));
} else {
ImGui::Selectable(button.text, false, 0, ImVec2(32, 32));
}
// mouse down handler
if (ImGui::IsItemActive()) {
eamuse_set_keypad_overrides_overlay(this->unit, button.flag);
}
// pop id and alignment
ImGui::PopStyleVar();
ImGui::PopID();
// line join
if ((i % 3) < 2) {
ImGui::SameLine();
}
}
}
}