diff options
-rw-r--r-- | include/vcl/slider.hxx | 9 | ||||
-rw-r--r-- | vcl/source/control/slider.cxx | 166 |
2 files changed, 100 insertions, 75 deletions
diff --git a/include/vcl/slider.hxx b/include/vcl/slider.hxx index 4f3677677e3b..a3d3fdbea427 100644 --- a/include/vcl/slider.hxx +++ b/include/vcl/slider.hxx @@ -45,8 +45,9 @@ private: long mnLineSize; long mnPageSize; long mnDelta; - sal_uInt16 mnDragDraw; - sal_uInt16 mnStateFlags; + sal_uInt16 mnDragDraw; + sal_uInt16 mnDrawFlags; + sal_uInt16 mnStateFlags; ScrollType meScrollType; bool mbCalcSize; bool mbFullDrag; @@ -61,7 +62,7 @@ private: SAL_DLLPRIVATE long ImplCalcThumbPos( long nPixPos ); SAL_DLLPRIVATE long ImplCalcThumbPosPix( long nPos ); SAL_DLLPRIVATE void ImplCalc( bool bUpdate = true ); - SAL_DLLPRIVATE void ImplDraw( sal_uInt16 nDrawFlags ); + SAL_DLLPRIVATE void ImplDraw(vcl::RenderContext& rRenderContext, sal_uInt16 nDrawFlags); SAL_DLLPRIVATE bool ImplIsPageUp( const Point& rPos ); SAL_DLLPRIVATE bool ImplIsPageDown( const Point& rPos ); SAL_DLLPRIVATE long ImplSlide( long nNewPos, bool bCallEndSlide ); @@ -77,7 +78,7 @@ public: virtual void MouseButtonUp( const MouseEvent& rMEvt ) SAL_OVERRIDE; virtual void Tracking( const TrackingEvent& rTEvt ) SAL_OVERRIDE; virtual void KeyInput( const KeyEvent& rKEvt ) SAL_OVERRIDE; - virtual void Paint( vcl::RenderContext& rRenderContext, const Rectangle& rRect ) SAL_OVERRIDE; + virtual void Paint(vcl::RenderContext& rRenderContext, const Rectangle& rRect) SAL_OVERRIDE; virtual void Resize() SAL_OVERRIDE; virtual void RequestHelp( const HelpEvent& rHEvt ) SAL_OVERRIDE; virtual void StateChanged( StateChangedType nType ) SAL_OVERRIDE; diff --git a/vcl/source/control/slider.cxx b/vcl/source/control/slider.cxx index ba41c6fc9d3c..ac4418add7d5 100644 --- a/vcl/source/control/slider.cxx +++ b/vcl/source/control/slider.cxx @@ -62,6 +62,7 @@ void Slider::ImplInit( vcl::Window* pParent, WinBits nStyle ) mnPageSize = 1; mnDelta = 0; mnDragDraw = 0; + mnDrawFlags = SLIDER_DRAW_ALL; mnStateFlags = 0; meScrollType = SCROLL_DONTKNOW; mbCalcSize = true; @@ -189,6 +190,7 @@ void Slider::ImplUpdateRects( bool bUpdate ) { if ( aOldThumbRect != maThumbRect ) { + mnDrawFlags = SLIDER_DRAW_ALL; if( bInvalidateAll ) Invalidate(); else @@ -296,145 +298,146 @@ void Slider::ImplCalc( bool bUpdate ) if ( bUpdate && bInvalidateAll ) { + mnDrawFlags = SLIDER_DRAW_ALL; Invalidate(); bUpdate = false; } ImplUpdateRects( bUpdate ); } -void Slider::ImplDraw( sal_uInt16 nDrawFlags ) +void Slider::ImplDraw(vcl::RenderContext& rRenderContext, sal_uInt16 nDrawFlags) { - DecorationView aDecoView( this ); - sal_uInt16 nStyle; - const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); - bool bEnabled = IsEnabled(); + DecorationView aDecoView(&rRenderContext); + sal_uInt16 nStyle; + const StyleSettings& rStyleSettings = rRenderContext.GetSettings().GetStyleSettings(); + bool bEnabled = IsEnabled(); // do missing calculations - if ( mbCalcSize ) - ImplCalc( false ); + if (mbCalcSize) + ImplCalc(false); ControlPart nPart = (GetStyle() & WB_HORZ) ? PART_TRACK_HORZ_AREA : PART_TRACK_VERT_AREA; - ControlState nState = ( IsEnabled() ? ControlState::ENABLED : ControlState::NONE ) | ( HasFocus() ? ControlState::FOCUSED : ControlState::NONE ); - SliderValue sldValue; + ControlState nState = (IsEnabled() ? ControlState::ENABLED : ControlState::NONE); + nState |= (HasFocus() ? ControlState::FOCUSED : ControlState::NONE); + SliderValue sldValue; - sldValue.mnMin = mnMinRange; - sldValue.mnMax = mnMaxRange; - sldValue.mnCur = mnThumbPos; + sldValue.mnMin = mnMinRange; + sldValue.mnMax = mnMaxRange; + sldValue.mnCur = mnThumbPos; sldValue.maThumbRect = maThumbRect; - if( IsMouseOver() ) + if (IsMouseOver()) { - if( maThumbRect.IsInside( GetPointerPosPixel() ) ) + if (maThumbRect.IsInside(GetPointerPosPixel())) sldValue.mnThumbState |= ControlState::ROLLOVER; } - const Rectangle aCtrlRegion( Point(0,0), GetOutputSizePixel() ); - bool bNativeOK = DrawNativeControl( CTRL_SLIDER, nPart, - aCtrlRegion, nState, sldValue, OUString() ); - if( bNativeOK ) + const Rectangle aCtrlRegion(Point(0,0), rRenderContext.GetOutputSizePixel()); + bool bNativeOK = rRenderContext.DrawNativeControl(CTRL_SLIDER, nPart, aCtrlRegion, nState, sldValue, OUString()); + if (bNativeOK) return; - if ( (nDrawFlags & SLIDER_DRAW_CHANNEL1) && !maChannel1Rect.IsEmpty() ) + if ((nDrawFlags & SLIDER_DRAW_CHANNEL1) && !maChannel1Rect.IsEmpty()) { long nRectSize; Rectangle aRect = maChannel1Rect; - SetLineColor( rStyleSettings.GetShadowColor() ); - if ( GetStyle() & WB_HORZ ) + rRenderContext.SetLineColor(rStyleSettings.GetShadowColor()); + if (GetStyle() & WB_HORZ) { - DrawLine( aRect.TopLeft(), Point( aRect.Left(), aRect.Bottom()-1 ) ); - DrawLine( aRect.TopLeft(), aRect.TopRight() ); + rRenderContext.DrawLine(aRect.TopLeft(), Point(aRect.Left(), aRect.Bottom() - 1)); + rRenderContext.DrawLine(aRect.TopLeft(), aRect.TopRight()); } else { - DrawLine( aRect.TopLeft(), Point( aRect.Right()-1, aRect.Top() ) ); - DrawLine( aRect.TopLeft(), aRect.BottomLeft() ); + rRenderContext.DrawLine(aRect.TopLeft(), Point(aRect.Right() - 1, aRect.Top())); + rRenderContext.DrawLine(aRect.TopLeft(), aRect.BottomLeft()); } - SetLineColor( rStyleSettings.GetLightColor() ); - if ( GetStyle() & WB_HORZ ) + rRenderContext.SetLineColor(rStyleSettings.GetLightColor()); + if (GetStyle() & WB_HORZ) { - DrawLine( aRect.BottomLeft(), aRect.BottomRight() ); + rRenderContext.DrawLine(aRect.BottomLeft(), aRect.BottomRight()); nRectSize = aRect.GetWidth(); } else { - DrawLine( aRect.TopRight(), aRect.BottomRight() ); + rRenderContext.DrawLine(aRect.TopRight(), aRect.BottomRight()); nRectSize = aRect.GetHeight(); } - if ( nRectSize > 1 ) + if (nRectSize > 1) { aRect.Left()++; aRect.Top()++; - if ( GetStyle() & WB_HORZ ) + if (GetStyle() & WB_HORZ) aRect.Bottom()--; else aRect.Right()--; - SetLineColor(); - if ( mnStateFlags & SLIDER_STATE_CHANNEL1_DOWN ) - SetFillColor( rStyleSettings.GetShadowColor() ); + rRenderContext.SetLineColor(); + if (mnStateFlags & SLIDER_STATE_CHANNEL1_DOWN) + rRenderContext.SetFillColor(rStyleSettings.GetShadowColor()); else - SetFillColor( rStyleSettings.GetCheckedColor() ); - DrawRect( aRect ); + rRenderContext.SetFillColor(rStyleSettings.GetCheckedColor()); + rRenderContext.DrawRect(aRect); } } - if ( (nDrawFlags & SLIDER_DRAW_CHANNEL2) && !maChannel2Rect.IsEmpty() ) + if ((nDrawFlags & SLIDER_DRAW_CHANNEL2) && !maChannel2Rect.IsEmpty()) { - long nRectSize; - Rectangle aRect = maChannel2Rect; - SetLineColor( rStyleSettings.GetLightColor() ); - if ( GetStyle() & WB_HORZ ) + long nRectSize; + Rectangle aRect = maChannel2Rect; + rRenderContext.SetLineColor(rStyleSettings.GetLightColor()); + if (GetStyle() & WB_HORZ) { - DrawLine( aRect.TopRight(), aRect.BottomRight() ); - DrawLine( aRect.BottomLeft(), aRect.BottomRight() ); + rRenderContext.DrawLine(aRect.TopRight(), aRect.BottomRight()); + rRenderContext.DrawLine(aRect.BottomLeft(), aRect.BottomRight()); nRectSize = aRect.GetWidth(); } else { - DrawLine( aRect.BottomLeft(), aRect.BottomRight() ); - DrawLine( aRect.TopRight(), aRect.BottomRight() ); + rRenderContext.DrawLine(aRect.BottomLeft(), aRect.BottomRight()); + rRenderContext.DrawLine(aRect.TopRight(), aRect.BottomRight()); nRectSize = aRect.GetHeight(); } - if ( nRectSize > 1 ) + if (nRectSize > 1) { - SetLineColor( rStyleSettings.GetShadowColor() ); - if ( GetStyle() & WB_HORZ ) - DrawLine( aRect.TopLeft(), Point( aRect.Right()-1, aRect.Top() ) ); + rRenderContext.SetLineColor(rStyleSettings.GetShadowColor()); + if (GetStyle() & WB_HORZ) + rRenderContext.DrawLine(aRect.TopLeft(), Point(aRect.Right() - 1, aRect.Top())); else - DrawLine( aRect.TopLeft(), Point( aRect.Left(), aRect.Bottom()-1 ) ); + rRenderContext.DrawLine(aRect.TopLeft(), Point(aRect.Left(), aRect.Bottom() - 1)); aRect.Right()--; aRect.Bottom()--; - if ( GetStyle() & WB_HORZ ) + if (GetStyle() & WB_HORZ) aRect.Top()++; else aRect.Left()++; - SetLineColor(); - if ( mnStateFlags & SLIDER_STATE_CHANNEL2_DOWN ) - SetFillColor( rStyleSettings.GetShadowColor() ); + rRenderContext.SetLineColor(); + if (mnStateFlags & SLIDER_STATE_CHANNEL2_DOWN) + rRenderContext.SetFillColor(rStyleSettings.GetShadowColor()); else - SetFillColor( rStyleSettings.GetCheckedColor() ); - DrawRect( aRect ); + rRenderContext.SetFillColor(rStyleSettings.GetCheckedColor()); + rRenderContext.DrawRect(aRect); } } - if ( nDrawFlags & SLIDER_DRAW_THUMB ) + if (nDrawFlags & SLIDER_DRAW_THUMB) { - if ( !maThumbRect.IsEmpty() ) + if (!maThumbRect.IsEmpty()) { - if ( bEnabled ) + if (bEnabled) { nStyle = 0; - if ( mnStateFlags & SLIDER_STATE_THUMB_DOWN ) + if (mnStateFlags & SLIDER_STATE_THUMB_DOWN) nStyle |= BUTTON_DRAW_PRESSED; - aDecoView.DrawButton( maThumbRect, nStyle ); + aDecoView.DrawButton(maThumbRect, nStyle); } else { - SetLineColor( rStyleSettings.GetShadowColor() ); - SetFillColor( rStyleSettings.GetCheckedColor() ); - DrawRect( maThumbRect ); + rRenderContext.SetLineColor(rStyleSettings.GetShadowColor()); + rRenderContext.SetFillColor(rStyleSettings.GetCheckedColor()); + rRenderContext.DrawRect(maThumbRect); } } } @@ -574,12 +577,16 @@ void Slider::ImplDoMouseAction( const Point& rMousePos, bool bCallAction ) if ( mnDragDraw & SLIDER_DRAW_CHANNEL ) { Update(); - ImplDraw( mnDragDraw ); + mnDrawFlags = mnDragDraw; + Invalidate(); } } } else if ( nOldStateFlags != mnStateFlags ) - ImplDraw( mnDragDraw ); + { + mnDrawFlags = mnDragDraw; + Invalidate(); + } } long Slider::ImplDoSlide( long nNewPos ) @@ -675,8 +682,10 @@ void Slider::MouseButtonUp( const MouseEvent& ) mnStateFlags &= ~( SLIDER_STATE_CHANNEL1_DOWN | SLIDER_STATE_CHANNEL2_DOWN | SLIDER_STATE_THUMB_DOWN ); if ( nOldStateFlags != mnStateFlags ) - ImplDraw( mnDragDraw ); - + { + mnDrawFlags = mnDragDraw; + Invalidate(); + } mnDragDraw = 0; ImplDoAction( true ); meScrollType = SCROLL_DONTKNOW; @@ -692,7 +701,10 @@ void Slider::Tracking( const TrackingEvent& rTEvt ) mnStateFlags &= ~(SLIDER_STATE_CHANNEL1_DOWN | SLIDER_STATE_CHANNEL2_DOWN | SLIDER_STATE_THUMB_DOWN); if ( nOldStateFlags != mnStateFlags ) - ImplDraw( mnDragDraw ); + { + mnDrawFlags = mnDragDraw; + Invalidate(); + } mnDragDraw = 0; // on cancel, reset the previous Thumb position @@ -808,9 +820,13 @@ void Slider::KeyInput( const KeyEvent& rKEvt ) Control::KeyInput( rKEvt ); } -void Slider::Paint( vcl::RenderContext& /*rRenderContext*/, const Rectangle& ) +void Slider::Paint(vcl::RenderContext& rRenderContext, const Rectangle& /*rRect*/) { - ImplDraw( SLIDER_DRAW_ALL ); + if (mnDrawFlags) + { + ImplDraw(rRenderContext, mnDrawFlags); + mnDrawFlags = 0; + } } void Slider::Resize() @@ -819,6 +835,7 @@ void Slider::Resize() mbCalcSize = true; if ( IsReallyVisible() ) ImplCalc( false ); + mnDrawFlags = SLIDER_DRAW_ALL; Invalidate(); } @@ -843,13 +860,17 @@ void Slider::StateChanged( StateChangedType nType ) if ( IsReallyVisible() && IsUpdateMode() ) { ImplCalc( false ); + mnDrawFlags = SLIDER_DRAW_ALL; Invalidate(); } } else if ( nType == StateChangedType::Enable ) { if ( IsReallyVisible() && IsUpdateMode() ) + { + mnDrawFlags = SLIDER_DRAW_ALL; Invalidate(); + } } else if ( nType == StateChangedType::Style ) { @@ -860,6 +881,7 @@ void Slider::StateChanged( StateChangedType nType ) { mbCalcSize = true; ImplCalc( false ); + mnDrawFlags = SLIDER_DRAW_ALL; Invalidate(); } } @@ -867,6 +889,7 @@ void Slider::StateChanged( StateChangedType nType ) else if ( nType == StateChangedType::ControlBackground ) { ImplInitSettings(); + mnDrawFlags = SLIDER_DRAW_ALL; Invalidate(); } } @@ -879,6 +902,7 @@ void Slider::DataChanged( const DataChangedEvent& rDCEvt ) (rDCEvt.GetFlags() & AllSettingsFlags::STYLE) ) { ImplInitSettings(); + mnDrawFlags = SLIDER_DRAW_ALL; Invalidate(); } } |