Я создаю пользовательский интерфейс просто для обучения, используя дорогой imgui. Я сделал простой регистратор команд, где я могу зарегистрировать команды с помощью Lambda обратного вызова. У меня есть простое окно, которое показывает список всех доступных команд и их сочетание клавиатуры. Он также показывает кнопку, которая при нажатии должна выполнить команду, хотя она не: < /p>
Это в моей основной функции: < /p>
Commander commander;
// Command states
bool show_commander = false;
bool show_equity = false;
static bool prev_show_equity = false;
bool show_portfolio = false;
static bool prev_show_portfolio = false;
// Register commands
commander.registerCommand("CMD", "Toggle Commander UI.", { ImGuiKey_F1 }, [&show_commander]() {
show_commander = !show_commander;
});
// main while loop...
while (1)
{
...
if (show_commander)
commander.draw();
// Track previous states to detect when views are first opened
if (show_equity && !prev_show_equity)
show_commander = false; // Set to false only when equity view is first opened
prev_show_equity = show_equity;
if (show_equity)
{
ImGui::Begin("Equity", &show_equity);
ImGui::Text("Equity");
ImGui::End();
}
if (show_portfolio && !prev_show_portfolio)
show_commander = false; // Set to false only when portfolio view is first opened
prev_show_portfolio = show_portfolio;
if (show_portfolio)
{
ImGui::Begin("Portfolio", &show_portfolio);
ImGui::Text("Portfolio");
ImGui::End();
}
...
}
< /code>
Как вы можете видеть, где я регистрирую единую команду CMD, у меня есть функция лямбды, которая переключает чертеж пользовательского интерфейса.void Commander::draw()
{
...
ImGui::Begin("Commander", nullptr, windowFlags);
// Search bar
static char search[128] = "";
ImGui::SetNextItemWidth(-FLT_MIN);
ImGui::SetKeyboardFocusHere();
ImGui::InputTextWithHint("##SEARCH_COMMAND", "", search, sizeof(search));
ImVec2 childSize = ImVec2(-FLT_MIN, tableHeight); // Child size to fit 5 rows
ImGui::BeginChild("CommandsTableChild", childSize, true);
if (ImGui::BeginTable("CommandsTable", 3, ImGuiTableFlags_BordersInnerV | ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_RowBg)) {
for (const auto& command : commands) {
// Filter commands based on search input
if (std::string(command.name).find(search) != std::string::npos) {
ImGui::TableNextRow();
// First column: Button to execute the command
ImGui::TableSetColumnIndex(0);
// The button is the one that is rendered here
// bug but idk why: the button renders but never
// returns true and thus the callback is never called
if (ImGui::Button(command.name.c_str())) {
printf("test");
command.callback();
}
// Second column: Shortcut keys
ImGui::TableSetColumnIndex(1);
if (!command.shortcut.empty()) {
std::string shortcutStr;
for (size_t i = 0; i < command.shortcut.size(); ++i) {
shortcutStr += ImGui::GetKeyName(command.shortcut[i]);
if (i < command.shortcut.size() - 1) {
shortcutStr += "+";
}
}
ImGui::Text("%s", shortcutStr.c_str());
} else {
ImGui::Text("--");
}
// Third column: Command hint
ImGui::TableSetColumnIndex(2);
ImGui::Text("%s", command.description.c_str());
if (ImGui::IsItemHovered()) {
ImGui::SetTooltip("%s", command.description.c_str());
}
}
}
ImGui::EndTable();
}
ImGui::EndChild();
ImGui::End();
}
Я создаю пользовательский интерфейс просто для обучения, используя дорогой imgui. Я сделал простой регистратор команд, где я могу зарегистрировать команды с помощью Lambda обратного вызова. У меня есть простое окно, которое показывает список всех доступных команд и их сочетание клавиатуры. Он также показывает кнопку, которая при нажатии должна выполнить команду, хотя она не: < /p> Это в моей основной функции: < /p> [code]Commander commander; // Command states bool show_commander = false; bool show_equity = false; static bool prev_show_equity = false; bool show_portfolio = false; static bool prev_show_portfolio = false; // Register commands commander.registerCommand("CMD", "Toggle Commander UI.", { ImGuiKey_F1 }, [&show_commander]() { show_commander = !show_commander; });
// main while loop... while (1) { ... if (show_commander) commander.draw(); // Track previous states to detect when views are first opened
if (show_equity && !prev_show_equity) show_commander = false; // Set to false only when equity view is first opened prev_show_equity = show_equity; if (show_equity) { ImGui::Begin("Equity", &show_equity); ImGui::Text("Equity"); ImGui::End(); }
if (show_portfolio && !prev_show_portfolio) show_commander = false; // Set to false only when portfolio view is first opened prev_show_portfolio = show_portfolio; if (show_portfolio) { ImGui::Begin("Portfolio", &show_portfolio); ImGui::Text("Portfolio"); ImGui::End(); } ... }
< /code> Как вы можете видеть, где я регистрирую единую команду CMD, у меня есть функция лямбды, которая переключает чертеж пользовательского интерфейса.void Commander::draw() { ...
ImVec2 childSize = ImVec2(-FLT_MIN, tableHeight); // Child size to fit 5 rows ImGui::BeginChild("CommandsTableChild", childSize, true); if (ImGui::BeginTable("CommandsTable", 3, ImGuiTableFlags_BordersInnerV | ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_RowBg)) { for (const auto& command : commands) { // Filter commands based on search input if (std::string(command.name).find(search) != std::string::npos) { ImGui::TableNextRow(); // First column: Button to execute the command ImGui::TableSetColumnIndex(0);
// The button is the one that is rendered here
// bug but idk why: the button renders but never // returns true and thus the callback is never called if (ImGui::Button(command.name.c_str())) { printf("test"); command.callback(); }
// Second column: Shortcut keys ImGui::TableSetColumnIndex(1); if (!command.shortcut.empty()) { std::string shortcutStr; for (size_t i = 0; i < command.shortcut.size(); ++i) { shortcutStr += ImGui::GetKeyName(command.shortcut[i]); if (i < command.shortcut.size() - 1) { shortcutStr += "+"; } } ImGui::Text("%s", shortcutStr.c_str()); } else { ImGui::Text("--"); } // Third column: Command hint ImGui::TableSetColumnIndex(2); ImGui::Text("%s", command.description.c_str()); if (ImGui::IsItemHovered()) { ImGui::SetTooltip("%s", command.description.c_str()); } } } ImGui::EndTable(); } ImGui::EndChild(); ImGui::End(); } [/code] На самом деле нажатие клавиш работает нормально