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:
@@ -308,6 +308,52 @@ protected:
|
|||||||
|
|
||||||
virtual wxBitmap GetFrameButtonBitmap(FrameButtonType type);
|
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:
|
private:
|
||||||
// the sizing parameters (TODO make them changeable)
|
// the sizing parameters (TODO make them changeable)
|
||||||
wxSize m_sizeScrollbarArrow;
|
wxSize m_sizeScrollbarArrow;
|
||||||
@@ -1973,21 +2019,15 @@ wxRect wxWin32Renderer::GetSliderShaftRect(const wxRect& rectOrig,
|
|||||||
wxOrientation orient,
|
wxOrientation orient,
|
||||||
long style) const
|
long style) const
|
||||||
{
|
{
|
||||||
bool transpose = (orient == wxVERTICAL);
|
bool left, right;
|
||||||
bool left = ((style & wxSL_AUTOTICKS) != 0) &
|
GetSliderLabelsSides(orient, style, &left, &right);
|
||||||
(((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));
|
|
||||||
|
|
||||||
wxRect rect = rectOrig;
|
wxRect rect = rectOrig;
|
||||||
|
|
||||||
wxSize sizeThumb = GetSliderThumbSize (rect, lenThumb, orient);
|
wxSize sizeThumb = GetSliderThumbSize (rect, lenThumb, orient);
|
||||||
|
|
||||||
if (orient == wxHORIZONTAL) {
|
if (orient == wxHORIZONTAL)
|
||||||
|
{
|
||||||
rect.x += SLIDER_MARGIN;
|
rect.x += SLIDER_MARGIN;
|
||||||
if (left & right)
|
if (left & right)
|
||||||
{
|
{
|
||||||
@@ -2004,8 +2044,8 @@ wxRect wxWin32Renderer::GetSliderShaftRect(const wxRect& rectOrig,
|
|||||||
rect.width -= 2*SLIDER_MARGIN;
|
rect.width -= 2*SLIDER_MARGIN;
|
||||||
rect.height = 2*BORDER_THICKNESS;
|
rect.height = 2*BORDER_THICKNESS;
|
||||||
}
|
}
|
||||||
else
|
else // == wxVERTICAL
|
||||||
{ // == wxVERTICAL
|
{
|
||||||
rect.y += SLIDER_MARGIN;
|
rect.y += SLIDER_MARGIN;
|
||||||
if (left & right)
|
if (left & right)
|
||||||
{
|
{
|
||||||
@@ -2052,9 +2092,8 @@ void wxWin32Renderer::DrawSliderShaft(wxDC& dc,
|
|||||||
y1 y2
|
y1 y2
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (flags & wxCONTROL_FOCUSED) {
|
if (flags & wxCONTROL_FOCUSED)
|
||||||
DrawFocusRect(NULL, dc, rectOrig);
|
DrawFocusRect(NULL, dc, rectOrig);
|
||||||
}
|
|
||||||
|
|
||||||
wxRect rect = GetSliderShaftRect(rectOrig, lenThumb, orient, style);
|
wxRect rect = GetSliderShaftRect(rectOrig, lenThumb, orient, style);
|
||||||
|
|
||||||
@@ -2098,72 +2137,70 @@ void wxWin32Renderer::DrawSliderThumb(wxDC& dc,
|
|||||||
|
|
||||||
DrawBackground(dc, wxNullColour, rect, flags);
|
DrawBackground(dc, wxNullColour, rect, flags);
|
||||||
|
|
||||||
bool transpose = (orient == wxVERTICAL);
|
bool left, right;
|
||||||
bool left = ((style & wxSL_AUTOTICKS) != 0) &
|
GetSliderLabelsSides(orient, style, &left, &right);
|
||||||
(((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);
|
|
||||||
|
|
||||||
wxCoord sizeArrow = (transpose ? rect.height : rect.width) / 2;
|
bool isVertical = orient == wxVERTICAL;
|
||||||
wxCoord c = ((transpose ? rect.height : rect.width) - 2*sizeArrow);
|
|
||||||
|
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;
|
wxCoord x1, x2, x3, y1, y2, y3, y4;
|
||||||
x1 = (transpose ? rect.y : rect.x);
|
x1 = (isVertical ? rect.y : rect.x);
|
||||||
x2 = (transpose ? rect.GetBottom() : rect.GetRight());
|
x2 = (isVertical ? rect.GetBottom() : rect.GetRight());
|
||||||
x3 = (x1-1+c) + sizeArrow;
|
x3 = (x1-1+c) + sizeArrow;
|
||||||
y1 = (transpose ? rect.x : rect.y);
|
y1 = (isVertical ? rect.x : rect.y);
|
||||||
y2 = (transpose ? rect.GetRight() : rect.GetBottom());
|
y2 = (isVertical ? rect.GetRight() : rect.GetBottom());
|
||||||
y3 = (left ? (y1-1+c) + sizeArrow : y1);
|
y3 = (left ? (y1-1+c) + sizeArrow : y1);
|
||||||
y4 = (right ? (y2+1-c) - sizeArrow : y2);
|
y4 = (right ? (y2+1-c) - sizeArrow : y2);
|
||||||
|
|
||||||
dc.SetPen(m_penBlack);
|
dc.SetPen(m_penBlack);
|
||||||
if (left) {
|
if (left)
|
||||||
DrawLine(dc, x3+1-c, y1, x2, y3, transpose);
|
{
|
||||||
|
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)
|
if (right)
|
||||||
{
|
{
|
||||||
DrawLine(dc, x3+1-c, y2, x2, y4, transpose);
|
DrawLine(dc, x3+1-c, y2, x2, y4, isVertical);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
DrawLine(dc, x1, y2, x2, y2, transpose);
|
DrawLine(dc, x1, y2, x2, y2, isVertical);
|
||||||
}
|
}
|
||||||
|
|
||||||
dc.SetPen(m_penDarkGrey);
|
dc.SetPen(m_penDarkGrey);
|
||||||
DrawLine(dc, x2-1, y3+1, x2-1, y4-1, transpose);
|
DrawLine(dc, x2-1, y3+1, x2-1, y4-1, isVertical);
|
||||||
if (right) {
|
if (right)
|
||||||
DrawLine(dc, x3+1-c, y2-1, x2-1, y4, transpose);
|
{
|
||||||
|
DrawLine(dc, x3+1-c, y2-1, x2-1, y4, isVertical);
|
||||||
}
|
}
|
||||||
else
|
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);
|
dc.SetPen(m_penHighlight);
|
||||||
if (left)
|
if (left)
|
||||||
{
|
{
|
||||||
DrawLine(dc, x1, y3, x3, y1, transpose);
|
DrawLine(dc, x1, y3, x3, y1, isVertical);
|
||||||
DrawLine(dc, x3+1-c, y1+1, x2-1, y3, transpose);
|
DrawLine(dc, x3+1-c, y1+1, x2-1, y3, isVertical);
|
||||||
}
|
}
|
||||||
else
|
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)
|
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
|
// TODO: MSW fills the entire area inside, not just the rect
|
||||||
wxRect rectInt = rect;
|
wxRect rectInt = rect;
|
||||||
if ( transpose )
|
if ( isVertical )
|
||||||
{
|
{
|
||||||
rectInt.SetLeft(y3);
|
rectInt.SetLeft(y3);
|
||||||
rectInt.SetRight(y4);
|
rectInt.SetRight(y4);
|
||||||
@@ -2237,55 +2274,56 @@ void wxWin32Renderer::DrawSliderTicks(wxDC& dc,
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
// empty slider?
|
// empty slider?
|
||||||
if (end == start) return;
|
if ( end == start )
|
||||||
|
return;
|
||||||
|
|
||||||
bool transpose = (orient == wxVERTICAL);
|
bool left, right;
|
||||||
bool left = ((style & wxSL_AUTOTICKS) != 0) &
|
GetSliderLabelsSides(orient, style, &left, &right);
|
||||||
(((style & wxSL_TOP) != 0) & !transpose |
|
|
||||||
((style & wxSL_LEFT) != 0) & transpose |
|
bool isVertical = orient == wxVERTICAL;
|
||||||
((style & wxSL_BOTH) != 0));
|
|
||||||
bool right = ((style & wxSL_AUTOTICKS) != 0) &
|
|
||||||
(((style & wxSL_BOTTOM) != 0) & !transpose |
|
|
||||||
((style & wxSL_RIGHT) != 0) & transpose |
|
|
||||||
((style & wxSL_BOTH) != 0));
|
|
||||||
|
|
||||||
// default thumb size
|
// default thumb size
|
||||||
wxSize sizeThumb = GetSliderThumbSize (rect, 0, orient);
|
wxSize sizeThumb = GetSliderThumbSize (rect, 0, orient);
|
||||||
wxCoord defaultLen = (transpose ? sizeThumb.x : sizeThumb.y);
|
wxCoord defaultLen = (isVertical ? sizeThumb.x : sizeThumb.y);
|
||||||
|
|
||||||
// normal thumb size
|
// normal thumb size
|
||||||
sizeThumb = GetSliderThumbSize (rect, lenThumb, orient);
|
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);
|
wxRect rectShaft = GetSliderShaftRect (rect, lenThumb, orient, style);
|
||||||
|
|
||||||
wxCoord x1, x2, y1, y2, y3, y4 , len;
|
wxCoord x1, x2, y1, y2, y3, y4 , len;
|
||||||
x1 = (transpose ? rectShaft.y : rectShaft.x) + widthThumb/2;
|
x1 = (isVertical ? rectShaft.y : rectShaft.x) + widthThumb/2;
|
||||||
x2 = (transpose ? rectShaft.GetBottom() : rectShaft.GetRight()) - widthThumb/2;
|
x2 = (isVertical ? rectShaft.GetBottom() : rectShaft.GetRight()) - widthThumb/2;
|
||||||
y1 = (transpose ? rectShaft.x : rectShaft.y) - defaultLen/2;
|
y1 = (isVertical ? rectShaft.x : rectShaft.y) - defaultLen/2;
|
||||||
y2 = (transpose ? rectShaft.GetRight() : rectShaft.GetBottom()) + defaultLen/2;
|
y2 = (isVertical ? rectShaft.GetRight() : rectShaft.GetBottom()) + defaultLen/2;
|
||||||
y3 = (transpose ? rect.x : rect.y);
|
y3 = (isVertical ? rect.x : rect.y);
|
||||||
y4 = (transpose ? rect.GetRight() : rect.GetBottom());
|
y4 = (isVertical ? rect.GetRight() : rect.GetBottom());
|
||||||
len = x2 - x1;
|
len = x2 - x1;
|
||||||
|
|
||||||
dc.SetPen(m_penBlack);
|
dc.SetPen(m_penBlack);
|
||||||
|
|
||||||
int range = end - start;
|
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;
|
wxCoord x = x1 + (len*n) / range;
|
||||||
|
|
||||||
if (left & (y1 > y3)) {
|
if (left & (y1 > y3))
|
||||||
|
{
|
||||||
DrawLine(dc, x, y1, x, y3, orient == wxVERTICAL);
|
DrawLine(dc, x, y1, x, y3, orient == wxVERTICAL);
|
||||||
}
|
}
|
||||||
if (right & (y4 > y2)) {
|
if (right & (y4 > y2))
|
||||||
|
{
|
||||||
DrawLine(dc, x, y2, x, y4, orient == wxVERTICAL);
|
DrawLine(dc, x, y2, x, y4, orient == wxVERTICAL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// always draw the line at the end position
|
// always draw the line at the end position
|
||||||
if (left & (y1 > y3)) {
|
if (left & (y1 > y3))
|
||||||
|
{
|
||||||
DrawLine(dc, x2, y1, x2, y3, orient == wxVERTICAL);
|
DrawLine(dc, x2, y1, x2, y3, orient == wxVERTICAL);
|
||||||
}
|
}
|
||||||
if (right & (y4 > y2)) {
|
if (right & (y4 > y2))
|
||||||
|
{
|
||||||
DrawLine(dc, x2, y2, x2, y4, orient == wxVERTICAL);
|
DrawLine(dc, x2, y2, x2, y4, orient == wxVERTICAL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user