mirror of
https://github.com/ddnet/ddnet.git
synced 2024-11-10 01:58:19 +00:00
Fix memory leak of server browser entry UI elements
New UI elements were being created for every server info after refreshing the server list. At the same time, old UI elements were not being deleted when the server info objects are deleted. The use of `mutable` for this purpose was also rather unclean. Now, a separate `std::vector` of UI elements is kept for all server browser entries, instead of associating the UI elements directly with the server info.
This commit is contained in:
parent
8dfa0b2198
commit
816f1a5a01
|
@ -94,8 +94,6 @@ public:
|
||||||
CClient m_aClients[SERVERINFO_MAX_CLIENTS];
|
CClient m_aClients[SERVERINFO_MAX_CLIENTS];
|
||||||
int m_NumFilteredPlayers;
|
int m_NumFilteredPlayers;
|
||||||
|
|
||||||
mutable CUIElement *m_pUIElement;
|
|
||||||
|
|
||||||
static int EstimateLatency(int Loc1, int Loc2);
|
static int EstimateLatency(int Loc1, int Loc2);
|
||||||
static bool ParseLocation(int *pResult, const char *pString);
|
static bool ParseLocation(int *pResult, const char *pString);
|
||||||
void InfoToString(char *pBuffer, int BufferSize) const;
|
void InfoToString(char *pBuffer, int BufferSize) const;
|
||||||
|
|
|
@ -452,6 +452,7 @@ protected:
|
||||||
// found in menus_browser.cpp
|
// found in menus_browser.cpp
|
||||||
int m_SelectedIndex;
|
int m_SelectedIndex;
|
||||||
bool m_ServerBrowserShouldRevealSelection;
|
bool m_ServerBrowserShouldRevealSelection;
|
||||||
|
std::vector<CUIElement *> m_vpServerBrowserUiElements;
|
||||||
void RenderServerbrowserServerList(CUIRect View, bool &WasListboxItemActivated);
|
void RenderServerbrowserServerList(CUIRect View, bool &WasListboxItemActivated);
|
||||||
void RenderServerbrowserStatusBox(CUIRect StatusBox, bool WasListboxItemActivated);
|
void RenderServerbrowserStatusBox(CUIRect StatusBox, bool WasListboxItemActivated);
|
||||||
void Connect(const char *pAddress);
|
void Connect(const char *pAddress);
|
||||||
|
|
|
@ -230,14 +230,18 @@ void CMenus::RenderServerbrowserServerList(CUIRect View, bool &WasListboxItemAct
|
||||||
TextRender()->SetFontPreset(EFontPreset::DEFAULT_FONT);
|
TextRender()->SetFontPreset(EFontPreset::DEFAULT_FONT);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if(m_vpServerBrowserUiElements.size() < (size_t)NumServers)
|
||||||
|
m_vpServerBrowserUiElements.resize(NumServers, nullptr);
|
||||||
|
|
||||||
for(int i = 0; i < NumServers; i++)
|
for(int i = 0; i < NumServers; i++)
|
||||||
{
|
{
|
||||||
const CServerInfo *pItem = ServerBrowser()->SortedGet(i);
|
const CServerInfo *pItem = ServerBrowser()->SortedGet(i);
|
||||||
|
|
||||||
if(pItem->m_pUIElement == nullptr)
|
if(m_vpServerBrowserUiElements[i] == nullptr)
|
||||||
{
|
{
|
||||||
pItem->m_pUIElement = UI()->GetNewUIElement(NUM_UI_ELEMS);
|
m_vpServerBrowserUiElements[i] = UI()->GetNewUIElement(NUM_UI_ELEMS);
|
||||||
}
|
}
|
||||||
|
CUIElement *pUiElement = m_vpServerBrowserUiElements[i];
|
||||||
|
|
||||||
const CListboxItem ListItem = s_ListBox.DoNextItem(pItem, str_comp(pItem->m_aAddress, g_Config.m_UiServerAddress) == 0);
|
const CListboxItem ListItem = s_ListBox.DoNextItem(pItem, str_comp(pItem->m_aAddress, g_Config.m_UiServerAddress) == 0);
|
||||||
if(ListItem.m_Selected)
|
if(ListItem.m_Selected)
|
||||||
|
@ -281,22 +285,22 @@ void CMenus::RenderServerbrowserServerList(CUIRect View, bool &WasListboxItemAct
|
||||||
{
|
{
|
||||||
if(pItem->m_Flags & SERVER_FLAG_PASSWORD)
|
if(pItem->m_Flags & SERVER_FLAG_PASSWORD)
|
||||||
{
|
{
|
||||||
RenderBrowserIcons(*pItem->m_pUIElement->Rect(UI_ELEM_LOCK_ICON), &Button, ColorRGBA(0.75f, 0.75f, 0.75f, 1.0f), TextRender()->DefaultTextOutlineColor(), FONT_ICON_LOCK, TEXTALIGN_MC);
|
RenderBrowserIcons(*pUiElement->Rect(UI_ELEM_LOCK_ICON), &Button, ColorRGBA(0.75f, 0.75f, 0.75f, 1.0f), TextRender()->DefaultTextOutlineColor(), FONT_ICON_LOCK, TEXTALIGN_MC);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(ID == COL_FLAG_FAV)
|
else if(ID == COL_FLAG_FAV)
|
||||||
{
|
{
|
||||||
if(pItem->m_Favorite != TRISTATE::NONE)
|
if(pItem->m_Favorite != TRISTATE::NONE)
|
||||||
{
|
{
|
||||||
RenderBrowserIcons(*pItem->m_pUIElement->Rect(UI_ELEM_FAVORITE_ICON), &Button, ColorRGBA(0.94f, 0.4f, 0.4f, 1.0f), TextRender()->DefaultTextOutlineColor(), FONT_ICON_HEART, TEXTALIGN_MC);
|
RenderBrowserIcons(*pUiElement->Rect(UI_ELEM_FAVORITE_ICON), &Button, ColorRGBA(0.94f, 0.4f, 0.4f, 1.0f), TextRender()->DefaultTextOutlineColor(), FONT_ICON_HEART, TEXTALIGN_MC);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(ID == COL_FLAG_OFFICIAL)
|
else if(ID == COL_FLAG_OFFICIAL)
|
||||||
{
|
{
|
||||||
if(pItem->m_Official && g_Config.m_UiPage != PAGE_DDNET && g_Config.m_UiPage != PAGE_KOG)
|
if(pItem->m_Official && g_Config.m_UiPage != PAGE_DDNET && g_Config.m_UiPage != PAGE_KOG)
|
||||||
{
|
{
|
||||||
RenderBrowserIcons(*pItem->m_pUIElement->Rect(UI_ELEM_OFFICIAL_ICON_1), &Button, ColorRGBA(0.4f, 0.7f, 0.94f, 1.0f), ColorRGBA(0.0f, 0.0f, 0.0f, 1.0f), FONT_ICON_CERTIFICATE, TEXTALIGN_MC);
|
RenderBrowserIcons(*pUiElement->Rect(UI_ELEM_OFFICIAL_ICON_1), &Button, ColorRGBA(0.4f, 0.7f, 0.94f, 1.0f), ColorRGBA(0.0f, 0.0f, 0.0f, 1.0f), FONT_ICON_CERTIFICATE, TEXTALIGN_MC);
|
||||||
RenderBrowserIcons(*pItem->m_pUIElement->Rect(UI_ELEM_OFFICIAL_ICON_2), &Button, ColorRGBA(0.0f, 0.0f, 0.0f, 1.0f), ColorRGBA(0.0f, 0.0f, 0.0f, 0.0f), FONT_ICON_CHECK, TEXTALIGN_MC, true);
|
RenderBrowserIcons(*pUiElement->Rect(UI_ELEM_OFFICIAL_ICON_2), &Button, ColorRGBA(0.0f, 0.0f, 0.0f, 1.0f), ColorRGBA(0.0f, 0.0f, 0.0f, 0.0f), FONT_ICON_CHECK, TEXTALIGN_MC, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(ID == COL_NAME)
|
else if(ID == COL_NAME)
|
||||||
|
@ -308,14 +312,14 @@ void CMenus::RenderServerbrowserServerList(CUIRect View, bool &WasListboxItemAct
|
||||||
bool Printed = false;
|
bool Printed = false;
|
||||||
if(g_Config.m_BrFilterString[0] && (pItem->m_QuickSearchHit & IServerBrowser::QUICK_SERVERNAME))
|
if(g_Config.m_BrFilterString[0] && (pItem->m_QuickSearchHit & IServerBrowser::QUICK_SERVERNAME))
|
||||||
Printed = PrintHighlighted(pItem->m_aName, [&](const char *pFilteredStr, const int FilterLen) {
|
Printed = PrintHighlighted(pItem->m_aName, [&](const char *pFilteredStr, const int FilterLen) {
|
||||||
UI()->DoLabelStreamed(*pItem->m_pUIElement->Rect(UI_ELEM_NAME_1), &Button, pItem->m_aName, FontSize, TEXTALIGN_ML, Props, (int)(pFilteredStr - pItem->m_aName));
|
UI()->DoLabelStreamed(*pUiElement->Rect(UI_ELEM_NAME_1), &Button, pItem->m_aName, FontSize, TEXTALIGN_ML, Props, (int)(pFilteredStr - pItem->m_aName));
|
||||||
TextRender()->TextColor(gs_HighlightedTextColor);
|
TextRender()->TextColor(gs_HighlightedTextColor);
|
||||||
UI()->DoLabelStreamed(*pItem->m_pUIElement->Rect(UI_ELEM_NAME_2), &Button, pFilteredStr, FontSize, TEXTALIGN_ML, Props, FilterLen, &pItem->m_pUIElement->Rect(UI_ELEM_NAME_1)->m_Cursor);
|
UI()->DoLabelStreamed(*pUiElement->Rect(UI_ELEM_NAME_2), &Button, pFilteredStr, FontSize, TEXTALIGN_ML, Props, FilterLen, &pUiElement->Rect(UI_ELEM_NAME_1)->m_Cursor);
|
||||||
TextRender()->TextColor(TextRender()->DefaultTextColor());
|
TextRender()->TextColor(TextRender()->DefaultTextColor());
|
||||||
UI()->DoLabelStreamed(*pItem->m_pUIElement->Rect(UI_ELEM_NAME_3), &Button, pFilteredStr + FilterLen, FontSize, TEXTALIGN_ML, Props, -1, &pItem->m_pUIElement->Rect(UI_ELEM_NAME_2)->m_Cursor);
|
UI()->DoLabelStreamed(*pUiElement->Rect(UI_ELEM_NAME_3), &Button, pFilteredStr + FilterLen, FontSize, TEXTALIGN_ML, Props, -1, &pUiElement->Rect(UI_ELEM_NAME_2)->m_Cursor);
|
||||||
});
|
});
|
||||||
if(!Printed)
|
if(!Printed)
|
||||||
UI()->DoLabelStreamed(*pItem->m_pUIElement->Rect(UI_ELEM_NAME_1), &Button, pItem->m_aName, FontSize, TEXTALIGN_ML, Props);
|
UI()->DoLabelStreamed(*pUiElement->Rect(UI_ELEM_NAME_1), &Button, pItem->m_aName, FontSize, TEXTALIGN_ML, Props);
|
||||||
}
|
}
|
||||||
else if(ID == COL_GAMETYPE)
|
else if(ID == COL_GAMETYPE)
|
||||||
{
|
{
|
||||||
|
@ -327,7 +331,7 @@ void CMenus::RenderServerbrowserServerList(CUIRect View, bool &WasListboxItemAct
|
||||||
{
|
{
|
||||||
TextRender()->TextColor(GetGametypeTextColor(pItem->m_aGameType));
|
TextRender()->TextColor(GetGametypeTextColor(pItem->m_aGameType));
|
||||||
}
|
}
|
||||||
UI()->DoLabelStreamed(*pItem->m_pUIElement->Rect(UI_ELEM_GAMETYPE), &Button, pItem->m_aGameType, FontSize, TEXTALIGN_ML, Props);
|
UI()->DoLabelStreamed(*pUiElement->Rect(UI_ELEM_GAMETYPE), &Button, pItem->m_aGameType, FontSize, TEXTALIGN_ML, Props);
|
||||||
TextRender()->TextColor(TextRender()->DefaultTextColor());
|
TextRender()->TextColor(TextRender()->DefaultTextColor());
|
||||||
}
|
}
|
||||||
else if(ID == COL_MAP)
|
else if(ID == COL_MAP)
|
||||||
|
@ -340,7 +344,7 @@ void CMenus::RenderServerbrowserServerList(CUIRect View, bool &WasListboxItemAct
|
||||||
if(g_Config.m_BrIndicateFinished && pItem->m_HasRank == 1)
|
if(g_Config.m_BrIndicateFinished && pItem->m_HasRank == 1)
|
||||||
{
|
{
|
||||||
Icon.Margin(2.0f, &Icon);
|
Icon.Margin(2.0f, &Icon);
|
||||||
RenderBrowserIcons(*pItem->m_pUIElement->Rect(UI_ELEM_FINISH_ICON), &Icon, TextRender()->DefaultTextColor(), TextRender()->DefaultTextOutlineColor(), FONT_ICON_FLAG_CHECKERED, TEXTALIGN_MC);
|
RenderBrowserIcons(*pUiElement->Rect(UI_ELEM_FINISH_ICON), &Icon, TextRender()->DefaultTextColor(), TextRender()->DefaultTextOutlineColor(), FONT_ICON_FLAG_CHECKERED, TEXTALIGN_MC);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -351,14 +355,14 @@ void CMenus::RenderServerbrowserServerList(CUIRect View, bool &WasListboxItemAct
|
||||||
bool Printed = false;
|
bool Printed = false;
|
||||||
if(g_Config.m_BrFilterString[0] && (pItem->m_QuickSearchHit & IServerBrowser::QUICK_MAPNAME))
|
if(g_Config.m_BrFilterString[0] && (pItem->m_QuickSearchHit & IServerBrowser::QUICK_MAPNAME))
|
||||||
Printed = PrintHighlighted(pItem->m_aMap, [&](const char *pFilteredStr, const int FilterLen) {
|
Printed = PrintHighlighted(pItem->m_aMap, [&](const char *pFilteredStr, const int FilterLen) {
|
||||||
UI()->DoLabelStreamed(*pItem->m_pUIElement->Rect(UI_ELEM_MAP_1), &Button, pItem->m_aMap, FontSize, TEXTALIGN_ML, Props, (int)(pFilteredStr - pItem->m_aMap));
|
UI()->DoLabelStreamed(*pUiElement->Rect(UI_ELEM_MAP_1), &Button, pItem->m_aMap, FontSize, TEXTALIGN_ML, Props, (int)(pFilteredStr - pItem->m_aMap));
|
||||||
TextRender()->TextColor(gs_HighlightedTextColor);
|
TextRender()->TextColor(gs_HighlightedTextColor);
|
||||||
UI()->DoLabelStreamed(*pItem->m_pUIElement->Rect(UI_ELEM_MAP_2), &Button, pFilteredStr, FontSize, TEXTALIGN_ML, Props, FilterLen, &pItem->m_pUIElement->Rect(UI_ELEM_MAP_1)->m_Cursor);
|
UI()->DoLabelStreamed(*pUiElement->Rect(UI_ELEM_MAP_2), &Button, pFilteredStr, FontSize, TEXTALIGN_ML, Props, FilterLen, &pUiElement->Rect(UI_ELEM_MAP_1)->m_Cursor);
|
||||||
TextRender()->TextColor(TextRender()->DefaultTextColor());
|
TextRender()->TextColor(TextRender()->DefaultTextColor());
|
||||||
UI()->DoLabelStreamed(*pItem->m_pUIElement->Rect(UI_ELEM_MAP_3), &Button, pFilteredStr + FilterLen, FontSize, TEXTALIGN_ML, Props, -1, &pItem->m_pUIElement->Rect(UI_ELEM_MAP_2)->m_Cursor);
|
UI()->DoLabelStreamed(*pUiElement->Rect(UI_ELEM_MAP_3), &Button, pFilteredStr + FilterLen, FontSize, TEXTALIGN_ML, Props, -1, &pUiElement->Rect(UI_ELEM_MAP_2)->m_Cursor);
|
||||||
});
|
});
|
||||||
if(!Printed)
|
if(!Printed)
|
||||||
UI()->DoLabelStreamed(*pItem->m_pUIElement->Rect(UI_ELEM_MAP_1), &Button, pItem->m_aMap, FontSize, TEXTALIGN_ML, Props);
|
UI()->DoLabelStreamed(*pUiElement->Rect(UI_ELEM_MAP_1), &Button, pItem->m_aMap, FontSize, TEXTALIGN_ML, Props);
|
||||||
}
|
}
|
||||||
else if(ID == COL_PLAYERS)
|
else if(ID == COL_PLAYERS)
|
||||||
{
|
{
|
||||||
|
@ -368,7 +372,7 @@ void CMenus::RenderServerbrowserServerList(CUIRect View, bool &WasListboxItemAct
|
||||||
CUIRect Icon;
|
CUIRect Icon;
|
||||||
Button.VSplitRight(50.0f, &Icon, &Button);
|
Button.VSplitRight(50.0f, &Icon, &Button);
|
||||||
Icon.Margin(2.0f, &Icon);
|
Icon.Margin(2.0f, &Icon);
|
||||||
RenderBrowserIcons(*pItem->m_pUIElement->Rect(UI_ELEM_FRIEND_ICON), &Icon, ColorRGBA(0.94f, 0.4f, 0.4f, 1.0f), TextRender()->DefaultTextOutlineColor(), FONT_ICON_HEART, TEXTALIGN_MC);
|
RenderBrowserIcons(*pUiElement->Rect(UI_ELEM_FRIEND_ICON), &Icon, ColorRGBA(0.94f, 0.4f, 0.4f, 1.0f), TextRender()->DefaultTextOutlineColor(), FONT_ICON_HEART, TEXTALIGN_MC);
|
||||||
if(FriendsOnServer > 1)
|
if(FriendsOnServer > 1)
|
||||||
{
|
{
|
||||||
str_from_int(FriendsOnServer, aTemp);
|
str_from_int(FriendsOnServer, aTemp);
|
||||||
|
@ -383,7 +387,7 @@ void CMenus::RenderServerbrowserServerList(CUIRect View, bool &WasListboxItemAct
|
||||||
{
|
{
|
||||||
TextRender()->TextColor(gs_HighlightedTextColor);
|
TextRender()->TextColor(gs_HighlightedTextColor);
|
||||||
}
|
}
|
||||||
UI()->DoLabelStreamed(*pItem->m_pUIElement->Rect(UI_ELEM_PLAYERS), &Button, aTemp, FontSize, TEXTALIGN_MR);
|
UI()->DoLabelStreamed(*pUiElement->Rect(UI_ELEM_PLAYERS), &Button, aTemp, FontSize, TEXTALIGN_MR);
|
||||||
TextRender()->TextColor(TextRender()->DefaultTextColor());
|
TextRender()->TextColor(TextRender()->DefaultTextColor());
|
||||||
}
|
}
|
||||||
else if(ID == COL_PING)
|
else if(ID == COL_PING)
|
||||||
|
@ -394,7 +398,7 @@ void CMenus::RenderServerbrowserServerList(CUIRect View, bool &WasListboxItemAct
|
||||||
{
|
{
|
||||||
TextRender()->TextColor(GetPingTextColor(pItem->m_Latency));
|
TextRender()->TextColor(GetPingTextColor(pItem->m_Latency));
|
||||||
}
|
}
|
||||||
UI()->DoLabelStreamed(*pItem->m_pUIElement->Rect(UI_ELEM_PING), &Button, aTemp, FontSize, TEXTALIGN_MR);
|
UI()->DoLabelStreamed(*pUiElement->Rect(UI_ELEM_PING), &Button, aTemp, FontSize, TEXTALIGN_MR);
|
||||||
TextRender()->TextColor(TextRender()->DefaultTextColor());
|
TextRender()->TextColor(TextRender()->DefaultTextColor());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue