From 3996b21a7f11ae6c1985b5ee55223ddec537f689 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Mon, 5 Oct 2009 22:57:45 +0000 Subject: [PATCH] Determine the appropriate show effect automatically in wxInfoBar. Slide the info bar from top or bottom of the parent window depending on its location. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@62302 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/generic/infobar.h | 19 ++++++++-- interface/wx/infobar.h | 18 +++++----- src/generic/infobar.cpp | 67 +++++++++++++++++++++++++++++++++--- 3 files changed, 88 insertions(+), 16 deletions(-) diff --git a/include/wx/generic/infobar.h b/include/wx/generic/infobar.h index 16cf5d4ab0..43f9108c9a 100644 --- a/include/wx/generic/infobar.h +++ b/include/wx/generic/infobar.h @@ -63,8 +63,8 @@ public: } // get effect used when showing/hiding the window - wxShowEffect GetShowEffect() const { return m_showEffect; } - wxShowEffect GetHideEffect() const { return m_hideEffect; } + wxShowEffect GetShowEffect() const; + wxShowEffect GetHideEffect() const; // set the duration of animation used when showing/hiding the bar, in ms void SetEffectDuration(int duration) { m_effectDuration = duration; } @@ -101,13 +101,26 @@ private: void DoShow(); void DoHide(); + // determine the placement of the bar from its position in the containing + // sizer + enum BarPlacement + { + BarPlacement_Top, + BarPlacement_Bottom, + BarPlacement_Unknown + }; + + BarPlacement GetBarPlacement() const; + // different controls making up the bar wxStaticBitmap *m_icon; wxStaticText *m_text; wxBitmapButton *m_button; - // the effects to use when showing/hiding and duration for them + // the effects to use when showing/hiding and duration for them: by default + // the effect is determined by the info bar automatically depending on its + // position and the default duration is used wxShowEffect m_showEffect, m_hideEffect; int m_effectDuration; diff --git a/interface/wx/infobar.h b/interface/wx/infobar.h index f79f3b110d..76694ae057 100644 --- a/interface/wx/infobar.h +++ b/interface/wx/infobar.h @@ -71,7 +71,7 @@ @since 2.9.1 */ -class wxInfoBar : public wxWindow +class wxInfoBar : public wxControl { public: /** @@ -200,17 +200,17 @@ public: Either or both of the parameters can be set to wxSHOW_EFFECT_NONE to disable using effects entirely. - Notice that if you place the bar at the bottom of the window you should - reverse the effects used for showing and hiding for better appearance. + By default, the info bar uses wxSHOW_EFFECT_SLIDE_TO_BOTTOM effect for + showing itself and wxSHOW_EFFECT_SLIDE_TO_TOP for hiding if it is the + first element of the containing sizer and reverse effects if it's the + last one. If it is neither the first nor the last element, no effect is + used to avoid the use of an inappropriate one and this function must be + called if an effect is desired. @param showEffect - The effect to use when showing the bar. By default, - wxSHOW_EFFECT_SLIDE_TO_BOTTOM which is appropriate for the bars - placed at the top of the window. + The effect to use when showing the bar. @param hideEffect - The effect to use when hiding the bar. By default, - wxSHOW_EFFECT_SLIDE_TO_TOP which is appropriate for the bars placed - at the top of the window. + The effect to use when hiding the bar. */ void SetShowHideEffects(wxShowEffect showEffect, wxShowEffect hideEffect); diff --git a/src/generic/infobar.cpp b/src/generic/infobar.cpp index a85ead0f40..2cc7b5e164 100644 --- a/src/generic/infobar.cpp +++ b/src/generic/infobar.cpp @@ -82,8 +82,8 @@ void wxInfoBarGeneric::Init() m_text = NULL; m_button = NULL; - m_showEffect = wxSHOW_EFFECT_SLIDE_TO_BOTTOM; - m_hideEffect = wxSHOW_EFFECT_SLIDE_TO_TOP; + m_showEffect = + m_hideEffect = wxSHOW_EFFECT_MAX; // use default effect duration m_effectDuration = 0; @@ -164,6 +164,65 @@ bool wxInfoBarGeneric::SetFont(const wxFont& font) return true; } +wxInfoBarGeneric::BarPlacement wxInfoBarGeneric::GetBarPlacement() const +{ + wxSizer * const sizer = GetContainingSizer(); + if ( !sizer ) + return BarPlacement_Unknown; + + const wxSizerItemList& siblings = sizer->GetChildren(); + if ( siblings.GetFirst()->GetData()->GetWindow() == this ) + return BarPlacement_Top; + else if ( siblings.GetLast()->GetData()->GetWindow() == this ) + return BarPlacement_Bottom; + else + return BarPlacement_Unknown; +} + +wxShowEffect wxInfoBarGeneric::GetShowEffect() const +{ + if ( m_showEffect != wxSHOW_EFFECT_MAX ) + return m_showEffect; + + switch ( GetBarPlacement() ) + { + case BarPlacement_Top: + return wxSHOW_EFFECT_SLIDE_TO_BOTTOM; + + case BarPlacement_Bottom: + return wxSHOW_EFFECT_SLIDE_TO_TOP; + + default: + wxFAIL_MSG( "unknown info bar placement" ); + // fall through + + case BarPlacement_Unknown: + return wxSHOW_EFFECT_NONE; + } +} + +wxShowEffect wxInfoBarGeneric::GetHideEffect() const +{ + if ( m_hideEffect != wxSHOW_EFFECT_MAX ) + return m_hideEffect; + + switch ( GetBarPlacement() ) + { + case BarPlacement_Top: + return wxSHOW_EFFECT_SLIDE_TO_TOP; + + case BarPlacement_Bottom: + return wxSHOW_EFFECT_SLIDE_TO_BOTTOM; + + default: + wxFAIL_MSG( "unknown info bar placement" ); + // fall through + + case BarPlacement_Unknown: + return wxSHOW_EFFECT_NONE; + } +} + void wxInfoBarGeneric::UpdateParent() { wxWindow * const parent = wxGetTopLevelParent(GetParent()); @@ -172,7 +231,7 @@ void wxInfoBarGeneric::UpdateParent() void wxInfoBarGeneric::DoHide() { - HideWithEffect(m_hideEffect, m_effectDuration); + HideWithEffect(GetHideEffect(), GetEffectDuration()); UpdateParent(); } @@ -198,7 +257,7 @@ void wxInfoBarGeneric::DoShow() // finally do really show the window. - ShowWithEffect(m_showEffect, m_effectDuration); + ShowWithEffect(GetShowEffect(), GetEffectDuration()); } void wxInfoBarGeneric::ShowMessage(const wxString& msg, int flags) -- 2.45.2