}
// 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; }
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;
@since 2.9.1
*/
-class wxInfoBar : public wxWindow
+class wxInfoBar : public wxControl
{
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);
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;
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());
void wxInfoBarGeneric::DoHide()
{
- HideWithEffect(m_hideEffect, m_effectDuration);
+ HideWithEffect(GetHideEffect(), GetEffectDuration());
UpdateParent();
}
// finally do really show the window.
- ShowWithEffect(m_showEffect, m_effectDuration);
+ ShowWithEffect(GetShowEffect(), GetEffectDuration());
}
void wxInfoBarGeneric::ShowMessage(const wxString& msg, int flags)