]> git.saurik.com Git - wxWidgets.git/commitdiff
Determine the appropriate show effect automatically in wxInfoBar.
authorVadim Zeitlin <vadim@wxwidgets.org>
Mon, 5 Oct 2009 22:57:45 +0000 (22:57 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Mon, 5 Oct 2009 22:57:45 +0000 (22:57 +0000)
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
interface/wx/infobar.h
src/generic/infobar.cpp

index 16cf5d4ab08657b752733fd3e06832dae4bc4ebd..43f9108c9a2ecd735f288efbea250d41336cdd1d 100644 (file)
@@ -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;
index f79f3b110dcff767eec0d283017d4bdb26f64cb3..76694ae057e02769b836ce5f228ebc9212d19c28 100644 (file)
@@ -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);
 
index a85ead0f40cbf488098b743a3c1f1e105de78137..2cc7b5e164230ac41367b12e0e936c3a7c756196 100644 (file)
@@ -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)