ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   Общие вопросы программирования (https://forum.antichat.xyz/forumdisplay.php?f=206)
-   -   sf | imgui (https://forum.antichat.xyz/showthread.php?t=1405041)

Andrinall 18.10.2021 10:26

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

Есть такой код

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

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

status
!=
Config
::
all_icons_state
)
{
Config
::
map_win_icons
[
i
]
->
status
=
Config
::
all_icons_state
;
}
}
}
for
(
int
i
=
0
;
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.pngAndrinall · 18 Окт 2021 в 09:26' data-fancybox="lb-post-865384" data-lb-caption-extra-html="" data-lb-sidebar-href="" data-single-image="1" data-src="https://www.blast.hk/attachments/118275/" style="cursor: pointer;" title="1634537310849.png">
https://forum.antichat.xyz/attachments/27865384/

Цитата:

Сообщение от Спойлер


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





kin4stat 18.10.2021 10:39

У тебя не union должен быть, а struct

Andrinall 18.10.2021 11:08

Заменил 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 18.10.2021 11:21

Цитата:

Сообщение от Andrinall

Заменил 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 18.10.2021 11:28

Цитата:

Сообщение от salofan

Тебе там не нужен двумерный массив объектов структур

Типо просто сделать его одномерным, суть останется той же?

legendabrn 18.10.2021 12:01

Цитата:

Сообщение от Andrinall

Типо просто сделать его одномерным, суть останется той же?

да

GDB online Debugger | Code, Compile, Run, Debug online C, C++

Online GDB is online ide with compiler and debugger for C/C++. Code, Compiler, Run, Debug Share code nippets.

onlinegdb.com

Dark_Knight 20.10.2021 21:00

Да и вообще уходи в контейнера. Они имеют динамический размер. Вместо чаров юзай std::string или std::string_view


Время: 05:52