Skip to content

Commit 86ad47c

Browse files
committed
GUI related safety tweaks
1 parent dc0fb96 commit 86ad47c

File tree

6 files changed

+274
-56
lines changed

6 files changed

+274
-56
lines changed

Client/core/CLanguageSelector.cpp

Lines changed: 44 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -55,17 +55,22 @@ CLanguageSelector::CLanguageSelector(CGUIElement* pMainMenuCanvas)
5555
///////////////////////////////////////////////////////////////
5656
CLanguageSelector::~CLanguageSelector()
5757
{
58-
SAFE_DELETE(m_pButtonWindow);
59-
SAFE_DELETE(m_pListWindow);
60-
SAFE_DELETE(m_ButtonItem.pContainerPane);
61-
SAFE_DELETE(m_ButtonItem.pIcon);
62-
SAFE_DELETE(m_ButtonItem.pLabel);
63-
for (CLangListItem& item : m_ListItems)
64-
{
65-
SAFE_DELETE(item.pContainerPane);
66-
SAFE_DELETE(item.pIcon);
67-
SAFE_DELETE(item.pLabel);
68-
}
58+
CGUI* pGUI = g_pCore ? g_pCore->GetGUI() : nullptr;
59+
60+
auto destroyElement = [pGUI](auto*& element) {
61+
if (!element)
62+
return;
63+
64+
if (pGUI)
65+
pGUI->DestroyElementRecursive(element);
66+
element = nullptr;
67+
};
68+
69+
destroyElement(m_pListWindow);
70+
destroyElement(m_pButtonWindow);
71+
72+
m_ButtonItem = CLangListItem();
73+
m_ListItems.clear();
6974
}
7075

7176
///////////////////////////////////////////////////////////////
@@ -118,18 +123,17 @@ void CLanguageSelector::CreateGUI(CGUIElement* pMainMenuCanvas)
118123
pLabel->SetZOrderingEnabled(false);
119124
pLabel->SetText(g_pLocalization->GetLanguageNativeName());
120125

121-
CLangListItem m_ButtonItem;
122-
m_ButtonItem.strLocale = "";
123-
m_ButtonItem.pContainerPane = pContainerPane;
124-
m_ButtonItem.pIcon = pIcon;
125-
m_ButtonItem.vecIconInitialPos = pIcon->GetPosition();
126-
m_ButtonItem.vecIconInitialSize = pIcon->GetSize();
127-
m_ButtonItem.pLabel = pLabel;
128-
m_ButtonItem.vecLabelInitialPos = pLabel->GetPosition();
129-
m_ButtonItem.vecLabelInitialSize = pLabel->GetSize();
130-
m_ButtonItem.pContainerPane->SetMouseButtonDownHandler(GUI_CALLBACK(&CLanguageSelector::OnButtonClick, this));
131-
m_ButtonItem.pContainerPane->SetMouseEnterHandler(GUI_CALLBACK(&CLanguageSelector::OnButtonEnter, this));
132-
m_ButtonItem.pContainerPane->SetMouseLeaveHandler(GUI_CALLBACK(&CLanguageSelector::OnButtonLeave, this));
126+
m_ButtonItem.strLocale = "";
127+
m_ButtonItem.pContainerPane = pContainerPane;
128+
m_ButtonItem.pIcon = pIcon;
129+
m_ButtonItem.vecIconInitialPos = pIcon->GetPosition();
130+
m_ButtonItem.vecIconInitialSize = pIcon->GetSize();
131+
m_ButtonItem.pLabel = pLabel;
132+
m_ButtonItem.vecLabelInitialPos = pLabel->GetPosition();
133+
m_ButtonItem.vecLabelInitialSize = pLabel->GetSize();
134+
m_ButtonItem.pContainerPane->SetMouseButtonDownHandler(GUI_CALLBACK(&CLanguageSelector::OnButtonClick, this));
135+
m_ButtonItem.pContainerPane->SetMouseEnterHandler(GUI_CALLBACK(&CLanguageSelector::OnButtonEnter, this));
136+
m_ButtonItem.pContainerPane->SetMouseLeaveHandler(GUI_CALLBACK(&CLanguageSelector::OnButtonLeave, this));
133137
}
134138

135139
//
@@ -263,6 +267,16 @@ void CLanguageSelector::DoPulse()
263267
}
264268
}
265269

270+
bool CLanguageSelector::ConsumePendingLocale(SString& outLocale)
271+
{
272+
if (m_strPendingLocale.empty())
273+
return false;
274+
275+
outLocale = m_strPendingLocale;
276+
m_strPendingLocale.clear();
277+
return true;
278+
}
279+
266280
///////////////////////////////////////////////////////////////
267281
//
268282
// CLanguageSelector::SetLanguageListVisible
@@ -383,9 +397,13 @@ bool CLanguageSelector::OnListItemClick(CGUIElement* pElement)
383397
SString strNewLocale = pItem->strLocale;
384398
if (strNewLocale != strPrevLocale)
385399
{
386-
// Locale change
387-
CVARS_SET("locale", strNewLocale);
388-
SetApplicationSetting("locale", strNewLocale);
400+
// Defer locale change to avoid destroying GUI during callback stack
401+
m_strPendingLocale = strNewLocale;
402+
403+
// Update button label immediately so user sees their selection
404+
m_ButtonItem.strLocale = strNewLocale;
405+
if (m_ButtonItem.pLabel)
406+
m_ButtonItem.pLabel->SetText(g_pLocalization->GetLanguageNativeName(strNewLocale));
389407
}
390408
}
391409
return true;

Client/core/CLanguageSelector.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ class CLanguageSelector
3030
CLanguageSelector(CGUIElement* pMainMenuCanvas);
3131
~CLanguageSelector();
3232
void DoPulse();
33+
bool ConsumePendingLocale(SString& outLocale);
3334

3435
protected:
3536
void CreateGUI(CGUIElement* pMainMenuCanvas);
@@ -51,4 +52,5 @@ class CLanguageSelector
5152
CTickCount m_LastTickCount;
5253
bool m_bMouseOverButton;
5354
bool m_bListWasVisible;
55+
SString m_strPendingLocale;
5456
};

Client/core/CMainMenu.cpp

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -402,6 +402,12 @@ CMainMenu::~CMainMenu()
402402
m_pDisconnect = nullptr;
403403
}
404404

405+
delete m_pLanguageSelector;
406+
m_pLanguageSelector = nullptr;
407+
408+
delete m_pNewsBrowser;
409+
m_pNewsBrowser = nullptr;
410+
405411
destroyElement(m_pMenuArea);
406412
destroyElement(m_pLogo);
407413
destroyElement(m_pLatestNews);
@@ -411,11 +417,6 @@ CMainMenu::~CMainMenu()
411417
destroyElement(m_pBackground);
412418
destroyElement(m_pFiller);
413419
destroyElement(m_pFiller2);
414-
415-
delete m_pLanguageSelector;
416-
m_pLanguageSelector = nullptr;
417-
delete m_pNewsBrowser;
418-
m_pNewsBrowser = nullptr;
419420
}
420421

421422
void CMainMenu::SetMenuVerticalPosition(int iPosY)
@@ -729,6 +730,16 @@ void CMainMenu::Update()
729730
m_ServerBrowser.Update();
730731
m_ServerInfo.DoPulse();
731732
m_pLanguageSelector->DoPulse();
733+
734+
if (m_pLanguageSelector)
735+
{
736+
SString strPendingLocale;
737+
if (m_pLanguageSelector->ConsumePendingLocale(strPendingLocale))
738+
{
739+
CVARS_SET("locale", strPendingLocale);
740+
SetApplicationSetting("locale", strPendingLocale);
741+
}
742+
}
732743
}
733744

734745
void CMainMenu::Show(bool bOverlay)

Client/core/CNewsBrowser.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,9 @@ void CNewsBrowser::CreateGUI()
200200
////////////////////////////////////////////////////
201201
void CNewsBrowser::DestroyGUI()
202202
{
203+
if (!m_pWindow && !m_pTabPanel && !m_pButtonOK && !m_pButtonNewsLink)
204+
return;
205+
203206
// Clean up the main UI elements in reverse order of creation
204207
SAFE_DELETE(m_pTabPanel); // This will destroy all tabs and their children
205208
SAFE_DELETE(m_pButtonOK);

0 commit comments

Comments
 (0)