Код: Выделить всё
// ID conflict. Expected behaviour.
static float value1;
static float value2;
ImGui::DragFloat("##drag-float", &value1); // .../##drag-float
ImGui::DragFloat("##drag-float", &value2); // .../##drag-float
Однако я ожидал, что следующий код будет вести себя так же. Но это не так.
Код: Выделить всё
// 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();
}
Причина, по которой мне не нужно такое поведение потому что я хочу создать свои собственные виджеты-оболочки, которые будут использовать 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.
Подробнее здесь: https://stackoverflow.com/questions/784 ... ld-widgets
Мобильная версия