refactor some existing themes methods in a new base wxStdRenderer class (before adding a new theme)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@41289 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -44,351 +44,6 @@
|
||||
// implementation
|
||||
// ============================================================================
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxRenderer: drawing helpers
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
void wxRenderer::StandardDrawFrame(wxDC& dc,
|
||||
const wxRect& rectFrame,
|
||||
const wxRect& rectLabel)
|
||||
{
|
||||
// draw left, bottom and right lines entirely
|
||||
DrawVerticalLine(dc, rectFrame.GetLeft(),
|
||||
rectFrame.GetTop(), rectFrame.GetBottom() - 2);
|
||||
DrawHorizontalLine(dc, rectFrame.GetBottom() - 1,
|
||||
rectFrame.GetLeft(), rectFrame.GetRight());
|
||||
DrawVerticalLine(dc, rectFrame.GetRight() - 1,
|
||||
rectFrame.GetTop(), rectFrame.GetBottom() - 1);
|
||||
|
||||
// and 2 parts of the top line
|
||||
DrawHorizontalLine(dc, rectFrame.GetTop(),
|
||||
rectFrame.GetLeft() + 1, rectLabel.GetLeft());
|
||||
DrawHorizontalLine(dc, rectFrame.GetTop(),
|
||||
rectLabel.GetRight(), rectFrame.GetRight() - 2);
|
||||
}
|
||||
|
||||
/* static */
|
||||
void wxRenderer::StandardDrawTextLine(wxDC& dc,
|
||||
const wxString& text,
|
||||
const wxRect& rect,
|
||||
int selStart, int selEnd,
|
||||
int flags)
|
||||
{
|
||||
if ( (selStart == -1) || !(flags & wxCONTROL_FOCUSED) )
|
||||
{
|
||||
// just draw it as is
|
||||
dc.DrawText(text, rect.x, rect.y);
|
||||
}
|
||||
else // we have selection
|
||||
{
|
||||
wxCoord width,
|
||||
x = rect.x;
|
||||
|
||||
// draw the part before selection
|
||||
wxString s(text, (size_t)selStart);
|
||||
if ( !s.empty() )
|
||||
{
|
||||
dc.DrawText(s, x, rect.y);
|
||||
|
||||
dc.GetTextExtent(s, &width, NULL);
|
||||
x += width;
|
||||
}
|
||||
|
||||
// draw the selection itself
|
||||
s = wxString(text.c_str() + selStart, text.c_str() + selEnd);
|
||||
if ( !s.empty() )
|
||||
{
|
||||
wxColour colFg = dc.GetTextForeground(),
|
||||
colBg = dc.GetTextBackground();
|
||||
dc.SetTextForeground(wxTHEME_COLOUR(HIGHLIGHT_TEXT));
|
||||
dc.SetTextBackground(wxTHEME_COLOUR(HIGHLIGHT));
|
||||
dc.SetBackgroundMode(wxSOLID);
|
||||
|
||||
dc.DrawText(s, x, rect.y);
|
||||
dc.GetTextExtent(s, &width, NULL);
|
||||
x += width;
|
||||
|
||||
dc.SetBackgroundMode(wxTRANSPARENT);
|
||||
dc.SetTextBackground(colBg);
|
||||
dc.SetTextForeground(colFg);
|
||||
}
|
||||
|
||||
// draw the final part
|
||||
s = text.c_str() + selEnd;
|
||||
if ( !s.empty() )
|
||||
{
|
||||
dc.DrawText(s, x, rect.y);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxRenderer: scrollbar geometry
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
#if wxUSE_SCROLLBAR
|
||||
|
||||
/* static */
|
||||
void wxRenderer::StandardScrollBarThumbSize(wxCoord length,
|
||||
int thumbPos,
|
||||
int thumbSize,
|
||||
int range,
|
||||
wxCoord *thumbStart,
|
||||
wxCoord *thumbEnd)
|
||||
{
|
||||
// the thumb can't be made less than this number of pixels
|
||||
static const wxCoord thumbMinWidth = 8; // FIXME: should be configurable
|
||||
|
||||
*thumbStart = (length*thumbPos) / range;
|
||||
*thumbEnd = (length*(thumbPos + thumbSize)) / range;
|
||||
|
||||
if ( *thumbEnd - *thumbStart < thumbMinWidth )
|
||||
{
|
||||
// adjust the end if possible
|
||||
if ( *thumbStart <= length - thumbMinWidth )
|
||||
{
|
||||
// yes, just make it wider
|
||||
*thumbEnd = *thumbStart + thumbMinWidth;
|
||||
}
|
||||
else // it is at the bottom of the scrollbar
|
||||
{
|
||||
// so move it a bit up
|
||||
*thumbStart = length - thumbMinWidth;
|
||||
*thumbEnd = length;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* static */
|
||||
wxRect wxRenderer::StandardGetScrollbarRect(const wxScrollBar *scrollbar,
|
||||
wxScrollBar::Element elem,
|
||||
int thumbPos,
|
||||
const wxSize& sizeArrow)
|
||||
{
|
||||
if ( thumbPos == -1 )
|
||||
{
|
||||
thumbPos = scrollbar->GetThumbPosition();
|
||||
}
|
||||
|
||||
wxSize sizeTotal = scrollbar->GetClientSize();
|
||||
wxCoord *start, *width;
|
||||
wxCoord length, arrow;
|
||||
wxRect rect;
|
||||
if ( scrollbar->IsVertical() )
|
||||
{
|
||||
rect.x = 0;
|
||||
rect.width = sizeTotal.x;
|
||||
length = sizeTotal.y;
|
||||
start = &rect.y;
|
||||
width = &rect.height;
|
||||
arrow = sizeArrow.y;
|
||||
}
|
||||
else // horizontal
|
||||
{
|
||||
rect.y = 0;
|
||||
rect.height = sizeTotal.y;
|
||||
length = sizeTotal.x;
|
||||
start = &rect.x;
|
||||
width = &rect.width;
|
||||
arrow = sizeArrow.x;
|
||||
}
|
||||
|
||||
switch ( elem )
|
||||
{
|
||||
case wxScrollBar::Element_Arrow_Line_1:
|
||||
*start = 0;
|
||||
*width = arrow;
|
||||
break;
|
||||
|
||||
case wxScrollBar::Element_Arrow_Line_2:
|
||||
*start = length - arrow;
|
||||
*width = arrow;
|
||||
break;
|
||||
|
||||
case wxScrollBar::Element_Arrow_Page_1:
|
||||
case wxScrollBar::Element_Arrow_Page_2:
|
||||
// we don't have them at all
|
||||
break;
|
||||
|
||||
case wxScrollBar::Element_Thumb:
|
||||
case wxScrollBar::Element_Bar_1:
|
||||
case wxScrollBar::Element_Bar_2:
|
||||
// we need to calculate the thumb position - do it
|
||||
{
|
||||
length -= 2*arrow;
|
||||
wxCoord thumbStart, thumbEnd;
|
||||
int range = scrollbar->GetRange();
|
||||
if ( !range )
|
||||
{
|
||||
thumbStart =
|
||||
thumbEnd = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
StandardScrollBarThumbSize(length,
|
||||
thumbPos,
|
||||
scrollbar->GetThumbSize(),
|
||||
range,
|
||||
&thumbStart,
|
||||
&thumbEnd);
|
||||
}
|
||||
|
||||
if ( elem == wxScrollBar::Element_Thumb )
|
||||
{
|
||||
*start = thumbStart;
|
||||
*width = thumbEnd - thumbStart;
|
||||
}
|
||||
else if ( elem == wxScrollBar::Element_Bar_1 )
|
||||
{
|
||||
*start = 0;
|
||||
*width = thumbStart;
|
||||
}
|
||||
else // elem == wxScrollBar::Element_Bar_2
|
||||
{
|
||||
*start = thumbEnd;
|
||||
*width = length - thumbEnd;
|
||||
}
|
||||
|
||||
// everything is relative to the start of the shaft so far
|
||||
*start += arrow;
|
||||
}
|
||||
break;
|
||||
|
||||
case wxScrollBar::Element_Max:
|
||||
default:
|
||||
wxFAIL_MSG( _T("unknown scrollbar element") );
|
||||
}
|
||||
|
||||
return rect;
|
||||
}
|
||||
|
||||
/* static */
|
||||
wxCoord wxRenderer::StandardScrollBarSize(const wxScrollBar *scrollbar,
|
||||
const wxSize& sizeArrowSB)
|
||||
{
|
||||
wxCoord sizeArrow, sizeTotal;
|
||||
if ( scrollbar->GetWindowStyle() & wxVERTICAL )
|
||||
{
|
||||
sizeArrow = sizeArrowSB.y;
|
||||
sizeTotal = scrollbar->GetSize().y;
|
||||
}
|
||||
else // horizontal
|
||||
{
|
||||
sizeArrow = sizeArrowSB.x;
|
||||
sizeTotal = scrollbar->GetSize().x;
|
||||
}
|
||||
|
||||
return sizeTotal - 2*sizeArrow;
|
||||
}
|
||||
|
||||
/* static */
|
||||
wxCoord wxRenderer::StandardScrollbarToPixel(const wxScrollBar *scrollbar,
|
||||
int thumbPos,
|
||||
const wxSize& sizeArrow)
|
||||
{
|
||||
int range = scrollbar->GetRange();
|
||||
if ( !range )
|
||||
{
|
||||
// the only valid position anyhow
|
||||
return 0;
|
||||
}
|
||||
|
||||
if ( thumbPos == -1 )
|
||||
{
|
||||
// by default use the current thumb position
|
||||
thumbPos = scrollbar->GetThumbPosition();
|
||||
}
|
||||
|
||||
return ( thumbPos*StandardScrollBarSize(scrollbar, sizeArrow) ) / range
|
||||
+ (scrollbar->IsVertical() ? sizeArrow.y : sizeArrow.x);
|
||||
}
|
||||
|
||||
/* static */
|
||||
int wxRenderer::StandardPixelToScrollbar(const wxScrollBar *scrollbar,
|
||||
wxCoord coord,
|
||||
const wxSize& sizeArrow)
|
||||
{
|
||||
return ( (coord - (scrollbar->IsVertical() ? sizeArrow.y : sizeArrow.x)) *
|
||||
scrollbar->GetRange() ) /
|
||||
StandardScrollBarSize(scrollbar, sizeArrow);
|
||||
}
|
||||
|
||||
/* static */
|
||||
wxHitTest wxRenderer::StandardHitTestScrollbar(const wxScrollBar *scrollbar,
|
||||
const wxPoint& pt,
|
||||
const wxSize& sizeArrowSB)
|
||||
{
|
||||
// we only need to work with either x or y coord depending on the
|
||||
// orientation, choose one (but still check the other one to verify if the
|
||||
// mouse is in the window at all)
|
||||
wxCoord coord, sizeArrow, sizeTotal;
|
||||
wxSize size = scrollbar->GetSize();
|
||||
if ( scrollbar->GetWindowStyle() & wxVERTICAL )
|
||||
{
|
||||
if ( pt.x < 0 || pt.x > size.x )
|
||||
return wxHT_NOWHERE;
|
||||
|
||||
coord = pt.y;
|
||||
sizeArrow = sizeArrowSB.y;
|
||||
sizeTotal = size.y;
|
||||
}
|
||||
else // horizontal
|
||||
{
|
||||
if ( pt.y < 0 || pt.y > size.y )
|
||||
return wxHT_NOWHERE;
|
||||
|
||||
coord = pt.x;
|
||||
sizeArrow = sizeArrowSB.x;
|
||||
sizeTotal = size.x;
|
||||
}
|
||||
|
||||
// test for the arrows first as it's faster
|
||||
if ( coord < 0 || coord > sizeTotal )
|
||||
{
|
||||
return wxHT_NOWHERE;
|
||||
}
|
||||
else if ( coord < sizeArrow )
|
||||
{
|
||||
return wxHT_SCROLLBAR_ARROW_LINE_1;
|
||||
}
|
||||
else if ( coord > sizeTotal - sizeArrow )
|
||||
{
|
||||
return wxHT_SCROLLBAR_ARROW_LINE_2;
|
||||
}
|
||||
else
|
||||
{
|
||||
// calculate the thumb position in pixels
|
||||
sizeTotal -= 2*sizeArrow;
|
||||
wxCoord thumbStart, thumbEnd;
|
||||
int range = scrollbar->GetRange();
|
||||
if ( !range )
|
||||
{
|
||||
// clicking the scrollbar without range has no effect
|
||||
return wxHT_NOWHERE;
|
||||
}
|
||||
else
|
||||
{
|
||||
StandardScrollBarThumbSize(sizeTotal,
|
||||
scrollbar->GetThumbPosition(),
|
||||
scrollbar->GetThumbSize(),
|
||||
range,
|
||||
&thumbStart,
|
||||
&thumbEnd);
|
||||
}
|
||||
|
||||
// now compare with the thumb position
|
||||
coord -= sizeArrow;
|
||||
if ( coord < thumbStart )
|
||||
return wxHT_SCROLLBAR_BAR_1;
|
||||
else if ( coord > thumbEnd )
|
||||
return wxHT_SCROLLBAR_BAR_2;
|
||||
else
|
||||
return wxHT_SCROLLBAR_THUMB;
|
||||
}
|
||||
}
|
||||
|
||||
#endif // wxUSE_SCROLLBAR
|
||||
|
||||
wxRenderer::~wxRenderer()
|
||||
{
|
||||
}
|
||||
@@ -679,10 +334,11 @@ void wxControlRenderer::DrawItems(const wxListBox *lbox,
|
||||
void wxControlRenderer::DoDrawItems(const wxListBox *lbox,
|
||||
size_t itemFirst, size_t itemLast,
|
||||
#if wxUSE_CHECKLISTBOX
|
||||
bool isCheckLbox)
|
||||
bool isCheckLbox
|
||||
#else
|
||||
bool WXUNUSED(isCheckLbox))
|
||||
bool WXUNUSED(isCheckLbox)
|
||||
#endif
|
||||
)
|
||||
{
|
||||
// prepare for the drawing: calc the initial position
|
||||
wxCoord lineHeight = lbox->GetLineHeight();
|
||||
|
||||
Reference in New Issue
Block a user