X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c6212a0cb7e6285f62198a9411d91bbe8dc06e60..549d99f04372ef743bbea362c2f2fa582333b74c:/src/osx/dialog_osx.cpp?ds=sidebyside diff --git a/src/osx/dialog_osx.cpp b/src/osx/dialog_osx.cpp index fbc3ce67e2..e605e95f3f 100644 --- a/src/osx/dialog_osx.cpp +++ b/src/osx/dialog_osx.cpp @@ -12,6 +12,7 @@ #include "wx/wxprec.h" #include "wx/dialog.h" +#include "wx/evtloop.h" #ifndef WX_PRECOMP #include "wx/app.h" @@ -22,7 +23,6 @@ #include "wx/osx/private.h" - // Lists to keep track of windows, so we can disable/enable them // for modal dialogs @@ -32,7 +32,8 @@ IMPLEMENT_DYNAMIC_CLASS(wxDialog, wxTopLevelWindow) void wxDialog::Init() { - m_isModalStyle = false; + m_modality = wxDIALOG_MODALITY_NONE; + m_eventLoop = NULL; } bool wxDialog::Create( wxWindow *parent, @@ -57,18 +58,6 @@ bool wxDialog::Create( wxWindow *parent, return true; } -void wxDialog::SetModal( bool flag ) -{ - if ( flag ) - { - m_isModalStyle = true; - } - else - { - m_isModalStyle = false; - } -} - wxDialog::~wxDialog() { SendDestroyEvent(); @@ -89,16 +78,23 @@ bool wxDialog::IsEscapeKey(const wxKeyEvent& event) bool wxDialog::IsModal() const { - return wxModalDialogs.Find((wxDialog *)this) != NULL; // const_cast - // return m_isModalStyle; + return m_modality != wxDIALOG_MODALITY_NONE; } - bool wxDialog::Show(bool show) { - if ( !wxDialogBase::Show(show) ) - // nothing to do - return false; + if ( m_modality == wxDIALOG_MODALITY_WINDOW_MODAL ) + { + if ( !wxWindow::Show(show) ) + // nothing to do + return false; + } + else + { + if ( !wxDialogBase::Show(show) ) + // nothing to do + return false; + } if (show && CanDoLayoutAdaptation()) DoLayoutAdaptation(); @@ -107,43 +103,62 @@ bool wxDialog::Show(bool show) // usually will result in TransferDataToWindow() being called InitDialog(); - if ( m_isModalStyle ) + if ( !show ) { - if ( show ) - { - DoShowModal(); - } - else // end of modal dialog + switch( m_modality ) { - // this will cause IsModalShowing() return false and our local - // message loop will terminate - wxModalDialogs.DeleteObject(this); + case wxDIALOG_MODALITY_WINDOW_MODAL: + EndWindowModal(); // OS X implementation method for cleanup + SendWindowModalDialogEvent ( wxEVT_WINDOW_MODAL_DIALOG_CLOSED ); + break; + default: + break; } + m_modality = wxDIALOG_MODALITY_NONE; } - + return true; } // Replacement for Show(true) for modal dialogs - returns return code int wxDialog::ShowModal() { - if ( !m_isModalStyle ) - SetModal(true); + m_modality = wxDIALOG_MODALITY_APP_MODAL; + + Show(); + + wxModalEventLoop modalLoop(this); + m_eventLoop = &modalLoop; + + modalLoop.Run(); + + m_eventLoop = NULL; + + return GetReturnCode(); +} - if ( IsShown() ) - DoShowModal(); - else - Show(true); +void wxDialog::ShowWindowModal() +{ + m_modality = wxDIALOG_MODALITY_WINDOW_MODAL; + + Show(); + + DoShowWindowModal(); +} - return GetReturnCode(); +wxDialogModality wxDialog::GetModality() const +{ + return m_modality; } -// NB: this function (surprizingly) may be called for both modal and modeless +// NB: this function (surprisingly) may be called for both modal and modeless // dialogs and should work for both of them void wxDialog::EndModal(int retCode) { + if ( m_eventLoop ) + m_eventLoop->Exit(retCode); + SetReturnCode(retCode); Show(false); - SetModal(false); }