sf | imgui

Andrinall

Известный
Автор темы
701
517
Сразу напишу, что я в с++ пока хлебушек полный, так что палками не бейте сильно)




Есть такой код
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, если вдруг такой вопрос возникнет.
1634537310849.png

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
 
Последнее редактирование:

Andrinall

Известный
Автор темы
701
517
Заменил union на struct
заменил тип данных с char[*] (звёздочка = число которое там было)
на const char *var
C++:
struct map_wico {
    bool status;
    int  index;
    const char *ru_name;
    const char *cat_name;
};

изменил проверку на имя категории, вписал туда ...->cat_name != nullptr
if (Config::map_win_icons[i]->cat_name != nullptr) { // если cat_name != nil(грубо говоря) - написать имя категории

теперь всё работает как мне было нужно
 
Последнее редактирование:

Izvinisb

Известный
Проверенный
963
599
Заменил union на struct
заменил тип данных с char[*] (звёздочка = число которое там было)
на const char *var
C++:
struct map_wico {
    bool status;
    int  index;
    const char *ru_name;
    const char *cat_name;
};

изменил проверку на имя категории, вписал туда ...->cat_name != nullptr
if (Config::map_win_icons[i]->cat_name != nullptr) { // если cat_name != nil(грубо говоря) - написать имя категории

теперь всё работает как мне было нужно
Тебе там не нужен двумерный массив объектов структуры
 
Последнее редактирование:
  • Нравится
Реакции: Andrinall

legendabrn

Известный
Проверенный
120
170
  • Нравится
Реакции: Andrinall