]> git.saurik.com Git - wxWidgets.git/commitdiff
added wxWindowDisabler ctor for conditionally disabling all windows and use it in...
authorVadim Zeitlin <vadim@wxwidgets.org>
Sat, 22 Mar 2008 03:06:57 +0000 (03:06 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sat, 22 Mar 2008 03:06:57 +0000 (03:06 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@52671 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/utils.h
interface/utils.h
src/common/utilscmn.cpp
src/unix/utilsunx.cpp

index bba48e566ae93d5cfc3c1e3b724287bccc2936a9..95cf1a6ada8cc27ce91f02fb1340ca93505044a2 100644 (file)
@@ -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)
 };
index 67e68ccad56d3b8696e206d5d190e166d18064fb..c29bbd8dfb6dce8a8c084c7d53acec618a861d21 100644 (file)
@@ -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}
 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.
index dd052b5c907167f076bca61c6ec9548e6134304e..2e8c64bfe64d7ec16e945346689ee98a3eb0f290 100644 (file)
@@ -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() )
     {
index e47af5bf5537aa2ffafbaff4e6010c6014119868..d1ea16acc73974873d1c34b88df05791813c0971 100644 (file)
@@ -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;
 }