X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/35d6156ba4efddad24c032dce4f84ed383a9ce5c..7dbb435338bce3b3747dcef615e13f80fbff5389:/include/wx/dialog.h diff --git a/include/wx/dialog.h b/include/wx/dialog.h index 95e6b6f99e..e32cabb018 100644 --- a/include/wx/dialog.h +++ b/include/wx/dialog.h @@ -79,6 +79,11 @@ public: virtual void ShowWindowModal () ; virtual void SendWindowModalDialogEvent ( wxEventType type ); +#ifdef wxHAS_EVENT_BIND + template + void ShowWindowModalThenDo(const Functor& onEndModal); +#endif // wxHAS_EVENT_BIND + // Modal dialogs have a return code - usually the id of the last // pressed button void SetReturnCode(int returnCode) { m_returnCode = returnCode; } @@ -391,5 +396,40 @@ typedef void (wxEvtHandler::*wxWindowModalDialogEventFunction)(wxWindowModalDial #define EVT_WINDOW_MODAL_DIALOG_CLOSED(winid, func) \ wx__DECLARE_EVT1(wxEVT_WINDOW_MODAL_DIALOG_CLOSED, winid, wxWindowModalDialogEventHandler(func)) +#ifdef wxHAS_EVENT_BIND +template +class wxWindowModalDialogEventFunctor +{ +public: + wxWindowModalDialogEventFunctor(const Functor& f) + : m_f(f), m_wasCalled(false) + {} + + void operator()(wxWindowModalDialogEvent& event) + { + if ( m_wasCalled ) + { + event.Skip(); + return; + } + + m_wasCalled = true; + m_f(event.GetReturnCode()); + } + +private: + Functor m_f; + bool m_wasCalled; +}; + +template +void wxDialogBase::ShowWindowModalThenDo(const Functor& onEndModal) +{ + Bind(wxEVT_WINDOW_MODAL_DIALOG_CLOSED, + wxWindowModalDialogEventFunctor(onEndModal)); + ShowWindowModal(); +}; +#endif // wxHAS_EVENT_BIND + #endif // _WX_DIALOG_H_BASE_