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
This commit is contained in:
Vadim Zeitlin
2008-03-22 03:06:57 +00:00
parent 1d57de4858
commit 2ecd1756e4
4 changed files with 44 additions and 8 deletions

View File

@@ -654,11 +654,23 @@ WXDLLEXPORT void wxFlushEvents();
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)
};

View 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}
@@ -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.

View 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() )
{

View 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;
}