X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/344d48020e95c02729404bbd54f2bcbe6a3356f9..3d63970769b32a93061989a38a00a5b6110bc7a5:/src/mac/carbon/slider.cpp diff --git a/src/mac/carbon/slider.cpp b/src/mac/carbon/slider.cpp index 1d66db39e0..6c240067ff 100644 --- a/src/mac/carbon/slider.cpp +++ b/src/mac/carbon/slider.cpp @@ -9,11 +9,11 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "slider.h" #endif -#include "wx/defs.h" +#include "wx/wxprec.h" #if wxUSE_SLIDER @@ -70,7 +70,6 @@ bool wxSlider::Create(wxWindow *parent, wxWindowID id, m_macMaximumStatic = NULL ; m_macValueStatic = NULL ; - m_lineSize = 1; m_tickFreq = 0; @@ -90,11 +89,11 @@ bool wxSlider::Create(wxWindow *parent, wxWindowID id, tickMarks = (maxValue - minValue) + 1; //+1 for the 0 value while (tickMarks > 20) - tickMarks /= 5; //keep the number of tickmarks from becoming unwieldly + tickMarks /= 5; //keep the number of tickmarks from becoming unwieldly m_peer = new wxMacControl() ; verify_noerr ( CreateSliderControl( MAC_WXHWND(parent->MacGetTopLevelWindowRef()) , &bounds , - value , minValue , maxValue , kControlSliderPointsDownOrRight , tickMarks , true /* liveTracking */ , + value , minValue , maxValue , kControlSliderPointsDownOrRight , tickMarks , true /* liveTracking */ , wxMacLiveScrollbarActionUPP , m_peer->GetControlRefAddr() ) ); @@ -124,14 +123,20 @@ bool wxSlider::Create(wxWindow *parent, wxWindowID id, wxSlider::~wxSlider() { - delete m_macMinimumStatic ; - delete m_macMaximumStatic ; - delete m_macValueStatic ; + // this is a special case, as we had to add windows as siblings we are + // responsible for their disposal, but only if we are not part of a DestroyAllChildren + if ( m_parent && m_parent->IsBeingDeleted() == false ) + { + delete m_macMinimumStatic ; + delete m_macMaximumStatic ; + delete m_macValueStatic ; + } } int wxSlider::GetValue() const { - return m_peer->GetValue() ; + // We may need to invert the value returned by the widget + return MacInvertOrNot( m_peer->GetValue() ) ; } void wxSlider::SetValue(int value) @@ -140,7 +145,9 @@ void wxSlider::SetValue(int value) valuestring.Printf( wxT("%d") , value ) ; if ( m_macValueStatic ) m_macValueStatic->SetLabel( valuestring ) ; - m_peer->SetValue( value ) ; + + // We only invert for the setting of the actual native widget + m_peer->SetValue( MacInvertOrNot ( value ) ) ; } void wxSlider::SetRange(int minValue, int maxValue) @@ -154,11 +161,11 @@ void wxSlider::SetRange(int minValue, int maxValue) m_peer->SetMaximum( m_rangeMax); if(m_macMinimumStatic) { - value.Printf(wxT("%d"), m_rangeMin); + value.Printf(wxT("%d"), MacInvertOrNot( m_rangeMin ) ); m_macMinimumStatic->SetLabel(value); } if(m_macMaximumStatic) { - value.Printf(wxT("%d"), m_rangeMax); + value.Printf(wxT("%d"), MacInvertOrNot( m_rangeMax ) ); m_macMaximumStatic->SetLabel(value); } SetValue(m_rangeMin); @@ -245,7 +252,9 @@ void wxSlider::Command (wxCommandEvent & event) void wxSlider::MacHandleControlClick( WXWidget control , wxInt16 controlpart, bool mouseStillDown ) { - SInt16 value = m_peer->GetValue() ; + // Whatever the native value is, we may need to invert it for calling + // SetValue and putting the possibly inverted value in the event + SInt16 value = MacInvertOrNot ( m_peer->GetValue() ) ; SetValue( value ) ; @@ -267,7 +276,9 @@ void wxSlider::MacHandleControlClick( WXWidget control , wxInt16 controlpart, bo wxInt32 wxSlider::MacControlHit( WXEVENTHANDLERREF handler , WXEVENTREF mevent ) { - SInt16 value = m_peer->GetValue() ; + // Whatever the native value is, we may need to invert it for calling + // SetValue and putting the possibly inverted value in the event + SInt16 value = MacInvertOrNot ( m_peer->GetValue() ) ; SetValue( value ) ; @@ -288,20 +299,19 @@ wxInt32 wxSlider::MacControlHit( WXEVENTHANDLERREF handler , WXEVENTREF mevent ) return noErr ; } - /* This is overloaded in wxSlider so that the proper width/height will always be used * for the slider different values would cause redrawing and mouse detection problems */ -void wxSlider::SetSizeHints( int minW, int minH, - int maxW , int maxH , - int incW , int incH ) +void wxSlider::DoSetSizeHints( int minW, int minH, + int maxW , int maxH , + int incW , int incH ) { wxSize size = GetBestSize(); if(GetWindowStyle() & wxSL_VERTICAL) { - wxWindow::SetSizeHints(size.x, minH, size.x, maxH, incW, incH); + wxWindow::DoSetSizeHints(size.x, minH, size.x, maxH, incW, incH); } else { - wxWindow::SetSizeHints(minW, size.y, maxW, size.y, incW, incH); + wxWindow::DoSetSizeHints(minW, size.y, maxW, size.y, incW, incH); } } @@ -316,9 +326,9 @@ wxSize wxSlider::DoGetBestSize() const int ht, wd; // Get maximum text label width and height - text.Printf(wxT("%d"), m_rangeMin); + text.Printf(wxT("%d"), MacInvertOrNot( m_rangeMin ) ); GetTextExtent(text, &textwidth, &textheight); - text.Printf(wxT("%d"), m_rangeMax); + text.Printf(wxT("%d"), MacInvertOrNot( m_rangeMax ) ); GetTextExtent(text, &wd, &ht); if(ht > textheight) { textheight = ht; @@ -378,9 +388,9 @@ void wxSlider::DoSetSize(int x, int y, int w, int h, int sizeFlags) int ht; // Get maximum text label width and height - text.Printf(wxT("%d"), m_rangeMin); + text.Printf(wxT("%d"), MacInvertOrNot( m_rangeMin ) ); GetTextExtent(text, &minValWidth, &textheight); - text.Printf(wxT("%d"), m_rangeMax); + text.Printf(wxT("%d"), MacInvertOrNot( m_rangeMax ) ); GetTextExtent(text, &maxValWidth, &ht); if(ht > textheight) { textheight = ht; @@ -422,10 +432,10 @@ void wxSlider::DoSetSize(int x, int y, int w, int h, int sizeFlags) m_macValueStatic->Move(GetPosition().x + w, GetPosition().y + 0); } } + //If the control has labels, we still need to call this again because //the labels alter the control's w and h values. wxControl::DoSetSize( x, y , w , h ,sizeFlags ) ; - } void wxSlider::DoMoveWindow(int x, int y, int width, int height) @@ -433,4 +443,26 @@ void wxSlider::DoMoveWindow(int x, int y, int width, int height) wxControl::DoMoveWindow(x,y,width,height) ; } +// Common processing to invert slider values based on wxSL_INVERSE +int wxSlider::MacInvertOrNot(int value) const +{ + if (m_windowStyle & wxSL_VERTICAL) + { + // The reason for the backwards logic is that Mac's vertical sliders are + // inverted compared to Windows and GTK, hence we want inversion to be the + // default, and if wxSL_INVERSE is set, then we do not invert (use native) + if (m_windowStyle & wxSL_INVERSE) + return value; + else + return (m_rangeMax + m_rangeMin) - value; + } + else // normal logic applies to HORIZONTAL sliders + { + if (m_windowStyle & wxSL_INVERSE) + return (m_rangeMax + m_rangeMin) - value; + else + return value; + } +} + #endif // wxUSE_SLIDER