diff --git a/src/xrGame/MainMenu.cpp b/src/xrGame/MainMenu.cpp index 2467fe93f0..425cbb9817 100644 --- a/src/xrGame/MainMenu.cpp +++ b/src/xrGame/MainMenu.cpp @@ -416,6 +416,12 @@ bool CMainMenu::OnRenderPPUI_query() return IsActive() && !m_Flags.test(flGameSaveScreenshot) && b_shniaganeed_pp; } +CUIDialogWnd* CMainMenu::ModalOverStartDialog() +{ + CUIDialogWnd* tir = TopInputReceiver(); + return (tir && tir != m_startDialog) ? tir : NULL; +} + extern void draw_wnds_rects(); extern bool use_reshade; @@ -435,11 +441,15 @@ void CMainMenu::OnRender() Render->Render(); if (!OnRenderPPUI_query()) - { DoRenderDialogs(); - UI().RenderFont(); - draw_wnds_rects(); + else if (CUIDialogWnd* modal = ModalOverStartDialog()) + { + if (modal->IsShown()) + modal->Draw(); } + + UI().RenderFont(); + draw_wnds_rects(); } void CMainMenu::OnRenderPPUI_main() @@ -456,7 +466,7 @@ void CMainMenu::OnRenderPPUI_main() if (OnRenderPPUI_query()) { - DoRenderDialogs(); + DoRenderDialogs(ModalOverStartDialog()); UI().RenderFont(); } diff --git a/src/xrGame/MainMenu.h b/src/xrGame/MainMenu.h index 52c67166ed..dfe2bb2cef 100644 --- a/src/xrGame/MainMenu.h +++ b/src/xrGame/MainMenu.h @@ -155,6 +155,7 @@ class CMainMenu : virtual void IR_OnMouseWheel(int direction); + CUIDialogWnd* ModalOverStartDialog(); bool OnRenderPPUI_query(); void OnRenderPPUI_main(); void OnRenderPPUI_PP(); diff --git a/src/xrGame/UIDialogHolder.cpp b/src/xrGame/UIDialogHolder.cpp index 2d9aa49256..9d36357f00 100644 --- a/src/xrGame/UIDialogHolder.cpp +++ b/src/xrGame/UIDialogHolder.cpp @@ -163,12 +163,12 @@ void CDialogHolder::RemoveDialogToRender(CUIWindow* pDialog) } -void CDialogHolder::DoRenderDialogs() +void CDialogHolder::DoRenderDialogs(CUIWindow* skip) { xr_vector::iterator it = m_dialogsToRender.begin(); for (; it != m_dialogsToRender.end(); ++it) { - if ((*it).enabled && (*it).wnd->IsShown()) + if ((*it).enabled && (*it).wnd->IsShown() && (*it).wnd != skip) (*it).wnd->Draw(); } } diff --git a/src/xrGame/UIDialogHolder.h b/src/xrGame/UIDialogHolder.h index 605691bced..b6af1d17de 100644 --- a/src/xrGame/UIDialogHolder.h +++ b/src/xrGame/UIDialogHolder.h @@ -40,7 +40,7 @@ class PROTECT_API CDialogHolder : public pureFrame void StopMenu(CUIDialogWnd* pDialog); void SetMainInputReceiver(CUIDialogWnd* ir, bool _find_remove); protected: - void DoRenderDialogs(); + void DoRenderDialogs(CUIWindow* skip = NULL); void CleanInternals(); public: CDialogHolder(); diff --git a/src/xrGame/ui/UIMMShniaga.cpp b/src/xrGame/ui/UIMMShniaga.cpp index 0ef0eb5b59..07cd9d6c08 100644 --- a/src/xrGame/ui/UIMMShniaga.cpp +++ b/src/xrGame/ui/UIMMShniaga.cpp @@ -2,6 +2,7 @@ #include "UIMMShniaga.h" #include "UICursor.h" +#include "UIDialogWnd.h" #include "UIStatic.h" #include "UIScrollView.h" #include "UIXmlInit.h" @@ -256,6 +257,20 @@ bool CUIMMShniaga::IsButton(CUIWindow* st) return false; } +bool CUIMMShniaga::IsFrozenByModal() +{ + CUIDialogWnd* owner = smart_cast(GetTop()); + if (!owner) + return false; + + CDialogHolder* holder = owner->GetHolder(); + if (!holder) + return false; + + CUIDialogWnd* tir = holder->TopInputReceiver(); + return tir && tir != owner; +} + void CUIMMShniaga::SendMessage(CUIWindow* pWnd, s16 msg, void* pData) { CUIWindow::SendMessage(pWnd, msg, pData); @@ -337,6 +352,9 @@ void CUIMMShniaga::Update() ProcessEvent(E_Update); + if (IsFrozenByModal()) + return; + CUIWindow::Update(); } diff --git a/src/xrGame/ui/UIMMShniaga.h b/src/xrGame/ui/UIMMShniaga.h index a50bb91689..d352178e4c 100644 --- a/src/xrGame/ui/UIMMShniaga.h +++ b/src/xrGame/ui/UIMMShniaga.h @@ -52,6 +52,7 @@ class CUIMMShniaga : public CUIWindow, void ProcessEvent(EVENT ev); bool IsButton(CUIWindow* st); + bool IsFrozenByModal(); void CreateList(xr_vector& lst, CUIXml& xml_doc, LPCSTR path); void ShowMain(); void ShowNewGame();