Почему Dear ImGui Tables вставляет дополнительный идентификатор в путь идентификатора дочерних виджетов?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему Dear ImGui Tables вставляет дополнительный идентификатор в путь идентификатора дочерних виджетов?

Сообщение Anonymous »

Код: Выделить всё

// ID conflict. Expected behaviour.
static float value1;
static float value2;

ImGui::DragFloat("##drag-float", &value1);  // .../##drag-float
ImGui::DragFloat("##drag-float", &value2);  // .../##drag-float
Если один из DragFloat будет изменен, другой DragFloat будет обновлен, что и ожидается, поскольку они оба имеют один и тот же идентификатор во время выполнения (в комментарии)
Однако я ожидал, что следующий код будет вести себя так же. Но это не так.

Код: Выделить всё

// No ID conflict. Unexpected behaviour.
static float table_value1;
static float table_value2;

if (ImGui::BeginTable("table", 1)) {
ImGui::TableNextRow();
ImGui::TableSetColumnIndex(0);
ImGui::DragFloat("##drag-float", &table_value1); // .../table/##drag-float
ImGui::EndTable();
}
if (ImGui::BeginTable("table", 1)) {
ImGui::TableNextRow();
ImGui::TableSetColumnIndex(0);
ImGui::DragFloat("##drag-float", &table_value2);  // .../table/0x8CD5DC7A [override]/##drag-float
ImGui::EndTable();
}
Во втором случае ImGui добавляет 0x8CD5DC7A [переопределить] между идентификатором таблицы и идентификатором DragFloat.
Причина, по которой мне не нужно такое поведение потому что я хочу создать свои собственные виджеты-оболочки, которые будут использовать API таблиц ImGui, и я также хочу поддерживать поведение «метки» как виджеты ImGui (т. е., если в метке есть «##», тогда отображаемая метка будет подстрока перед этим, а id - это все. Если в метке есть "###", то отображаемая метка - это подстрока до нее, а id - это подстрока после нее).
Итак, , когда я создаю свои собственные виджеты следующим образом:

Код: Выделить всё

void WrapperWidget(const std::string& label, float& value) {
std::pair label_id_pair = extractLabelAndId(label);

ImGui::PushID(label_id_pair.second.c_str());

ImGui::Text(label_id_pair.first.c_str());
ImGui::SameLine();

if (ImGui::BeginTable("table", 1)) {
ImGui::TableNextRow();
ImGui::TableSetColumnIndex(0);
ImGui::DragFloat("##drag-float", &value);  // .../table/0x8CD5DC7A [override]/##drag-float
ImGui::EndTable();
}

ImGui::PopID();
}

static float value1;
static float value2;
WrapperWidget("WrapDrag1###ID", value1);
WrapperWidget("WrapDrag2###ID", value2);  // Supposed to have the same id as the previous one.
Я хочу, чтобы они конфликтовали друг с другом, когда имеют один и тот же идентификатор — точно так же, как собственные виджеты ImGui. Как мне добиться такого поведения?

Подробнее здесь: https://stackoverflow.com/questions/784 ... ld-widgets
Ответить

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

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

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

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

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