X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1b69c815746d9ca7cbfcbe96423e2021ed3fbdb2..4997d3014cd76b41f2d4036dfd168ad886972f35:/src/common/wincmn.cpp diff --git a/src/common/wincmn.cpp b/src/common/wincmn.cpp index 25a98cc3d2..6b6b35ab28 100644 --- a/src/common/wincmn.cpp +++ b/src/common/wincmn.cpp @@ -115,6 +115,8 @@ wxWindowBase::wxWindowBase() m_parent = (wxWindow *)NULL; m_windowId = wxID_ANY; + m_initialSize = wxDefaultSize; + // no constraints on the minimal window size m_minWidth = m_minHeight = @@ -193,7 +195,7 @@ wxWindowBase::wxWindowBase() bool wxWindowBase::CreateBase(wxWindowBase *parent, wxWindowID id, const wxPoint& WXUNUSED(pos), - const wxSize& WXUNUSED(size), + const wxSize& size, long style, const wxValidator& wxVALIDATOR_PARAM(validator), const wxString& name) @@ -222,6 +224,10 @@ bool wxWindowBase::CreateBase(wxWindowBase *parent, SetWindowStyleFlag(style); SetParent(parent); + // Save the size passed to the ctor (if any.) This will be used later as + // the minimal size if the window is added to a sizer. + m_initialSize = size; + #if wxUSE_VALIDATORS SetValidator(validator); #endif // wxUSE_VALIDATORS @@ -536,9 +542,9 @@ wxSize wxWindowBase::DoGetBestSize() const return wxSize(maxX, maxY); } #endif // wxUSE_CONSTRAINTS - else if ( GetChildren().GetCount() > 0 ) + else if ( !GetChildren().empty() ) { - // our minimal acceptable size is such that all our windows fit inside + // our minimal acceptable size is such that all our visible child windows fit inside int maxX = 0, maxY = 0; @@ -547,7 +553,7 @@ wxSize wxWindowBase::DoGetBestSize() const node = node->GetNext() ) { wxWindow *win = node->GetData(); - if ( win->IsTopLevel() + if ( win->IsTopLevel() || ( ! win->IsShown() ) #if wxUSE_STATUSBAR || wxDynamicCast(win, wxStatusBar) #endif // wxUSE_STATUSBAR @@ -583,11 +589,14 @@ wxSize wxWindowBase::DoGetBestSize() const return wxSize(maxX, maxY); } - else + else // ! has children { - // for a generic window there is no natural best size - just use the - // current one - return GetSize(); + // for a generic window there is no natural best size - just use either the + // minimum size if there is one, or the current size + if ( GetMinSize().IsFullySpecified() ) + return GetMinSize(); + else + return GetSize(); } } @@ -870,6 +879,31 @@ bool wxWindowBase::RemoveEventHandler(wxEvtHandler *handler) // colours, fonts &c // ---------------------------------------------------------------------------- +void wxWindowBase::InheritAttributes() +{ + const wxWindowBase * const parent = GetParent(); + if ( !parent ) + return; + + // we only inherit attributes which had been explicitly set for the parent + // which ensures that this only happens if the user really wants it and + // not by default which wouldn't make any sense in modern GUIs where the + // controls don't all use the same fonts (nor colours) + if ( parent->m_hasFont && !m_hasFont ) + SetFont(parent->GetFont()); + + // in addition, there is a possibility to explicitly forbid inheriting + // colours at each class level by overriding ShouldInheritColours() + if ( ShouldInheritColours() ) + { + if ( parent->m_hasFgCol && !m_hasFgCol ) + SetForegroundColour(parent->GetForegroundColour()); + + if ( parent->m_hasBgCol && !m_hasBgCol ) + SetBackgroundColour(parent->GetBackgroundColour()); + } +} + /* static */ wxVisualAttributes wxWindowBase::GetClassDefaultAttributes(wxWindowVariant WXUNUSED(variant)) { @@ -1594,6 +1628,26 @@ void wxWindowBase::SetSizerAndFit(wxSizer *sizer, bool deleteOld) sizer->SetSizeHints( (wxWindow*) this ); } + +void wxWindowBase::SetContainingSizer(wxSizer* sizer) +{ + // adding a window to a sizer twice is going to result in fatal and + // hard to debug problems later because when deleting the second + // associated wxSizerItem we're going to dereference a dangling + // pointer; so try to detect this as early as possible + wxASSERT_MSG( !sizer || m_containingSizer != sizer, + _T("Adding a window to the same sizer twice?") ); + + m_containingSizer = sizer; + + // If there was an initial size for this window, and if a minsize has not + // been set, then set the initial size as the minsize. This helps with + // sizer layout when a larger than GetBestSize size is needed for + // controls. + if (m_initialSize != wxDefaultSize && GetMinSize() == wxDefaultSize) + SetSizeHints(m_initialSize); +} + #if wxUSE_CONSTRAINTS void wxWindowBase::SatisfyConstraints()