Кнопка imgui рендерирует, но никогда не возвращает истинноC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Кнопка imgui рендерирует, но никогда не возвращает истинно

Сообщение Anonymous »

Я создаю пользовательский интерфейс просто для обучения, используя дорогой 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();
}
На самом деле нажатие клавиш работает нормально


Подробнее здесь: https://stackoverflow.com/questions/795 ... turns-true
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»