Refactor and clean up slider labels drawing code.

This change fixes multiple g++ 4 warnings about unsafe expressions with
bit-wise operators (completely justified, for once, as the expressions were
absolutely incomprehensible and almost certainly incorrect too) and refactors
the determination of where to draw the slider labels in a single function
instead of triplicating it.

Also reformat to follow wxWidgets conventions and use more clear variable
names.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@61719 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2009-08-20 00:44:42 +00:00
parent ffbd0d14a6
commit 4462f911b1

View File

@@ -308,6 +308,52 @@ protected:
virtual wxBitmap GetFrameButtonBitmap(FrameButtonType type);
#if wxUSE_SLIDER
// Fill the arguments with true or false if this slider has labels on
// left/right side (or top/bottom for horizontal sliders) respectively
static
void GetSliderLabelsSides(wxOrientation orient, long style,
bool *left, bool *right)
{
// should we draw ticks at all?
if ( !(style & wxSL_AUTOTICKS) )
{
*left =
*right = false;
return;
}
// should we draw them on both sides?
if ( style & wxSL_BOTH )
{
*left =
*right = true;
return;
}
// we draw them on one side only, determine which one
if ( ((style & wxSL_TOP) && (orient == wxHORIZONTAL)) ||
((style & wxSL_LEFT) && (orient == wxVERTICAL)) )
{
*left = true;
*right = false;
}
else if ( ((style & wxSL_BOTTOM) && (orient == wxHORIZONTAL)) ||
((style & wxSL_RIGHT) && (orient == wxVERTICAL)) )
{
*left = false;
*right = true;
}
else
{
wxFAIL_MSG( "inconsistent wxSlider flags" );
*left =
*right = false;
}
}
#endif // wxUSE_SLIDER
private:
// the sizing parameters (TODO make them changeable)
wxSize m_sizeScrollbarArrow;
@@ -1973,21 +2019,15 @@ wxRect wxWin32Renderer::GetSliderShaftRect(const wxRect& rectOrig,
wxOrientation orient,
long style) const
{
bool transpose = (orient == wxVERTICAL);
bool left = ((style & wxSL_AUTOTICKS) != 0) &
(((style & wxSL_TOP) != 0) & !transpose |
((style & wxSL_LEFT) != 0) & transpose |
((style & wxSL_BOTH) != 0));
bool right = ((style & wxSL_AUTOTICKS) != 0) &
(((style & wxSL_BOTTOM) != 0) & !transpose |
((style & wxSL_RIGHT) != 0) & transpose |
((style & wxSL_BOTH) != 0));
bool left, right;
GetSliderLabelsSides(orient, style, &left, &right);
wxRect rect = rectOrig;
wxSize sizeThumb = GetSliderThumbSize (rect, lenThumb, orient);
if (orient == wxHORIZONTAL) {
if (orient == wxHORIZONTAL)
{
rect.x += SLIDER_MARGIN;
if (left & right)
{
@@ -2004,8 +2044,8 @@ wxRect wxWin32Renderer::GetSliderShaftRect(const wxRect& rectOrig,
rect.width -= 2*SLIDER_MARGIN;
rect.height = 2*BORDER_THICKNESS;
}
else
{ // == wxVERTICAL
else // == wxVERTICAL
{
rect.y += SLIDER_MARGIN;
if (left & right)
{
@@ -2052,9 +2092,8 @@ void wxWin32Renderer::DrawSliderShaft(wxDC& dc,
y1 y2
*/
if (flags & wxCONTROL_FOCUSED) {
if (flags & wxCONTROL_FOCUSED)
DrawFocusRect(NULL, dc, rectOrig);
}
wxRect rect = GetSliderShaftRect(rectOrig, lenThumb, orient, style);
@@ -2098,72 +2137,70 @@ void wxWin32Renderer::DrawSliderThumb(wxDC& dc,
DrawBackground(dc, wxNullColour, rect, flags);
bool transpose = (orient == wxVERTICAL);
bool left = ((style & wxSL_AUTOTICKS) != 0) &
(((style & wxSL_TOP) != 0) & !transpose |
((style & wxSL_LEFT) != 0) & transpose) &
((style & wxSL_BOTH) == 0);
bool right = ((style & wxSL_AUTOTICKS) != 0) &
(((style & wxSL_BOTTOM) != 0) & !transpose |
((style & wxSL_RIGHT) != 0) & transpose) &
((style & wxSL_BOTH) == 0);
bool left, right;
GetSliderLabelsSides(orient, style, &left, &right);
wxCoord sizeArrow = (transpose ? rect.height : rect.width) / 2;
wxCoord c = ((transpose ? rect.height : rect.width) - 2*sizeArrow);
bool isVertical = orient == wxVERTICAL;
wxCoord sizeArrow = (isVertical ? rect.height : rect.width) / 2;
wxCoord c = ((isVertical ? rect.height : rect.width) - 2*sizeArrow);
wxCoord x1, x2, x3, y1, y2, y3, y4;
x1 = (transpose ? rect.y : rect.x);
x2 = (transpose ? rect.GetBottom() : rect.GetRight());
x1 = (isVertical ? rect.y : rect.x);
x2 = (isVertical ? rect.GetBottom() : rect.GetRight());
x3 = (x1-1+c) + sizeArrow;
y1 = (transpose ? rect.x : rect.y);
y2 = (transpose ? rect.GetRight() : rect.GetBottom());
y1 = (isVertical ? rect.x : rect.y);
y2 = (isVertical ? rect.GetRight() : rect.GetBottom());
y3 = (left ? (y1-1+c) + sizeArrow : y1);
y4 = (right ? (y2+1-c) - sizeArrow : y2);
dc.SetPen(m_penBlack);
if (left) {
DrawLine(dc, x3+1-c, y1, x2, y3, transpose);
if (left)
{
DrawLine(dc, x3+1-c, y1, x2, y3, isVertical);
}
DrawLine(dc, x2, y3, x2, y4, transpose);
DrawLine(dc, x2, y3, x2, y4, isVertical);
if (right)
{
DrawLine(dc, x3+1-c, y2, x2, y4, transpose);
DrawLine(dc, x3+1-c, y2, x2, y4, isVertical);
}
else
{
DrawLine(dc, x1, y2, x2, y2, transpose);
DrawLine(dc, x1, y2, x2, y2, isVertical);
}
dc.SetPen(m_penDarkGrey);
DrawLine(dc, x2-1, y3+1, x2-1, y4-1, transpose);
if (right) {
DrawLine(dc, x3+1-c, y2-1, x2-1, y4, transpose);
DrawLine(dc, x2-1, y3+1, x2-1, y4-1, isVertical);
if (right)
{
DrawLine(dc, x3+1-c, y2-1, x2-1, y4, isVertical);
}
else
{
DrawLine(dc, x1+1, y2-1, x2-1, y2-1, transpose);
DrawLine(dc, x1+1, y2-1, x2-1, y2-1, isVertical);
}
dc.SetPen(m_penHighlight);
if (left)
{
DrawLine(dc, x1, y3, x3, y1, transpose);
DrawLine(dc, x3+1-c, y1+1, x2-1, y3, transpose);
DrawLine(dc, x1, y3, x3, y1, isVertical);
DrawLine(dc, x3+1-c, y1+1, x2-1, y3, isVertical);
}
else
{
DrawLine(dc, x1, y1, x2, y1, transpose);
DrawLine(dc, x1, y1, x2, y1, isVertical);
}
DrawLine(dc, x1, y3, x1, y4, transpose);
DrawLine(dc, x1, y3, x1, y4, isVertical);
if (right)
{
DrawLine(dc, x1, y4, x3+c, y2+c, transpose);
DrawLine(dc, x1, y4, x3+c, y2+c, isVertical);
}
if (flags & wxCONTROL_PRESSED) {
if (flags & wxCONTROL_PRESSED)
{
// TODO: MSW fills the entire area inside, not just the rect
wxRect rectInt = rect;
if ( transpose )
if ( isVertical )
{
rectInt.SetLeft(y3);
rectInt.SetRight(y4);
@@ -2237,55 +2274,56 @@ void wxWin32Renderer::DrawSliderTicks(wxDC& dc,
*/
// empty slider?
if (end == start) return;
if ( end == start )
return;
bool transpose = (orient == wxVERTICAL);
bool left = ((style & wxSL_AUTOTICKS) != 0) &
(((style & wxSL_TOP) != 0) & !transpose |
((style & wxSL_LEFT) != 0) & transpose |
((style & wxSL_BOTH) != 0));
bool right = ((style & wxSL_AUTOTICKS) != 0) &
(((style & wxSL_BOTTOM) != 0) & !transpose |
((style & wxSL_RIGHT) != 0) & transpose |
((style & wxSL_BOTH) != 0));
bool left, right;
GetSliderLabelsSides(orient, style, &left, &right);
bool isVertical = orient == wxVERTICAL;
// default thumb size
wxSize sizeThumb = GetSliderThumbSize (rect, 0, orient);
wxCoord defaultLen = (transpose ? sizeThumb.x : sizeThumb.y);
wxCoord defaultLen = (isVertical ? sizeThumb.x : sizeThumb.y);
// normal thumb size
sizeThumb = GetSliderThumbSize (rect, lenThumb, orient);
wxCoord widthThumb = (transpose ? sizeThumb.y : sizeThumb.x);
wxCoord widthThumb = (isVertical ? sizeThumb.y : sizeThumb.x);
wxRect rectShaft = GetSliderShaftRect (rect, lenThumb, orient, style);
wxCoord x1, x2, y1, y2, y3, y4 , len;
x1 = (transpose ? rectShaft.y : rectShaft.x) + widthThumb/2;
x2 = (transpose ? rectShaft.GetBottom() : rectShaft.GetRight()) - widthThumb/2;
y1 = (transpose ? rectShaft.x : rectShaft.y) - defaultLen/2;
y2 = (transpose ? rectShaft.GetRight() : rectShaft.GetBottom()) + defaultLen/2;
y3 = (transpose ? rect.x : rect.y);
y4 = (transpose ? rect.GetRight() : rect.GetBottom());
x1 = (isVertical ? rectShaft.y : rectShaft.x) + widthThumb/2;
x2 = (isVertical ? rectShaft.GetBottom() : rectShaft.GetRight()) - widthThumb/2;
y1 = (isVertical ? rectShaft.x : rectShaft.y) - defaultLen/2;
y2 = (isVertical ? rectShaft.GetRight() : rectShaft.GetBottom()) + defaultLen/2;
y3 = (isVertical ? rect.x : rect.y);
y4 = (isVertical ? rect.GetRight() : rect.GetBottom());
len = x2 - x1;
dc.SetPen(m_penBlack);
int range = end - start;
for ( int n = 0; n < range; n += step ) {
for ( int n = 0; n < range; n += step )
{
wxCoord x = x1 + (len*n) / range;
if (left & (y1 > y3)) {
if (left & (y1 > y3))
{
DrawLine(dc, x, y1, x, y3, orient == wxVERTICAL);
}
if (right & (y4 > y2)) {
if (right & (y4 > y2))
{
DrawLine(dc, x, y2, x, y4, orient == wxVERTICAL);
}
}
// always draw the line at the end position
if (left & (y1 > y3)) {
if (left & (y1 > y3))
{
DrawLine(dc, x2, y1, x2, y3, orient == wxVERTICAL);
}
if (right & (y4 > y2)) {
if (right & (y4 > y2))
{
DrawLine(dc, x2, y2, x2, y4, orient == wxVERTICAL);
}
}