7#include "imgui/imgui.h"
15 if (ImGui::IsKeyPressed(ImGuiKey_Space)) {
16 ImGui::OpenPopup(
"WhichKey");
19 ImGui::SetNextWindowPos(ImVec2(0, ImGui::GetIO().DisplaySize.y - 100),
21 ImGui::SetNextWindowSize(ImVec2(ImGui::GetIO().DisplaySize.x, 100),
23 if (ImGui::BeginPopup(
"WhichKey")) {
25 if (ImGui::IsKeyPressed(ImGuiKey_Escape)) {
26 ImGui::CloseCurrentPopup();
29 const ImVec4 colors[] = {
30 ImVec4(0.8f, 0.2f, 0.2f, 1.0f),
31 ImVec4(0.2f, 0.8f, 0.2f, 1.0f),
32 ImVec4(0.2f, 0.2f, 0.8f, 1.0f),
33 ImVec4(0.8f, 0.8f, 0.2f, 1.0f),
34 ImVec4(0.8f, 0.2f, 0.8f, 1.0f),
35 ImVec4(0.2f, 0.8f, 0.8f, 1.0f)
37 const int numColors =
sizeof(colors) /
sizeof(colors[0]);
40 if (ImGui::BeginTable(
"CommandsTable",
commands_.size(),
41 ImGuiTableFlags_SizingStretchProp)) {
42 for (
const auto& [shortcut, group] :
commands_) {
43 ImGui::TableNextColumn();
44 ImGui::TextColored(colors[colorIndex],
"%c: %s",
45 group.main_command.mnemonic,
46 group.main_command.name.c_str());
47 colorIndex = (colorIndex + 1) % numColors;
56 std::ofstream out(filepath);
58 for (
const auto& [shortcut, group] :
commands_) {
59 out << shortcut <<
" " << group.main_command.mnemonic <<
" "
60 << group.main_command.name <<
" " << group.main_command.desc <<
"\n";
67 std::ifstream in(filepath);
70 std::string shortcut,
name, desc;
72 while (in >> shortcut >> mnemonic >> name >> desc) {
73 commands_[shortcut].main_command = {
nullptr, mnemonic,
name, desc};
85 ImGui::OpenPopup(
"WhichKeyHierarchical");
89 if (ImGui::IsKeyPressed(ImGuiKey_Escape)) {
94 ImGui::CloseCurrentPopup();
99 ImGui::SetNextWindowPos(ImVec2(0, ImGui::GetIO().DisplaySize.y - 150),
101 ImGui::SetNextWindowSize(ImVec2(ImGui::GetIO().DisplaySize.x, 150),
104 if (ImGui::BeginPopup(
"WhichKeyHierarchical")) {
112 ImGui::CloseCurrentPopup();
128 const ImVec4 colors[] = {
129 ImVec4(0.8f, 0.2f, 0.2f, 1.0f),
130 ImVec4(0.2f, 0.8f, 0.2f, 1.0f),
131 ImVec4(0.2f, 0.2f, 0.8f, 1.0f),
132 ImVec4(0.8f, 0.8f, 0.2f, 1.0f),
133 ImVec4(0.8f, 0.2f, 0.8f, 1.0f),
134 ImVec4(0.2f, 0.8f, 0.8f, 1.0f)
140 if (ImGui::BeginTable(
"RootCommands", 6,
141 ImGuiTableFlags_SizingStretchProp)) {
143 for (
const auto& [shortcut, group] :
commands_) {
144 ImGui::TableNextColumn();
145 ImGui::TextColored(colors[colorIndex % 6],
"%c: %s",
146 group.main_command.mnemonic,
147 group.main_command.name.c_str());
156 const auto& group = it->second;
157 if (!group.subcommands.empty()) {
158 if (ImGui::BeginTable(
"Subcommands",
159 std::min(6, (
int)group.subcommands.size()),
160 ImGuiTableFlags_SizingStretchProp)) {
162 for (
const auto& [key, cmd] : group.subcommands) {
163 ImGui::TableNextColumn();
164 ImGui::TextColored(colors[colorIndex % 6],
"%c: %s", cmd.mnemonic,
171 ImGui::TextDisabled(
"No subcommands available");
189 for (
const auto& [shortcut, group] :
commands_) {
191 if (key != ImGuiKey_COUNT && ImGui::IsKeyPressed(key)) {
201 for (
const auto& [subkey, cmd] : it->second.subcommands) {
202 if (cmd.mnemonic == group.main_command.mnemonic) {
208 ImGui::CloseCurrentPopup();
void LoadKeybindings(const std::string &filepath)
std::string current_prefix_
void HandleWhichKeyInput()
void ShowWhichKeyHierarchical()
std::unordered_map< std::string, CommandGroup > commands_
void SaveKeybindings(const std::string &filepath)
ImGuiKey MapKeyToImGuiKey(char key)