mirror of
https://github.com/DrBeef/Raze.git
synced 2024-12-15 15:11:01 +00:00
2997bb6292
Obviously the existing menu implementation from Duke Nukem needs to be tossed out at some point, but at least the functionality is there again.
92 lines
No EOL
2.4 KiB
C++
92 lines
No EOL
2.4 KiB
C++
|
|
|
|
|
|
#include "imgui.h"
|
|
#include "v_draw.h"
|
|
#include "gamecvars.h"
|
|
#include "c_buttons.h"
|
|
#include "c_bind.h"
|
|
#include "inputstate.h"
|
|
|
|
FString activeCommand;
|
|
|
|
void sendKeyForBinding(int key)
|
|
{
|
|
Bindings.DoBind(KeyName(key), activeCommand);
|
|
GUICapture &= ~8;
|
|
}
|
|
|
|
|
|
bool ShowOptionMenu()
|
|
{
|
|
bool isOpen = true;
|
|
int w = screen->GetWidth(), h = screen->GetHeight();
|
|
double scale;
|
|
if (w >= 1024 && h >= 768)
|
|
{
|
|
scale = 1;
|
|
ImGui::SetNextWindowPos(ImVec2((w-1024)/2, (h-768)/2), ImGuiCond_Always);
|
|
ImGui::SetNextWindowSize(ImVec2(1024, 768), ImGuiCond_Always);
|
|
}
|
|
else
|
|
{
|
|
// This should use a smaller font!
|
|
scale = 640.0/1024.0;
|
|
ImGui::SetNextWindowPos(ImVec2((w-640)/2, (h-480)/2), ImGuiCond_Always);
|
|
ImGui::SetNextWindowSize(ImVec2(640, 480), ImGuiCond_Always);
|
|
}
|
|
|
|
|
|
const int window_flags = ImGuiWindowFlags_MenuBar | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize;
|
|
// Main body of the Demo window starts here.
|
|
if (!ImGui::Begin("Customize Controls", &isOpen, window_flags))
|
|
{
|
|
// Early out if the window is collapsed, as an optimization.
|
|
ImGui::End();
|
|
return false;
|
|
}
|
|
|
|
for (int i = 0; i < NUMGAMEFUNCTIONS; i++)
|
|
{
|
|
FString al = buttonMap.GetButtonAlias(i);
|
|
FString cmd = "+" + al;
|
|
if (al.IsNotEmpty())
|
|
{
|
|
al.Substitute('_', ' ');
|
|
ImGui::Text(al.GetChars());
|
|
ImGui::SameLine(300*scale);
|
|
al = buttonMap.GetButtonName(i);
|
|
auto binds = Bindings.GetKeysForCommand(cmd);
|
|
al = C_NameKeys(binds.Data(), binds.Size());
|
|
if (ImGui::Button(al, ImVec2(450 * scale, 0)))
|
|
{
|
|
activeCommand = cmd;
|
|
ImGui::OpenPopup("Bind");
|
|
}
|
|
}
|
|
}
|
|
if (ImGui::BeginPopupModal("Bind", NULL, ImGuiWindowFlags_AlwaysAutoResize))
|
|
{
|
|
auto binds = Bindings.GetKeysForCommand(activeCommand);
|
|
auto al = C_NameKeys(binds.Data(), binds.Size());
|
|
|
|
ImGui::Text("Press 'bind' to enter binding mode or\n'delete' to clear all bindings for this action\n\nCurrently bound to this action:\n%s\n\n", al.GetChars());
|
|
ImGui::Separator();
|
|
if (ImGui::Button("Done", ImVec2(120, 0))) { ImGui::CloseCurrentPopup(); }
|
|
ImGui::SetItemDefaultFocus();
|
|
ImGui::SameLine();
|
|
if (ImGui::Button("Clear", ImVec2(120, 0))) { Bindings.UnbindACommand(activeCommand); }
|
|
ImGui::SameLine();
|
|
if (ImGui::Button("Bind", ImVec2(120, 0)))
|
|
{
|
|
// Todo: Set event handler to binding mode.
|
|
// Wait for a bound key to arrive and add to the current command.
|
|
GUICapture |= 8;
|
|
}
|
|
ImGui::EndPopup();
|
|
}
|
|
|
|
|
|
ImGui::End();
|
|
return isOpen;
|
|
} |