X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/32b1391332e67af96856865ded257aacd6e1e956..4c75209fc3cd4b7f9e2698949e73b64341b56aef:/src/univ/slider.cpp diff --git a/src/univ/slider.cpp b/src/univ/slider.cpp index df73dc6951..25d5e99541 100644 --- a/src/univ/slider.cpp +++ b/src/univ/slider.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////////// -// Name: univ/slider.cpp +// Name: src/univ/slider.cpp // Purpose: implementation of the universal version of wxSlider // Author: Vadim Zeitlin // Modified by: @@ -22,9 +22,9 @@ or right. What we really need is probably a more fine grain control on labels, i.e. we - should be able to select if we show nothign at all, the current value only + should be able to select if we show nothing at all, the current value only or the value and the limits - the current approach is just that of the - greatest common denominator. + lowest common denominator. TODO: @@ -42,23 +42,19 @@ // headers // ---------------------------------------------------------------------------- -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) - #pragma implementation "univslider.h" -#endif - #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif -#ifndef WX_PRECOMP - #include "wx/dc.h" -#endif +#if wxUSE_SLIDER #include "wx/slider.h" -#if wxUSE_SLIDER +#ifndef WX_PRECOMP + #include "wx/dc.h" +#endif #include "wx/univ/renderer.h" #include "wx/univ/inphand.h" @@ -184,7 +180,8 @@ bool wxSlider::ChangeValueBy(int inc) bool wxSlider::ChangeValueTo(int value) { // check if the value is going to change at all - if (value == m_value) return false; + if (value == m_value) + return false; // this method is protected and we should only call it with normalized // value! @@ -194,11 +191,15 @@ bool wxSlider::ChangeValueTo(int value) Refresh(); - // generate the event + // generate the events: both a specific scroll event and a command event + wxScrollEvent eventScroll(wxEVT_SCROLL_CHANGED, GetId()); + eventScroll.SetPosition(m_value); + eventScroll.SetEventObject( this ); + (void)GetEventHandler()->ProcessEvent(eventScroll); + wxCommandEvent event(wxEVT_COMMAND_SLIDER_UPDATED, GetId()); event.SetInt(m_value); event.SetEventObject(this); - (void)GetEventHandler()->ProcessEvent(event); return true; @@ -743,49 +744,80 @@ bool wxSlider::PerformAction(const wxControlAction& action, long numArg, const wxString& strArg) { - if ( action == wxACTION_SLIDER_START ) + wxEventType scrollEvent = wxEVT_NULL; + int value; + bool valueChanged = true; + + if ( action == wxACTION_SLIDER_START ) { - ChangeValueTo(m_min); + scrollEvent = wxEVT_SCROLL_TOP; + value = m_min; } else if ( action == wxACTION_SLIDER_END ) { - ChangeValueTo(m_max); + scrollEvent = wxEVT_SCROLL_BOTTOM; + value = m_max; } else if ( action == wxACTION_SLIDER_PAGE_CHANGE ) { - ChangeValueBy(numArg * GetPageSize()); + value = NormalizeValue(m_value + numArg * GetPageSize()); } else if ( action == wxACTION_SLIDER_LINE_UP ) { - ChangeValueBy(+GetLineSize()); + scrollEvent = wxEVT_SCROLL_LINEUP; + value = NormalizeValue(m_value + +GetLineSize()); } else if ( action == wxACTION_SLIDER_LINE_DOWN ) { - ChangeValueBy(-GetLineSize()); + scrollEvent = wxEVT_SCROLL_LINEDOWN; + value = NormalizeValue(m_value + -GetLineSize()); } else if ( action == wxACTION_SLIDER_PAGE_UP ) { - ChangeValueBy(+GetPageSize()); + scrollEvent = wxEVT_SCROLL_PAGEUP; + value = NormalizeValue(m_value + +GetPageSize()); } else if ( action == wxACTION_SLIDER_PAGE_DOWN ) { - ChangeValueBy(-GetPageSize()); + scrollEvent = wxEVT_SCROLL_PAGEDOWN; + value = NormalizeValue(m_value + -GetPageSize()); } - else if ( action == wxACTION_SLIDER_THUMB_DRAG ) + else if ( action == wxACTION_SLIDER_THUMB_DRAG || + action == wxACTION_SLIDER_THUMB_MOVE ) { - // no special processing for it - return true; + scrollEvent = wxEVT_SCROLL_THUMBTRACK; + + // we shouldn't generate a command event about this change but we still + // should update our value and the slider appearance + valueChanged = false; + m_value = + value = (int)numArg; + Refresh(); } - else if ( action == wxACTION_SLIDER_THUMB_MOVE || - action == wxACTION_SLIDER_THUMB_RELEASE ) + else if ( action == wxACTION_SLIDER_THUMB_RELEASE ) { - ChangeValueTo((int)numArg); + scrollEvent = wxEVT_SCROLL_THUMBRELEASE; + value = (int)numArg; } else { return wxControl::PerformAction(action, numArg, strArg); } + // update wxSlider current value and generate wxCommandEvent, except while + // dragging the thumb + if ( valueChanged ) + ChangeValueTo(value); + + // also generate more precise wxScrollEvent if applicable + if ( scrollEvent != wxEVT_NULL ) + { + wxScrollEvent event(scrollEvent, GetId()); + event.SetPosition(value); + event.SetEventObject( this ); + GetEventHandler()->ProcessEvent(event); + } + return true; } @@ -823,13 +855,13 @@ wxScrollThumb::Shaft wxSlider::HitTest(const wxPoint& pt) const x3 = rectThumb.GetRight(); x4 = rectShaft.GetRight(); } - if ((x1 <= x) & (x < x2)) + if ((x1 <= x) && (x < x2)) { // or to the left return wxScrollThumb::Shaft_Above; } - if ((x3 < x) & (x <= x4)) { + if ((x3 < x) && (x <= x4)) { // or to the right return wxScrollThumb::Shaft_Below; } @@ -952,7 +984,7 @@ bool wxStdSliderButtonInputHandler::HandleKey(wxInputConsumer *consumer, const wxKeyEvent& event, bool pressed) { - if ( pressed ) + if ( pressed ) { int keycode = event.GetKeyCode(); @@ -977,12 +1009,10 @@ bool wxStdSliderButtonInputHandler::HandleKey(wxInputConsumer *consumer, action = wxACTION_SLIDER_LINE_DOWN; break; - case WXK_PRIOR: case WXK_PAGEUP: action = wxACTION_SLIDER_PAGE_UP; break; - case WXK_NEXT: case WXK_PAGEDOWN: action = wxACTION_SLIDER_PAGE_DOWN; break;