made Freeze/Thaw recursively (un)freeze child windows too
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@52283 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
parent
9e85b0594d
commit
1c8e5c51f8
@ -215,9 +215,6 @@ protected:
|
|||||||
|
|
||||||
virtual wxSize DoGetBestSize() const;
|
virtual wxSize DoGetBestSize() const;
|
||||||
|
|
||||||
virtual void DoFreeze();
|
|
||||||
virtual void DoThaw();
|
|
||||||
|
|
||||||
// return the text for the given column of the given item
|
// return the text for the given column of the given item
|
||||||
virtual wxString OnGetItemText(long item, long column) const;
|
virtual wxString OnGetItemText(long item, long column) const;
|
||||||
|
|
||||||
|
@ -75,8 +75,6 @@ public:
|
|||||||
virtual bool SetTransparent(wxByte alpha);
|
virtual bool SetTransparent(wxByte alpha);
|
||||||
virtual bool CanSetTransparent();
|
virtual bool CanSetTransparent();
|
||||||
|
|
||||||
virtual void AddChild( wxWindowBase *child );
|
|
||||||
|
|
||||||
|
|
||||||
// implementation from now on
|
// implementation from now on
|
||||||
// --------------------------
|
// --------------------------
|
||||||
|
@ -888,16 +888,10 @@ public:
|
|||||||
virtual void ClearBackground();
|
virtual void ClearBackground();
|
||||||
|
|
||||||
// freeze the window: don't redraw it until it is thawed
|
// freeze the window: don't redraw it until it is thawed
|
||||||
void Freeze() { if ( !m_freezeCount++ ) DoFreeze(); }
|
void Freeze();
|
||||||
|
|
||||||
// thaw the window: redraw it after it had been frozen
|
// thaw the window: redraw it after it had been frozen
|
||||||
void Thaw()
|
void Thaw();
|
||||||
{
|
|
||||||
wxASSERT_MSG( m_freezeCount, "Thaw() without matching Freeze()" );
|
|
||||||
|
|
||||||
if ( !--m_freezeCount )
|
|
||||||
DoThaw();
|
|
||||||
}
|
|
||||||
|
|
||||||
// return true if window had been frozen and not unthawed yet
|
// return true if window had been frozen and not unthawed yet
|
||||||
bool IsFrozen() const { return m_freezeCount != 0; }
|
bool IsFrozen() const { return m_freezeCount != 0; }
|
||||||
|
@ -928,6 +928,52 @@ bool wxWindowBase::IsTopLevel() const
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// Freeze/Thaw
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void wxWindowBase::Freeze()
|
||||||
|
{
|
||||||
|
if ( !m_freezeCount++ )
|
||||||
|
{
|
||||||
|
// physically freeze this window:
|
||||||
|
DoFreeze();
|
||||||
|
|
||||||
|
// and recursively freeze all children:
|
||||||
|
for ( wxWindowList::iterator i = GetChildren().begin();
|
||||||
|
i != GetChildren().end(); ++i )
|
||||||
|
{
|
||||||
|
wxWindow *child = *i;
|
||||||
|
if ( child->IsTopLevel() )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
child->Freeze();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxWindowBase::Thaw()
|
||||||
|
{
|
||||||
|
wxASSERT_MSG( m_freezeCount, "Thaw() without matching Freeze()" );
|
||||||
|
|
||||||
|
if ( !--m_freezeCount )
|
||||||
|
{
|
||||||
|
// recursively thaw all children:
|
||||||
|
for ( wxWindowList::iterator i = GetChildren().begin();
|
||||||
|
i != GetChildren().end(); ++i )
|
||||||
|
{
|
||||||
|
wxWindow *child = *i;
|
||||||
|
if ( child->IsTopLevel() )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
child->Thaw();
|
||||||
|
}
|
||||||
|
|
||||||
|
// physically thaw this window:
|
||||||
|
DoThaw();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// reparenting the window
|
// reparenting the window
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@ -943,12 +989,22 @@ void wxWindowBase::AddChild(wxWindowBase *child)
|
|||||||
|
|
||||||
GetChildren().Append((wxWindow*)child);
|
GetChildren().Append((wxWindow*)child);
|
||||||
child->SetParent(this);
|
child->SetParent(this);
|
||||||
|
|
||||||
|
// adding a child while frozen will assert when thawn, so freeze it as if
|
||||||
|
// it had been already present when we were frozen
|
||||||
|
if ( IsFrozen() && !child->IsTopLevel() )
|
||||||
|
child->Freeze();
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxWindowBase::RemoveChild(wxWindowBase *child)
|
void wxWindowBase::RemoveChild(wxWindowBase *child)
|
||||||
{
|
{
|
||||||
wxCHECK_RET( child, wxT("can't remove a NULL child") );
|
wxCHECK_RET( child, wxT("can't remove a NULL child") );
|
||||||
|
|
||||||
|
// removing a child while frozen may result in permanently frozen window
|
||||||
|
// if used e.g. from Reparent(), so thaw it
|
||||||
|
if ( IsFrozen() && !child->IsTopLevel() )
|
||||||
|
child->Thaw();
|
||||||
|
|
||||||
GetChildren().DeleteObject((wxWindow *)child);
|
GetChildren().DeleteObject((wxWindow *)child);
|
||||||
child->SetParent(NULL);
|
child->SetParent(NULL);
|
||||||
}
|
}
|
||||||
|
@ -5901,14 +5901,4 @@ void wxGenericListCtrl::Refresh(bool eraseBackground, const wxRect *rect)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxGenericListCtrl::DoFreeze()
|
|
||||||
{
|
|
||||||
m_mainWin->Freeze();
|
|
||||||
}
|
|
||||||
|
|
||||||
void wxGenericListCtrl::DoThaw()
|
|
||||||
{
|
|
||||||
m_mainWin->Thaw();
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // wxUSE_LISTCTRL
|
#endif // wxUSE_LISTCTRL
|
||||||
|
@ -1175,49 +1175,14 @@ bool wxTopLevelWindowMSW::CanSetTransparent()
|
|||||||
|
|
||||||
void wxTopLevelWindowMSW::DoFreeze()
|
void wxTopLevelWindowMSW::DoFreeze()
|
||||||
{
|
{
|
||||||
if ( IsShown() )
|
// do nothing: freezing toplevel window causes paint and mouse events
|
||||||
{
|
// to go through it any TLWs under it, so the best we can do is to freeze
|
||||||
for ( wxWindowList::compatibility_iterator node = GetChildren().GetFirst();
|
// all children -- and wxWindowBase::Freeze() does that
|
||||||
node;
|
|
||||||
node = node->GetNext() )
|
|
||||||
{
|
|
||||||
wxWindow *child = node->GetData();
|
|
||||||
if ( child->IsTopLevel() )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
child->Freeze();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxTopLevelWindowMSW::DoThaw()
|
void wxTopLevelWindowMSW::DoThaw()
|
||||||
{
|
{
|
||||||
if ( IsShown() )
|
// intentionally empty -- see DoFreeze()
|
||||||
{
|
|
||||||
for ( wxWindowList::compatibility_iterator node = GetChildren().GetFirst();
|
|
||||||
node;
|
|
||||||
node = node->GetNext() )
|
|
||||||
{
|
|
||||||
wxWindow *child = node->GetData();
|
|
||||||
if ( child->IsTopLevel() )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
child->Thaw();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void wxTopLevelWindowMSW::AddChild(wxWindowBase *child)
|
|
||||||
{
|
|
||||||
// adding a child while frozen will assert when thawn, so freeze it as if
|
|
||||||
// it had been already present when we were frozen
|
|
||||||
if ( child && !child->IsTopLevel() && IsFrozen() )
|
|
||||||
{
|
|
||||||
child->Freeze();
|
|
||||||
}
|
|
||||||
|
|
||||||
wxTopLevelWindowBase::AddChild(child);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user