From: Vadim Zeitlin Date: Sat, 22 Mar 2008 03:06:57 +0000 (+0000) Subject: added wxWindowDisabler ctor for conditionally disabling all windows and use it in... X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/2ecd1756e4238edc910a38a18f84b4f5bf42f85c added wxWindowDisabler ctor for conditionally disabling all windows and use it in WaitForChild() git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@52671 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/utils.h b/include/wx/utils.h index bba48e566a..95cf1a6ada 100644 --- a/include/wx/utils.h +++ b/include/wx/utils.h @@ -649,16 +649,28 @@ WXDLLEXPORT bool wxCheckForInterrupt(wxWindow *wnd); // Consume all events until no more left WXDLLEXPORT void wxFlushEvents(); -// a class which disables all windows (except, may be, thegiven one) in its +// a class which disables all windows (except, may be, the given one) in its // ctor and enables them back in its dtor class WXDLLEXPORT wxWindowDisabler { public: - wxWindowDisabler(wxWindow *winToSkip = (wxWindow *)NULL); + // this ctor conditionally disables all windows: if the argument is false, + // it doesn't do anything + wxWindowDisabler(bool disable = true); + + // ctor disables all windows except winToSkip + wxWindowDisabler(wxWindow *winToSkip); + + // dtor enables back all windows disabled by the ctor ~wxWindowDisabler(); private: + // disable all windows except the given one (used by both ctors) + void DoDisable(wxWindow *winToSkip = NULL); + + wxWindowList *m_winDisabled; + bool m_disabled; DECLARE_NO_COPY_CLASS(wxWindowDisabler) }; diff --git a/interface/utils.h b/interface/utils.h index 67e68ccad5..c29bbd8dfb 100644 --- a/interface/utils.h +++ b/interface/utils.h @@ -12,7 +12,8 @@ This class disables all windows of the application (may be with the exception of one of them) in its constructor and enables them back in its destructor. - This comes in handy when you want to indicate to the user that the application + + This is useful when you want to indicate to the user that the application is currently busy and cannot respond to user input. @library{wxcore} @@ -23,11 +24,21 @@ class wxWindowDisabler { public: + /** + Disables all top level windows of the applications. + + If @a disable is @c false nothing is done. This can be convenient if + the windows should be disabled depending on some condition. + + @since 2.9.0 + */ + wxWindowDisabler(bool disable = true); + /** Disables all top level windows of the applications with the exception of @a winToSkip if it is not @NULL. */ - wxWindowDisabler(wxWindow* winToSkip = NULL); + wxWindowDisabler(wxWindow* winToSkip); /** Reenables back the windows disabled by the constructor. diff --git a/src/common/utilscmn.cpp b/src/common/utilscmn.cpp index dd052b5c90..2e8c64bfe6 100644 --- a/src/common/utilscmn.cpp +++ b/src/common/utilscmn.cpp @@ -1561,7 +1561,20 @@ void wxEnableTopLevelWindows(bool enable) node->GetData()->Enable(enable); } +wxWindowDisabler::wxWindowDisabler(bool disable) +{ + m_disabled = disable; + if ( disable ) + DoDisable(); +} + wxWindowDisabler::wxWindowDisabler(wxWindow *winToSkip) +{ + m_disabled = true; + DoDisable(winToSkip); +} + +void wxWindowDisabler::DoDisable(wxWindow *winToSkip) { // remember the top level windows which were already disabled, so that we // don't reenable them later @@ -1593,6 +1606,9 @@ wxWindowDisabler::wxWindowDisabler(wxWindow *winToSkip) wxWindowDisabler::~wxWindowDisabler() { + if ( !m_disabled ) + return; + wxWindowList::compatibility_iterator node; for ( node = wxTopLevelWindows.GetFirst(); node; node = node->GetNext() ) { diff --git a/src/unix/utilsunx.cpp b/src/unix/utilsunx.cpp index e47af5bf55..d1ea16acc7 100644 --- a/src/unix/utilsunx.cpp +++ b/src/unix/utilsunx.cpp @@ -1447,8 +1447,7 @@ int wxGUIAppTraits::WaitForChild(wxExecuteData& execData) // prepare to wait for the child termination: show to the user that we're // busy and refuse all input unless explicitly told otherwise wxBusyCursor bc; - wxWindowDisabler *wd = flags & wxEXEC_NODISABLE ? NULL - : new wxWindowDisabler; + wxWindowDisabler wd(!(flags & wxEXEC_NODISABLE)); // endProcData.pid will be set to 0 from wxHandleProcessTermination() when // the process terminates @@ -1480,8 +1479,6 @@ int wxGUIAppTraits::WaitForChild(wxExecuteData& execData) wxYield(); } - delete wd; - return endProcData.exitcode; }