- 702
- 518
Сразу напишу, что я в с++ пока хлебушек полный, так что палками не бейте сильно)
Есть такой код
В общем проблему обрисую просто скрином.
Слева реализация на c++, справа на lua.
В c++ версии кнопка(показать все/скрыть все) специально заменена на значение bool переменной, я тогда исправлял 1 косяк и не вернул как было)
Вот мне нужно сделать как на lua, чтобы чекбоксы отображались по категориям и с нормальным текстом.
А ещё мне нужно, чтобы чекбоксы тыкались независимо от других, а то сейчас они(чекбоксы) только в определённом порядке нажимаются сейчас(сверху вниз и никак иначе),
но в lua версии их можно тыкать в любом порядке.
Версия ImGui 1.71, если вдруг такой вопрос возникнет.
Есть такой код
C++:
/* Где-то там в config.h , namespace Config {}; */
bool button_menu_opened = false;
bool all_icons_state = false;
float cSize[2] = { 405.0f, 522.0f }; // если button_menu_opened -> размер окна по X будет равен cSize[0] * 1.75f
union map_wico {
bool status;
int index; // отвечает не за номер ячейки, а за тип иконки на карте.
char ru_name[66];
char cat_name[35]; // название категории
};
map_wico map_win_icons[18][4] = { // пробовал проставлять u8 около "", но толку от этого нет
{ false, 1, "Бургерные", "Питание" },
{ false, 2, "Фастфуды Cluckin' ( KFC )" },
{ false, 3, "Пиццерии" },
{ false, 4, "Столовые" },
{ false, 5, "Бары/Кабаре" },
{ false, 6, "Гаражи / Базы транспортных компаний", "Гаражи и базы" },
{ false, 7, "Оптовые базы" },
{ false, 8, "Места аренды прицепов" },
{ false, 9, "Автосалоны", "Транспорт" },
{ false, 10, "Автозаправки" },
{ false, 11, "Автомастерские" },
{ false, 12, "Магазины автозапчастей" },
{ false, 13, "Банки", "Государственные" },
{ false, 14, "Места трудоустройства" },
{ false, 15, "Полицейские участки" },
{ false, 16, "Отели", "Отдых и безделушки" },
{ false, 17, "Магазины 24/7" },
{ false, 18, "Магазины одежды" }
};
//
/* present в main.cpp */
// выше есть ещё код, но он нормально работает по нему у меня вопросов нет.
if (Config::button_menu_opened) { // bool
ImGui::SetCursorPos(ImVec2(Config::cSize[0], 0.0f));
ImGui::VerticalSeparator();
ImGui::SetCursorPos(ImVec2(Config::cSize[0] + 3.0f, Config::cSize[0] / 100.0f * 6.0f));
ImGui::BeginChild("##icons_select", ImVec2((Config::cSize[0] * 1.5f - Config::cSize[0] / 1.5f), 492.0f), false, ImGuiWindowFlags_NoScrollbar);
int res = 0;
for (int i = 0; i < 18; i++) { if (Config::map_win_icons[i]->status) { res += 1; } }
if (res >= 9) { Config::all_icons_state = true; }
else { Config::all_icons_state = false; }
ImGui::SetCursorPosX(ImGui::GetCursorPos().x + ImGui::GetStyle().ItemSpacing.x / 2.0f);
if (ImGui::Button((Config::all_icons_state ? "true" : "false"), ImVec2((Config::cSize[0] * 1.5f - Config::cSize[0] / 1.5f) - 48.5f, 0.0f))) {
Config::all_icons_state = !Config::all_icons_state;
for (int i = 0; i < 18; i++) {
if (Config::map_win_icons[i]->status != Config::all_icons_state) {
Config::map_win_icons[i]->status = Config::all_icons_state;
}
}
}
for (int i = 0; i < 18; i++) { // цикл, в котором перебирается массив и как бы должны отображаться чекбоксы.
if (Config::map_win_icons[i]->cat_name) { // if name of category ~= nil then display that
ImGui::Separator();
ImGui::SetCursorPosX((Config::cSize[0] * 1.5f - Config::cSize[0] / 1.3f) / 2 - ImGui::CalcTextSize(Config::map_win_icons[i]->cat_name).x / 2);
ImGui::Text(Config::map_win_icons[i]->ru_name);
ImGui::Separator();
}
ImGui::SetCursorPosX(ImGui::GetCursorPos().x + ImGui::GetStyle().ItemSpacing.x / 2);
ImGui::Checkbox(Config::map_win_icons[i]->ru_name, &Config::map_win_icons[i]->status);
}
ImGui::Spacing();
ImGui::EndChild();
}
//
В общем проблему обрисую просто скрином.
Слева реализация на c++, справа на lua.
В c++ версии кнопка(показать все/скрыть все) специально заменена на значение bool переменной, я тогда исправлял 1 косяк и не вернул как было)
Вот мне нужно сделать как на lua, чтобы чекбоксы отображались по категориям и с нормальным текстом.
А ещё мне нужно, чтобы чекбоксы тыкались независимо от других, а то сейчас они(чекбоксы) только в определённом порядке нажимаются сейчас(сверху вниз и никак иначе),
но в lua версии их можно тыкать в любом порядке.
Версия ImGui 1.71, если вдруг такой вопрос возникнет.
Lua:
if button_menu_opened[0] then
imgui.SetCursorPos( imgui.ImVec2( cSize.x, 0) )
imgui.VerticalSeparator()
imgui.SetCursorPos( imgui.ImVec2( cSize.x+3, cSize.x/100*6 ) )
imgui.BeginChild("##icons_select", imgui.ImVec2((cSize.x*1.5-cSize.x/1.5), 492 ), false, imgui.WindowFlags.NoScrollbar)
local res = 0
for i = 1, #map_win_icons do
if map_win_icons[i][1][0] then res = res + 1 end
end
if res >= #map_win_icons/2 then
all_icons_state[0] = true
else
all_icons_state[0] = false
end
imgui.SetCursorPosX( imgui.GetCursorPos().x + imgui.GetStyle().ItemSpacing.x/2 )
if imgui.Button( (all_icons_state[0] and u8"Скрыть все" or u8"Показать все"), imgui.ImVec2((cSize.x*1.5-cSize.x/1.5)-48.5, 0) ) then
all_icons_state[0] = not all_icons_state[0]
for i = 1, #map_win_icons do
if map_win_icons[i][1][0] ~= all_icons_state[0] then
map_win_icons[i][1][0] = all_icons_state[0]
end
end
end
for i = 1, #map_win_icons do
if map_win_icons[i][4] ~= nil then
imgui.Separator()
imgui.SetCursorPosX( (cSize.x*1.5-cSize.x/1.3)/2 - imgui.CalcTextSize( u8(map_win_icons[i][4]) ).x/2 )
imgui.Text( u8( map_win_icons[i][4] ) )
imgui.Separator()
end
imgui.SetCursorPosX( imgui.GetCursorPos().x + imgui.GetStyle().ItemSpacing.x/2 )
imgui.Checkbox( u8(map_win_icons[i][3]), map_win_icons[i][1] )
end
imgui.Spacing()
imgui.EndChild()
end
Последнее редактирование: