Merge pull request #7945 from Robyt3/Client-Config-Error-Popup

Show warnings after client close instead of preventing quitting
This commit is contained in:
Dennis Felsing 2024-02-07 22:23:53 +00:00 committed by GitHub
commit 1e012af2fd
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 41 additions and 44 deletions

View file

@ -335,7 +335,6 @@ public:
virtual void DummyResetInput() = 0;
virtual void Echo(const char *pString) = 0;
virtual bool CanDisplayWarning() const = 0;
virtual bool IsDisplayingWarning() const = 0;
virtual CNetObjHandler *GetNetObjHandler() = 0;
};

View file

@ -2981,28 +2981,11 @@ void CClient::Run()
AutoStatScreenshot_Cleanup();
AutoCSV_Cleanup();
// check conditions
if(State() == IClient::STATE_QUITTING || State() == IClient::STATE_RESTARTING)
{
static bool s_SavedConfig = false;
if(!s_SavedConfig)
{
// write down the config and quit
if(!m_pConfigManager->Save())
{
char aWarning[128];
str_format(aWarning, sizeof(aWarning), Localize("Saving settings to '%s' failed"), CONFIG_FILE);
m_vWarnings.emplace_back(aWarning);
}
s_SavedConfig = true;
}
if(m_vWarnings.empty() && !GameClient()->IsDisplayingWarning())
break;
}
m_Fifo.Update();
if(State() == IClient::STATE_QUITTING || State() == IClient::STATE_RESTARTING)
break;
// beNice
auto Now = time_get_nanoseconds();
decltype(Now) SleepTimeInNanoSeconds{0};
@ -3050,6 +3033,13 @@ void CClient::Run()
m_GlobalTime = (time_get() - m_GlobalStartTime) / (float)time_freq();
}
if(!m_pConfigManager->Save())
{
char aError[128];
str_format(aError, sizeof(aError), Localize("Saving settings to '%s' failed"), CONFIG_FILE);
m_vQuittingWarnings.emplace_back(Localize("Error saving settings"), aError);
}
m_Fifo.Shutdown();
GameClient()->OnShutdown();
@ -4172,6 +4162,26 @@ static bool SaveUnknownCommandCallback(const char *pCommand, void *pUser)
return true;
}
static Uint32 GetSdlMessageBoxFlags(IClient::EMessageBoxType Type)
{
switch(Type)
{
case IClient::MESSAGE_BOX_TYPE_ERROR:
return SDL_MESSAGEBOX_ERROR;
case IClient::MESSAGE_BOX_TYPE_WARNING:
return SDL_MESSAGEBOX_WARNING;
case IClient::MESSAGE_BOX_TYPE_INFO:
return SDL_MESSAGEBOX_INFORMATION;
}
dbg_assert(false, "Type invalid");
return 0;
}
static void ShowMessageBox(const char *pTitle, const char *pMessage, IClient::EMessageBoxType Type = IClient::MESSAGE_BOX_TYPE_ERROR)
{
SDL_ShowSimpleMessageBox(GetSdlMessageBoxFlags(Type), pTitle, pMessage, nullptr);
}
/*
Server Time
Client Mirror Time
@ -4490,8 +4500,15 @@ int main(int argc, const char **argv)
pStorage->GetBinaryPath(PLAT_CLIENT_EXEC, aRestartBinaryPath, sizeof(aRestartBinaryPath));
}
std::vector<SWarning> vQuittingWarnings = pClient->QuittingWarnings();
PerformCleanup();
for(const SWarning &Warning : vQuittingWarnings)
{
::ShowMessageBox(Warning.m_aWarningTitle, Warning.m_aWarningMsg);
}
if(Restarting)
{
shell_execute(aRestartBinaryPath, EShellExecuteWindowState::FOREGROUND);
@ -4708,25 +4725,10 @@ void CClient::ShellUnregister()
}
#endif
static Uint32 GetSdlMessageBoxFlags(IClient::EMessageBoxType Type)
{
switch(Type)
{
case IClient::MESSAGE_BOX_TYPE_ERROR:
return SDL_MESSAGEBOX_ERROR;
case IClient::MESSAGE_BOX_TYPE_WARNING:
return SDL_MESSAGEBOX_WARNING;
case IClient::MESSAGE_BOX_TYPE_INFO:
return SDL_MESSAGEBOX_INFORMATION;
}
dbg_assert(false, "Type invalid");
return 0;
}
void CClient::ShowMessageBox(const char *pTitle, const char *pMessage, EMessageBoxType Type)
{
if(m_pGraphics == nullptr || !m_pGraphics->ShowMessageBox(GetSdlMessageBoxFlags(Type), pTitle, pMessage))
SDL_ShowSimpleMessageBox(GetSdlMessageBoxFlags(Type), pTitle, pMessage, nullptr);
::ShowMessageBox(pTitle, pMessage, Type);
}
void CClient::GetGPUInfoString(char (&aGPUInfo)[256])

View file

@ -228,6 +228,7 @@ class CClient : public IClient, public CDemoPlayer::IListener
} m_VersionInfo;
std::vector<SWarning> m_vWarnings;
std::vector<SWarning> m_vQuittingWarnings;
CFifo m_Fifo;
@ -495,6 +496,7 @@ public:
void AddWarning(const SWarning &Warning) override;
SWarning *GetCurWarning() override;
std::vector<SWarning> &&QuittingWarnings() { return std::move(m_vQuittingWarnings); }
CChecksumData *ChecksumData() override { return &m_Checksum.m_Data; }
int UdpConnectivity(int NetType) override;

View file

@ -445,6 +445,7 @@ bool CConfigManager::Save()
return false;
}
log_info("config", "saved to " CONFIG_FILE);
return true;
}

View file

@ -731,7 +731,6 @@ public:
void UpdateOwnGhost(CGhostItem Item);
void DeleteGhostItem(int Index);
int GetCurPopup() const { return m_Popup; }
bool CanDisplayWarning() const;
void PopupWarning(const char *pTopic, const char *pBody, const char *pButton, std::chrono::nanoseconds Duration);

View file

@ -3520,11 +3520,6 @@ bool CGameClient::CanDisplayWarning() const
return m_Menus.CanDisplayWarning();
}
bool CGameClient::IsDisplayingWarning() const
{
return m_Menus.GetCurPopup() == CMenus::POPUP_WARNING;
}
CNetObjHandler *CGameClient::GetNetObjHandler()
{
return &m_NetObjHandler;

View file

@ -555,7 +555,6 @@ public:
int SwitchStateTeam() const;
bool IsLocalCharSuper() const;
bool CanDisplayWarning() const override;
bool IsDisplayingWarning() const override;
CNetObjHandler *GetNetObjHandler() override;
void LoadGameSkin(const char *pPath, bool AsDir = false);