Centre labels above and below vertical wxSlider

Improve label position for specific combinations of wxSlider styles.
This commit is contained in:
Maarten Bent
2019-01-31 20:19:12 +01:00
parent 0e82488300
commit 94f3d567c8

View File

@@ -401,10 +401,10 @@ void wxSlider::DoMoveWindow(int x, int y, int width, int height)
} }
int tickOffset = 0; int tickOffset = 0;
if ( HasFlag(wxSL_TICKS)) if ( HasFlag(wxSL_TICKS) )
tickOffset = TICK; tickOffset = TICK;
if ( HasFlag(wxSL_BOTH)) if ( HasFlag(wxSL_BOTH) )
tickOffset *= 2; tickOffset *= 2;
// be careful to position the slider itself after moving the labels as // be careful to position the slider itself after moving the labels as
// otherwise our GetBoundingBox(), which is called from WM_SIZE handler, // otherwise our GetBoundingBox(), which is called from WM_SIZE handler,
@@ -419,7 +419,7 @@ void wxSlider::DoMoveWindow(int x, int y, int width, int height)
sliderOffset += longestLabelWidth + HGAP; sliderOffset += longestLabelWidth + HGAP;
} }
int labelHeightUsed = 0 ; int labelHeightUsed = 0;
if ( HasFlag(wxSL_MIN_MAX_LABELS) ) if ( HasFlag(wxSL_MIN_MAX_LABELS) )
{ {
@@ -429,9 +429,12 @@ void wxSlider::DoMoveWindow(int x, int y, int width, int height)
if ( HasFlag(wxSL_LEFT) ) if ( HasFlag(wxSL_LEFT) )
{ {
// Label aligned to the left edge of the slider. // Label aligned to the left edge of the slider.
xPos = sliderOffset + tickOffset; xPos = sliderOffset + THUMB / 2;
holdTopX = xPos; if ( HasFlag(wxSL_TICKS) )
holdBottomX = xPos; xPos += TICK;
holdTopX = xPos - minLabelWidth / 2;
holdBottomX = xPos - maxLabelWidth / 2;
if ( holdTopX + minLabelWidth > width ) if ( holdTopX + minLabelWidth > width )
holdTopX = width - minLabelWidth; holdTopX = width - minLabelWidth;
if ( holdBottomX + maxLabelWidth > width ) if ( holdBottomX + maxLabelWidth > width )
@@ -440,24 +443,18 @@ void wxSlider::DoMoveWindow(int x, int y, int width, int height)
else // wxSL_RIGHT else // wxSL_RIGHT
{ {
// Label aligned to the right edge of the slider. // Label aligned to the right edge of the slider.
if ( HasFlag(wxSL_BOTH) ) xPos = sliderOffset + THUMB / 2;
xPos = sliderOffset + THUMB + tickOffset/2; if ( HasFlag(wxSL_TICKS) && HasFlag(wxSL_BOTH) )
else xPos += TICK;
xPos = sliderOffset + THUMB;
holdTopX = xPos - minLabelWidth; holdTopX = xPos - minLabelWidth / 2;
holdBottomX = xPos - maxLabelWidth; holdBottomX = xPos - maxLabelWidth / 2;
if ( holdTopX < 0 ) if ( holdTopX < 0 )
holdTopX = 0; holdTopX = 0;
if ( holdBottomX < 0 ) if ( holdBottomX < 0 )
holdBottomX = 0; holdBottomX = 0;
} }
if ( HasFlag(wxSL_INVERSE) )
{
wxSwap(holdTopX, holdBottomX);
}
DoMoveSibling((HWND)(*m_labels)[SliderLabel_Min], DoMoveSibling((HWND)(*m_labels)[SliderLabel_Min],
x + holdTopX, x + holdTopX,
y, y,
@@ -467,14 +464,14 @@ void wxSlider::DoMoveWindow(int x, int y, int width, int height)
y + height - labelHeight, y + height - labelHeight,
maxLabelWidth, labelHeight); maxLabelWidth, labelHeight);
labelHeightUsed = labelHeight ; labelHeightUsed = labelHeight;
} }
if ( HasFlag(wxSL_VALUE_LABEL) ) if ( HasFlag(wxSL_VALUE_LABEL) )
{ {
DoMoveSibling((HWND)(*m_labels)[SliderLabel_Value], DoMoveSibling((HWND)(*m_labels)[SliderLabel_Value],
x + ( HasFlag(wxSL_LEFT) ? THUMB + tickOffset + HGAP : 0 ), x + ( HasFlag(wxSL_LEFT) ? THUMB + tickOffset + HGAP : 0 ),
y + (height - labelHeight)/2, y + (height - labelHeight) / 2,
longestLabelWidth, labelHeight); longestLabelWidth, labelHeight);
} }
@@ -488,20 +485,20 @@ void wxSlider::DoMoveWindow(int x, int y, int width, int height)
else // horizontal else // horizontal
{ {
int yLabelMinMax = int yLabelMinMax =
(y + ((THUMB + tickOffset) / 2)) - (labelHeight / 2); ((THUMB + tickOffset) / 2) - (labelHeight / 2);
int xLabelValue = int xLabelValue =
x + minLabelWidth + minLabelWidth +
((width - (minLabelWidth + maxLabelWidth)) / 2) - ((width - (minLabelWidth + maxLabelWidth)) / 2) -
(longestLabelWidth / 2); (longestLabelWidth / 2);
int ySlider = y; int ySlider = 0;
int minLabelWidthUsed = 0 ; int minLabelWidthUsed = 0;
int maxLabelWidthUsed = 0 ; int maxLabelWidthUsed = 0;
if ( HasFlag(wxSL_VALUE_LABEL) ) if ( HasFlag(wxSL_VALUE_LABEL) )
{ {
DoMoveSibling((HWND)(*m_labels)[SliderLabel_Value], DoMoveSibling((HWND)(*m_labels)[SliderLabel_Value],
xLabelValue, x + xLabelValue,
y + (HasFlag(wxSL_BOTTOM) ? 0 : THUMB + tickOffset), y + (HasFlag(wxSL_BOTTOM) ? 0 : THUMB + tickOffset),
longestLabelWidth, labelHeight); longestLabelWidth, labelHeight);
@@ -516,21 +513,21 @@ void wxSlider::DoMoveWindow(int x, int y, int width, int height)
{ {
DoMoveSibling((HWND)(*m_labels)[SliderLabel_Min], DoMoveSibling((HWND)(*m_labels)[SliderLabel_Min],
x, x,
yLabelMinMax, y + yLabelMinMax,
minLabelWidth, labelHeight); minLabelWidth, labelHeight);
DoMoveSibling((HWND)(*m_labels)[SliderLabel_Max], DoMoveSibling((HWND)(*m_labels)[SliderLabel_Max],
x + width - maxLabelWidth, x + width - maxLabelWidth,
yLabelMinMax, y + yLabelMinMax,
maxLabelWidth, labelHeight); maxLabelWidth, labelHeight);
minLabelWidthUsed = minLabelWidth + VGAP ; minLabelWidthUsed = minLabelWidth + VGAP;
maxLabelWidthUsed = maxLabelWidth + VGAP ; maxLabelWidthUsed = maxLabelWidth + VGAP;
} }
// position the slider itself along the top/bottom edge // position the slider itself along the top/bottom edge
wxSliderBase::DoMoveWindow( wxSliderBase::DoMoveWindow(
x + minLabelWidthUsed, x + minLabelWidthUsed,
ySlider, y + ySlider,
width - (minLabelWidthUsed + maxLabelWidthUsed), width - (minLabelWidthUsed + maxLabelWidthUsed),
THUMB + tickOffset); THUMB + tickOffset);
} }
@@ -559,7 +556,7 @@ wxSize wxSlider::DoGetBestSize() const
if ( HasFlag(wxSL_VALUE_LABEL) ) if ( HasFlag(wxSL_VALUE_LABEL) )
size.x += longestLabelWidth + HGAP; size.x += longestLabelWidth + HGAP;
if (HasFlag(wxSL_MIN_MAX_LABELS)) if ( HasFlag(wxSL_MIN_MAX_LABELS) )
{ {
size.x = wxMax(size.x, longestLabelWidth); size.x = wxMax(size.x, longestLabelWidth);
size.y += hLabel * 2; size.y += hLabel * 2;