Fixed label positions for horizontal slider [ modified patch 1102150 ], fixed value label position for vertical slider, added logic in constructor for choosing vertical or horizontal based on LEFT/RIGHT/TOP/BOTTOM etc. copied from MSW; without this, the widgets sample slider tab can't show the vertical slider because using LEFT or RIGHT doesn't cause the slider to go vertical.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@34977 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Kevin Hock
2005-07-29 05:19:50 +00:00
parent 56d74412d9
commit c6732f7f2f

View File

@@ -59,6 +59,34 @@ bool wxSlider::Create(wxWindow *parent, wxWindowID id,
{ {
m_macIsUserPane = false ; m_macIsUserPane = false ;
// our styles are redundant: wxSL_LEFT/RIGHT imply wxSL_VERTICAL and
// wxSL_TOP/BOTTOM imply wxSL_HORIZONTAL, but for backwards compatibility
// reasons we can't really change it, instead try to infer the orientation
// from the flags given to us here
switch ( style & (wxSL_LEFT | wxSL_RIGHT | wxSL_TOP | wxSL_BOTTOM) )
{
case wxSL_LEFT:
case wxSL_RIGHT:
style |= wxSL_VERTICAL;
break;
case wxSL_TOP:
case wxSL_BOTTOM:
style |= wxSL_HORIZONTAL;
break;
case 0:
// no specific direction, do we have at least the orientation?
if ( !(style & (wxSL_HORIZONTAL | wxSL_VERTICAL)) )
{
// no, choose default
style |= wxSL_BOTTOM | wxSL_HORIZONTAL;
}
};
wxASSERT_MSG( !(style & wxSL_VERTICAL) | !(style & wxSL_HORIZONTAL),
_T("incompatible slider direction and orientation") );
if ( !wxControl::Create(parent, id, pos, size, style, validator, name) ) if ( !wxControl::Create(parent, id, pos, size, style, validator, name) )
return false; return false;
@@ -92,7 +120,6 @@ bool wxSlider::Create(wxWindow *parent, wxWindowID id,
value , minValue , maxValue , kControlSliderPointsDownOrRight , tickMarks , true /* liveTracking */ , value , minValue , maxValue , kControlSliderPointsDownOrRight , tickMarks , true /* liveTracking */ ,
GetwxMacLiveScrollbarActionProc() , m_peer->GetControlRefAddr() ) ); GetwxMacLiveScrollbarActionProc() , m_peer->GetControlRefAddr() ) );
if(style & wxSL_VERTICAL) { if(style & wxSL_VERTICAL) {
SetSizeHints(10, -1, 10, -1); // Forces SetSize to use the proper width SetSizeHints(10, -1, 10, -1); // Forces SetSize to use the proper width
} }
@@ -314,23 +341,31 @@ void wxSlider::DoSetSizeHints( int minW, int minH,
wxSize wxSlider::DoGetBestSize() const wxSize wxSlider::DoGetBestSize() const
{ {
wxSize size; wxSize size;
int textwidth, textheight; int textwidth = 0;
int textheight = 0;
int mintwidth, mintheight;
int maxtwidth, maxtheight;
if(GetWindowStyle() & wxSL_LABELS) if(GetWindowStyle() & wxSL_LABELS)
{ {
wxString text; wxString text;
int ht, wd;
// Get maximum text label width and height // Get maximum text label width and height
text.Printf(wxT("%d"), ValueInvertOrNot( m_rangeMin ) ); text.Printf(wxT("%d"), ValueInvertOrNot( m_rangeMin ) );
GetTextExtent(text, &textwidth, &textheight); GetTextExtent(text, &mintwidth, &mintheight);
text.Printf(wxT("%d"), ValueInvertOrNot( m_rangeMax ) ); text.Printf(wxT("%d"), ValueInvertOrNot( m_rangeMax ) );
GetTextExtent(text, &wd, &ht); GetTextExtent(text, &maxtwidth, &maxtheight);
if(ht > textheight) { if(maxtheight > mintheight) {
textheight = ht; textheight = maxtheight;
} }
if (wd > textwidth) { else {
textwidth = wd; textheight = mintheight;
}
if (maxtwidth > mintwidth) {
textwidth = maxtwidth;
}
else {
textwidth = mintwidth;
} }
} }
@@ -355,10 +390,13 @@ wxSize wxSlider::DoGetBestSize() const
else { else {
size.y = wxSLIDER_DIMENSIONACROSS_ARROW; size.y = wxSLIDER_DIMENSIONACROSS_ARROW;
} }
size.x = 150;
if(GetWindowStyle() & wxSL_LABELS) { if(GetWindowStyle() & wxSL_LABELS) {
size.y += textheight + wxSLIDER_BORDERTEXT; size.y += textheight + wxSLIDER_BORDERTEXT;
size.x += (mintwidth/2) + (maxtwidth/2);
} }
size.x = 150;
} }
return size; return size;
} }
@@ -366,7 +404,7 @@ wxSize wxSlider::DoGetBestSize() const
void wxSlider::DoSetSize(int x, int y, int w, int h, int sizeFlags) void wxSlider::DoSetSize(int x, int y, int w, int h, int sizeFlags)
{ {
int xborder, yborder; int xborder, yborder;
int minValWidth, maxValWidth, textwidth, textheight; int minValWidth, maxValWidth, textheight;
int sliderBreadth; int sliderBreadth;
int width = w; int width = w;
@@ -374,6 +412,32 @@ void wxSlider::DoSetSize(int x, int y, int w, int h, int sizeFlags)
if (GetWindowStyle() & wxSL_LABELS) if (GetWindowStyle() & wxSL_LABELS)
{ {
wxString text;
int ht, valValWidth;
// Get maximum text label width and height
text.Printf(wxT("%d"), ValueInvertOrNot( m_rangeMin ) );
GetTextExtent(text, &minValWidth, &textheight);
text.Printf(wxT("%d"), ValueInvertOrNot( m_rangeMax ) );
GetTextExtent(text, &maxValWidth, &ht);
if(ht > textheight) {
textheight = ht;
}
if(GetWindowStyle() & wxSL_HORIZONTAL)
{
if ( m_macMinimumStatic ) {
w-=minValWidth/2;
x+=minValWidth/2;
}
if ( m_macMaximumStatic ) {
w-=maxValWidth/2;
}
}
//Labels have this control's parent as their parent //Labels have this control's parent as their parent
//so if this control is not at 0,0 relative to the parent //so if this control is not at 0,0 relative to the parent
//the labels need to know the position of this control //the labels need to know the position of this control
@@ -381,20 +445,19 @@ void wxSlider::DoSetSize(int x, int y, int w, int h, int sizeFlags)
//move the control first so we can use GetPosition() //move the control first so we can use GetPosition()
wxControl::DoSetSize( x, y , w , h ,sizeFlags ) ; wxControl::DoSetSize( x, y , w , h ,sizeFlags ) ;
wxString text; // If vertical, use current value
int ht; if(GetWindowStyle() & wxSL_VERTICAL)
{
// Get maximum text label width and height text.Printf(wxT("%d"), (int)m_peer->GetValue());
text.Printf(wxT("%d"), ValueInvertOrNot( m_rangeMin ) ); }
GetTextExtent(text, &minValWidth, &textheight); // Use max so that the current value doesn't drift as centering would need to change
text.Printf(wxT("%d"), ValueInvertOrNot( m_rangeMax ) ); else
GetTextExtent(text, &maxValWidth, &ht); {
if(ht > textheight) { text.Printf(wxT("%d"), m_rangeMax);
textheight = ht;
} }
textwidth = (minValWidth > maxValWidth ? minValWidth : maxValWidth);
xborder = textwidth + wxSLIDER_BORDERTEXT; GetTextExtent(text, &valValWidth, &ht);
yborder = textheight + wxSLIDER_BORDERTEXT; yborder = textheight + wxSLIDER_BORDERTEXT;
// Get slider breadth // Get slider breadth
@@ -410,23 +473,20 @@ void wxSlider::DoSetSize(int x, int y, int w, int h, int sizeFlags)
h = h - yborder ; h = h - yborder ;
if ( m_macMinimumStatic ) if ( m_macMinimumStatic )
m_macMinimumStatic->Move(GetPosition().x + sliderBreadth + wxSLIDER_BORDERTEXT, m_macMinimumStatic->Move(GetPosition().x + sliderBreadth + wxSLIDER_BORDERTEXT, GetPosition().y + h - yborder);
GetPosition().y + h - yborder);
if ( m_macMaximumStatic ) if ( m_macMaximumStatic )
m_macMaximumStatic->Move(GetPosition().x + sliderBreadth + wxSLIDER_BORDERTEXT, GetPosition().y + 0); m_macMaximumStatic->Move(GetPosition().x + sliderBreadth + wxSLIDER_BORDERTEXT, GetPosition().y + 0);
if ( m_macValueStatic ) if ( m_macValueStatic )
m_macValueStatic->Move(GetPosition().x, GetPosition().y + h ); m_macValueStatic->Move(GetPosition().x + sliderBreadth + wxSLIDER_BORDERTEXT, GetPosition().y + (h/2) - (ht/2));
} }
else else
{ {
w = w - xborder ;
if ( m_macMinimumStatic ) if ( m_macMinimumStatic )
m_macMinimumStatic->Move(GetPosition().x + 0, GetPosition().y + sliderBreadth + wxSLIDER_BORDERTEXT); m_macMinimumStatic->Move(GetPosition().x, GetPosition().y + sliderBreadth + wxSLIDER_BORDERTEXT);
if ( m_macMaximumStatic ) if ( m_macMaximumStatic )
m_macMaximumStatic->Move(GetPosition().x + w - (maxValWidth/2), m_macMaximumStatic->Move(GetPosition().x + w - maxValWidth, GetPosition().y + sliderBreadth + wxSLIDER_BORDERTEXT);
GetPosition().y + sliderBreadth + wxSLIDER_BORDERTEXT);
if ( m_macValueStatic ) if ( m_macValueStatic )
m_macValueStatic->Move(GetPosition().x + w, GetPosition().y + 0); m_macValueStatic->Move(GetPosition().x + (w/2) - (valValWidth/2), GetPosition().y + sliderBreadth + wxSLIDER_BORDERTEXT);
} }
} }