Fix horizontal alignment in icon view in generic wxListCtrl.

Ensure that all the items in the same column have the same width, so that
their labels are centred.

Closes #9227.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@70066 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 2011-12-20 21:21:38 +00:00
parent 8573b14550
commit 4d0c23087a
3 changed files with 25 additions and 7 deletions

View File

@ -453,6 +453,7 @@ All (GUI):
- Added wxFilePickerCtrl::SetInitialDirectory().
- Added wxDataViewItemAttr::SetBackgroundColour() and implemented it in generic
wxDataViewCtrl (Andrew Xu).
- Fix item alignment in icon view in the generic wxListCtrl.
MSW:

View File

@ -571,8 +571,14 @@ void MyFrame::InitWithIconItems(bool withText, bool sameIcon)
if ( withText )
{
m_listCtrl->InsertItem(i, wxString::Format(wxT("Label %d"), i),
image);
// Make labels of different widths to test the layout.
wxString label;
if ( !(i % 5) )
label.Printf("Longer label %d", i);
else
label.Printf("Label %d", i);
m_listCtrl->InsertItem(i, label, image);
}
else
{

View File

@ -3629,6 +3629,9 @@ void wxListMainWindow::RecalculatePositions(bool noRefresh)
int x = EXTRA_BORDER_X;
int y = EXTRA_BORDER_Y;
// Note that "row" here is vertical, i.e. what is called
// "column" in many other places in wxWidgets.
int maxWidthInThisRow = 0;
m_linesPerPage = 0;
@ -3650,8 +3653,20 @@ void wxListMainWindow::RecalculatePositions(bool noRefresh)
if (currentlyVisibleLines > m_linesPerPage)
m_linesPerPage = currentlyVisibleLines;
if ( y + sizeLine.y >= clientHeight )
// Have we reached the end of the row either because no
// more items would fit or because there are simply no more
// items?
if ( y + sizeLine.y >= clientHeight
|| i == count - 1)
{
// Adjust all items in this row to have the same
// width to ensure that they all align horizontally.
size_t firstRowLine = i - currentlyVisibleLines + 1;
for (size_t j = firstRowLine; j <= i; j++)
{
GetLine(j)->m_gi->ExtendWidth(maxWidthInThisRow);
}
currentlyVisibleLines = 0;
y = EXTRA_BORDER_Y;
maxWidthInThisRow += MARGIN_BETWEEN_ROWS;
@ -3660,10 +3675,6 @@ void wxListMainWindow::RecalculatePositions(bool noRefresh)
maxWidthInThisRow = 0;
}
// We have reached the last item.
if ( i == count - 1 )
entireWidth += maxWidthInThisRow;
if ( (tries == 0) &&
(entireWidth + SCROLL_UNIT_X > clientWidth) )
{