49 int peeropts_menu_active_user_uid = -1;
50 if (m_peeropts_menu_active_user_vectorpos != -1)
52 peeropts_menu_active_user_uid = (int)m_users[m_peeropts_menu_active_user_vectorpos].uniqueid;
54 m_peeropts_menu_active_user_vectorpos = -1;
61 m_users_peeropts.insert(m_users_peeropts.begin(),
BitMask_t(0));
64 for (
int i = 0; i < (int)m_users.size(); i++)
66 if ((
int)m_users[i].uniqueid == peeropts_menu_active_user_uid)
68 m_peeropts_menu_active_user_vectorpos = i;
87 ImGuiWindowFlags flags = ImGuiWindowFlags_NoCollapse |
88 ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoScrollbar;
89 const float content_width = 225.f;
90 ImGui::SetNextWindowContentWidth(content_width);
91 ImGui::SetNextWindowPos(ImVec2(
92 ImGui::GetIO().DisplaySize.x - (content_width + (2*ImGui::GetStyle().WindowPadding.x) + theme.
screen_edge_padding.x),
95 int y = 20 + (ImGui::GetTextLineHeightWithSpacing() * m_users.size());
102 ImGui::SetNextWindowSize(ImVec2((content_width + (2*ImGui::GetStyle().WindowPadding.x)),
y));
104 ImGui::Begin(
"Peers",
nullptr, flags);
110 ImGui::PushID(user.uniqueid);
111 const ImVec2 hover_tl = ImGui::GetCursorScreenPos();
114 if (user.uniqueid == local_user.
uniqueid)
116 ImGui::Dummy(ImVec2(ImGui::CalcTextSize(
" < ").
x + ImGui::GetStyle().FramePadding.x*2 , ImGui::GetTextLineHeight()));
118 else if (ImGui::SmallButton(
" < "))
120 if (m_peeropts_menu_active_user_vectorpos == vectorpos)
122 m_peeropts_menu_active_user_vectorpos = -1;
126 m_peeropts_menu_active_user_vectorpos = vectorpos;
127 m_peeropts_menu_corner_tl = hover_tl - ImVec2(PEEROPTS_MENU_CONTENT_WIDTH + ImGui::GetStyle().WindowPadding.x*3 + PEEROPTS_MENU_MARGIN, 0);
133 Ogre::TexturePtr flag_tex;
134 Ogre::TexturePtr auth_tex;
135 Ogre::TexturePtr down_tex;
136 Ogre::TexturePtr up_tex;
139 if (user.uniqueid != local_user.
uniqueid &&
144 case 0: down_tex = m_icon_arrow_down_red;
break;
145 case 1: down_tex = m_icon_arrow_down;
break;
146 case 2: down_tex = m_icon_arrow_down_grey;
break;
153 case 0: up_tex = m_icon_arrow_up_red;
break;
154 case 1: up_tex = m_icon_arrow_up;
break;
155 case 2: up_tex = m_icon_arrow_up_grey;
break;
160 this->DrawIcon(down_tex, ImVec2(8.f, ImGui::GetTextLineHeight()));
161 this->DrawIcon(up_tex, ImVec2(8.f, ImGui::GetTextLineHeight()));
165 else if (user.authstatus &
RoRnet::AUTH_MOD ) { auth_tex = m_icon_flag_blue; }
168 this->DrawIcon(auth_tex, ImVec2(14.f, ImGui::GetTextLineHeight()));
171 StringVector parts = StringUtil::split(user.language,
"_");
172 if (parts.size() == 2)
174 StringUtil::toLowerCase(parts[1]);
175 flag_tex =
FetchIcon((parts[1] +
".png").c_str());
176 this->DrawIcon(flag_tex, ImVec2(16.f, ImGui::GetTextLineHeight()));
180 ImGui::SetCursorPosX(ImGui::GetCursorPosX() + ImGui::GetStyle().ItemSpacing.x);
182 ImGui::TextColored(ImVec4(col.r, col.g, col.b, col.a),
"%s", user.username);
183 const ImVec2 hover_br = hover_tl + ImVec2(content_width, ImGui::GetTextLineHeight());
184 const float HOVER_TL_SHIFTX = 20.f;
186 = hover_br.x > ImGui::GetIO().MousePos.x
187 && hover_br.y > ImGui::GetIO().MousePos.y
188 && ImGui::GetIO().MousePos.x > (hover_tl.x + HOVER_TL_SHIFTX)
189 && ImGui::GetIO().MousePos.y > hover_tl.y;
194 ImGui::BeginTooltip();
198 ImGui::TextDisabled(
"%s: ",
_LC(
"MultiplayerClientList",
"user name"));
200 ImGui::TextColored(ImVec4(col.r, col.g, col.b, col.a),
"%s", user.username);
203 ImGui::TextDisabled(
"%s: ",
_LC(
"MultiplayerClientList",
"user uid"));
205 ImGui::Text(
"%d", user.uniqueid);
207 ImGui::TextDisabled(
"%s",
_LC(
"MultiplayerClientList",
"user language: "));
209 ImGui::Text(
"%s", parts[0].c_str());
211 ImGui::TextDisabled(
"%s",
_LC(
"MultiplayerClientList",
"user country: "));
213 ImGui::Text(
"%s", parts[1].c_str());
217 ImGui::Image(
reinterpret_cast<ImTextureID
>(flag_tex->getHandle()),
218 ImVec2(flag_tex->getWidth(), flag_tex->getHeight()));
222 ImGui::TextDisabled(
"%s",
_LC(
"MultiplayerClientList",
"user authentication level"));
225 ImGui::Image(
reinterpret_cast<ImTextureID
>(auth_tex->getHandle()),
226 ImVec2(auth_tex->getWidth(), auth_tex->getHeight()));
230 ImGui::Text(
"%s",
App::GetNetwork()->UserAuthToStringLong(user).c_str());
233 if (user.uniqueid != local_user.
uniqueid &&
237 ImGui::TextDisabled(
"%s",
_LC(
"MultiplayerClientList",
"truck loading state"));
240 ImGui::Image(
reinterpret_cast<ImTextureID
>(down_tex->getHandle()),
241 ImVec2(down_tex->getWidth(), down_tex->getHeight()));
246 case 0: ImGui::Text(
"%s",
_LC(
"MultiplayerClientList",
"Truck loading errors"));
break;
247 case 1: ImGui::Text(
"%s",
_LC(
"MultiplayerClientList",
"Truck loaded correctly, no errors"));
break;
248 case 2: ImGui::Text(
"%s",
_LC(
"MultiplayerClientList",
"no truck loaded"));
break;
252 ImGui::TextDisabled(
"%s",
_LC(
"MultiplayerClientList",
"remote truck loading state"));
255 ImGui::Image(
reinterpret_cast<ImTextureID
>(up_tex->getHandle()),
256 ImVec2(up_tex->getWidth(), up_tex->getHeight()));
261 case 0: ImGui::Text(
"%s",
_LC(
"MultiplayerClientList",
"Remote Truck loading errors"));
break;
262 case 1: ImGui::Text(
"%s",
_LC(
"MultiplayerClientList",
"Remote Truck loaded correctly, no errors"));
break;
263 case 2: ImGui::Text(
"%s",
_LC(
"MultiplayerClientList",
"No Trucks loaded"));
break;
277 ImGui::Image(
reinterpret_cast<ImTextureID
>(m_icon_warn_triangle->getHandle()),
278 ImVec2(m_icon_warn_triangle->getWidth(), m_icon_warn_triangle->getHeight()));
280 ImGui::TextColored(
App::GetGuiManager()->GetTheme().error_text_color,
"%s",
_LC(
"MultiplayerClientList",
"Slow Network Download"));
284 ImGui::PopStyleColor(1);
286 this->DrawPeerOptionsMenu();
287 #endif // USE_SOCKETW
292 int uid = (int)m_users[m_peeropts_menu_active_user_vectorpos].uniqueid;
293 bool flagval = m_users_peeropts[m_peeropts_menu_active_user_vectorpos] & flag;
295 if (ImGui::Checkbox(label.c_str(), &flagval))
305 std::string chatmsg =
fmt::format(cmdfmt, m_users[m_peeropts_menu_active_user_vectorpos].uniqueid);
306 if (ImGui::Button(label.c_str()))
314 if (m_peeropts_menu_active_user_vectorpos == -1)
318 const bool vectorpos_sane = (m_peeropts_menu_active_user_vectorpos >= 0
319 && m_peeropts_menu_active_user_vectorpos < (int)m_users_peeropts.size());
325 ImGui::SetNextWindowPos(m_peeropts_menu_corner_tl);
326 ImGui::SetNextWindowContentWidth(PEEROPTS_MENU_CONTENT_WIDTH);
327 const int flags = ImGuiWindowFlags_NoDecoration;
328 if (ImGui::Begin(
"PeerOptions",
nullptr, flags))
330 ImGui::TextDisabled(
"%s",
_LC(
"MultiplayerClientList",
"Local actions"));
335 ImGui::TextDisabled(
"%s",
_LC(
"MultiplayerClientList",
"Server commands"));
336 this->DrawServerCommandBtn(
"!report {} Please enter reason: ",
_LC(
"MultiplayerClientList",
"Report"));
337 const int32_t authstatus = m_users[0].authstatus;
340 this->DrawServerCommandBtn(
"!kick {}",
_LC(
"MultiplayerClientList",
"Kick"));
341 this->DrawServerCommandBtn(
"!ban {}",
_LC(
"MultiplayerClientList",
"Ban"));
343 m_peeropts_menu_corner_br = m_peeropts_menu_corner_tl + ImGui::GetWindowContentRegionMax();
349 const ImVec2 hoverbox_tl = m_peeropts_menu_corner_tl - ImVec2(PEEROPTS_HOVER_MARGIN, PEEROPTS_HOVER_MARGIN);
350 const ImVec2 hoverbox_br = m_peeropts_menu_corner_br + ImVec2(PEEROPTS_HOVER_MARGIN, PEEROPTS_HOVER_MARGIN);
351 const ImVec2 mousepos = ImGui::GetIO().MousePos;
352 if (mousepos.x < hoverbox_tl.x || mousepos.x > hoverbox_br.x
353 || mousepos.y < hoverbox_tl.y || mousepos.y > hoverbox_br.y)
355 m_peeropts_menu_active_user_vectorpos = -1;
361 ImVec2 orig_pos = ImGui::GetCursorPos();
367 ImGui::Image(
reinterpret_cast<ImTextureID
>(tex->getHandle()), ImVec2(16, 16));
369 ImGui::SetCursorPosX(orig_pos.x + reference_box.x + ImGui::GetStyle().ItemSpacing.x);
370 ImGui::SetCursorPosY(orig_pos.y);
375 m_icon_arrow_down =
FetchIcon(
"arrow_down.png");
376 m_icon_arrow_down_grey =
FetchIcon(
"arrow_down_grey.png");
377 m_icon_arrow_down_red =
FetchIcon(
"arrow_down_red.png");
378 m_icon_arrow_up =
FetchIcon(
"arrow_up.png");
379 m_icon_arrow_up_grey =
FetchIcon(
"arrow_up_grey.png");
380 m_icon_arrow_up_red =
FetchIcon(
"arrow_up_red.png");
381 m_icon_flag_red =
FetchIcon(
"flag_red.png");
382 m_icon_flag_blue =
FetchIcon(
"flag_blue.png");
383 m_icon_flag_green =
FetchIcon(
"flag_green.png");
384 m_icon_warn_triangle =
FetchIcon(
"error.png");
386 m_icons_cached =
true;