align the items correctly with wxLC_ALIGN_TOP
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@23587 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
parent
13602ebd04
commit
94dd23aebc
@ -282,6 +282,18 @@ public:
|
||||
|
||||
// the part to be highlighted
|
||||
wxRect m_rectHighlight;
|
||||
|
||||
// extend all our rects to be centered inside theo ne of given width
|
||||
void ExtendWidth(wxCoord w)
|
||||
{
|
||||
wxASSERT_MSG( m_rectAll.width <= w,
|
||||
_T("width can only be increased") );
|
||||
|
||||
m_rectAll.width = w;
|
||||
m_rectLabel.x = m_rectAll.x + (w - m_rectLabel.width)/2;
|
||||
m_rectIcon.x = m_rectAll.x + (w - m_rectIcon.width)/2;
|
||||
m_rectHighlight.x = m_rectAll.x + (w - m_rectHighlight.width)/2;
|
||||
}
|
||||
} *m_gi;
|
||||
|
||||
// is this item selected? [NB: not used in virtual mode]
|
||||
@ -1115,96 +1127,93 @@ void wxListLineData::CalculateSize( wxDC *dc, int spacing )
|
||||
|
||||
wxListItemData *item = node->GetData();
|
||||
|
||||
wxString s;
|
||||
wxCoord lw, lh;
|
||||
|
||||
switch ( GetMode() )
|
||||
{
|
||||
case wxLC_ICON:
|
||||
case wxLC_SMALL_ICON:
|
||||
m_gi->m_rectAll.width = spacing;
|
||||
|
||||
s = item->GetText();
|
||||
|
||||
if ( s.empty() )
|
||||
{
|
||||
m_gi->m_rectAll.width = spacing;
|
||||
|
||||
wxString s = item->GetText();
|
||||
|
||||
wxCoord lw, lh;
|
||||
if ( s.empty() )
|
||||
{
|
||||
lh =
|
||||
m_gi->m_rectLabel.width =
|
||||
m_gi->m_rectLabel.height = 0;
|
||||
}
|
||||
else // has label
|
||||
{
|
||||
dc->GetTextExtent( s, &lw, &lh );
|
||||
if (lh < SCROLL_UNIT_Y)
|
||||
lh = SCROLL_UNIT_Y;
|
||||
lw += EXTRA_WIDTH;
|
||||
lh += EXTRA_HEIGHT;
|
||||
|
||||
m_gi->m_rectAll.height = spacing + lh;
|
||||
if (lw > spacing)
|
||||
m_gi->m_rectAll.width = lw;
|
||||
|
||||
m_gi->m_rectLabel.width = lw;
|
||||
m_gi->m_rectLabel.height = lh;
|
||||
}
|
||||
|
||||
if (item->HasImage())
|
||||
{
|
||||
int w, h;
|
||||
m_owner->GetImageSize( item->GetImage(), w, h );
|
||||
m_gi->m_rectIcon.width = w + 8;
|
||||
m_gi->m_rectIcon.height = h + 8;
|
||||
|
||||
if ( m_gi->m_rectIcon.width > m_gi->m_rectAll.width )
|
||||
m_gi->m_rectAll.width = m_gi->m_rectIcon.width;
|
||||
if ( m_gi->m_rectIcon.height + lh > m_gi->m_rectAll.height - 4 )
|
||||
m_gi->m_rectAll.height = m_gi->m_rectIcon.height + lh + 4;
|
||||
}
|
||||
|
||||
if ( item->HasText() )
|
||||
{
|
||||
m_gi->m_rectHighlight.width = m_gi->m_rectLabel.width;
|
||||
m_gi->m_rectHighlight.height = m_gi->m_rectLabel.height;
|
||||
}
|
||||
else // no text, highlight the icon
|
||||
{
|
||||
m_gi->m_rectHighlight.width = m_gi->m_rectIcon.width;
|
||||
m_gi->m_rectHighlight.height = m_gi->m_rectIcon.height;
|
||||
}
|
||||
lh =
|
||||
m_gi->m_rectLabel.width =
|
||||
m_gi->m_rectLabel.height = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case wxLC_LIST:
|
||||
else // has label
|
||||
{
|
||||
wxString s = item->GetTextForMeasuring();
|
||||
|
||||
wxCoord lw,lh;
|
||||
dc->GetTextExtent( s, &lw, &lh );
|
||||
if (lh < SCROLL_UNIT_Y)
|
||||
lh = SCROLL_UNIT_Y;
|
||||
lw += EXTRA_WIDTH;
|
||||
lh += EXTRA_HEIGHT;
|
||||
|
||||
m_gi->m_rectAll.height = spacing + lh;
|
||||
if (lw > spacing)
|
||||
m_gi->m_rectAll.width = lw;
|
||||
|
||||
m_gi->m_rectLabel.width = lw;
|
||||
m_gi->m_rectLabel.height = lh;
|
||||
|
||||
m_gi->m_rectAll.width = lw;
|
||||
m_gi->m_rectAll.height = lh;
|
||||
|
||||
if (item->HasImage())
|
||||
{
|
||||
int w, h;
|
||||
m_owner->GetImageSize( item->GetImage(), w, h );
|
||||
m_gi->m_rectIcon.width = w;
|
||||
m_gi->m_rectIcon.height = h;
|
||||
|
||||
m_gi->m_rectAll.width += 4 + w;
|
||||
if (h > m_gi->m_rectAll.height)
|
||||
m_gi->m_rectAll.height = h;
|
||||
}
|
||||
|
||||
m_gi->m_rectHighlight.width = m_gi->m_rectAll.width;
|
||||
m_gi->m_rectHighlight.height = m_gi->m_rectAll.height;
|
||||
}
|
||||
|
||||
if (item->HasImage())
|
||||
{
|
||||
int w, h;
|
||||
m_owner->GetImageSize( item->GetImage(), w, h );
|
||||
m_gi->m_rectIcon.width = w + 8;
|
||||
m_gi->m_rectIcon.height = h + 8;
|
||||
|
||||
if ( m_gi->m_rectIcon.width > m_gi->m_rectAll.width )
|
||||
m_gi->m_rectAll.width = m_gi->m_rectIcon.width;
|
||||
if ( m_gi->m_rectIcon.height + lh > m_gi->m_rectAll.height - 4 )
|
||||
m_gi->m_rectAll.height = m_gi->m_rectIcon.height + lh + 4;
|
||||
}
|
||||
|
||||
if ( item->HasText() )
|
||||
{
|
||||
m_gi->m_rectHighlight.width = m_gi->m_rectLabel.width;
|
||||
m_gi->m_rectHighlight.height = m_gi->m_rectLabel.height;
|
||||
}
|
||||
else // no text, highlight the icon
|
||||
{
|
||||
m_gi->m_rectHighlight.width = m_gi->m_rectIcon.width;
|
||||
m_gi->m_rectHighlight.height = m_gi->m_rectIcon.height;
|
||||
}
|
||||
break;
|
||||
|
||||
case wxLC_LIST:
|
||||
s = item->GetTextForMeasuring();
|
||||
|
||||
dc->GetTextExtent( s, &lw, &lh );
|
||||
if (lh < SCROLL_UNIT_Y)
|
||||
lh = SCROLL_UNIT_Y;
|
||||
lw += EXTRA_WIDTH;
|
||||
lh += EXTRA_HEIGHT;
|
||||
|
||||
m_gi->m_rectLabel.width = lw;
|
||||
m_gi->m_rectLabel.height = lh;
|
||||
|
||||
m_gi->m_rectAll.width = lw;
|
||||
m_gi->m_rectAll.height = lh;
|
||||
|
||||
if (item->HasImage())
|
||||
{
|
||||
int w, h;
|
||||
m_owner->GetImageSize( item->GetImage(), w, h );
|
||||
m_gi->m_rectIcon.width = w;
|
||||
m_gi->m_rectIcon.height = h;
|
||||
|
||||
m_gi->m_rectAll.width += 4 + w;
|
||||
if (h > m_gi->m_rectAll.height)
|
||||
m_gi->m_rectAll.height = h;
|
||||
}
|
||||
|
||||
m_gi->m_rectHighlight.width = m_gi->m_rectAll.width;
|
||||
m_gi->m_rectHighlight.height = m_gi->m_rectAll.height;
|
||||
break;
|
||||
|
||||
case wxLC_REPORT:
|
||||
@ -1446,20 +1455,31 @@ void wxListLineData::Draw( wxDC *dc )
|
||||
dc->DrawRectangle( m_gi->m_rectHighlight );
|
||||
}
|
||||
|
||||
// just for debugging to better see where the items are
|
||||
#if 0
|
||||
dc->SetPen(*wxRED_PEN);
|
||||
dc->SetBrush(*wxTRANSPARENT_BRUSH);
|
||||
dc->DrawRectangle( m_gi->m_rectAll );
|
||||
dc->SetPen(*wxGREEN_PEN);
|
||||
dc->DrawRectangle( m_gi->m_rectIcon );
|
||||
#endif // 0
|
||||
|
||||
wxListItemData *item = node->GetData();
|
||||
if (item->HasImage())
|
||||
{
|
||||
wxRect rectIcon = m_gi->m_rectIcon;
|
||||
m_owner->DrawImage( item->GetImage(), dc,
|
||||
rectIcon.x, rectIcon.y );
|
||||
// centre the image inside our rectangle, this looks nicer when items
|
||||
// ae aligned in a row
|
||||
const wxRect& rectIcon = m_gi->m_rectIcon;
|
||||
|
||||
m_owner->DrawImage(item->GetImage(), dc, rectIcon.x, rectIcon.y);
|
||||
}
|
||||
|
||||
if (item->HasText())
|
||||
{
|
||||
wxRect rectLabel = m_gi->m_rectLabel;
|
||||
const wxRect& rectLabel = m_gi->m_rectLabel;
|
||||
|
||||
wxDCClipper clipper(*dc, rectLabel);
|
||||
dc->DrawText( item->GetText(), rectLabel.x, rectLabel.y );
|
||||
dc->DrawText(item->GetText(), rectLabel.x, rectLabel.y);
|
||||
}
|
||||
}
|
||||
|
||||
@ -3892,7 +3912,10 @@ void wxListMainWindow::RecalculatePositions(bool noRefresh)
|
||||
int x = EXTRA_BORDER_X;
|
||||
int y = EXTRA_BORDER_Y;
|
||||
|
||||
for ( size_t i = 0; i < count; i++ )
|
||||
wxCoord widthMax = 0;
|
||||
|
||||
size_t i;
|
||||
for ( i = 0; i < count; i++ )
|
||||
{
|
||||
wxListLineData *line = GetLine(i);
|
||||
line->CalculateSize( &dc, iconSpacing );
|
||||
@ -3902,6 +3925,9 @@ void wxListMainWindow::RecalculatePositions(bool noRefresh)
|
||||
|
||||
if ( HasFlag(wxLC_ALIGN_TOP) )
|
||||
{
|
||||
if ( sizeLine.x > widthMax )
|
||||
widthMax = sizeLine.x;
|
||||
|
||||
y += sizeLine.y;
|
||||
}
|
||||
else // wxLC_ALIGN_LEFT
|
||||
@ -3910,6 +3936,18 @@ void wxListMainWindow::RecalculatePositions(bool noRefresh)
|
||||
}
|
||||
}
|
||||
|
||||
if ( HasFlag(wxLC_ALIGN_TOP) )
|
||||
{
|
||||
// traverse the items again and tweak their sizes so that they are
|
||||
// all the same in a row
|
||||
for ( i = 0; i < count; i++ )
|
||||
{
|
||||
wxListLineData *line = GetLine(i);
|
||||
line->m_gi->ExtendWidth(widthMax);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
SetScrollbars
|
||||
(
|
||||
SCROLL_UNIT_X,
|
||||
|
Loading…
Reference in New Issue
Block a user