]> git.saurik.com Git - wxWidgets.git/commitdiff
Refactor and clean up slider labels drawing code.
authorVadim Zeitlin <vadim@wxwidgets.org>
Thu, 20 Aug 2009 00:44:42 +0000 (00:44 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Thu, 20 Aug 2009 00:44:42 +0000 (00:44 +0000)
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

src/univ/themes/win32.cpp

index 8e0a742da84e8aa4e782ec9a814079738fb9f785..37943fb3ef95160772182e384b6f09c555f2bc0d 100644 (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);
+
+    bool isVertical = orient == wxVERTICAL;
 
-    wxCoord sizeArrow = (transpose ? rect.height : rect.width) / 2;
-    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;
-    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;
-
-    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));
+    if ( end == start )
+        return;
+
+    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);
     }
 }