 |

18.10.2021, 10:26
|
|
Постоянный
Регистрация: 11.07.2019
Сообщений: 702
С нами:
3601315
Репутация:
148
|
|
Сразу напишу, что я в с++ пока хлебушек полный, так что палками не бейте сильно)
Есть такой код
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">
Сообщение от Спойлер
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
|
|
|

18.10.2021, 10:39
|
|
Флудер
Регистрация: 06.11.2017
Сообщений: 2,759
С нами:
4483143
Репутация:
183
|
|
У тебя не union должен быть, а struct
|
|
|

18.10.2021, 11:08
|
|
Постоянный
Регистрация: 11.07.2019
Сообщений: 702
С нами:
3601315
Репутация:
148
|
|
Заменил 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(грубо говоря) - написать имя категории
теперь всё работает как мне было нужно
|
|
|

18.10.2021, 11:21
|
|
Постоянный
Регистрация: 19.06.2018
Сообщений: 961
С нами:
4158550
Репутация:
163
|
|
Сообщение от 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(грубо говоря) - написать имя категории
теперь всё работает как мне было нужно
Тебе там не нужен двумерный массив объектов структуры
|
|
|

18.10.2021, 11:28
|
|
Постоянный
Регистрация: 11.07.2019
Сообщений: 702
С нами:
3601315
Репутация:
148
|
|
Сообщение от salofan
Тебе там не нужен двумерный массив объектов структур
Типо просто сделать его одномерным, суть останется той же?
|
|
|

18.10.2021, 12:01
|
|
Участник форума
Регистрация: 08.03.2019
Сообщений: 121
С нами:
3781678
Репутация:
113
|
|
|
|
|

20.10.2021, 21:00
|
|
Флудер
Регистрация: 18.03.2013
Сообщений: 4,080
С нами:
6921957
Репутация:
183
|
|
Да и вообще уходи в контейнера. Они имеют динамический размер. Вместо чаров юзай std::string или std::string_view
|
|
|
|
 |
Предыдущая тема
Следующая тема
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|